summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2004-03-01 15:20:41 +0000
committerpaltherr <paltherr@epfl.ch>2004-03-01 15:20:41 +0000
commitf909d73594213c86c24cea70f136364b0623d831 (patch)
tree1e589ba89a7f119431f26ae1bee5d1c87e4adc25
parent4066bd9c1579ce1d5f8b85735149397dfaa4a076 (diff)
downloadscala-f909d73594213c86c24cea70f136364b0623d831.tar.gz
scala-f909d73594213c86c24cea70f136364b0623d831.tar.bz2
scala-f909d73594213c86c24cea70f136364b0623d831.zip
- Added new node DocDef
- Added a "case DocDef" in Analyzer.enterSyms and Analyzer.transform - Split method Analyzer.transform into transform, transform0 and - transform1
-rw-r--r--sources/meta/scalac/ast/Tree.java8
-rw-r--r--sources/scala/tools/scalac/typechecker/Analyzer.scala95
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;
- }
}
}
}