diff options
author | Sean McDirmid <sean.mcdirmid@gmail.com> | 2005-12-19 11:44:04 +0000 |
---|---|---|
committer | Sean McDirmid <sean.mcdirmid@gmail.com> | 2005-12-19 11:44:04 +0000 |
commit | d6c0efe5b4b89a0337f1cdcdabf8c607d81f4ae1 (patch) | |
tree | 561cdb3f58b8f3b964a727f5c27c2aeb0a5705f9 /sources | |
parent | 2f7430a2779cf675c21e8e6170a481dac1c88152 (diff) | |
download | scala-d6c0efe5b4b89a0337f1cdcdabf8c607d81f4ae1.tar.gz scala-d6c0efe5b4b89a0337f1cdcdabf8c607d81f4ae1.tar.bz2 scala-d6c0efe5b4b89a0337f1cdcdabf8c607d81f4ae1.zip |
Updated parser to fix ref locations.
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scala/tools/nsc/ast/parser/Parsers.scala | 20 | ||||
-rw-r--r-- | sources/scala/tools/nsc/models/SemanticTokens.scala | 121 | ||||
-rw-r--r-- | sources/scala/tools/nsc/models/Signatures.scala | 65 |
3 files changed, 134 insertions, 72 deletions
diff --git a/sources/scala/tools/nsc/ast/parser/Parsers.scala b/sources/scala/tools/nsc/ast/parser/Parsers.scala index 0fbfac53c1..0634ace4d0 100644 --- a/sources/scala/tools/nsc/ast/parser/Parsers.scala +++ b/sources/scala/tools/nsc/ast/parser/Parsers.scala @@ -324,14 +324,14 @@ import Tokens._; if (in.token == THIS) { t = atPos(in.skipToken()) { This(nme.EMPTY.toTypeName) } if (!thisOK || in.token == DOT) - t = atPos(accept(DOT)) { selectors(t, typeOK) } + t = { selectors(t, typeOK, accept(DOT)) } } else if (in.token == SUPER) { t = atPos(in.skipToken()) { Super(nme.EMPTY.toTypeName, mixinQualifierOpt()) } t = atPos(accept(DOT)) { Select(t, ident()) } if (in.token == DOT) - t = atPos(in.skipToken()) { selectors(t, typeOK) } + t = { selectors(t, typeOK, in.skipToken()) } } else { val i = atPos(in.currentPos) { Ident(ident()) } t = i; @@ -341,28 +341,28 @@ import Tokens._; in.nextToken(); t = atPos(i.pos) { This(i.name.toTypeName) } if (!thisOK || in.token == DOT) - t = atPos(accept(DOT)) { selectors(t, typeOK) } + t = { selectors(t, typeOK, accept(DOT)) } } else if (in.token == SUPER) { in.nextToken(); t = atPos(i.pos) { Super(i.name.toTypeName, mixinQualifierOpt()) } t = atPos(accept(DOT)) { Select(t, ident())} if (in.token == DOT) - t = atPos(in.skipToken()) { selectors(t, typeOK) } + t = { selectors(t, typeOK, in.skipToken()) } } else { - t = atPos(pos) { selectors(t, typeOK) } + t = { selectors(t, typeOK, pos) } } } } t } - def selectors(t: Tree, typeOK: boolean): Tree = + def selectors(t: Tree, typeOK: boolean, pos : Int): Tree = if (typeOK && in.token == TYPE) { in.nextToken(); - SingletonTypeTree(t) + atPos(pos) { SingletonTypeTree(t) } } else { - val t1 = Select(t, ident()); - if (in.token == DOT) atPos(in.skipToken()) { selectors(t1, typeOK) } + val t1 = atPos(pos) { Select(t, ident()); } + if (in.token == DOT) { selectors(t1, typeOK, in.skipToken()) } else t1 } @@ -389,7 +389,7 @@ import Tokens._; */ def qualId(): Tree = { val id = atPos(in.currentPos) { Ident(ident()) } - if (in.token == DOT) atPos(in.skipToken()) { selectors(id, false) } + if (in.token == DOT) { selectors(id, false, in.skipToken()) } else id } diff --git a/sources/scala/tools/nsc/models/SemanticTokens.scala b/sources/scala/tools/nsc/models/SemanticTokens.scala index b9aa64de38..51d127b54b 100644 --- a/sources/scala/tools/nsc/models/SemanticTokens.scala +++ b/sources/scala/tools/nsc/models/SemanticTokens.scala @@ -7,7 +7,6 @@ import scala.tools.nsc.util.{NameTransformer,Position,SourceFile}; import scala.collection.mutable.{HashMap,HashSet}; - class SemanticTokens(val compiler: Compiler) { import compiler._; @@ -223,73 +222,71 @@ class SemanticTokens(val compiler: Compiler) { val tree1 = if (tree.original != null) tree.original; else tree; buildT(tree1, tree.tpe); def buildT( tree : Tree, tpe : Type) : Unit = if (tree.pos != Position.NOPOS) tpe match { - case tpe0 : TypeRef => tree match { - case apt : AppliedTypeTree => - buildUse(tpe.symbol, apt.tpt.pos); - //System.err.println("APT: " + apt.tpt + " sym0=" + apt.tpt.symbol + " sym1=" + tpe0.sym + " " + " " + apt.args + " " + tpe0.args); - - buildTs (apt.args, tpe0.args); - case ident : Ident => buildUse(tpe0.sym, ident.pos); - case select : Select => - // System.err.println("BUILD_SELECT: " + select + " @ " + tpe0); - try { - build(select); - } catch { - case e : Error => - System.err.println("BUILD_SELECT: " + select + " @ " + tpe0 + " " + unit.source.dbg(select.pos)); - throw e; - } - case tpt : TypeTree => - //System.err.println("UNKNOWN TPT0: " + tpe0 + " " + tpe0.args + " " + tpt); - case sft : SelectFromTypeTree => - build(sft.qualifier); // XXX: broken - if (false) System.err.println("SFTT: " + sft + " sym=" + sft.symbol + " selector=" + sft.selector + " qual=" + sft.qualifier + " qual.sym=" + - sft.qualifier.symbol + - " qual.pos=" + unit.source.dbg(sft.qualifier.pos) + " symbol=" + sft.symbol + " type=" + tpe0 + - " type.sym=" + tpe0.symbol); - case _ => System.err.println("UNKNOWN TPT2: " + tree + " vs. " + tpe0 + " " + tree.getClass() + " " + unit.source.content(tree.pos)); - } - case tpe0 : MethodType => tree match { - case tpt: TypeTree => - if (tpt.original != null) buildT(tpt.original, tpe); - else { - System.err.println("UNKNOWN TPT3: " + tree + " vs. " + tpe0 + " " + unit.source.content(tree.pos)); - } - case ident : Ident => buildT(ident, tpe0.resultType); - case select : Select => buildT(select, tpe0.resultType); - case _ => System.err.println("UNKNOWN TPE: " + tree + " vs. " + tpe0 + " " + tree.getClass()); - } - case _ => // System.err.println("UNKNOWN: " + tree + " " + (if (tree != null) tree.getClass() else null) + " vs. " + tpe + " " + (if (tpe != null) tpe.getClass() else null) + " " + (if (tree != null) tree.pos else null)); - }; + case tpe0 : TypeRef => tree match { + case apt : AppliedTypeTree => + buildUse(tpe.symbol, apt.tpt.pos); + //System.err.println("APT: " + apt.tpt + " sym0=" + apt.tpt.symbol + " sym1=" + tpe0.sym + " " + " " + apt.args + " " + tpe0.args); + + buildTs (apt.args, tpe0.args); + case ident : Ident => buildUse(tpe0.sym, ident.pos); + case select : Select => + // System.err.println("BUILD_SELECT: " + select + " @ " + tpe0); + try { + build(select); + } catch { + case e : Error => + System.err.println("BUILD_SELECT: " + select + " @ " + tpe0 + " " + unit.source.dbg(select.pos)); + throw e; + } + case tpt : TypeTree => + //System.err.println("UNKNOWN TPT0: " + tpe0 + " " + tpe0.args + " " + tpt); + case sft : SelectFromTypeTree => + build(sft.qualifier); // XXX: broken + if (false) System.err.println("SFTT: " + sft + " sym=" + sft.symbol + " selector=" + sft.selector + " qual=" + sft.qualifier + " qual.sym=" + + sft.qualifier.symbol + + " qual.pos=" + unit.source.dbg(sft.qualifier.pos) + " symbol=" + sft.symbol + " type=" + tpe0 + + " type.sym=" + tpe0.symbol); + case _ => System.err.println("UNKNOWN TPT2: " + tree + " vs. " + tpe0 + " " + tree.getClass() + " " + unit.source.content(tree.pos)); + } + case tpe0 : MethodType => tree match { + case tpt: TypeTree => + if (tpt.original != null) buildT(tpt.original, tpe); + else { + System.err.println("UNKNOWN TPT3: " + tree + " vs. " + tpe0 + " " + unit.source.content(tree.pos)); + } + case ident : Ident => buildT(ident, tpe0.resultType); + case select : Select => buildT(select, tpe0.resultType); + case _ => System.err.println("UNKNOWN TPE: " + tree + " vs. " + tpe0 + " " + tree.getClass()); + } + case _ => // System.err.println("UNKNOWN: " + tree + " " + (if (tree != null) tree.getClass() else null) + " vs. " + tpe + " " + (if (tpe != null) tpe.getClass() else null) + " " + (if (tree != null) tree.pos else null)); + }; def buildTs(trees : List[Tree], types : List[Type]): Unit = if (!trees.isEmpty || !types.isEmpty) { - buildT (trees.head, types.head); - buildTs(trees.tail, types.tail); - }; - case tree : AbsTypeDef => - buildDef(tree.symbol, tree.namePos); - case tree : Bind => - buildDef(tree.symbol, tree.pos); - build(tree.body); + buildT (trees.head, types.head); + buildTs(trees.tail, types.tail); + }; + case tree : AbsTypeDef => buildDef(tree.symbol, tree.namePos); + case tree : Bind => buildDef(tree.symbol, tree.pos); + build(tree.body); case tree : Ident => buildUse(tree.symbol, tree.pos); case tree : Select => - // System.err.println("SELECT: " + tree.qualifier + " ** " + tree.symbol + " " + selectPos(tree)); - try { - build(tree.qualifier); - } catch { - case e : Error => System.err.println("SELECTQ: " + tree + " " + tree.qualifier + " " + unit.source.dbg(tree.qualifier.pos)); throw e; - } - try { - if (tree.pos >= unit.source.content.length) - System.err.println("BAD_SELECT_QUALIFIER " + tree + " @ " + tree.pos); - else buildUse(tree.symbol, selectPos(tree)); - } catch { - case e : Error => System.err.println("SELECTU: " + tree + " " + tree.symbol + " " + unit.source.dbg(tree.pos)); throw e; - } + // System.err.println("SELECT: " + tree.qualifier + " ** " + tree.symbol + " " + selectPos(tree)); + try { + build(tree.qualifier); + } catch { + case e : Error => System.err.println("SELECTQ: " + tree + " " + tree.qualifier + " " + unit.source.dbg(tree.qualifier.pos)); throw e; + } + try { + if (tree.pos >= unit.source.content.length) + System.err.println("BAD_SELECT_QUALIFIER " + tree + " @ " + tree.pos); + else buildUse(tree.symbol, selectPos(tree)); + } catch { + case e : Error => System.err.println("SELECTU: " + tree + " " + tree.symbol + " " + unit.source.dbg(tree.pos)); throw e; + } case tree : GenericApply => //System.err.println("APPLY-FUN: " + tree.fun0 + " " + tree.args0); build(tree.fun0); //System.err.println("APPLY-ARG: " + tree.fun0 + " " + tree.args0); - build(tree.args0); + build(tree.args0); case tree : Typed => build(tree.expr); build(tree.tpt); case tree : Import => //System.err.println("IMPORT: " + tree.expr + " " + tree.selectors); @@ -461,7 +458,7 @@ class SemanticTokens(val compiler: Compiler) { } str; }; - private object cursor { + object cursor { var token : Token = end; var offset : Int = 0; diff --git a/sources/scala/tools/nsc/models/Signatures.scala b/sources/scala/tools/nsc/models/Signatures.scala new file mode 100644 index 0000000000..3a779a7021 --- /dev/null +++ b/sources/scala/tools/nsc/models/Signatures.scala @@ -0,0 +1,65 @@ + +package scala.tools.nsc.models; + +import scala.tools.nsc.{Global => Compiler}; +import scala.tools.nsc.symtab.{Flags,Names}; +import scala.tools.nsc.util.{NameTransformer,Position,SourceFile}; +import scala.collection.mutable.{HashMap,HashSet}; + +class Signatures(val compiler: Compiler) { + import compiler._; + + class Signature(val name : String, val children : List[Signature]) { + def asString : String = name + "[" + asString0(children) + "]"; + } + def sort(sigs : List[Signature]) = + sigs.sort((l0,l1) => l0.name.compareTo(l1.name) > 0); + + def asString0(sigs : List[Signature]) : String = { + var ret = ""; + for (val sig <- sort(sigs)) + ret = ret + sig.asString; + ret; + } + + def signature(unit : CompilationUnit): String = asString0(signature(unit.body, Nil)); + + def signature(trees : List[Tree]) : List[Signature] = { + var ret : List[Signature] = Nil; + for (val tree <- trees) ret = signature(tree, ret); + ret; + } + def signature(tree0 : Tree, rest : List[Signature]) : List[Signature] = tree0 match { + case tree : MemberDef => if (!tree.mods.isPrivate) { + val name = "" + tree.name + "::" + tree.mods; + val children : List[Signature] = (tree match { + case impl : ImplDef => + val supers = new Signature("$$supers", signature(impl.impl.parents)); + val body = new Signature("$$body", signature(impl.impl.body)); + val ret = supers :: body :: Nil; + (impl match { + case cdef : ClassDef => new Signature("$$tparams", signature(cdef.tparams)) :: ret; + case _ => ret; + }); + case vdef : ValOrDefDef => + val ret = signature(vdef.tpt, Nil); + (vdef match { + case ddef : DefDef => + val tparams = new Signature("$$tparams", signature(ddef.tparams)); + var vparamss : List[Signature] = Nil; + for (val list <- ddef.vparamss) vparamss = signature(list) ::: vparamss; + tparams :: vparamss; + case _ => ret; + }); + case pdef : PackageDef => signature(pdef.stats); + case _ => Nil; + }); + new Signature(name, children) :: rest; + + } else rest; + case tree : TypeTree => new Signature("" + tree.tpe, Nil) :: rest; + case _ => rest; + } + + +} |