summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/meta/scalac/ast/Tree.java5
-rw-r--r--sources/scala/tools/scalac/ast/parser/MarkupParser.scala2
-rw-r--r--sources/scala/tools/scalac/ast/parser/Parser.scala34
-rw-r--r--sources/scala/tools/scalac/ast/printer/TextTreePrinter.scala3
-rw-r--r--sources/scala/tools/scalac/typechecker/Analyzer.scala80
-rw-r--r--sources/scala/tools/scalac/typechecker/Infer.scala3
-rw-r--r--sources/scalac/backend/jvm/GenJVM.java2
7 files changed, 75 insertions, 54 deletions
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, "<syntax-error>" )
}
// 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("<error: " + tree + ">");
- 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);
}