Skip to content

Commit

Permalink
Fix REPL shadowing bug
Browse files Browse the repository at this point in the history
  • Loading branch information
dwijnand committed Nov 21, 2022
1 parent 298ff3f commit 074f313
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1060,7 +1060,7 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
if (sym.isImport)
sym.infoOrCompleter match {
case info: Namer#Completer => return info.original.show
case info: ImportType => return s"import $info.expr.show"
case info: ImportType => return s"import ${info.expr.show}"
case _ =>
}
def name =
Expand Down
6 changes: 4 additions & 2 deletions compiler/src/dotty/tools/dotc/typer/Typer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,10 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
if (curImport.nn.unimported ne NoSymbol) unimported += curImport.nn.unimported
if (curOwner.is(Package) && curImport != null && curImport.isRootImport && previous.exists)
previous // no more conflicts possible in this case
else if (isPossibleImport(NamedImport) && (curImport nen outer.importInfo)) {
else if isPossibleImport(NamedImport) &&
((curImport nen outer.importInfo)
|| curImport != null && !curImport.importSym.isCompleting && curImport.site.termSymbol.name.isReplWrapperName)
then
val namedImp = namedImportRef(curImport.uncheckedNN)
if (namedImp.exists)
recurAndCheckNewOrShadowed(namedImp, NamedImport, ctx)(using outer)
Expand All @@ -456,7 +459,6 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
updateUnimported()
loop(ctx)(using outer)
}
}
else loop(ctx)(using outer)
}
}
Expand Down
1 change: 0 additions & 1 deletion compiler/src/dotty/tools/repl/ReplCompiler.scala
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ class ReplCompiler extends Compiler:
}

val rootCtx = super.rootContext.fresh
.setOwner(defn.EmptyPackageClass)
.withRootImports
(state.validObjectIndexes).foldLeft(rootCtx)((ctx, id) =>
importPreviousRun(id)(using ctx))
Expand Down
14 changes: 14 additions & 0 deletions compiler/test/dotty/tools/repl/ShadowingBatchTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,20 @@ class ShadowingBatchTests extends ErrorMessagesTest:
ictx.setSetting(classpath, classpath.value + File.pathSeparator + dir.jpath.toAbsolutePath)
}

@Test def io =
val lib = """|package io.foo
|
|object Bar {
| def baz: Int = 42
|}
|""".stripMargin
val app = """|object Main:
| def main(args: Array[String]): Unit =
| println(io.foo.Bar.baz)
|""".stripMargin
checkMessages(lib).expectNoErrors
checkMessages(app).expectNoErrors

@Test def file =
checkMessages("class C(val c: Int)").expectNoErrors
checkMessages("object rsline1 {\n def line1 = new C().c\n}").expect { (_, msgs) =>
Expand Down
19 changes: 18 additions & 1 deletion compiler/test/dotty/tools/repl/ShadowingTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,18 @@ class ShadowingTests extends ReplTest(options = ShadowingTests.options):
Files.delete(file)
end compileShadowed

@Test def io = shadowedScriptedTest(name = "io",
shadowed = """|package io.foo
|
|object Bar {
| def baz: Int = 42
|}
|""".stripMargin,
script = """|scala> io.foo.Bar.baz
|val res0: Int = 42
|""".stripMargin
)

@Test def i7635 = shadowedScriptedTest(name = "<i7635>",
shadowed = "class C(val c: Int)",
script =
Expand All @@ -97,7 +109,7 @@ class ShadowingTests extends ReplTest(options = ShadowingTests.options):
|""".stripMargin
)

@Test def `shadow subdirectories on classpath` =
@Test def shadowSubDir =
// NB: Tests of shadowing of subdirectories on the classpath are only valid
// when the subdirectories exist prior to initialization of the REPL driver.
// In the tests below this is enforced by the call to `testScript` which
Expand Down Expand Up @@ -129,6 +141,11 @@ class ShadowingTests extends ReplTest(options = ShadowingTests.options):
ShadowingTests.createSubDir("util")
testScript(name = "<shadow-subdir-util>",
"""|scala> import util.Try
|-- [E008] Not Found Error: -----------------------------------------------------
|1 | import util.Try
| | ^^^
| | value Try is not a member of util
|1 error found
|
|scala> object util { class Try { override def toString = "you've gotta try!" } }
|// defined object util
Expand Down

0 comments on commit 074f313

Please sign in to comment.