From 556ac3b679201441d83c6d226e005318fec37658 Mon Sep 17 00:00:00 2001 From: paltherr Date: Sun, 4 Apr 2004 20:30:28 +0000 Subject: - Removed Tree.Bad --- sources/meta/scalac/ast/Tree.java | 5 -- .../tools/scalac/ast/parser/MarkupParser.scala | 2 +- sources/scala/tools/scalac/ast/parser/Parser.scala | 34 +++++---- .../tools/scalac/ast/printer/TextTreePrinter.scala | 3 - .../scala/tools/scalac/typechecker/Analyzer.scala | 80 ++++++++++++++-------- sources/scala/tools/scalac/typechecker/Infer.scala | 3 +- sources/scalac/backend/jvm/GenJVM.java | 2 - 7 files changed, 75 insertions(+), 54 deletions(-) (limited to 'sources') diff --git a/sources/meta/scalac/ast/Tree.java b/sources/meta/scalac/ast/Tree.java index 98cdc00414..4545d6915a 100644 --- a/sources/meta/scalac/ast/Tree.java +++ b/sources/meta/scalac/ast/Tree.java @@ -70,7 +70,6 @@ public class Tree { // Public Fields 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), @@ -122,10 +121,6 @@ public class Tree { public Tree() { nodes = (TreeNode[])list.toArray(new TreeNode[list.size()]); - n_Bad. - setDescription("Representation for parser errors"). - setRange(Phase.PARSER, Phase.END); - n_Empty. setDescription("A tree node for the absence of a tree"). setRange(Phase.PARSER, Phase.UNKNOWN). diff --git a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala b/sources/scala/tools/scalac/ast/parser/MarkupParser.scala index d879491cac..56953f55a5 100644 --- a/sources/scala/tools/scalac/ast/parser/MarkupParser.scala +++ b/sources/scala/tools/scalac/ast/parser/MarkupParser.scala @@ -243,7 +243,7 @@ class MarkupParser( unit:Unit, s:Scanner, p:Parser ) { tmp case _ => s.xSyntaxError( "' or \" delimited attribute value or '{' scala-expr '}' expected" ); - make.Bad(s.pos) + gen.mkStringLit( s.pos, "" ) } // well-formedness constraint: unique attribute names if( aMap.contains( key )) diff --git a/sources/scala/tools/scalac/ast/parser/Parser.scala b/sources/scala/tools/scalac/ast/parser/Parser.scala index 59fa4cf0fe..59d9a2821e 100644 --- a/sources/scala/tools/scalac/ast/parser/Parser.scala +++ b/sources/scala/tools/scalac/ast/parser/Parser.scala @@ -7,6 +7,7 @@ \* */ import scalac.symtab.Modifiers; +import scalac.symtab.Type; import scalac.ast._; import scalac.atree.AConstant; import scalac._; @@ -91,16 +92,15 @@ class Parser(unit: Unit) { } } - def syntaxError(msg: String, skipIt: boolean): Tree = + def syntaxError(msg: String, skipIt: boolean): unit = syntaxError(s.pos, msg, skipIt); - def syntaxError(pos: int, msg: String, skipIt: boolean): Tree = { + def syntaxError(pos: int, msg: String, skipIt: boolean): unit = { if (pos != s.errpos) { s.unit.error(pos, msg); s.errpos = pos; } if (skipIt) skip(); - make.Bad(pos) } def accept(token: int): int = { @@ -388,7 +388,8 @@ class Parser(unit: Unit) { make.ValDef( tree.pos, Modifiers.PARAM, name, tpe, Tree.Empty) case _ => - val tpe = syntaxError(tree.pos, "not a legal formal parameter", false); + syntaxError(tree.pos, "not a legal formal parameter", false); + val tpe = gen.mkType(tree.pos, Type.ErrorType); make.ValDef( tree.pos, Modifiers.PARAM, Names.ERROR, tpe, Tree.Empty) } @@ -413,7 +414,8 @@ class Parser(unit: Unit) { make.Select(t.pos, qual, name.toTypeName()) case _ => Console.println( "class instead "+t.getClass() ); - syntaxError(t.pos, "class constructor expected", false) + syntaxError(t.pos, "class constructor expected", false); + gen.mkType(t.pos, Type.ErrorType) } /** Complete unapplied constructor with `()' arguments @@ -617,7 +619,8 @@ class Parser(unit: Unit) { case NULL => gen.mkNullLit(s.pos) case _ => - syntaxError("illegal literal", true) + syntaxError("illegal literal", true); + gen.mkZeroLit(s.pos) } val isSymLit = s.token == SYMBOLLIT; @@ -1003,7 +1006,8 @@ class Parser(unit: Unit) { t = make.Function( pos, convertToParams(ts.toArray()), Tree.Empty); } else { - t = syntaxError(commapos, "`)' expected", false); + syntaxError(commapos, "`)' expected", false); + t = gen.mkZeroLit(pos) } } else { accept(RPAREN); @@ -1033,7 +1037,8 @@ class Parser(unit: Unit) { pos, make.Apply(pos, make.Ident(pos, name), Tree.EMPTY_ARRAY))); } case _ => - return syntaxError("illegal start of expression", true); + syntaxError("illegal start of expression", true); + return gen.mkZeroLit(s.pos); } while (true) { s.token match { @@ -1172,7 +1177,7 @@ class Parser(unit: Unit) { // normalize pN.wrapAlternative(pN.elimSequence(pN.flattenSequence(pat))) } else { - make.Bad(pos) + make.Ident(pos, Names.PATTERN_WILDCARD) } } @@ -1184,7 +1189,7 @@ class Parser(unit: Unit) { if(this.pN.check(pat)) { // reports syntax errors as side effect pN.wrapAlternative(pN.elimSequence(pN.flattenSequence(pat))) } else { - make.Bad(pos) + make.Ident(pos, Names.PATTERN_WILDCARD) } } @@ -1350,7 +1355,8 @@ class Parser(unit: Unit) { accept(RPAREN); t case _ => - syntaxError("illegal start of pattern", true) + syntaxError("illegal start of pattern", true); + make.Ident(s.pos, Names.PATTERN_WILDCARD) } ////////// MODIFIERS //////////////////////////////////////////////////////////// @@ -1668,7 +1674,8 @@ class Parser(unit: Unit) { case CASEOBJECT => objectDef(mods | Modifiers.CASE); case _ => - NewArray.Tree(syntaxError("illegal start of definition", true)) + syntaxError("illegal start of definition", true); + Tree.EMPTY_ARRAY } } @@ -1834,7 +1841,8 @@ class Parser(unit: Unit) { case SUPERTYPE | SUBTYPE | VIEWBOUND | SEMI | COMMA | RBRACE => typeBounds(pos, mods | Modifiers.DEFERRED, name) case _ => - syntaxError("`=', `>:', or `<:' expected", true) + syntaxError("`=', `>:', or `<:' expected", true); + Tree.Empty; } } diff --git a/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala b/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala index b4ca7f1000..1aabbfd2e6 100644 --- a/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala +++ b/sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala @@ -221,9 +221,6 @@ class TextTreePrinter(writer: PrintWriter) with TreePrinter { def print(tree: Tree): TreePrinter = { tree match { - case Tree$Bad() => - print(TXT_ERROR); - case Tree.Empty => print(TXT_EMPTY); diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala index d0df134245..2ee82cb803 100644 --- a/sources/scala/tools/scalac/typechecker/Analyzer.scala +++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala @@ -191,14 +191,39 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( // Diagnostics ---------------------------------------------------------------- - def errorTree(pos: int): Tree = - make.Bad(pos).setSymbol(Symbol.ERROR).setType(Type.ErrorType); + private def errorName(tree: Tree): Name = + Name.fromString(""); - def error(pos: int, msg: String): Tree = { - unit.error(pos, msg); - errorTree(pos); + private def errorTree(tree: Tree): Tree = + if (tree.isType()) errorTypeTree(tree) else errorTermTree(tree); + + private def errorTypeTree(tree: Tree): Tree = { + val symbol = context.owner.newErrorClass(errorName(tree).toTypeName()); + tree match { + case Tree$Ident(_) => + if (tree.symbol() == null) tree.setSymbol(symbol); + make.Ident(tree.pos, symbol).setType(Type.ErrorType); + errorTermTree(tree); + case Tree$Select(qualifier, _) => + if (tree.symbol() == null) tree.setSymbol(symbol); + make.Select(tree.pos, symbol, qualifier).setType(Type.ErrorType); + errorTermTree(tree); + case _ => + gen.mkType(tree.pos, Type.ErrorType); + } } + private def errorTermTree(tree: Tree): Tree = + gen.mkLocalRef(tree.pos, Symbol.NONE.newErrorValue(errorName(tree))); + + def error(tree: Tree, msg: String): Tree = { + error(tree.pos, msg); + errorTree(tree); + } + + def error(pos: int, msg: String): unit = + unit.error(pos, msg); + def typeError(pos: int, found: Type, req: Type): unit = { var msg: String = infer.typeErrorMsg("type mismatch", found, req); val foundResult: Type = found.resultType(); @@ -207,7 +232,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( error(pos, msg); } - def reportTypeError(pos: int, ex: Type$Error): Tree = { + def reportTypeError(pos: int, ex: Type$Error): unit = { if (global.debug) ex.printStackTrace(); if (ex.isInstanceOf[CyclicReference]) { val cyc: CyclicReference = ex.asInstanceOf[CyclicReference]; @@ -486,7 +511,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( */ def checkStable(tree: Tree): Tree = if (TreeInfo.isPureExpr(tree) || tree.getType().isError()) tree; - else error(tree.pos, "stable identifier required, but " + tree + " found."); + else error(tree, "stable identifier required, but " + tree + " found."); /** Check that class can be instantiated. */ @@ -1316,7 +1341,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( tree1 = infer.exprInstance(tree, tparams, restp, pt); } catch { case ex: Type$Error => - tree1 = error(tree.pos, ex.msg); + tree1 = error(tree, ex.msg); } return adapt(tree1, mode, pt); } @@ -1329,7 +1354,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( checkEtaExpandable(tree.pos, tree.getType()); return transform(desugarize.etaExpand(tree, tree.getType()), mode, pt); } else if ((mode & (CONSTRmode | FUNmode)) == CONSTRmode) { - return error(tree.pos, "missing arguments for class constructor"); + return error(tree, "missing arguments for class constructor"); } case _ => @@ -1373,11 +1398,11 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( } tree.setType(seqConstructorType(seqtp, pt)); } else { - return error(tree.pos, "expected pattern type " + pt + + return error(tree, "expected pattern type " + pt + " does not conform to sequence " + clazz); } } else if (!tree.getType().isError()) { - return error(tree.pos, "" + tree.getType().symbol() + + return error(tree, "" + tree.getType().symbol() + " is neither a case class constructor nor a sequence class constructor"); } } @@ -1413,7 +1438,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( case Tree$Ident(_) | Tree$Select(_, _) => val sym: Symbol = tree.symbol(); if (sym != null && !sym.isError() && !sym.isValue()) { - return error(tree.pos, "" + tree.symbol() + " is not a value"); + return error(tree, "" + tree.symbol() + " is not a value"); } case _ => } @@ -1542,7 +1567,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( } } } else if (sym.kind != NONE && !sym.isExternal()) { - return error(tree.pos, + return error(tree, "reference to " + name + " is ambiguous;\n" + "it is both defined in " + sym.owner() + " and imported subsequently by \n" + lastimports.tree); @@ -1550,7 +1575,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( // check that there are no other applicable imports in same scope. while (nextimports != null && nextimports.enclScope == lastimports.enclScope) { if (!nextimports.sameImport(lastimports) && nextimports.importedSymbol(name).kind != NONE) { - return error(tree.pos, + return error(tree, "reference to " + name + " is ambiguous;\n" + "it is imported twice in the same scope by\n " + lastimports.tree + "\nand " + nextimports.tree); @@ -1572,7 +1597,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( else if (sym.owner().isPackageClass()) symtype = infer.checkAccessible(tree.pos, sym, symtype, qual, sym.owner().getType()); if (symtype == Type.NoType) - return error(tree.pos, "not found: " + decode(name)); + return error(tree, "not found: " + decode(name)); //System.out.println(name + ":" + symtype);//DEBUG mkStable(tree.setSymbol(sym).setType(symtype), pre, mode, pt) } @@ -1601,7 +1626,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( } else { //System.out.println(qual.getType() + " has members " + qual.getType().members());//DEBUG return error( - tree.pos, + tree, decode(name) + " is not a member of " + qual.getType().widen()); } } @@ -1613,7 +1638,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( (if (sym.isType()) sym.typeConstructor() else sym.getType()) .asSeenFrom(qualtype, sym.owner()); if (symtype == Type.NoType) - return error(tree.pos, "not found: " + decode(name)); + return error(tree, "not found: " + decode(name)); else symtype = infer.checkAccessible(tree.pos, sym, symtype, qual, qualtype); //System.out.println(sym.name + ":" + symtype);//DEBUG @@ -1943,7 +1968,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( if ((mode & TYPEmode) != 0) { val sym: Symbol = tree1.symbol(); if ((mode & FUNmode) == 0 && sym != null && sym.typeParams().length != 0) - return error(tree.pos, "" + sym + " takes type parameters.") + return error(tree, "" + sym + " takes type parameters.") // else if (tree1.isType()) // return gen.mkType(tree1.pos, tree1.getType()); } @@ -2002,9 +2027,6 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( // extracted from transform to avoid overflows in GenJVM private def transform0(tree: Tree, sym: Symbol): Tree = { tree match { - case Tree$Bad() => - tree.setSymbol(Symbol.ERROR).setType(Type.ErrorType) - case Tree.Empty => tree.setType(Type.NoType) @@ -2243,7 +2265,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( tree.pos, applyVisitor, isDefinedAtVisitor, pattype, restype, context.owner); } else { - error(tree.pos, "expected pattern type of cases could not be determined"); + error(tree, "expected pattern type of cases could not be determined"); } } else { transform(desugarize.Visitor(unit, tree)) @@ -2265,7 +2287,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( } else { if (!lhs1.getType().isError()) error(tree.pos, "assignment to non-variable "); - errorTree(tree.pos); + gen.mkUnitLit(tree.pos) } case Tree$If(cond, thenp, elsep) => @@ -2289,7 +2311,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( case Tree$Return(expr) => if (!context.owner.isInitialized()) { - error(tree.pos, "method with return needs result type"); + error(tree, "method with return needs result type"); } else { val enclFun: Symbol = context.owner.enclMethod(); if (enclFun.kind == VAL && !enclFun.isConstructor()) { @@ -2298,7 +2320,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( copy.Return(tree, expr1) .setSymbol(enclFun).setType(definitions.ALL_TYPE()); } else { - error(tree.pos, "return outside method definition"); + error(tree, "return outside method definition"); } } @@ -2428,7 +2450,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( " cannot be applied to " + ArrayApply.toString( argtypes.asInstanceOf[Array[Object]], "(", ",", ")")); - errorTree(tree.pos) + errorTermTree(tree) } } @@ -2574,7 +2596,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( return copy.Apply(tree, fn2, NewArray.Tree(arg1)) .setType(arg1.getType()); } else { - return error(tree.pos, "expected pattern type of cases could not be determined") : Tree; + return error(tree, "expected pattern type of cases could not be determined") : Tree; } } } @@ -2667,7 +2689,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( tree.pos, infer.applyErrorMsg( "", fn1, " cannot be applied to ", argtypes, pt)); - errorTree(tree.pos) + errorTermTree(tree) } handleApply @@ -2688,7 +2710,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( if (i < parents.length) tree.setType(parents(i).instanceType()); else - error(tree.pos, + error(tree, "" + mixin + " does not name a mixin base class of " + clazz); } } diff --git a/sources/scala/tools/scalac/typechecker/Infer.scala b/sources/scala/tools/scalac/typechecker/Infer.scala index 4dc4c36375..02b98f6e01 100644 --- a/sources/scala/tools/scalac/typechecker/Infer.scala +++ b/sources/scala/tools/scalac/typechecker/Infer.scala @@ -34,7 +34,7 @@ class Infer(global: scalac_Global, gen: TreeGen, make: TreeFactory) extends scal def getContext: Context = Context.NONE; - def error(pos: int, msg: String): Tree = + def error(pos: int, msg: String): unit = throw new Type$Error(msg); @@ -345,6 +345,7 @@ class Infer(global: scalac_Global, gen: TreeGen, make: TreeFactory) extends scal "type instantiation with [" + ArrayApply.toString(targs.asInstanceOf[Array[Object]], ",") + "] failed since " + vargs(0) + " is not viewable as " + vargs(1)); + gen.mkDefaultValue(pos, vtype) } } diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java index 1804581884..ac19bf7088 100644 --- a/sources/scalac/backend/jvm/GenJVM.java +++ b/sources/scalac/backend/jvm/GenJVM.java @@ -560,8 +560,6 @@ class GenJVM { case Visitor(_): case Function(_, _): throw global.fail("unexpected node", tree); - case Bad(): - throw global.fail("bad tree"); default: throw global.fail("unknown node", tree); } -- cgit v1.2.3