File tree Expand file tree Collapse file tree 3 files changed +34
-4
lines changed Expand file tree Collapse file tree 3 files changed +34
-4
lines changed Original file line number Diff line number Diff line change @@ -4684,7 +4684,7 @@ object Parsers {
46844684     *                 | Expr1 
46854685     *                 | 
46864686     */  
4687-     def  blockStatSeq ():  List [Tree ] =  checkNoEscapingPlaceholders {
4687+     def  blockStatSeq (outermost :  Boolean   =   false ):  List [Tree ] =  checkNoEscapingPlaceholders {
46884688      val  stats  =  new  ListBuffer [Tree ]
46894689      while 
46904690        var  empty  =  false 
@@ -4696,7 +4696,11 @@ object Parsers {
46964696          stats +=  closure(in.offset, Location .InBlock , modifiers(BitSet (IMPLICIT )))
46974697        else  if  isIdent(nme.extension) &&  followingIsExtension() then 
46984698          stats +=  extension()
4699-         else  if  isDefIntro(localModifierTokens, excludedSoftModifiers =  Set (nme.`opaque`)) then 
4699+         else  if  isDefIntro(localModifierTokens,
4700+             excludedSoftModifiers = 
4701+               //  Allow opaque definitions at outermost level in REPL.
4702+               if  outermost &&  ctx.mode.is(Mode .Interactive )
4703+               then  Set .empty else  Set (nme.`opaque`)) then 
47004704          stats +++=  localDef(in.offset)
47014705        else 
47024706          empty =  true 
Original file line number Diff line number Diff line change @@ -122,7 +122,7 @@ object ParseResult {
122122
123123  private  def  parseStats (using  Context ):  List [untpd.Tree ] =  {
124124    val  parser  =  new  Parser (ctx.source)
125-     val  stats  =  parser.blockStatSeq()
125+     val  stats  =  parser.blockStatSeq(outermost  =   true )
126126    parser.accept(Tokens .EOF )
127127    stats
128128  }
Original file line number Diff line number Diff line change @@ -462,10 +462,36 @@ class ReplCompilerTests extends ReplTest:
462462    .andThen: 
463463      run(" 0" //  check for crash
464464      val  last  =  lines()
465-       println(last)
466465      assertTrue(last(0 ), last(0 ) ==  (" Options incompatible with repl will be ignored: -Ybest-effort, -Ywith-best-effort-tasty" 
467466      assertTrue(last(1 ), last(1 ) ==  (" val res0: Int = 0" 
468467
468+   @ Test  def  `i9879` :  Unit  =  initially :
469+     run {
470+       """ |opaque type A = Int; def getA: A = 0
471+          |object Wrapper { opaque type A = Int; def getA: A = 1 } 
472+          |val x = getA 
473+          |val y = Wrapper.getA"""  .stripMargin
474+     }
475+     val  expected  =  List (
476+       " def getA: A" 
477+       " // defined object Wrapper" 
478+       " val x: A = 0" 
479+       " val y: Wrapper.A = 1" 
480+     )
481+     assertEquals(expected, lines())
482+ 
483+   @ Test  def  `i9879b` :  Unit  =  initially :
484+     run {
485+       """ |def test =
486+          |  type A = Int 
487+          |  opaque type B = String 
488+          |  object Wrapper { opaque type C = Int } 
489+          |  ()"""  .stripMargin
490+     }
491+     val  all  =  lines()
492+     assertEquals(6 , all.length)
493+     assertTrue(all.head.startsWith(" -- [E103] Syntax Error" 
494+     assertTrue(all.exists(_.trim().startsWith(" |  Illegal start of statement: this modifier is not allowed here" 
469495
470496object  ReplCompilerTests : 
471497
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments