Skip to content

Commit

Permalink
Merge pull request #8541 from som-snytt/issue/5389
Browse files Browse the repository at this point in the history
Exclude universal members from root module import
  • Loading branch information
lrytz committed Nov 18, 2019
2 parents 9ef8fc3 + 5bfe149 commit 6766e23
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 9 deletions.
2 changes: 1 addition & 1 deletion src/compiler/scala/tools/nsc/ast/TreeGen.scala
Expand Up @@ -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 = (
Expand Down
23 changes: 15 additions & 8 deletions src/compiler/scala/tools/nsc/typechecker/Contexts.scala
Expand Up @@ -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._

Expand Down Expand Up @@ -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)
Expand All @@ -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 =
Expand Down
1 change: 1 addition & 0 deletions src/reflect/scala/reflect/internal/Trees.scala
Expand Up @@ -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])
Expand Down
4 changes: 4 additions & 0 deletions test/files/neg/t5389.check
@@ -0,0 +1,4 @@
t5389.scala:2: error: not found: object ne
import ne.scala
^
one error found
4 changes: 4 additions & 0 deletions test/files/neg/t5389.scala
@@ -0,0 +1,4 @@

import ne.scala

class C

0 comments on commit 6766e23

Please sign in to comment.