diff options
author | Som Snytt <som.snytt@gmail.com> | 2015-07-16 11:03:50 -0700 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2015-07-16 11:03:50 -0700 |
commit | ac0e1d8c7f158a809a135855d821cbeb7f1bec92 (patch) | |
tree | 640ce71f1d2e5070b303fbfec28da7eab6ba0159 /src/compiler/scala/tools/nsc/typechecker/Contexts.scala | |
parent | 6f795ac3f66cb889ea92324dd40cfc9156e99c90 (diff) | |
download | scala-ac0e1d8c7f158a809a135855d821cbeb7f1bec92.tar.gz scala-ac0e1d8c7f158a809a135855d821cbeb7f1bec92.tar.bz2 scala-ac0e1d8c7f158a809a135855d821cbeb7f1bec92.zip |
SI-9383 Name the function for implicit importing
Per review, adds a function that clarifies the purpose
of the code path that collects imported implicits,
namely, to examine qualifying imported implicits and
then collect them. In the context of doing something
with the import (besides importing), it's clear why we
don't want to record that we used the import, that is,
because we might be doing something other than using.
That's clear, right?
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Contexts.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Contexts.scala | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala index 0cacca055f..024ff11758 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala @@ -802,6 +802,14 @@ trait Contexts { self: Analyzer => (e ne null) && (e.owner == scope) && (!settings.isScala212 || e.sym.exists) }) + /** Do something with the symbols with name `name` imported via the import in `imp`, + * if any such symbol is accessible from this context and is a qualifying implicit. + */ + private def withQualifyingImplicitAlternatives(imp: ImportInfo, name: Name, pre: Type)(f: Symbol => Unit) = for { + sym <- importedAccessibleSymbol(imp, name, requireExplicit = false, record = false).alternatives + if isQualifyingImplicit(name, sym, pre, imported = true) + } f(sym) + private def collectImplicits(syms: Scope, pre: Type, imported: Boolean = false): List[ImplicitInfo] = for (sym <- syms.toList if isQualifyingImplicit(sym.name, sym, pre, imported)) yield new ImplicitInfo(sym.name, pre, sym) @@ -819,9 +827,9 @@ trait Contexts { self: Analyzer => case ImportSelector(from, _, to, _) :: sels1 => var impls = collect(sels1) filter (info => info.name != from) if (to != nme.WILDCARD) { - for (sym <- importedAccessibleSymbol(imp, to).alternatives) - if (isQualifyingImplicit(to, sym, pre, imported = true)) - impls = new ImplicitInfo(to, pre, sym) :: impls + withQualifyingImplicitAlternatives(imp, to, pre) { sym => + impls = new ImplicitInfo(to, pre, sym) :: impls + } } impls } @@ -946,9 +954,6 @@ trait Contexts { self: Analyzer => /** The symbol with name `name` imported via the import in `imp`, * if any such symbol is accessible from this context. */ - def importedAccessibleSymbol(imp: ImportInfo, name: Name): Symbol = - importedAccessibleSymbol(imp, name, requireExplicit = false, record = false) - private def importedAccessibleSymbol(imp: ImportInfo, name: Name, requireExplicit: Boolean, record: Boolean): Symbol = imp.importedSymbol(name, requireExplicit, record) filter (s => isAccessible(s, imp.qual.tpe, superAccess = false)) |