diff options
author | Gilles Dubochet <gilles.dubochet@epfl.ch> | 2005-12-18 18:33:03 +0000 |
---|---|---|
committer | Gilles Dubochet <gilles.dubochet@epfl.ch> | 2005-12-18 18:33:03 +0000 |
commit | d3819b93ab8b2de3d5cc35c33b8258ccdb5a931a (patch) | |
tree | dfc6f7f497e58ea3321e6f687b11313d2afa86b5 /sources/scalac/checkers/TreeChecker.java | |
parent | 0e82079908655682e5140ad521cef0572cb6d2a4 (diff) | |
download | scala-d3819b93ab8b2de3d5cc35c33b8258ccdb5a931a.tar.gz scala-d3819b93ab8b2de3d5cc35c33b8258ccdb5a931a.tar.bz2 scala-d3819b93ab8b2de3d5cc35c33b8258ccdb5a931a.zip |
Removed old Scalac code in sources and various ...
Removed old Scalac code in sources and various other obsolete elements.
Diffstat (limited to 'sources/scalac/checkers/TreeChecker.java')
-rw-r--r-- | sources/scalac/checkers/TreeChecker.java | 637 |
1 files changed, 0 insertions, 637 deletions
diff --git a/sources/scalac/checkers/TreeChecker.java b/sources/scalac/checkers/TreeChecker.java deleted file mode 100644 index d5e7aac987..0000000000 --- a/sources/scalac/checkers/TreeChecker.java +++ /dev/null @@ -1,637 +0,0 @@ -/* ____ ____ ____ ____ ______ *\ -** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala ** -** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL ** -** /_____/\____/\___/\____/____/ ** -\* */ - -// $Id$ - -package scalac.checkers; - -import java.util.Iterator; -import java.util.HashSet; -import java.util.Set; -import java.util.Stack; - -import scala.tools.util.Position; - -import scalac.CompilationUnit; -import scalac.ast.Tree; -import scalac.ast.Tree.AbsTypeDef; -import scalac.ast.Tree.Ident; -import scalac.ast.Tree.Template; -import scalac.ast.Tree.ValDef; -import scalac.ast.TreeInfo; -import scalac.symtab.Definitions; -import scalac.symtab.Symbol; -import scalac.symtab.Type; -import scalac.util.Debug; - -/** - * This checker checks that trees are well-formed. It checks both the - * shape and the attribution of the trees. WARNING: currently, the - * checks are valid only for trees generated by phase AddConstructors. - */ -public class TreeChecker { - - //######################################################################## - // Private Fields - - /** The global definitions */ - private final Definitions definitions; - - /** The stack of current units */ - private final Stack/*<CompilationUnit>*/ units = new Stack(); - - /** The stack of current classes */ - private final Stack/*<Symbol>*/ classes = new Stack(); - - /** The stack of current members */ - private final Stack/*<Symbol>*/ members = new Stack(); - - /** The stack of current owners */ - private final Stack/*<Symbol>*/ owners = new Stack(); - - /** The currently visible type variables */ - private final Set/*<Symbol>*/ tvars = new HashSet(); - - /** The currently visible value variables */ - private final Set/*<Symbol>*/ vvars = new HashSet(); - - /** The currently visible labels */ - private final Set/*<Symbol>*/ labels = new HashSet(); - - /** The currently defined symbols */ - private final Set/*<Symbol>*/ symbols = new HashSet(); - - //######################################################################## - // Public Constructors - - /** Initializes this instance. */ - public TreeChecker(Definitions definitions) { - this.definitions = definitions; - } - - //######################################################################## - // Public Methods - Checking units - - /** Checks the unit. Returns true. */ - public boolean check(CompilationUnit unit) { - pushUnit(unit); - template(unit.body); - popUnit(); - return true; - } - - //######################################################################## - // Private Methods - Checking templates - - /** Checks the templates. Returns true. */ - private boolean template(Tree[] trees) { - for (int i = 0; i < trees.length; i++) template(trees[i]); - return true; - } - - /** Checks the template. Returns true. */ - private boolean template(Tree tree) { - switch (tree) { - - case Empty: - return true; - - case ClassDef(_, _, AbsTypeDef[] tparams, ValDef[][] vparams, _, Template(_, Tree[] body)): - Symbol symbol = tree.symbol(); - assert symbol != null && symbol.isClass(): show(tree); - assert vparams.length == 1: show(tree); - containSymbols(tparams, symbol.typeParams()); - containSymbols(vparams[0],symbol.valueParams()); - registerSymbol(symbol); - scopeInsertParametersOf(symbol); - pushClass(symbol); - member(body); - popClass(); - scopeRemoveParametersOf(symbol); - return true; - - case PackageDef(Tree packaged, Template(Tree[] bases, Tree[] body)): - Symbol symbol = packaged.symbol(); - assert symbol != null && symbol.isPackage(): show(packaged); - assert bases.length == 0: show(tree); - pushOwner(symbol); - template(body); - popOwner(); - return true; - - default: - throw Debug.abort("illegal case", tree); - } - } - - //######################################################################## - // Private Methods - Checking members - - /** Checks the members. Returns true. */ - private boolean member(Tree[] trees) { - for (int i = 0; i < trees.length; i++) member(trees[i]); - return true; - } - - /** Checks the member. Returns true. */ - private boolean member(Tree tree) { - switch (tree) { - - case Empty: - return true; - - case ClassDef(_, _, _, _, _, _): - return template(tree); - - case ValDef(_, _, _, Tree rhs): - Symbol symbol = tree.symbol(); - assert symbol != null && symbol.isTerm(): show(tree); - assert rhs == Tree.Empty: show(tree); - registerSymbol(symbol); - pushMember(symbol); - popMember(); - return true; - - case DefDef(_, _, AbsTypeDef[]tparams, ValDef[][]vparams, _, Tree rhs): - Symbol symbol = tree.symbol(); - assert symbol != null && symbol.isMethod(): show(tree); - assert vparams.length == 1: show(tree); - containSymbols(tparams, symbol.typeParams()); - containSymbols(vparams[0],symbol.valueParams()); - assert symbol.isDeferred() == (rhs == Tree.Empty): show(tree); - registerSymbol(symbol); - scopeInsertParametersOf(symbol); - pushMember(symbol); - if (!symbol.isDeferred()) expression(rhs, symbol.resultType()); - popMember(); - scopeRemoveParametersOf(symbol); - return true; - - default: - throw Debug.abort("illegal case", tree); - } - } - - //######################################################################## - // Private Methods - Checking statements - - /** Checks the statement. Returns true. */ - private boolean statement(Set locals, Tree tree) { - switch (tree) { - - case Empty: - return true; - - case ValDef(_, _, _, Tree rhs): - Symbol symbol = tree.symbol(); - assert symbol != null && symbol.isTerm(): show(tree); - scopeInsertVVariable(symbol, false); - locals.add(symbol); - pushOwner(symbol); - expression(rhs, symbol.type()); - popOwner(); - return true; - - default: - return expression(tree, tree.type()); - } - } - - //######################################################################## - // Private Methods - Checking expressions - - /** Checks the expression of given expected type. Returns true. */ - private boolean expression(Tree tree, Type expected) { - // !!! conforms(tree, expected); - expected = tree.type(); - switch (tree) { - - case LabelDef(_, Ident[] idents, Tree rhs): - Symbol symbol = tree.symbol(); - assert symbol != null && symbol.isLabel(): show(tree); - Symbol[] params = symbol.type().valueParams(); - assert params.length == idents.length: show(tree) - + format("params", Debug.show(params)); - for (int i = 0; i < idents.length; i++) { - location(idents[i]); - conforms(idents[i], definitions.ANY_TYPE(), params[i].type()); - Symbol local = idents[i].symbol(); - assert local != null && !local.isModule(): show(idents[i]); - } - conforms(tree, symbol.resultType()); - scopeInsertLabel(symbol); - expression(rhs, symbol.resultType()); - scopeRemoveLabel(symbol); - return true; - - case Block(Tree[] statements, Tree value): - Set locals = new HashSet(); - for (int i = 0; i < statements.length; i++) - statement(locals, statements[i]); - expression(value, expected); - for (Iterator i = locals.iterator(); i.hasNext(); ) - scopeRemoveVVariable((Symbol)i.next()); - return true; - - case Assign(Tree lhs, Tree rhs): - location(lhs); - expression(rhs, lhs.type().widen()); - return true; - - case If(Tree cond, Tree thenp, Tree elsep): - expression(cond, definitions.boolean_TYPE()); - expression(thenp, expected); - expression(elsep, expected); - return true; - - case Switch(Tree test, _, Tree[] bodies, Tree otherwise): - expression(test, definitions.int_TYPE()); - for (int i = 0; i < bodies.length; i++) - expression(bodies[i], expected); - expression(otherwise, expected); - return true; - - case Return(Tree value): - Symbol symbol = tree.symbol(); - assert symbol != null && symbol.isMethod(): show(tree); - assert currentMember() == symbol: show(tree); - return expression(value, currentMember().resultType()); - - case Throw(Tree value): - return expression(value, definitions.THROWABLE_TYPE()); - - case New(Tree init): - switch (init) { - case Apply(Select(Create(_, Tree[] targs), _), Tree[] vargs): - return expression(init, definitions.void_TYPE()); - default: - throw Debug.abort("illegal case", show(tree)); - } - - case Create(Tree qualifier, Tree[] targs): - assert qualifier == Tree.Empty: show(tree); - Symbol symbol = tree.symbol(); - assert symbol != null && symbol.isClass(): show(tree); - return true; - - case Apply(Tree vfun, Tree[] vargs): - vapply(tree, vfun.type(), vargs); - switch (vfun) { - case TypeApply(Tree tfun, Tree[] targs): - Symbol symbol = tfun.symbol(); - assert symbol != null && !symbol.isLabel(): show(tree); - tapply(tree, tfun.type(), targs); - return function(tfun); - default: - return function(vfun); - } - - case Super(_, _): - case This(_): - Symbol symbol = tree.symbol(); - assert symbol != null && symbol.isClass(): show(tree); - assert symbol == currentClass(): show(tree); - return true; - - case Select(_, _): - case Ident(_): - return location(tree); - - case Literal(_): - return true; - - default: - throw Debug.abort("illegal case", show(tree)); - } - } - - /** Checks the type application. Returns true. */ - private boolean tapply(Tree tree, Type function, Tree[] args) { - Symbol[] params = function.typeParams(); - assert params.length == args.length: show(tree) - + format("params", Debug.show(params)); - Type.Map subst = Type.getSubst(params, Tree.typeOf(args)); - for (int i = 0; i < args.length; i++) { - Type expected = subst.apply(params[i].info()); - Type loBound = subst.apply(params[i].loBound()); - conforms(args[i], expected, loBound); - } - conforms(tree, subst.apply(function.resultType())); - return true; - } - - /** Checks the value application. Returns true. */ - private boolean vapply(Tree tree, Type function, Tree[] args) { - Symbol[] params = function.valueParams(); - assert params.length == args.length: show(tree) - + format("params", Debug.show(params)); - for (int i = 0; i < args.length; i++) - expression(args[i], params[i].type()); - conforms(tree, function.resultType()); - return true; - } - - //######################################################################## - // Private Methods - Checking functions - - /** Checks the function. Returns true. */ - private boolean function(Tree tree) { - Symbol symbol = tree.symbol(); - assert symbol != null && symbol.isTerm(): show(tree); - assert symbol.isMethod(): show(tree); - switch (tree) { - - case Select(Tree qualifier, _): - if (qualifier instanceof Tree.Create) - assert symbol.isInitializer(): show(tree); - return selection(tree); - - case Ident(_): - if (!symbol.isLabel() && symbol.isStatic()) return true; - assert labels.contains(symbol): show(tree); - assert symbol.owner() == currentMember(): show(tree); - return true; - - default: - throw Debug.abort("illegal case", tree); - } - } - - /** Checks the location. Returns true. */ - private boolean location(Tree tree) { - Symbol symbol = tree.symbol(); - assert symbol != null && symbol.isTerm(): show(tree); - assert !symbol.isMethod(): show(tree); - switch (tree) { - - case Select(_, _): - return selection(tree); - - case Ident(_): - if (symbol.isStatic()) return true; - assert vvars.contains(symbol): show(tree); - assert symbol.owner() == currentMember(): show(tree); - return true; - - default: - throw Debug.abort("illegal case", tree); - } - } - - //######################################################################## - // Private Methods - Checking selection - - /** Checks the selection. Returns true. */ - private boolean selection(Tree tree) { - switch (tree) { - - case Select(Tree qualifier, _): - Symbol symbol = tree.symbol(); - assert symbol != null && symbol.isTerm(): show(tree); - Symbol owner = symbol.owner(); - assert owner.isClass() && !owner.isStaticOwner(): show(tree); - assert qualifier.type().baseType(owner) != Type.NoType: - show(tree) + format("qual.type", qualifier.type()); - return expression(qualifier, qualifier.type()); - - default: - throw Debug.abort("illegal case", tree); - } - } - - //######################################################################## - // Private Methods - Checking helpers - - /** Do the trees contain the given symbols? */ - private void containSymbols(Tree[] trees, Symbol[] symbols) { - boolean ok = trees.length == symbols.length; - for (int i = 0; ok && i < trees.length; i++) - ok &= trees[i].symbol() == symbols[i]; - assert ok: show() + format("trees", trees) + format("symbols",symbols); - } - - /** Does the type conform to the expected type and lower bound? */ - private void conforms(Tree tree, Type expected, Type loBound) { - conforms(tree, expected); - if (false && !loBound.isSubType(tree.type())) { // !!! false && - Type.explainSwitch = true; - assert loBound.isSubType(tree.type()): show(tree) - + format("loBound", expected); - Type.explainSwitch = false; - } - } - - /** Does the type conform to the expected type? */ - private void conforms(Tree tree, Type expected) { - if (!tree.type().isSubType(expected)) { - Type.explainSwitch = true; - assert tree.type().isSubType(expected): show(tree) - + format("expected", expected); - Type.explainSwitch = false; - } - } - - //######################################################################## - // Private Methods - Declaring symbols - - /** Remove parameters of symbol from current scope. */ - private void scopeInsertParametersOf(Symbol symbol) { - Symbol[] tparams = symbol.typeParams(); - for (int i = 0; i < tparams.length; i++) - scopeInsertTVariable(tparams[i], true); - Symbol[] vparams = symbol.valueParams(); - for (int i = 0; i < vparams.length; i++) - scopeInsertVVariable(vparams[i], true); - } - - /** Adds the type variable to the current scope. */ - private void scopeInsertTVariable(Symbol symbol, boolean isParameter) { - assert !symbol.owner().isClass(): show(symbol); - assert symbol.isParameter() == isParameter: show(symbol); - registerSymbol(symbol); - tvars.add(symbol); - } - - /** Adds the value variable to the current scope. */ - private void scopeInsertVVariable(Symbol symbol, boolean isParameter) { - assert !symbol.owner().isClass(): show(symbol); - assert symbol.isParameter() == isParameter: show(symbol); - registerSymbol(symbol); - vvars.add(symbol); - } - - /** Adds the label to current scope. */ - private void scopeInsertLabel(Symbol symbol) { - assert !symbol.owner().isClass(): show(symbol); - registerSymbol(symbol); - labels.add(symbol); - } - - /** Remove parameters of symbol from current scope. */ - private void scopeRemoveParametersOf(Symbol symbol) { - Symbol[] tparams = symbol.typeParams(); - for (int i = 0; i < tparams.length; i++) - scopeRemoveTVariable(tparams[i]); - Symbol[] vparams = symbol.valueParams(); - for (int i = 0; i < vparams.length; i++) - scopeRemoveVVariable(vparams[i]); - } - - /** Removes the type variable from current scope. */ - private void scopeRemoveTVariable(Symbol symbol) { - boolean removed = tvars.remove(symbol); - assert removed: show(symbol); - } - - /** Removes the value variable from current scope. */ - private void scopeRemoveVVariable(Symbol symbol) { - boolean removed = vvars.remove(symbol); - assert removed: show(symbol); - } - - /** Removes the label symbol from current scope. */ - private void scopeRemoveLabel(Symbol symbol) { - boolean removed = labels.remove(symbol); - assert removed: show(symbol); - } - - /** Registers the symbol. */ - private void registerSymbol(Symbol symbol) { - boolean added = symbols.add(symbol); - assert added: show(symbol); - } - - //######################################################################## - // Private Methods - Managing current context - - /** Returns the current unit. */ - private CompilationUnit currentUnit() { - return units.size() > 0 ? (CompilationUnit)units.peek() : null; - } - - /** Returns the current class. */ - private Symbol currentClass() { - return classes.size() > 0 ? (Symbol)classes.peek() : null; - } - - /** Returns the current member. */ - private Symbol currentMember() { - return members.size() > 0 ? (Symbol)members.peek() : null; - } - - /** Returns the current owner. */ - private Symbol currentOwner() { - return owners.size() > 0 ? (Symbol)owners.peek() : null; - } - - /** Sets the current unit to the given one. */ - private void pushUnit(CompilationUnit unit) { - assert units.size() == 0: showPush(unit); - assert classes.size() == 0: showPush(unit); - assert members.size() == 0: showPush(unit); - units.push(unit); - } - - /** Sets the current class to the given one. */ - private void pushClass(Symbol clasz) { - assert clasz.isClass(): showPush(clasz); - assert members.size() == 0: showPush(clasz); - classes.push(clasz); - pushOwner(clasz); - } - - /** Sets the current member to the given one. */ - private void pushMember(Symbol member) { - assert member.isTerm(): showPush(member); - assert members.size() == 0: showPush(member); - assert member.owner() == currentClass(): showPush(member); - members.push(member); - pushOwner(member); - } - - /** Sets the current owner to the given one. */ - private void pushOwner(Symbol owner) { - owners.push(owner); - } - - /** Sets the current unit to the previous one. */ - private void popUnit() { - assert units.size() > 0: show(); - units.pop(); - } - - /** Sets the current class to the previous one. */ - private void popClass() { - assert members.size() == 0: show(); - assert classes.size() > 0: show(); - popOwner(); - classes.pop(); - } - - /** Sets the current member to the previous one. */ - private void popMember() { - assert members.size() > 0: show(); - popOwner(); - members.pop(); - } - - /** Sets the current owner to the previous one. */ - private void popOwner() { - assert owners.size() > 0: show(); - owners.pop(); - } - - //######################################################################## - // Private Methods - Showing errors - - /** Returns the current position. */ - private String show() { - return format("unit", currentUnit()) - + format("clasz", currentClass()) - + format("member", currentMember()) - + format("owner", currentOwner()); - } - - /** Returns the current position and given header and value. */ - private String show(String header, Object value) { - return show() + format(header, value); - } - - /** Returns the current position and given symbol. */ - private String show(Symbol symbol) { - return show("symbol", symbol) - + format("symbol.pos", Position.toString(symbol.pos)) - + format("symbol.info", symbol.info()); - } - - /** Returns the current position and given tree. */ - private String show(Tree tree) { - return show("tree", tree) - + format("tree.pos", Position.toString(tree.pos)) - + format("tree.symbol", tree.symbol()) - + format("tree.type", tree.type()); - } - - /** Returns the current position and given pushed value. */ - private String showPush(Object value) { - return show("pushing", value); - } - - /** Returns a string with the given header and value. */ - private String format(String header, Object value) { - while (header.length() < 12) header = header + ' '; - return "\n" + header + ": " + toString(value); - } - - /** Returns a string representation of the given value. */ - private String toString(Object value) { - if (value instanceof Symbol) return Debug.show(value); - if (value instanceof Object[]) return Debug.show(value); - return String.valueOf(value); - } - - //######################################################################## -} |