summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2009-08-03 16:21:42 +0000
committerMartin Odersky <odersky@gmail.com>2009-08-03 16:21:42 +0000
commitec5e34144e6a8673ee1078fcf0d79411869b9829 (patch)
tree196eb2fa39a481848ad7742777d4b214e8176ec6 /src
parentac89702827559cab8835edecb35cc09a1ca3fe10 (diff)
downloadscala-ec5e34144e6a8673ee1078fcf0d79411869b9829.tar.gz
scala-ec5e34144e6a8673ee1078fcf0d79411869b9829.tar.bz2
scala-ec5e34144e6a8673ee1078fcf0d79411869b9829.zip
Fixed some problems with scope completion
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/interactive/CompilerControl.scala20
-rwxr-xr-xsrc/compiler/scala/tools/nsc/interactive/Global.scala14
2 files changed, 24 insertions, 10 deletions
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] = {