From 58bc0b3a53e6172bd9daf3701afb94b327c393c6 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Thu, 16 Jul 2009 15:43:02 +0000 Subject: small improvements concerning positions and com... small improvements concerning positions and completions --- src/compiler/scala/tools/nsc/ast/TreePrinters.scala | 2 ++ src/compiler/scala/tools/nsc/ast/parser/Parsers.scala | 17 ++++++++++------- .../scala/tools/nsc/ast/parser/TreeBuilder.scala | 2 +- src/compiler/scala/tools/nsc/interactive/Global.scala | 14 ++++++++++++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/compiler/scala/tools/nsc/ast/TreePrinters.scala b/src/compiler/scala/tools/nsc/ast/TreePrinters.scala index df19bdcf4b..120658b4e6 100644 --- a/src/compiler/scala/tools/nsc/ast/TreePrinters.scala +++ b/src/compiler/scala/tools/nsc/ast/TreePrinters.scala @@ -74,9 +74,11 @@ abstract class TreePrinters { def printParam(tree: Tree) { tree match { case ValDef(mods, name, tp, rhs) => + if (settings.Xprintpos.value) print(tree.pos.show) printAnnotations(tree) print(symName(tree, name)); printOpt(": ", tp); printOpt(" = ", rhs) case TypeDef(mods, name, tparams, rhs) => + if (settings.Xprintpos.value) print(tree.pos.show) print(symName(tree, name)) printTypeParams(tparams); print(rhs) } diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala index abb9f5214c..55aa4acf7d 100755 --- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala @@ -298,15 +298,16 @@ self => syntaxError(in.offset, msg, skipIt) } + def expectedMsg(token: Int): String = + token2string(token) + " expected but " +token2string(in.token) + " found." + /** Consume one token of the specified type, or * signal an error if it is not there. */ def accept(token: Int): Int = { val offset = in.offset if (in.token != token) { - val msg = - token2string(token) + " expected but " +token2string(in.token) + " found." - syntaxErrorOrIncomplete(msg, true) + syntaxErrorOrIncomplete(expectedMsg(token), false) if ((token == RPAREN || token == RBRACE || token == RBRACKET)) if (in.parenBalance(token) + assumedClosingParens(token) < 0) assumedClosingParens(token) += 1 @@ -543,20 +544,22 @@ self => /* -------- IDENTIFIERS AND LITERALS ------------------------------------------- */ - def ident(): Name = + def ident(skipIt: Boolean): Name = if (in.token == IDENTIFIER || in.token == BACKQUOTED_IDENT) { val name = in.name.encode in.nextToken() name } else { - accept(IDENTIFIER) + syntaxErrorOrIncomplete(expectedMsg(IDENTIFIER), skipIt) nme.ERROR } + def ident(): Name = ident(true) + def selector(t: Tree): Tree = { val point = in.offset //assert(t.pos.isDefined, t) - Select(t, ident()) setPos r2p(t.pos.start, point, in.lastOffset) + Select(t, ident(false)) setPos r2p(t.pos.start, point, in.lastOffset) } /** Path ::= StableId @@ -848,7 +851,7 @@ self => if (in.token == HASH) { val hashOffset = in.skipToken() val nameOffset = in.offset - val name = ident() + val name = ident(false) val sel = atPos(t.pos.start, if (name == nme.ERROR) hashOffset else nameOffset) { SelectFromTypeTree(t, name.toTypeName) } diff --git a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala index b3e73333c6..ca51c9aa5c 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala @@ -354,7 +354,7 @@ abstract class TreeBuilder { makeFor(mapName, flatMapName, rest, body)) case ValFrom(pos, pat, rhs) :: Filter(_, test) :: rest => makeFor(mapName, flatMapName, - ValFrom(pos, pat, makeCombination(r2p(rhs.pos.start, pos.point, test.pos.end), nme.filter, rhs, pat.syntheticDuplicate, test)) :: rest, + ValFrom(pos, pat, makeCombination(rhs.pos union test.pos, nme.filter, rhs, pat.syntheticDuplicate, test)) :: rest, body) case ValFrom(pos, pat, rhs) :: rest => val valeqs = rest.take(definitions.MaxTupleArity - 1).takeWhile(_.isInstanceOf[ValEq]); diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala index 72415b5d7b..93057c29ec 100755 --- a/src/compiler/scala/tools/nsc/interactive/Global.scala +++ b/src/compiler/scala/tools/nsc/interactive/Global.scala @@ -144,7 +144,7 @@ self => treePrinters.create(pw).print(tree) pw.flush - val typed = new SyncVar[Either[Tree, Throwable]] + val typed = new Response[Tree] askTypeAt(pos, typed) val typ = typed.get.left.toOption match { case Some(tree) => @@ -156,7 +156,16 @@ self => case None => "" } - source.content.view.drop(start).take(length).mkString+" : "+source.path+" ("+start+", "+end+")\n\nlocateTree:\n"+sw.toString+"\n\naskTypeAt:\n"+typ + val completionResponse = new Response[List[Member]] + askCompletion(pos, completionResponse) + val completion = completionResponse.get.left.toOption match { + case Some(members) => + members mkString "\n" + case None => "" + } + + source.content.view.drop(start).take(length).mkString+" : "+source.path+" ("+start+", "+end+ + ")\n\nlocateTree:\n"+sw.toString+"\n\naskTypeAt:\n"+typ+"\n\ncompletion:\n"+completion } // ----------------- The Background Runner Thread ----------------------- @@ -325,6 +334,7 @@ self => s.tree.symbol )} } + println("completion 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 -- cgit v1.2.3