From f909d73594213c86c24cea70f136364b0623d831 Mon Sep 17 00:00:00 2001 From: paltherr Date: Mon, 1 Mar 2004 15:20:41 +0000 Subject: - Added new node DocDef - Added a "case DocDef" in Analyzer.enterSyms and Analyzer.transform - Split method Analyzer.transform into transform, transform0 and - transform1 --- sources/meta/scalac/ast/Tree.java | 8 ++ .../scala/tools/scalac/typechecker/Analyzer.scala | 95 ++++++++++++++-------- 2 files changed, 69 insertions(+), 34 deletions(-) diff --git a/sources/meta/scalac/ast/Tree.java b/sources/meta/scalac/ast/Tree.java index eb853b7164..c48b5be621 100644 --- a/sources/meta/scalac/ast/Tree.java +++ b/sources/meta/scalac/ast/Tree.java @@ -32,6 +32,7 @@ public class Tree { t_int = TreeType.INT, t_ints = TreeType.Array(t_int), t_Object = TreeType.Reference(null, "Object"), + t_String = TreeType.Reference(null, "String"), t_Global = TreeType.Reference("scalac", "Global"), t_Unit = TreeType.Reference("scalac", "Unit"), t_TreeGen = TreeType.Reference("scalac.ast", "TreeGen"), @@ -71,6 +72,7 @@ public class Tree { public final TreeNode n_Bad = node("Bad" , Any , HasSym), n_Empty = node("Empty" , Any , NoSym), + n_DocDef = node("DocDef" , None, NoSym), n_ClassDef = node("ClassDef" , None, DefSym), n_PackageDef = node("PackageDef" , None, NoSym), n_ModuleDef = node("ModuleDef" , None, DefSym), @@ -129,6 +131,12 @@ public class Tree { setRange(Phase.PARSER, Phase.UNKNOWN). noFields(); + n_DocDef. + setDescription("Documented definition"). + setRange(Phase.PARSER, Phase.ANALYZER). + addField(t_String, "comment"). + addField(t_Tree, "definition"); + n_ClassDef. setDescription("Class and data declaration"). setRange(Phase.PARSER, Phase.END). diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala index aef94bc2f1..e8649d884e 100644 --- a/sources/scala/tools/scalac/typechecker/Analyzer.scala +++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala @@ -753,6 +753,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( global.compiledNow.put(sym, unit.source); } + def outerEnterSym(tree: Tree): Symbol = enterSym(tree); /** If `tree' is a definition, create a symbol for it with a lazily * constructed type, and enter into current scope. */ @@ -820,6 +821,9 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( throw new ApplicationError(); } + case Tree$DocDef(comment, definition) => + outerEnterSym(definition) + case Tree$ClassDef(mods, name, tparams, vparams, _, templ) => val clazz: ClassSymbol = ClassSymbol.define( tree.pos, name, owner, mods, context.scope); @@ -1941,30 +1945,6 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( */ override def transform(tree: Tree): Tree = { - def qualifyingClass(tree: Tree, name: Name): Symbol = { - if (name == TypeNames.EMPTY) { - val clazz: Symbol = context.enclClass.owner; - if (clazz != null) - clazz - else { - error(tree.pos, "" + tree + - " can be used only in a class, object, or template"); - Symbol.ERROR - } - } else { - var i: Context = context; - while (i != Context.NONE && - !(i.owner.kind == CLASS && i.owner.name == name)) - i = i.outer; - if (i != Context.NONE) - i.owner - else { - error(tree.pos, "" + name + " is not an enclosing class"); - Symbol.ERROR - } - } - } - //System.out.println("transforming " + tree);//DEBUG if (tree.getType() != null) { checkDefined.all = tree; checkDefined.traverse(tree);//debug @@ -1974,6 +1954,21 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( if (sym != null && !sym.isInitialized()) sym.initialize(); if (global.debug && TreeInfo.isDefinition(tree)) global.log("transforming definition of " + sym); try { + transform0(tree, sym); + } catch { + case ex: Type$Error => + reportTypeError(tree.pos, ex); + tree.setType(Type.ErrorType); + if (tree.hasSymbol()) { + if (tree.symbol() != null) tree.symbol().setInfo(Type.ErrorType); + else tree.setSymbol(Symbol.ERROR); + } + tree; + } + } + + // extracted from transform to avoid overflows in GenJVM + def transform0(tree: Tree, sym: Symbol): Tree = { tree match { case Tree$Bad() => tree.setSymbol(Symbol.ERROR).setType(Type.ErrorType) @@ -1981,6 +1976,15 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( case Tree.Empty => tree.setType(Type.NoType) + case Tree$DocDef(comment, definition) => + val defined = definition match { + case Tree$PackageDef(pkg, _) => pkg.symbol() + case _ => definition.symbol() + } + assert(defined != null, tree); + global.mapSymbolComment.put(defined, new Pair(comment, unit)); + transform(definition) + case Tree$PackageDef(pkg, templ @ Tree$Template(parents, body)) => val pkgSym: Symbol = pkg.symbol(); if (pkgSym != null && pkgSym.isPackage()) { @@ -2089,6 +2093,39 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( context.imports = new ImportList(tree, context.scope, context.imports); Tree.Empty + case _ => + transform1(tree, sym) + } + } + + // extracted from transform0 to avoid overflows in GenJVM + def transform1(tree: Tree, sym: Symbol): Tree = { + + def qualifyingClass(tree: Tree, name: Name): Symbol = { + if (name == TypeNames.EMPTY) { + val clazz: Symbol = context.enclClass.owner; + if (clazz != null) + clazz + else { + error(tree.pos, "" + tree + + " can be used only in a class, object, or template"); + Symbol.ERROR + } + } else { + var i: Context = context; + while (i != Context.NONE && + !(i.owner.kind == CLASS && i.owner.name == name)) + i = i.outer; + if (i != Context.NONE) + i.owner + else { + error(tree.pos, "" + name + " is not an enclosing class"); + Symbol.ERROR + } + } + } + + tree match { case Tree$Block(stats, value) => pushContext(tree, context.owner, new Scope(context.scope)); val stats1 = desugarize.Statements(stats, true); @@ -2801,16 +2838,6 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( case _ => throw new ApplicationError("illegal tree: " + tree) } - } catch { - case ex: Type$Error => - reportTypeError(tree.pos, ex); - tree.setType(Type.ErrorType); - if (tree.hasSymbol()) { - if (tree.symbol() != null) tree.symbol().setInfo(Type.ErrorType); - else tree.setSymbol(Symbol.ERROR); - } - tree; - } } } } -- cgit v1.2.3