summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/interactive/Global.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2009-08-02 18:22:20 +0000
committerMartin Odersky <odersky@gmail.com>2009-08-02 18:22:20 +0000
commitf9c2bc54ff2e047b9c2ebc9bcae4a4d1b87be0c2 (patch)
tree1261c27f53e4f57620f3d316cf8c4828e83e4b9f /src/compiler/scala/tools/nsc/interactive/Global.scala
parentd339959ff129d9c3ccabad25d924618d21b7a471 (diff)
downloadscala-f9c2bc54ff2e047b9c2ebc9bcae4a4d1b87be0c2.tar.gz
scala-f9c2bc54ff2e047b9c2ebc9bcae4a4d1b87be0c2.tar.bz2
scala-f9c2bc54ff2e047b9c2ebc9bcae4a4d1b87be0c2.zip
Deleted IDeSupport.
Diffstat (limited to 'src/compiler/scala/tools/nsc/interactive/Global.scala')
-rwxr-xr-xsrc/compiler/scala/tools/nsc/interactive/Global.scala124
1 files changed, 76 insertions, 48 deletions
diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala
index 4ca2203bb2..d055e5ec41 100755
--- a/src/compiler/scala/tools/nsc/interactive/Global.scala
+++ b/src/compiler/scala/tools/nsc/interactive/Global.scala
@@ -24,6 +24,8 @@ self =>
import definitions._
+ final val debugIDE = false
+
override def onlyPresentation = true
/** A list indicating in which order some units should be typechecked.
@@ -120,14 +122,14 @@ self =>
case Some(action) =>
try {
acting = true
- //println("picked up work item: "+action)
+ if (debugIDE) println("picked up work item: "+action)
action()
- //println("done with work item: "+action)
+ if (debugIDE) println("done with work item: "+action)
} catch {
case ex: CancelActionReq =>
- //println("cancelled work item: "+action)
+ if (debugIDE) println("cancelled work item: "+action)
} finally {
- //println("quitting work item: "+action)
+ if (debugIDE) println("quitting work item: "+action)
acting = false
}
case None =>
@@ -209,13 +211,13 @@ self =>
/** Compile all given units
*/
private def backgroundCompile() {
- //inform("Starting new presentation compiler type checking pass")
+ if (debugIDE) inform("Starting new presentation compiler type checking pass")
reporter.reset
firsts = firsts filter (s => unitOfFile contains (s.file))
val prefix = firsts map unitOf
val units = prefix ::: (unitOfFile.values.toList diff prefix) filter (!_.isUpToDate)
recompile(units)
- //inform("Everything is now up to date")
+ if (debugIDE) inform("Everything is now up to date")
}
/** Reset unit to just-parsed state */
@@ -244,11 +246,11 @@ self =>
def recompile(units: List[RichCompilationUnit]) {
for (unit <- units) {
reset(unit)
- //inform("parsing: "+unit)
+ if (debugIDE) inform("parsing: "+unit)
parse(unit)
}
for (unit <- units) {
- //inform("type checking: "+unit)
+ if (debugIDE) inform("type checking: "+unit)
activeLocks = 0
currentTyperRun.typeCheck(unit)
unit.status = currentRunId
@@ -329,59 +331,85 @@ self =>
respond(result) { scopeMembers(pos) }
}
- def scopeMembers(pos: Position): List[Member] = {
+ /** 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)
- List() // to be completed
+ val locals = new LinkedHashMap[Name, ScopeMember]
+ def addScopeMember(sym: Symbol, pre: Type, viaImport: Tree) =
+ if (!(locals contains sym.name)) {
+ locals(sym.name) = new ScopeMember(
+ sym,
+ pre.memberType(sym),
+ context.isAccessible(sym, pre, false),
+ viaImport)
+ }
+ var cx = context
+ while (cx != NoContext) {
+ for (sym <- cx.scope)
+ addScopeMember(sym, NoPrefix, EmptyTree)
+ cx = cx.enclClass
+ val pre = cx.prefix
+ for (sym <- pre.members)
+ addScopeMember(sym, pre, EmptyTree)
+ cx = cx.outer
+ }
+ for (imp <- context.imports) {
+ val pre = imp.qual.tpe
+ for (sym <- imp.allImportedSymbols) {
+ addScopeMember(sym, pre, imp.qual)
+ }
+ }
+ locals.valuesIterator.toList
}
def getTypeCompletion(pos: Position, result: Response[List[Member]]) {
respond(result) { typeMembers(pos) }
}
- def typeMembers(pos: Position): List[Member] = {
+ def typeMembers(pos: Position): List[TypeMember] = {
val tree = typedTreeAt(pos)
+ println("typeMembers at "+tree+" "+tree.tpe)
val context = doLocateContext(pos)
val superAccess = tree.isInstanceOf[Super]
+ val scope = newScope
+ val members = new LinkedHashMap[Symbol, TypeMember]
+ def addTypeMember(sym: Symbol, pre: Type, inherited: Boolean, viaView: Symbol) {
+ val symtpe = pre.memberType(sym)
+ if (scope.lookupAll(sym.name) forall (sym => !(members(sym).tpe matches symtpe))) {
+ scope enter sym
+ members(sym) = new TypeMember(
+ sym,
+ symtpe,
+ context.isAccessible(sym, pre, superAccess && (viaView == NoSymbol)),
+ inherited,
+ viaView)
+ }
+ }
+ def viewApply(view: SearchResult): Tree = {
+ assert(view.tree != EmptyTree)
+ try {
+ analyzer.newTyper(context.makeImplicit(false)).typed(Apply(view.tree, List(tree)) setPos tree.pos)
+ } catch {
+ case ex: TypeError => EmptyTree
+ }
+ }
val pre = stabilizedType(tree)
- def member(sym: Symbol, inherited: Boolean) = new Member(
- sym,
- pre memberType sym,
- context.isAccessible(sym, pre, superAccess),
- inherited,
- NoSymbol
- )
- def implicitMembers(s: SearchResult): List[Member] = {
- val vtree = viewApply(s, tree, context)
+ for (sym <- tree.tpe.decls)
+ addTypeMember(sym, pre, false, NoSymbol)
+ for (sym <- tree.tpe.members)
+ addTypeMember(sym, pre, true, NoSymbol)
+ val applicableViews: List[SearchResult] =
+ new ImplicitSearch(tree, functionType(List(tree.tpe), AnyClass.tpe), true, context.makeImplicit(false))
+ .allImplicits
+ for (view <- applicableViews) {
+ val vtree = viewApply(view)
val vpre = stabilizedType(vtree)
- vtree.tpe.members map { sym => new Member(
- sym,
- vpre memberType sym,
- context.isAccessible(sym, vpre, false),
- false,
- s.tree.symbol
- )}
- }
- println("typeMembers at "+tree+" "+tree.tpe)
- val decls = tree.tpe.decls.toList map (member(_, false))
- val inherited = tree.tpe.members.toList diff decls map (member(_, true))
- val implicits = applicableViews(tree, context) flatMap implicitMembers
- def isVisible(m: Member) =
- !(decls exists (_.shadows(m))) && !(inherited exists (_.shadows(m)))
- val allMembers = decls ::: inherited ::: (implicits filter isVisible)
- allMembers // filter (_.sym.name.startsWith(prefix))
- }
-
- def applicableViews(tree: Tree, context: Context): List[SearchResult] =
- new ImplicitSearch(tree, functionType(List(tree.tpe), AnyClass.tpe), true, context.makeImplicit(false))
- .allImplicits
-
- def viewApply(view: SearchResult, tree: Tree, context: Context): Tree = {
- assert(view.tree != EmptyTree)
- try {
- analyzer.newTyper(context.makeImplicit(false)).typed(Apply(view.tree, List(tree)) setPos tree.pos)
- } catch {
- case ex: TypeError => EmptyTree
+ for (sym <- vtree.tpe.members) {
+ addTypeMember(sym, vpre, false, view.tree.symbol)
+ }
}
+ members.valuesIterator.toList
}
// ---------------- Helper classes ---------------------------