diff options
Diffstat (limited to 'src/interactive')
3 files changed, 18 insertions, 23 deletions
diff --git a/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala b/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala index b4d3fd8aa0..c38c7c8257 100644 --- a/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala +++ b/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala @@ -295,6 +295,9 @@ trait CompilerControl { self: Global => val tpe: Type val accessible: Boolean def implicitlyAdded = false + + private def accessible_s = if (accessible) "" else "[inaccessible] " + def infoString = s"$accessible_s${sym.defStringSeenAs(tpe)}" } case class TypeMember( diff --git a/src/interactive/scala/tools/nsc/interactive/Global.scala b/src/interactive/scala/tools/nsc/interactive/Global.scala index 91c923886a..c9b4603d74 100644 --- a/src/interactive/scala/tools/nsc/interactive/Global.scala +++ b/src/interactive/scala/tools/nsc/interactive/Global.scala @@ -15,7 +15,7 @@ import scala.reflect.internal.util.{ SourceFile, BatchSourceFile, Position, NoPo import scala.tools.nsc.reporters._ import scala.tools.nsc.symtab._ import scala.tools.nsc.doc.ScaladocAnalyzer -import scala.tools.nsc.typechecker.{ Analyzer, DivergentImplicit } +import scala.tools.nsc.typechecker.Analyzer import symtab.Flags.{ACCESSOR, PARAMACCESSOR} import scala.annotation.{ elidable, tailrec } import scala.language.implicitConversions @@ -1035,23 +1035,21 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "") } private def typeMembers(pos: Position): Stream[List[TypeMember]] = { - var tree = typedTreeAt(pos) - - // if tree consists of just x. or x.fo where fo is not yet a full member name - // ignore the selection and look in just x. - tree match { - case Select(qual, name) if tree.tpe == ErrorType => tree = qual - case _ => + // Choosing which tree will tell us the type members at the given position: + // If pos leads to an Import, type the expr + // If pos leads to a Select, type the qualifier as long as it is not erroneous + // (this implies discarding the possibly incomplete name in the Select node) + // Otherwise, type the tree found at 'pos' directly. + val tree0 = typedTreeAt(pos) match { + case sel @ Select(qual, _) if sel.tpe == ErrorType => qual + case Import(expr, _) => expr + case t => t } - val context = doLocateContext(pos) - - if (tree.tpe == null) - // TODO: guard with try/catch to deal with ill-typed qualifiers. - tree = analyzer.newTyper(context).typedQualifier(tree) + // TODO: guard with try/catch to deal with ill-typed qualifiers. + val tree = if (tree0.tpe eq null) analyzer newTyper context typedQualifier tree0 else tree0 debugLog("typeMembers at "+tree+" "+tree.tpe) - val superAccess = tree.isInstanceOf[Super] val members = new Members[TypeMember] @@ -1212,9 +1210,6 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "") case ex: TypeError => debugLog("type error caught: "+ex) alt - case ex: DivergentImplicit => - debugLog("divergent implicit caught: "+ex) - alt } } diff --git a/src/interactive/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala b/src/interactive/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala index c0ad245091..08d84af8f5 100644 --- a/src/interactive/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala +++ b/src/interactive/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala @@ -16,21 +16,18 @@ private[tests] trait CoreTestDefs extends PresentationCompilerTestDef with AskCompletionAt { - def memberPrinter(member: compiler.Member): String = - "[accessible: %5s] ".format(member.accessible) + "`" + (member.sym.toString.trim + member.tpe.toString()).trim + "`" - override def runTest() { askAllSources(CompletionMarker) { pos => askCompletionAt(pos) } { (pos, members) => withResponseDelimiter { - reporter.println("[response] aksTypeCompletion at " + format(pos)) + reporter.println("[response] askCompletionAt " + format(pos)) // we skip getClass because it changed signature between 1.5 and 1.6, so there is no // universal check file that we can provide for this to work reporter.println("retrieved %d members".format(members.size)) compiler ask { () => val filtered = members.filterNot(member => (member.sym.name string_== "getClass") || member.sym.isConstructor) - reporter.println(filtered.map(memberPrinter).sortBy(_.toString()).mkString("\n")) + reporter println (filtered.map(_.infoString).sorted mkString "\n") } } } @@ -48,7 +45,7 @@ private[tests] trait CoreTestDefs askTypeAt(pos) } { (pos, tree) => withResponseDelimiter { - reporter.println("[response] askTypeAt at " + format(pos)) + reporter.println("[response] askTypeAt " + format(pos)) compiler.ask(() => reporter.println(tree)) } } |