Skip to content

Commit 6e34f77

Browse files
committed
REPL - fix collective extensions
Fixes #9374
1 parent 8bb0ca7 commit 6e34f77

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3647,12 +3647,12 @@ object Parsers {
36473647
in.nextToken()
36483648
val methods =
36493649
if isDefIntro(modifierTokens) then
3650-
extMethod(nparams) :: Nil
3650+
extMethodOpt(nparams).toList
36513651
else
36523652
in.observeIndented()
36533653
newLineOptWhenFollowedBy(LBRACE)
36543654
if in.isNestedStart then inDefScopeBraces(extMethods(nparams))
3655-
else { syntaxError("Extension without extension methods"); Nil }
3655+
else { syntaxErrorOrIncomplete("Extension without extension methods"); Nil }
36563656
val result = atSpan(start)(ExtMethods(joinParams(tparams, leadParamss.toList), methods))
36573657
val comment = in.getDocComment(start)
36583658
if comment.isDefined then
@@ -3663,21 +3663,25 @@ object Parsers {
36633663

36643664
/** ExtMethod ::= {Annotation [nl]} {Modifier} ‘def’ DefDef
36653665
*/
3666-
def extMethod(numLeadParams: Int): DefDef =
3666+
def extMethodOpt(numLeadParams: Int): Option[DefDef] =
36673667
val start = in.offset
36683668
val mods = defAnnotsMods(modifierTokens)
3669-
accept(DEF)
3670-
defDefOrDcl(start, mods, numLeadParams)
3671-
3669+
if in.token == DEF then
3670+
accept(DEF)
3671+
Some(defDefOrDcl(start, mods, numLeadParams))
3672+
else
3673+
None
3674+
36723675
/** ExtMethods ::= ExtMethod | [nl] ‘{’ ExtMethod {semi ExtMethod ‘}’
36733676
*/
36743677
def extMethods(numLeadParams: Int): List[DefDef] = checkNoEscapingPlaceholders {
36753678
val meths = new ListBuffer[DefDef]
36763679
while
3677-
meths += extMethod(numLeadParams)
3680+
val m = extMethodOpt(numLeadParams)
3681+
m.foreach(meths += _)
36783682
statSepOrEnd(meths, what = "extension method")
36793683
do ()
3680-
if meths.isEmpty then syntaxError("`def` expected")
3684+
if meths.isEmpty then syntaxErrorOrIncomplete("`def` expected")
36813685
meths.toList
36823686
}
36833687

compiler/test/dotty/tools/repl/ReplCompilerTests.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,12 @@ class ReplCompilerTests extends ReplTest {
199199
assertFalse(ParseResult.isIncomplete("_ + 1")) // was: assertThrows[NullPointerException]
200200
}
201201

202+
@Test def i9374: Unit = fromInitialState { state =>
203+
given Context = state.context
204+
assert(ParseResult.isIncomplete("extension (x: String)"))
205+
assert(ParseResult.isIncomplete("extension (x: String) {"))
206+
}
207+
202208
@Test def testSingletonPrint = fromInitialState { implicit state =>
203209
run("""val a = "hello"; val x: a.type = a""")
204210
assertMultiLineEquals("val a: String = hello\nval x: a.type = hello", storedOutput().trim)

0 commit comments

Comments
 (0)