From ec5e34144e6a8673ee1078fcf0d79411869b9829 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Mon, 3 Aug 2009 16:21:42 +0000 Subject: Fixed some problems with scope completion --- .../tools/nsc/interactive/CompilerControl.scala | 20 +++++++++++++------- .../scala/tools/nsc/interactive/Global.scala | 14 +++++++++++--- 2 files changed, 24 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala index 069516bbf4..ab02ae7460 100644 --- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala +++ b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala @@ -12,7 +12,11 @@ import scala.tools.nsc.ast._ */ trait CompilerControl { self: Global => - /** Response wrapper to client + /** Response { + override def toString = "TypeMember("+sym+","+tpe+","+accessible+","+inherited+","+viaView+")" + }{ + override def toString = "TypeMember("+sym+","+tpe+","+accessible+","+inherited+","+viaView+")" + }wrapper to client */ type Response[T] = SyncVar[Either[T, Throwable]] @@ -20,13 +24,14 @@ trait CompilerControl { self: Global => /** Info given for every member found by completion */ - case class Member(val sym: Symbol, val tpe: Type, val accessible: Boolean) - - class TypeMember(sym: Symbol, tpe: Type, accessible: Boolean, val inherited: Boolean, val viaView: Symbol = NoSymbol) - extends Member(sym, tpe, accessible) + abstract class Member { + val sym: Symbol + val tpe: Type + val accessible: Boolean + } - class ScopeMember(sym: Symbol, tpe: Type, accessible: Boolean, val viaImport: Tree = EmptyTree) - extends Member(sym, tpe, accessible) + case class TypeMember(sym: Symbol, tpe: Type, accessible: Boolean, inherited: Boolean, viaView: Symbol) extends Member + case class ScopeMember(sym: Symbol, tpe: Type, accessible: Boolean, viaImport: Tree) extends Member /** The scheduler by which client and compiler communicate * Must be initialized before starting compilerRunner @@ -88,6 +93,7 @@ trait CompilerControl { self: Global => def askType(source: SourceFile, forceReload: Boolean, result: Response[Tree]) = scheduler postWorkItem new WorkItem { def apply() = self.getTypedTree(source, forceReload, result) + override def toString = "typecheck" } /** Set sync var `result' to list of members that are visible diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala index d055e5ec41..40af4d389a 100755 --- a/src/compiler/scala/tools/nsc/interactive/Global.scala +++ b/src/compiler/scala/tools/nsc/interactive/Global.scala @@ -201,7 +201,7 @@ self => compileRunner = newRunnerThread ex match { case _ : ValidateError => // This will have been reported elsewhere - case _ => inform("Fatal Error: "+ex) + case _ => ex.printStackTrace(); inform("Fatal Error: "+ex) } } } @@ -331,13 +331,18 @@ self => respond(result) { scopeMembers(pos) } } + val Dollar = newTermName("$") + /** Return all members visible without prefix in context enclosing `pos`. */ def scopeMembers(pos: Position): List[ScopeMember] = { typedTreeAt(pos) // to make sure context is entered val context = doLocateContext(pos) val locals = new LinkedHashMap[Name, ScopeMember] def addScopeMember(sym: Symbol, pre: Type, viaImport: Tree) = - if (!(locals contains sym.name)) { + if (!sym.name.decode.containsName(Dollar) && + !sym.hasFlag(Flags.SYNTHETIC) && + !locals.contains(sym.name)) { + //println("adding scope member: "+pre+" "+sym) locals(sym.name) = new ScopeMember( sym, pre.memberType(sym), @@ -360,11 +365,14 @@ self => addScopeMember(sym, pre, imp.qual) } } - locals.valuesIterator.toList + val result = locals.valuesIterator.toList + if (debugIDE) for (m <- result) println(m) + result } def getTypeCompletion(pos: Position, result: Response[List[Member]]) { respond(result) { typeMembers(pos) } + if (debugIDE) scopeMembers(pos) } def typeMembers(pos: Position): List[TypeMember] = { -- cgit v1.2.3