From 541a3487ce92043a6ceff1dc5e9484206409a561 Mon Sep 17 00:00:00 2001 From: Tom Grigg Date: Tue, 15 Feb 2022 14:49:23 -0800 Subject: [PATCH] Avoid stale import context during REPL parsing --- .../src/dotty/tools/repl/ReplDriver.scala | 11 +++++++++- .../dotty/tools/repl/ReplCompilerTests.scala | 21 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/repl/ReplDriver.scala b/compiler/src/dotty/tools/repl/ReplDriver.scala index 5eef023c1fc2..f69a7ca142fb 100644 --- a/compiler/src/dotty/tools/repl/ReplDriver.scala +++ b/compiler/src/dotty/tools/repl/ReplDriver.scala @@ -254,6 +254,12 @@ class ReplDriver(settings: Array[String], def extractTopLevelImports(ctx: Context): List[tpd.Import] = unfusedPhases(using ctx).collectFirst { case phase: CollectTopLevelImports => phase.imports }.get + def contextWithNewImports(ctx: Context, imports: List[tpd.Import]): Context = + if imports.isEmpty then ctx + else + imports.foldLeft(ctx.fresh.setNewScope)((ctx, imp) => + ctx.importContext(imp, imp.symbol(using ctx))) + implicit val state = { val state0 = newRun(istate, parsed.reporter) state0.copy(context = state0.context.withSource(parsed.source)) @@ -269,7 +275,10 @@ class ReplDriver(settings: Array[String], var allImports = newState.imports if (newImports.nonEmpty) allImports += (newState.objectIndex -> newImports) - val newStateWithImports = newState.copy(imports = allImports) + val newStateWithImports = newState.copy( + imports = allImports, + context = contextWithNewImports(newState.context, newImports) + ) val warnings = newState.context.reporter .removeBufferedMessages(using newState.context) diff --git a/compiler/test/dotty/tools/repl/ReplCompilerTests.scala b/compiler/test/dotty/tools/repl/ReplCompilerTests.scala index 3c70f838caa3..c02552aac83c 100644 --- a/compiler/test/dotty/tools/repl/ReplCompilerTests.scala +++ b/compiler/test/dotty/tools/repl/ReplCompilerTests.scala @@ -241,6 +241,27 @@ class ReplCompilerTests extends ReplTest: assertEquals(List("// defined class C"), lines()) } + @Test def i14491 = + initially { + run("import language.experimental.fewerBraces") + } andThen { + run("""|val x = Seq(7,8,9).apply: + | 1 + |""".stripMargin) + assertEquals("val x: Int = 8", storedOutput().trim) + } + initially { + run("""|import language.experimental.fewerBraces + |import language.experimental.fewerBraces as _ + |""".stripMargin) + } andThen { + run("""|val x = Seq(7,8,9).apply: + | 1 + |""".stripMargin) + assert("expected error if fewerBraces is unimported", + lines().exists(_.contains("missing arguments for method apply"))) + } + object ReplCompilerTests: private val pattern = Pattern.compile("\\r[\\n]?|\\n");