File tree 3 files changed +35
-3
lines changed
3 files changed +35
-3
lines changed Original file line number Diff line number Diff line change @@ -4377,7 +4377,7 @@ object Parsers {
4377
4377
* | Expr1
4378
4378
* |
4379
4379
*/
4380
- def blockStatSeq (): List [Tree ] = checkNoEscapingPlaceholders {
4380
+ def blockStatSeq (outermost : Boolean = false ): List [Tree ] = checkNoEscapingPlaceholders {
4381
4381
val stats = new ListBuffer [Tree ]
4382
4382
while
4383
4383
var empty = false
@@ -4389,7 +4389,11 @@ object Parsers {
4389
4389
stats += closure(in.offset, Location .InBlock , modifiers(BitSet (IMPLICIT )))
4390
4390
else if isIdent(nme.extension) && followingIsExtension() then
4391
4391
stats += extension()
4392
- else if isDefIntro(localModifierTokens, excludedSoftModifiers = Set (nme.`opaque`)) then
4392
+ else if isDefIntro(localModifierTokens,
4393
+ excludedSoftModifiers =
4394
+ // Allow opaque definitions at outermost level in REPL.
4395
+ if outermost && ctx.mode.is(Mode .Interactive )
4396
+ then Set .empty else Set (nme.`opaque`)) then
4393
4397
stats +++= localDef(in.offset)
4394
4398
else
4395
4399
empty = true
Original file line number Diff line number Diff line change @@ -122,7 +122,7 @@ object ParseResult {
122
122
123
123
private def parseStats (using Context ): List [untpd.Tree ] = {
124
124
val parser = new Parser (ctx.source)
125
- val stats = parser.blockStatSeq()
125
+ val stats = parser.blockStatSeq(outermost = true )
126
126
parser.accept(Tokens .EOF )
127
127
stats
128
128
}
Original file line number Diff line number Diff line change @@ -372,6 +372,34 @@ class ReplCompilerTests extends ReplTest:
372
372
assertTrue(last, last.startsWith(" val res0: tpolecat.type = null" ))
373
373
assertTrue(last, last.endsWith(""" // result of "res0.toString" is null""" ))
374
374
375
+ @ Test def `i9879` : Unit = initially :
376
+ run {
377
+ """ |opaque type A = Int; def getA: A = 0
378
+ |object Wrapper { opaque type A = Int; def getA: A = 1 }
379
+ |val x = getA
380
+ |val y = Wrapper.getA""" .stripMargin
381
+ }
382
+ val expected = List (
383
+ " def getA: A" ,
384
+ " // defined object Wrapper" ,
385
+ " val x: A = 0" ,
386
+ " val y: Wrapper.A = 1"
387
+ )
388
+ assertEquals(expected, lines())
389
+
390
+ @ Test def `i9879b` : Unit = initially :
391
+ run {
392
+ """ |def test =
393
+ | type A = Int
394
+ | opaque type B = String
395
+ | object Wrapper { opaque type C = Int }
396
+ | ()""" .stripMargin
397
+ }
398
+ val all = lines()
399
+ assertEquals(6 , all.length)
400
+ assertTrue(all.head.startsWith(" -- [E103] Syntax Error" ))
401
+ assertTrue(all.exists(_.trim().startsWith(" | Illegal start of statement: this modifier is not allowed here" )))
402
+
375
403
object ReplCompilerTests :
376
404
377
405
private val pattern = Pattern .compile(" \\ r[\\ n]?|\\ n" );
You can’t perform that action at this time.
0 commit comments