From 5bfe1494648980d7822084c4aeb50ac5126103ae Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Fri, 15 Nov 2019 05:06:38 -0800 Subject: [PATCH] Exclude universal members from root module import --- .../scala/tools/nsc/ast/TreeGen.scala | 2 +- .../tools/nsc/typechecker/Contexts.scala | 23 ++++++++++++------- .../scala/reflect/internal/Trees.scala | 1 + test/files/neg/t5389.check | 4 ++++ test/files/neg/t5389.scala | 4 ++++ 5 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 test/files/neg/t5389.check create mode 100644 test/files/neg/t5389.scala diff --git a/src/compiler/scala/tools/nsc/ast/TreeGen.scala b/src/compiler/scala/tools/nsc/ast/TreeGen.scala index 4b7b87bfe30d..64430eacd2e0 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeGen.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeGen.scala @@ -39,7 +39,7 @@ abstract class TreeGen extends scala.reflect.internal.TreeGen with TreeDSL { def mkImport(qualSym: Symbol, name: Name, toName: Name): Import = mkImportFromSelector(qualSym, ImportSelector(name, 0, toName, 0) :: Nil) - private def mkImportFromSelector(qualSym: Symbol, selector: List[ImportSelector]): Import = { + def mkImportFromSelector(qualSym: Symbol, selector: List[ImportSelector]): Import = { assert(qualSym ne null, this) val qual = gen.mkAttributedStableRef(qualSym) val importSym = ( diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala index 2c3fc08d8bb9..a34f5f4aec11 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala @@ -13,16 +13,17 @@ package scala.tools.nsc package typechecker -import scala.collection.{immutable, mutable} import scala.annotation.tailrec -import scala.reflect.internal.util.{ ReusableInstance, shortClassOfInstance, ListOfNil, SomeOfNil } +import scala.collection.{immutable, mutable} +import scala.reflect.internal.util.{ReusableInstance, shortClassOfInstance, ListOfNil, SomeOfNil} +import scala.util.chaining._ /** * @author Martin Odersky */ trait Contexts { self: Analyzer => import global._ - import definitions.{JavaLangPackage, ScalaPackage, PredefModule, ScalaXmlTopScope, ScalaXmlPackage} + import definitions.{JavaLangPackage, ScalaPackage, PredefModule, ScalaXmlTopScope, ScalaXmlPackage, isUniversalMember} import ContextMode._ import scala.reflect.internal.Flags._ @@ -137,7 +138,16 @@ trait Contexts { self: Analyzer => } def rootContext(unit: CompilationUnit, tree: Tree = EmptyTree, throwing: Boolean = false, checking: Boolean = false): Context = { - val rootImportsContext = rootImports(unit).foldLeft(startContext)((c, sym) => c.make(gen.mkWildcardImport(sym), unit = unit)) + val rootImportsContext = rootImports(unit).foldLeft(startContext) { (c, sym) => + if (sym.isPackage) c.make(gen.mkWildcardImport(sym), unit = unit) + else { + val universals = sym.typeSignature.members.filter(isUniversalMember).map(_.name).toSet + val sels = universals.iterator + .map(ImportSelector.mask).toList + .appended(ImportSelector.wild) + c.make(gen.mkImportFromSelector(sym, sels), unit = unit) + } + } // there must be a scala.xml package when xml literals were parsed in this unit if (unit.hasXml && ScalaXmlPackage == NoSymbol) @@ -150,10 +160,7 @@ trait Contexts { self: Analyzer => if (!unit.hasXml || ScalaXmlTopScope == NoSymbol) rootImportsContext else rootImportsContext.make(gen.mkImport(ScalaXmlPackage, nme.TopScope, nme.dollarScope)) - val c = contextWithXML.make(tree, unit = unit) - - c.initRootContext(throwing, checking) - c + contextWithXML.make(tree, unit = unit).tap(_.initRootContext(throwing, checking)) } def rootContextPostTyper(unit: CompilationUnit, tree: Tree = EmptyTree): Context = diff --git a/src/reflect/scala/reflect/internal/Trees.scala b/src/reflect/scala/reflect/internal/Trees.scala index c0d71586c334..fabe8f9cef1f 100644 --- a/src/reflect/scala/reflect/internal/Trees.scala +++ b/src/reflect/scala/reflect/internal/Trees.scala @@ -498,6 +498,7 @@ trait Trees extends api.Trees { val wild = ImportSelector(nme.WILDCARD, -1, null, -1) val wildList = List(wild) // OPT This list is shared for performance. def wildAt(pos: Int) = ImportSelector(nme.WILDCARD, pos, null, -1) + def mask(name: Name) = ImportSelector(name, -1, nme.WILDCARD, -1) } case class Import(expr: Tree, selectors: List[ImportSelector]) diff --git a/test/files/neg/t5389.check b/test/files/neg/t5389.check new file mode 100644 index 000000000000..8911ebd57abe --- /dev/null +++ b/test/files/neg/t5389.check @@ -0,0 +1,4 @@ +t5389.scala:2: error: not found: object ne +import ne.scala + ^ +one error found diff --git a/test/files/neg/t5389.scala b/test/files/neg/t5389.scala new file mode 100644 index 000000000000..bb83d7a563d7 --- /dev/null +++ b/test/files/neg/t5389.scala @@ -0,0 +1,4 @@ + +import ne.scala + +class C