diff options
author | paltherr <paltherr@epfl.ch> | 2004-04-04 18:37:59 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2004-04-04 18:37:59 +0000 |
commit | 6b35acd807e982b5296eb05898561ea8664bf2a3 (patch) | |
tree | 4c39fe37f0dcd827eb7582eb0b4b564074b20acc /sources | |
parent | 8127c2eeeff7ee3a3f65a205020d50c4c5cdba16 (diff) | |
download | scala-6b35acd807e982b5296eb05898561ea8664bf2a3.tar.gz scala-6b35acd807e982b5296eb05898561ea8664bf2a3.tar.bz2 scala-6b35acd807e982b5296eb05898561ea8664bf2a3.zip |
- Added method Type.isError
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scala/tools/scalac/typechecker/Analyzer.scala | 47 | ||||
-rw-r--r-- | sources/scalac/symtab/Type.java | 25 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/CLRClassParser.java | 2 | ||||
-rw-r--r-- | sources/scalac/typechecker/RefCheck.java | 4 |
4 files changed, 45 insertions, 33 deletions
diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala index 90767afe75..d0df134245 100644 --- a/sources/scala/tools/scalac/typechecker/Analyzer.scala +++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala @@ -335,12 +335,9 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( tp.unalias() match { case Type$TypeRef(_, sym, _) => if (sym.kind == CLASS) return true; - else if (sym.isError()) return false; - case Type.ErrorType => - return false; case _ => } - error(pos, "class type expected"); + if (!tp.isError()) error(pos, "class type expected"); false } @@ -349,7 +346,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( private def checkObjectType(pos: int, tp: Type): Type = if (tp.isObjectType()) tp else { - if (tp != Type.ErrorType) error(pos, "object type expected"); + if (!tp.isError()) error(pos, "object type expected"); Type.ErrorType } @@ -467,28 +464,28 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( /** Check that tree represents a pure definition. */ def checkPureDef(tree: Tree, clazz: Symbol): unit = { - if (!TreeInfo.isPureDef(tree) && tree.getType() != Type.ErrorType) + if (!TreeInfo.isPureDef(tree) && !tree.getType().isError()) error(tree.pos, "" + clazz + " may contain only pure definitions"); } /** Check that tree represents a pure constructor. */ def checkPureConstr(tree: Tree, clazz: Symbol): unit = { - if (!TreeInfo.isPureConstr(tree) && tree.getType() != Type.ErrorType) + if (!TreeInfo.isPureConstr(tree) && !tree.getType().isError()) error(tree.pos, "" + clazz + " may invoke only pure superclass constructors"); } /** Check that tree represents a trait constructor. */ def checkTrait(tree: Tree, clazz: Symbol): unit = { - if (!tree.getType().symbol().isTrait() && tree.getType() != Type.ErrorType) + if (!tree.getType().symbol().isTrait() && !tree.getType().isError()) error(tree.pos, " " + clazz + " may inherit only traits as mixins"); } /** Check that tree is a stable expression .p */ def checkStable(tree: Tree): Tree = - if (TreeInfo.isPureExpr(tree) || tree.getType() == Type.ErrorType) tree; + if (TreeInfo.isPureExpr(tree) || tree.getType().isError()) tree; else error(tree.pos, "stable identifier required, but " + tree + " found."); /** Check that class can be instantiated. @@ -511,7 +508,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( var all: Tree = null; override def traverse(tree: Tree): unit = { if (tree.getType() == null) assert(false, "" + tree + " in " + all); - if (tree.getType() != Type.ErrorType) + if (!tree.getType().isError()) super.traverse(tree); } } @@ -538,7 +535,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( case _ => } - if (fn.getType() == Type.ErrorType) Type.ErrorType else Type.NoType + if (fn.getType().isError()) Type.ErrorType else Type.NoType } private def isSetterMethod(sym: Symbol): boolean = @@ -1357,7 +1354,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( //System.out.println("constr inst " + ArrayApply.toString(tparams) + restp + " against " + pt + " = " + tree.getType());//DEBUG } catch { case ex: Type$Error => - if (pt != Type.ErrorType) error(tree.pos, ex.msg); + if (!pt.isError()) error(tree.pos, ex.msg); tree.setType(Type.ErrorType); } case _ => @@ -1379,7 +1376,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( return error(tree.pos, "expected pattern type " + pt + " does not conform to sequence " + clazz); } - } else if (tree.getType() != Type.ErrorType) { + } else if (!tree.getType().isError()) { return error(tree.pos, "" + tree.getType().symbol() + " is neither a case class constructor nor a sequence class constructor"); } @@ -2266,7 +2263,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( copy.Assign(tree, lhs1, rhs1) .setType(definitions.UNIT_TYPE()); } else { - if (lhs1.getType() != Type.ErrorType) + if (!lhs1.getType().isError()) error(tree.pos, "assignment to non-variable "); errorTree(tree.pos); } @@ -2382,7 +2379,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( // propagate errors in arguments var i = 0; - while (i < argtypes.length && argtypes(i) != Type.ErrorType) + while (i < argtypes.length && !argtypes(i).isError()) i = i + 1; if (i < argtypes.length) tree.setType(Type.ErrorType); @@ -2425,15 +2422,13 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( copy.TypeApply(tree, fn1, args1) .setType(restp.subst(tparams, argtypes))); - case Type.ErrorType => - tree.setType(Type.ErrorType) - - case _ => - error(tree.pos, + case fn1tp => + if (!fn1tp.isError()) error(tree.pos, infer.toString(fn1.symbol(), fn1.getType()) + " cannot be applied to " + ArrayApply.toString( argtypes.asInstanceOf[Array[Object]], "(", ",", ")")); + errorTree(tree.pos) } } @@ -2568,7 +2563,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( // handle the case of application of match to a visitor specially if (args.length == 1 && args(0).isInstanceOf[Tree$Visitor]) { val pattp: Type = matchQualType(fn1); - if (pattp == Type.ErrorType) { + if (pattp.isError()) { return tree.setType(Type.ErrorType) } else if (pattp != Type.NoType) { if (infer.isFullyDefined(pattp) && @@ -2599,7 +2594,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( return tree.setType(Type.ErrorType) else { var i: int = 0; - while (i < argtypes.length && argtypes(i) != Type.ErrorType) + while (i < argtypes.length && !argtypes(i).isError()) i = i + 1; if (i < argtypes.length) return tree.setType(Type.ErrorType); } @@ -2666,15 +2661,13 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( .setType(restp)); } - case Type.ErrorType => - return tree.setType(Type.ErrorType); - case _ => } - error( + if (!fn1.getType().isError()) error( tree.pos, infer.applyErrorMsg( "", fn1, " cannot be applied to ", argtypes, pt)); + errorTree(tree.pos) } handleApply @@ -2809,7 +2802,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( val argtypes = Tree.typeOf(args); val tparams = tpe1.getType().symbol().typeParams(); var owntype: Type = Type.ErrorType; - if (tpe1.getType() != Type.ErrorType) { + if (!tpe1.getType().isError()) { if (tparams.length == args.length) owntype = Type.appliedType(tpe1.getType(), argtypes); else if (tparams.length == 0) diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java index 8fb835786b..bbd0455423 100644 --- a/sources/scalac/symtab/Type.java +++ b/sources/scalac/symtab/Type.java @@ -154,7 +154,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { "illegal cyclic reference involving " + rebind); sym = rebind.rebindSym(); } - if (pre.isStable() || pre == ErrorType) { + if (pre.isStable() || pre.isError()) { return new ExtSingleType(pre, sym); } else { throw new Type.Malformed(pre, sym.nameString() + ".type"); @@ -197,7 +197,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { } public static Type typeRef(Type pre, Symbol sym, Type[] args) { - if (!pre.isLegalPrefix() && pre != ErrorType) + if (!pre.isLegalPrefix() && !pre.isError()) throw new Type.Malformed(pre, sym.nameString()); rebind: if (sym.isAbstractType()) { @@ -225,7 +225,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { return new ExtTypeRef(pre, sym, args); } private static boolean isLegalTypeRef(Type pre, Symbol sym, Type[] args) { - if (!pre.isLegalPrefix() && pre != ErrorType) return false; + if (!pre.isLegalPrefix() && !pre.isError()) return false; if (!sym.isType() && !sym.isError()) return false; // !!! return args.length == 0 || args.length == sym.typeParams().length; return true; @@ -642,6 +642,25 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { // Tests -------------------------------------------------------------------- + /** Is this type a an error type? + */ + public boolean isError() { + switch (this) { + case ErrorType: + return true; + case ThisType(Symbol clasz): + return clasz.isError(); + case SingleType(_, Symbol symbol): + return symbol.isError(); + case TypeRef(_, Symbol symbol, _): + return symbol.isError(); + case CompoundType(Type[] parts, Scope members): + return symbol().isError(); + default: + return false; + } + } + /** Is this type a this type or singleton type? */ public boolean isStable() { diff --git a/sources/scalac/symtab/classfile/CLRClassParser.java b/sources/scalac/symtab/classfile/CLRClassParser.java index 8ac897cca5..0ec6df58a4 100644 --- a/sources/scalac/symtab/classfile/CLRClassParser.java +++ b/sources/scalac/symtab/classfile/CLRClassParser.java @@ -275,7 +275,7 @@ public class CLRClassParser extends SymbolLoader { assert type != null; scalac.symtab.Type res = make.classType(type.FullName.replace('+', '.')); - if (res == scalac.symtab.Type.ErrorType) + if (res.isError()) global.error("unknown class reference " + type.FullName); return res; } diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java index 92290a4317..c7e2572d72 100644 --- a/sources/scalac/typechecker/RefCheck.java +++ b/sources/scalac/typechecker/RefCheck.java @@ -277,7 +277,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { } void overrideError(int pos, Symbol member, Symbol other, String msg) { - if (other.type() != Type.ErrorType && member.type() != Type.ErrorType) + if (!other.type().isError() && !member.type().isError()) unit.error(pos, "error overriding " + other + other.locationString() + ";\n " + member + member.locationString() + " " + msg); @@ -285,7 +285,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { void overrideTypeError(int pos, Symbol member, Symbol other, Type site, boolean lobound) { - if (other.type() != Type.ErrorType && member.type() != Type.ErrorType) { + if (!other.type().isError() && !member.type().isError()) { Type memberInfo = lobound ? site.memberLoBound(member) : normalizedInfo(site, member); Type otherInfo = lobound ? site.memberLoBound(other) |