From b0cd565a51d819847de0691fe5f9098fd17dce71 Mon Sep 17 00:00:00 2001 From: paltherr Date: Wed, 29 Oct 2003 14:01:48 +0000 Subject: - Replaced most of the Definition <...>_TYPE fi... - Replaced most of the Definition <...>_TYPE fields by methods --- sources/scala/tools/scalai/Interpreter.java | 5 +- sources/scalac/Global.java | 7 +- sources/scalac/ast/TreeGen.java | 10 +- sources/scalac/backend/Primitives.java | 4 +- sources/scalac/symtab/Definitions.java | 163 ++++++++++----------- sources/scalac/symtab/Symbol.java | 4 +- sources/scalac/symtab/Type.java | 22 +-- .../scalac/symtab/classfile/AttributeParser.java | 10 +- .../scalac/symtab/classfile/ClassfileParser.java | 8 +- .../scalac/symtab/classfile/JavaTypeCreator.java | 60 +++++--- .../scalac/symtab/classfile/JavaTypeFactory.java | 1 + sources/scalac/transformer/AddInterfacesPhase.java | 2 +- .../transformer/matching/PatternMatcher.java | 2 +- sources/scalac/typechecker/Analyzer.java | 6 +- sources/scalac/typechecker/RefCheck.java | 8 +- 15 files changed, 163 insertions(+), 149 deletions(-) (limited to 'sources') diff --git a/sources/scala/tools/scalai/Interpreter.java b/sources/scala/tools/scalai/Interpreter.java index 4caecd7dbc..9c43c5fa1f 100644 --- a/sources/scala/tools/scalai/Interpreter.java +++ b/sources/scala/tools/scalai/Interpreter.java @@ -142,13 +142,16 @@ public class Interpreter { // Private Methods - Finding main method private Type getMainMethodType(boolean erased) { + scalac.Phase current = global.currentPhase; // !!! + if (!erased) global.currentPhase = global.getFirstPhase(); Definitions definitions = global.definitions; - Type argument = definitions.arrayType(definitions.JAVA_STRING_TYPE); + Type argument = definitions.arrayType(definitions.JAVA_STRING_TYPE()); Type result = definitions.UNIT_TYPE; if (erased) argument = argument.erasure(); if (erased) result = result.fullErasure(); Symbol formal = new TermSymbol(0, ARGS_N, null, Modifiers.PARAM); formal.setInfo(argument); + if (!erased) global.currentPhase = current; return Type.MethodType(new Symbol[] {formal}, result); } diff --git a/sources/scalac/Global.java b/sources/scalac/Global.java index d13798fd8d..d0a89b9191 100644 --- a/sources/scalac/Global.java +++ b/sources/scalac/Global.java @@ -287,6 +287,7 @@ public class Global { while (currentPhase.next != null && reporter.errors() == 0) { currentPhase = currentPhase.next; start(); + // !!! new scalac.checkers.SymbolChecker(this).check(); currentPhase.apply(units); stop(currentPhase.descriptor.taskDescription()); if (currentPhase.descriptor.hasPrintFlag()) { @@ -436,7 +437,7 @@ public class Global { last, make.Literal(last.pos, show(last.type())).setType( - definitions.JAVA_STRING_TYPE)}); + definitions.JAVA_STRING_TYPE())}); } TreeList body = new TreeList(); for (int j = 0; j < impl.body.length; j++) @@ -467,7 +468,7 @@ public class Global { SHOW_DEFINITION()), new Tree[] { make.Literal(tree.pos, show(tree.symbol())).setType( - definitions.JAVA_STRING_TYPE)})); + definitions.JAVA_STRING_TYPE())})); return; case ValDef(_, _, _, _): if (!mustShow(tree.symbol())) return; @@ -478,7 +479,7 @@ public class Global { SHOW_VALUE_DEFINITION()), new Tree[] { make.Literal(tree.pos, show(tree.symbol())).setType( - definitions.JAVA_STRING_TYPE), + definitions.JAVA_STRING_TYPE()), treeGen.Ident(tree.pos, tree.symbol())})); return; default: diff --git a/sources/scalac/ast/TreeGen.java b/sources/scalac/ast/TreeGen.java index eacd4b1452..3f9e33b3cc 100644 --- a/sources/scalac/ast/TreeGen.java +++ b/sources/scalac/ast/TreeGen.java @@ -62,7 +62,7 @@ public class TreeGen implements Kinds, Modifiers, TypeTags { mkToType(definitions.DOUBLE_TYPE), mkToType(definitions.BOOLEAN_TYPE), mkToType(definitions.UNIT_TYPE), - mkToType(definitions.JAVA_STRING_TYPE), + mkToType(definitions.JAVA_STRING_TYPE()), }; } @@ -241,7 +241,7 @@ public class TreeGen implements Kinds, Modifiers, TypeTags { /** Builds a default zero value according to given type. */ public Tree mkDefaultValue(int pos, Type type) { - if (type.isSubType(definitions.ANYREF_TYPE)) return mkNullLit(pos); + if (type.isSubType(definitions.ANYREF_TYPE())) return mkNullLit(pos); switch (type.unbox()) { case UnboxedType(int tag): return mkDefaultValue(pos, tag); } @@ -701,7 +701,7 @@ public class TreeGen implements Kinds, Modifiers, TypeTags { /** Builds a Return node of given method with given value. */ public Return Return(int pos, Symbol method, Tree value) { Return tree = make.Return(pos, method, value); - tree.setType(definitions.ALL_TYPE); + tree.setType(definitions.ALL_TYPE()); return tree; } public Return Return(Symbol method, Tree value) { @@ -993,7 +993,7 @@ public class TreeGen implements Kinds, Modifiers, TypeTags { argtypes[i] = params[i].type(); } Type[] parentTypes = { - definitions.OBJECT_TYPE, + definitions.OBJECT_TYPE(), definitions.functionType(argtypes, restype) }; ClassSymbol clazz = new ClassSymbol( pos, Names.ANON_CLASS_NAME.toTypeName(), owner, 0); @@ -1024,7 +1024,7 @@ public class TreeGen implements Kinds, Modifiers, TypeTags { ClassSymbol clazz = new ClassSymbol( pos, Names.ANON_CLASS_NAME.toTypeName(), owner, 0); Type[] parentTypes = { - definitions.OBJECT_TYPE, + definitions.OBJECT_TYPE(), definitions.partialFunctionType(pattype, restype)}; clazz.setInfo(Type.compoundType(parentTypes, new Scope(), clazz)); clazz.allConstructors().setInfo( diff --git a/sources/scalac/backend/Primitives.java b/sources/scalac/backend/Primitives.java index 028e73dd1b..4b2b4f4066 100644 --- a/sources/scalac/backend/Primitives.java +++ b/sources/scalac/backend/Primitives.java @@ -267,7 +267,7 @@ public class Primitives { this.BOX_LARRAY = getBoxArray(boxes, definitions.LONG_TYPE); this.BOX_FARRAY = getBoxArray(boxes, definitions.FLOAT_TYPE); this.BOX_DARRAY = getBoxArray(boxes, definitions.DOUBLE_TYPE); - this.BOX_OARRAY = getBoxArray(boxes, definitions.JAVA_OBJECT_TYPE); + this.BOX_OARRAY = getBoxArray(boxes, definitions.JAVA_OBJECT_TYPE()); this.AS_UVALUE = getUniqueTerm(definitions.UNIT_CLASS, AS_UVALUE_N); this.AS_ZVALUE = getUniqueTerm(definitions.BOOLEAN_CLASS, AS_ZVALUE_N); this.AS_BVALUE = getUniqueTerm(definitions.DOUBLE_CLASS, AS_BVALUE_N); @@ -572,7 +572,7 @@ public class Primitives { // !!! System.out.println("!!! Ignoring pico bridge method " + Debug.show(clasz) + "." + name); break; } - if (vparams[0].type().equals(definitions.JAVA_STRING_TYPE)) { + if (vparams[0].type().equals(definitions.JAVA_STRING_TYPE())) { addPrimitive(alts[i], Primitive.CONCAT); assert !concat; concat = true; diff --git a/sources/scalac/symtab/Definitions.java b/sources/scalac/symtab/Definitions.java index 1d0a4ee1a1..6d834d3256 100644 --- a/sources/scalac/symtab/Definitions.java +++ b/sources/scalac/symtab/Definitions.java @@ -57,10 +57,8 @@ public class Definitions { /** the scala.Any class */ public final Symbol ANY_CLASS; - public final Type ANY_TYPE; + public final Type ANY_TYPE() {return ANY_CLASS.type();} - /** some methods of the scala.Any class - */ public final Symbol MATCH; public final Symbol IS; public final Symbol AS; @@ -71,29 +69,47 @@ public class Definitions { public final Symbol TOSTRING; public final Symbol HASHCODE; - /** a method of class java.lang.Throwable - */ - public final Symbol THROW; - /** the scala.AnyVal class */ public final Symbol ANYVAL_CLASS; - public final Type ANYVAL_TYPE; + public final Type ANYVAL_TYPE() {return ANYVAL_CLASS.type();} /** the scala.AnyRef class */ public final Symbol ANYREF_CLASS; - public final Type ANYREF_TYPE; + public final Type ANYREF_TYPE() {return ANYREF_CLASS.type();} + + /** the scala.AllRef class + */ + public final Symbol ALLREF_CLASS; + public final Type ALLREF_TYPE() {return ALLREF_CLASS.type();} + + /** the scala.All class + */ + public final Symbol ALL_CLASS; + public final Type ALL_TYPE() {return ALL_CLASS.type();} /** the java.lang.Object class */ public final Symbol JAVA_OBJECT_CLASS; - public final Type JAVA_OBJECT_TYPE; + public final Type JAVA_OBJECT_TYPE() {return JAVA_OBJECT_CLASS.type();} + + /** the java.lang.String class + */ + public final Symbol JAVA_STRING_CLASS; + public final Type JAVA_STRING_TYPE() {return JAVA_STRING_CLASS.type();} + + /** the java.lang.Throwable class + */ + public final Symbol JAVA_THROWABLE_CLASS; + public final Type JAVA_THROWABLE_TYPE() {return JAVA_THROWABLE_CLASS.type();} + + public final Symbol THROW; /** the scala.Object class */ public final Symbol OBJECT_CLASS; - public final Type OBJECT_TYPE; + public final Type OBJECT_TYPE() {return OBJECT_CLASS.type();} private Symbol OBJECT_TAG; public Symbol OBJECT_TAG() { @@ -102,16 +118,6 @@ public class Definitions { return OBJECT_TAG; } - /** the scala.All class - */ - public final Symbol ALL_CLASS; - public final Type ALL_TYPE; - - /** the scala.AllRef class - */ - public final Symbol ALLREF_CLASS; - public final Type ALLREF_TYPE; - /** the primitive types */ public final Symbol BYTE_CLASS; @@ -153,17 +159,10 @@ public class Definitions { return BOOLEAN_NOT; } - /** types from java.lang - */ - public final Symbol JAVA_STRING_CLASS; - public final Type JAVA_STRING_TYPE; - public final Symbol JAVA_THROWABLE_CLASS; - public final Type JAVA_THROWABLE_TYPE; - - /** types from scala + /** the scala.String class */ public final Symbol STRING_CLASS; - public final Type STRING_TYPE; + public final Type STRING_TYPE() {return STRING_CLASS.type();} /** the scala.TupleX classes */ @@ -397,89 +396,79 @@ public class Definitions { ANY_CLASS = new ClassSymbol( Position.NOPOS, Names.Any.toTypeName(), SCALA_CLASS, Modifiers.JAVA); SCALA_CLASS.members().enter(ANY_CLASS); - ANY_TYPE = ANY_CLASS.typeConstructor(); ANY_CLASS.setInfo(Type.compoundType(Type.EMPTY_ARRAY, new Scope(), ANY_CLASS)); ANY_CLASS.primaryConstructor().setInfo( - Type.MethodType(Symbol.EMPTY_ARRAY, ANY_TYPE)); + Type.MethodType(Symbol.EMPTY_ARRAY, ANY_CLASS.typeConstructor())); // the java.lang.OBJECT class JAVA_OBJECT_CLASS = getClass(Names.java_lang_Object); - JAVA_OBJECT_TYPE = JAVA_OBJECT_CLASS.typeConstructor(); - JAVA_OBJECT_CLASS.setInfo(pparser.classCompletion); + JAVA_OBJECT_CLASS.setInfo(pparser.classCompletion); // !!! + + // the primitive types + DOUBLE_CLASS = getClass(Names.scala_Double); + DOUBLE_TYPE = DOUBLE_CLASS.typeConstructor(); + FLOAT_CLASS = getClass(Names.scala_Float); + FLOAT_TYPE = FLOAT_CLASS.typeConstructor(); + LONG_CLASS = getClass(Names.scala_Long); + LONG_TYPE = LONG_CLASS.typeConstructor(); + INT_CLASS = getClass(Names.scala_Int); + INT_TYPE = INT_CLASS.typeConstructor(); + CHAR_CLASS = getClass(Names.scala_Char); + CHAR_TYPE = CHAR_CLASS.typeConstructor(); + SHORT_CLASS = getClass(Names.scala_Short); + SHORT_TYPE = SHORT_CLASS.typeConstructor(); + BYTE_CLASS = getClass(Names.scala_Byte); + BYTE_TYPE = BYTE_CLASS.typeConstructor(); + BOOLEAN_CLASS = getClass(Names.scala_Boolean); + BOOLEAN_TYPE = BOOLEAN_CLASS.typeConstructor(); + UNIT_CLASS = getClass(Names.scala_Unit); + UNIT_TYPE = UNIT_CLASS.typeConstructor(); // the scala.ANYREF class ANYREF_CLASS = new AliasTypeSymbol( Position.NOPOS, Names.AnyRef.toTypeName(), SCALA_CLASS, Modifiers.JAVA) - .setInfo(JAVA_OBJECT_TYPE); + .setInfo(JAVA_OBJECT_TYPE()); SCALA_CLASS.members().enter(ANYREF_CLASS); - ANYREF_TYPE = JAVA_OBJECT_TYPE; - ANYREF_CLASS.primaryConstructor().setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, ANYREF_TYPE)); + ANYREF_CLASS.primaryConstructor().setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, JAVA_OBJECT_TYPE())); // the scala.OBJECT class OBJECT_CLASS = getClass(Names.scala_Object); - OBJECT_TYPE = OBJECT_CLASS.typeConstructor(); // the scala.ANYVAL class ANYVAL_CLASS = getClass(Names.scala_AnyVal); - ANYVAL_TYPE = ANYVAL_CLASS.typeConstructor(); // the scala.ALL class ALL_CLASS = new ClassSymbol( Position.NOPOS, Names.All.toTypeName(), SCALA_CLASS, 0); SCALA_CLASS.members().enter(ALL_CLASS); - ALL_TYPE = ALL_CLASS.typeConstructor(); - ALL_CLASS.setInfo(Type.compoundType(new Type[]{ANY_TYPE}, new Scope(), ALL_CLASS)); - ALL_CLASS.primaryConstructor().setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, ALL_TYPE)); + ALL_CLASS.setInfo(Type.compoundType(new Type[]{ANY_TYPE()}, new Scope(), ALL_CLASS)); + ALL_CLASS.primaryConstructor().setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, ALL_CLASS.typeConstructor())); // the scala.ALLREF class ALLREF_CLASS = new ClassSymbol( Position.NOPOS, Names.AllRef.toTypeName(), SCALA_CLASS, 0); SCALA_CLASS.members().enter(ALLREF_CLASS); - ALLREF_TYPE = ALLREF_CLASS.typeConstructor(); - ALLREF_CLASS.setInfo(Type.compoundType(new Type[]{ANYREF_TYPE}, new Scope(), ALLREF_CLASS)); - ALLREF_CLASS.primaryConstructor().setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, ALLREF_TYPE)); - - // the primitive types - DOUBLE_CLASS = getClass(Names.scala_Double); - DOUBLE_TYPE = DOUBLE_CLASS.typeConstructor(); - FLOAT_CLASS = getClass(Names.scala_Float); - FLOAT_TYPE = FLOAT_CLASS.typeConstructor(); - LONG_CLASS = getClass(Names.scala_Long); - LONG_TYPE = LONG_CLASS.typeConstructor(); - INT_CLASS = getClass(Names.scala_Int); - INT_TYPE = INT_CLASS.typeConstructor(); - CHAR_CLASS = getClass(Names.scala_Char); - CHAR_TYPE = CHAR_CLASS.typeConstructor(); - SHORT_CLASS = getClass(Names.scala_Short); - SHORT_TYPE = SHORT_CLASS.typeConstructor(); - BYTE_CLASS = getClass(Names.scala_Byte); - BYTE_TYPE = BYTE_CLASS.typeConstructor(); - BOOLEAN_CLASS = getClass(Names.scala_Boolean); - BOOLEAN_TYPE = BOOLEAN_CLASS.typeConstructor(); - UNIT_CLASS = getClass(Names.scala_Unit); - UNIT_TYPE = UNIT_CLASS.typeConstructor(); + ALLREF_CLASS.setInfo(Type.compoundType(new Type[]{ANYREF_TYPE()}, new Scope(), ALLREF_CLASS)); + ALLREF_CLASS.primaryConstructor().setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, ALLREF_CLASS.typeConstructor())); // the array class ARRAY_CLASS = getClass(Names.scala_Array); // add members to java.lang.Throwable JAVA_THROWABLE_CLASS = getClass(Names.java_lang_Throwable); - JAVA_THROWABLE_TYPE = JAVA_THROWABLE_CLASS.typeConstructor(); THROW = new TermSymbol( Position.NOPOS, Names.throw_, JAVA_THROWABLE_CLASS, Modifiers.FINAL); - THROW.setInfo(Type.PolyType(Symbol.EMPTY_ARRAY, ALL_TYPE)); + THROW.setInfo(Type.PolyType(Symbol.EMPTY_ARRAY, ALL_TYPE())); JAVA_THROWABLE_CLASS.members().enter(THROW); // add the java.lang.String class to the scala package JAVA_STRING_CLASS = getClass(Names.java_lang_String); - JAVA_STRING_TYPE = JAVA_STRING_CLASS.typeConstructor(); STRING_CLASS = new AliasTypeSymbol( Position.NOPOS, Names.String.toTypeName(), SCALA_CLASS, 0) - .setInfo(JAVA_STRING_TYPE); + .setInfo(JAVA_STRING_TYPE()); SCALA_CLASS.members().enter(STRING_CLASS); - STRING_TYPE = STRING_CLASS.typeConstructor(); - STRING_CLASS.primaryConstructor().setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, STRING_TYPE)); + STRING_CLASS.primaryConstructor().setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, STRING_CLASS.typeConstructor())); for (int i = 1; i < TUPLE_count; i++) { TUPLE_CLASS[i] = getClass(Names.scala_Tuple(i)); @@ -510,15 +499,15 @@ public class Definitions { Position.NOPOS, Names.PLUS, JAVA_STRING_CLASS, Modifiers.FINAL); STRING_PLUS_ANY.setInfo( Type.MethodType( - new Symbol[]{newParameter(STRING_PLUS_ANY, ANY_TYPE)}, - STRING_TYPE)); + new Symbol[]{newParameter(STRING_PLUS_ANY, ANY_TYPE())}, + STRING_TYPE())); JAVA_STRING_CLASS.members().enter(STRING_PLUS_ANY); // add members to class scala.Any MATCH = new TermSymbol( Position.NOPOS, Names.match, ANY_CLASS, Modifiers.FINAL); - Symbol matchTyParam1 = newTypeParameter(MATCH, ANY_TYPE); - Symbol matchTyParam2 = newTypeParameter(MATCH, ANY_TYPE); + Symbol matchTyParam1 = newTypeParameter(MATCH, ANY_TYPE()); + Symbol matchTyParam2 = newTypeParameter(MATCH, ANY_TYPE()); MATCH.setInfo( Type.PolyType( new Symbol[]{matchTyParam1, matchTyParam2}, @@ -534,43 +523,43 @@ public class Definitions { AS = new TermSymbol( Position.NOPOS, Names.asInstanceOf, ANY_CLASS, Modifiers.FINAL); - Symbol tvar = newTypeParameter(AS, ANY_TYPE); + Symbol tvar = newTypeParameter(AS, ANY_TYPE()); AS.setInfo(Type.PolyType(new Symbol[]{tvar}, tvar.type())); ANY_CLASS.members().enter(AS); IS = new TermSymbol( Position.NOPOS, Names.isInstanceOf, ANY_CLASS, Modifiers.FINAL); - IS.setInfo(Type.PolyType(new Symbol[]{newTypeParameter(IS, ANY_TYPE)}, + IS.setInfo(Type.PolyType(new Symbol[]{newTypeParameter(IS, ANY_TYPE())}, BOOLEAN_TYPE)); ANY_CLASS.members().enter(IS); EQEQ = new TermSymbol( Position.NOPOS, Names.EQEQ, ANY_CLASS, Modifiers.FINAL); - EQEQ.setInfo(Type.MethodType(new Symbol[]{newParameter(EQEQ, ANY_TYPE)}, + EQEQ.setInfo(Type.MethodType(new Symbol[]{newParameter(EQEQ, ANY_TYPE())}, BOOLEAN_TYPE)); ANY_CLASS.members().enter(EQEQ); BANGEQ = new TermSymbol( Position.NOPOS, Names.BANGEQ, ANY_CLASS, Modifiers.FINAL); - BANGEQ.setInfo(Type.MethodType(new Symbol[]{newParameter(BANGEQ, ANY_TYPE)}, + BANGEQ.setInfo(Type.MethodType(new Symbol[]{newParameter(BANGEQ, ANY_TYPE())}, BOOLEAN_TYPE)); ANY_CLASS.members().enter(BANGEQ); EQUALS = new TermSymbol( Position.NOPOS, Names.equals, ANY_CLASS, 0); - EQUALS.setInfo(Type.MethodType(new Symbol[]{newParameter(EQUALS, ANY_TYPE)}, + EQUALS.setInfo(Type.MethodType(new Symbol[]{newParameter(EQUALS, ANY_TYPE())}, BOOLEAN_TYPE)); ANY_CLASS.members().enter(EQUALS); EQ = new TermSymbol( Position.NOPOS, Names.eq, ANY_CLASS, 0); - EQ.setInfo(Type.MethodType(new Symbol[]{newParameter(EQ, ANY_TYPE)}, + EQ.setInfo(Type.MethodType(new Symbol[]{newParameter(EQ, ANY_TYPE())}, BOOLEAN_TYPE)); ANY_CLASS.members().enter(EQ); TOSTRING = new TermSymbol( Position.NOPOS, Names.toString, ANY_CLASS, 0); - TOSTRING.setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, STRING_TYPE)); + TOSTRING.setInfo(Type.MethodType(Symbol.EMPTY_ARRAY, STRING_TYPE())); ANY_CLASS.members().enter(TOSTRING); HASHCODE = new TermSymbol( @@ -581,18 +570,18 @@ public class Definitions { // add a null value to the root scope NULL = new TermSymbol( Position.NOPOS, Names.null_, ROOT_CLASS, 0); - NULL.setInfo(ALLREF_TYPE); + NULL.setInfo(ALLREF_TYPE()); ROOT.members().enter(NULL); // add a null value to the root scope ZERO = new TermSymbol( Position.NOPOS, Names.ZERO, ROOT_CLASS, 0); - ZERO.setInfo(ALL_TYPE); + ZERO.setInfo(ALL_TYPE()); ROOT.members().enter(ZERO); PATTERN_WILDCARD = new TermSymbol( Position.NOPOS, Names.PATTERN_WILDCARD, Symbol.NONE, 0); - PATTERN_WILDCARD.setType(ALL_TYPE); + PATTERN_WILDCARD.setType(ALL_TYPE()); } private Symbol newParameter(Symbol owner, Type tp) { @@ -645,10 +634,6 @@ public class Definitions { return getClass(fullname).type(); } - public Type getJavaType(Name fullname) { - return getClass(fullname).typeConstructor(); - } - private Symbol loadTerm(Symbol clasz, Name name) { Symbol sym = clasz.lookup(name); assert sym.isTerm() && !sym.isOverloaded(): clasz+"."+name+" -> "+sym; diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java index 03d5cbd6fa..9fd995b3b4 100644 --- a/sources/scalac/symtab/Symbol.java +++ b/sources/scalac/symtab/Symbol.java @@ -937,7 +937,7 @@ public abstract class Symbol implements Modifiers, Kinds { /** The low bound of this type variable */ public Type loBound() { - return Global.instance.definitions.ALL_TYPE; + return Global.instance.definitions.ALL_TYPE(); } /** Get this.type corresponding to this symbol @@ -1654,7 +1654,7 @@ public class AbsTypeSymbol extends TypeSymbol { public Type loBound() { initialize(); - return lobound == null ? Global.instance.definitions.ALL_TYPE : lobound; + return lobound == null ? Global.instance.definitions.ALL_TYPE() : lobound; } public Symbol setLoBound(Type lobound) { diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java index 9802005bd8..e574a35776 100644 --- a/sources/scalac/symtab/Type.java +++ b/sources/scalac/symtab/Type.java @@ -363,14 +363,14 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { public Type loBound() { switch (unalias()) { case TypeRef(Type pre, Symbol sym, Type[] args): - Type lb = Global.instance.definitions.ALL_TYPE; + Type lb = Global.instance.definitions.ALL_TYPE(); if (sym.kind == TYPE) { lb = pre.memberLoBound(sym); } if (lb.symbol() == Global.instance.definitions.ALL_CLASS && this.symbol() != Global.instance.definitions.ALL_CLASS && - this.isSubType(Global.instance.definitions.ANYREF_TYPE)) { - lb = Global.instance.definitions.ALLREF_TYPE; + this.isSubType(Global.instance.definitions.ANYREF_TYPE())) { + lb = Global.instance.definitions.ALLREF_TYPE(); } return lb; default: @@ -618,7 +618,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { } /** Is this type a reference to an object type? - * todo: replace by this.isSubType(global.definitions.ANY_TYPE)? + * todo: replace by this.isSubType(global.definitions.ANY_TYPE())? */ public boolean isObjectType() { switch (unalias()) { @@ -1812,12 +1812,12 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { if (sym.kind == ALIAS && sym.typeParams().length == args.length) return this.unalias().isSubType(that); else if (sym == Global.instance.definitions.ALL_CLASS) - return that.isSubType(Global.instance.definitions.ANY_TYPE); + return that.isSubType(Global.instance.definitions.ANY_TYPE()); else if (sym == Global.instance.definitions.ALLREF_CLASS) return that.symbol() == Global.instance.definitions.ANY_CLASS || (that.symbol() != Global.instance.definitions.ALL_CLASS && - that.isSubType(Global.instance.definitions.ANYREF_TYPE)); + that.isSubType(Global.instance.definitions.ANYREF_TYPE())); break; case OverloadedType(Symbol[] alts, Type[] alttypes): @@ -1835,7 +1835,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { break; case UnboxedArrayType(_): - if (Global.instance.definitions.JAVA_OBJECT_TYPE.isSubType(that)) + if (Global.instance.definitions.JAVA_OBJECT_TYPE().isSubType(that)) return true; // !!! we should probably also test for Clonable, Serializable, ... } @@ -2373,7 +2373,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { public static Type lub(Type[] tps) { //System.out.println("lub" + ArrayApply.toString(tps));//DEBUG - if (tps.length == 0) return Global.instance.definitions.ALL_TYPE; + if (tps.length == 0) return Global.instance.definitions.ALL_TYPE(); //If all types are method types with same parameters, //compute lub of their result types. @@ -2538,7 +2538,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { } public static Type glb(Type[] tps) { - if (tps.length == 0) return Global.instance.definitions.ANY_TYPE; + if (tps.length == 0) return Global.instance.definitions.ANY_TYPE(); // step one: eliminate redunandant types; return if one one is left tps = elimRedundant(tps, false); @@ -2560,7 +2560,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { break; case ThisType(_): case SingleType(_, _): - return Global.instance.definitions.ALL_TYPE; + return Global.instance.definitions.ALL_TYPE(); } } @@ -2579,7 +2579,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { // by AllRef glbType.members = Scope.EMPTY; treftl = new Type.List( - Global.instance.definitions.ALLREF_TYPE, treftl); + Global.instance.definitions.ALLREF_TYPE(), treftl); } } diff --git a/sources/scalac/symtab/classfile/AttributeParser.java b/sources/scalac/symtab/classfile/AttributeParser.java index d7bda1c82d..7de745ee1f 100644 --- a/sources/scalac/symtab/classfile/AttributeParser.java +++ b/sources/scalac/symtab/classfile/AttributeParser.java @@ -191,7 +191,7 @@ public class AttributeParser implements ClassfileConstants { Name.fromString(token).toTypeName(), owner, Modifiers.PARAM); - s.setFirstInfo(parser.defs.ANY_TYPE); + s.setFirstInfo(parser.make.anyType()); tvars.enter(s); return s; } else @@ -295,7 +295,7 @@ public class AttributeParser implements ClassfileConstants { nextToken(); if (s != Symbol.NONE) return s.type(); - Symbol clazz = parser.defs.getClass(Name.fromString(name)); + Type clazztype = parser.make.classType(Name.fromString(name)).unalias(); if (token.equals("[")) { Vector types = new Vector(); do { @@ -306,9 +306,9 @@ public class AttributeParser implements ClassfileConstants { nextToken(); Type[] args = new Type[types.size()]; types.toArray(args); - return Type.TypeRef(clazz.owner().thisType(), clazz, args).unalias(); + return Type.appliedType(clazztype, args); } else { - return clazz.typeConstructor().unalias(); + return clazztype; } } @@ -330,7 +330,7 @@ public class AttributeParser implements ClassfileConstants { Name.fromString(token).toTypeName(), owner, Modifiers.PARAM); - s.setFirstInfo(parser.defs.ANY_TYPE); + s.setFirstInfo(parser.make.anyType()); locals.enter(s); nextToken(); if (token.equals("<")) { diff --git a/sources/scalac/symtab/classfile/ClassfileParser.java b/sources/scalac/symtab/classfile/ClassfileParser.java index 9debd17b0f..8c2ed2f67c 100644 --- a/sources/scalac/symtab/classfile/ClassfileParser.java +++ b/sources/scalac/symtab/classfile/ClassfileParser.java @@ -46,7 +46,6 @@ public class ClassfileParser implements ClassfileConstants { protected Signatures sigs; protected ConstantPool pool; protected AttributeParser attrib; - protected Definitions defs; public ClassfileParser(Global global, AbstractFileReader in, Symbol c) { @@ -54,11 +53,10 @@ public class ClassfileParser implements ClassfileConstants { this.in = in; this.c = c; this.ctype = c.typeConstructor(); - this.make = new JavaTypeCreator(global); + this.make = new JavaTypeCreator(global.definitions); this.sigs = new Signatures(global, make); this.pool = new ConstantPool(in, sigs); this.attrib = new AttributeParser(in, pool, this); - this.defs = global.definitions; } @@ -159,8 +157,8 @@ public class ClassfileParser implements ClassfileConstants { */ protected Type readClassType(int i) { if (i == 0) - return defs.ANY_TYPE; - Type res = defs.getJavaType((Name)pool.readPool(i)); + return make.anyType(); + Type res = make.classType((Name)pool.readPool(i)); if (res == Type.ErrorType) global.error("unknown class reference " + pool.readPool(i)); return res; diff --git a/sources/scalac/symtab/classfile/JavaTypeCreator.java b/sources/scalac/symtab/classfile/JavaTypeCreator.java index 395778adec..7126d182cd 100644 --- a/sources/scalac/symtab/classfile/JavaTypeCreator.java +++ b/sources/scalac/symtab/classfile/JavaTypeCreator.java @@ -9,7 +9,6 @@ package scalac.symtab.classfile; import ch.epfl.lamp.util.Position; -import scalac.Global; import scalac.util.*; import scalac.symtab.*; import Type.*; @@ -17,54 +16,81 @@ import Type.*; public class JavaTypeCreator implements JavaTypeFactory { - protected Global global; + protected final Definitions definitions; + + protected final Type ANY_TYPE; + protected final Type DOUBLE_TYPE; + protected final Type FLOAT_TYPE; + protected final Type LONG_TYPE; + protected final Type INT_TYPE; + protected final Type CHAR_TYPE; + protected final Type SHORT_TYPE; + protected final Type BYTE_TYPE; + protected final Type BOOLEAN_TYPE; + protected final Type UNIT_TYPE; + protected final Type JAVA_OBJECT_TYPE; + + public JavaTypeCreator(Definitions definitions) { + this.definitions = definitions; + this.ANY_TYPE = definitions.ANY_CLASS.typeConstructor(); + this.DOUBLE_TYPE = definitions.DOUBLE_CLASS.typeConstructor(); + this.FLOAT_TYPE = definitions.FLOAT_CLASS.typeConstructor(); + this.LONG_TYPE = definitions.LONG_CLASS.typeConstructor(); + this.INT_TYPE = definitions.INT_CLASS.typeConstructor(); + this.CHAR_TYPE = definitions.CHAR_CLASS.typeConstructor(); + this.SHORT_TYPE = definitions.SHORT_CLASS.typeConstructor(); + this.BYTE_TYPE = definitions.BYTE_CLASS.typeConstructor(); + this.BOOLEAN_TYPE = definitions.BOOLEAN_CLASS.typeConstructor(); + this.UNIT_TYPE = definitions.UNIT_CLASS.typeConstructor(); + this.JAVA_OBJECT_TYPE =definitions.JAVA_OBJECT_CLASS.typeConstructor(); + } - public JavaTypeCreator(Global global) { - this.global = global; + public Type anyType() { + return ANY_TYPE; } public Type byteType() { - return global.definitions.BYTE_TYPE; + return BYTE_TYPE; } public Type shortType() { - return global.definitions.SHORT_TYPE; + return SHORT_TYPE; } public Type charType() { - return global.definitions.CHAR_TYPE; + return CHAR_TYPE; } public Type intType() { - return global.definitions.INT_TYPE; + return INT_TYPE; } public Type longType() { - return global.definitions.LONG_TYPE; + return LONG_TYPE; } public Type floatType() { - return global.definitions.FLOAT_TYPE; + return FLOAT_TYPE; } public Type doubleType() { - return global.definitions.DOUBLE_TYPE; + return DOUBLE_TYPE; } public Type booleanType() { - return global.definitions.BOOLEAN_TYPE; + return BOOLEAN_TYPE; } public Type voidType() { - return global.definitions.UNIT_TYPE; + return UNIT_TYPE; } public Type classType(Name classname) { - return global.definitions.getJavaType(classname); + return definitions.getClass(classname).typeConstructor(); } public Type arrayType(Type elemtpe) { - return global.definitions.arrayType(elemtpe); + return definitions.arrayType(elemtpe); } public Type methodType(Type[] argtpes, Type restpe, Type[] thrown) { @@ -77,8 +103,8 @@ public class JavaTypeCreator implements JavaTypeFactory { return new MethodType(args, restpe); } private Type objToAny(Type tp) { - if (tp.isSameAs(global.definitions.JAVA_OBJECT_TYPE)) - return global.definitions.ANY_TYPE; + if (tp.isSameAs(JAVA_OBJECT_TYPE)) + return ANY_TYPE; else return tp; } diff --git a/sources/scalac/symtab/classfile/JavaTypeFactory.java b/sources/scalac/symtab/classfile/JavaTypeFactory.java index 8205055bc9..ff1bea1727 100644 --- a/sources/scalac/symtab/classfile/JavaTypeFactory.java +++ b/sources/scalac/symtab/classfile/JavaTypeFactory.java @@ -12,6 +12,7 @@ import scalac.symtab.Type; import scalac.util.Name; public interface JavaTypeFactory { + Type anyType(); Type byteType(); Type shortType(); Type charType(); diff --git a/sources/scalac/transformer/AddInterfacesPhase.java b/sources/scalac/transformer/AddInterfacesPhase.java index b3f65fd553..fb19268c26 100644 --- a/sources/scalac/transformer/AddInterfacesPhase.java +++ b/sources/scalac/transformer/AddInterfacesPhase.java @@ -87,7 +87,7 @@ public class AddInterfacesPhase extends Phase { && oldSym != definitions.ANY_CLASS && oldSym != definitions.ANYREF_CLASS) { newParents = new Type[oldParents.length]; - newParents[0] = definitions.ANYREF_TYPE; + newParents[0] = definitions.ANYREF_TYPE(); for (int i = 1; i < oldParents.length; ++i) newParents[i] = oldParents[i]; } else diff --git a/sources/scalac/transformer/matching/PatternMatcher.java b/sources/scalac/transformer/matching/PatternMatcher.java index 5f074c05f7..3ece11b531 100644 --- a/sources/scalac/transformer/matching/PatternMatcher.java +++ b/sources/scalac/transformer/matching/PatternMatcher.java @@ -834,7 +834,7 @@ public class PatternMatcher extends PatternTool { } protected boolean optimize(Type selType, PatternNode alternatives) { - if (!optimize || !selType.isSubType(defs.OBJECT_TYPE)) + if (!optimize || !selType.isSubType(defs.OBJECT_TYPE())) return false; int cases = 0; while (alternatives != null) { diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java index 4595a33249..2954a56e3d 100644 --- a/sources/scalac/typechecker/Analyzer.java +++ b/sources/scalac/typechecker/Analyzer.java @@ -601,7 +601,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { else if (value instanceof Long) return definitions.LONG_TYPE; else if (value instanceof Float) return definitions.FLOAT_TYPE; else if (value instanceof Double) return definitions.DOUBLE_TYPE; - else if (value instanceof String) return definitions.JAVA_STRING_TYPE; + else if (value instanceof String) return definitions.JAVA_STRING_TYPE(); else if (value instanceof Boolean) return definitions.BOOLEAN_TYPE; else throw new ApplicationError(); } @@ -2084,7 +2084,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { case Throw(Tree expr): Tree expr1 = transform( - expr, EXPRmode, definitions.JAVA_THROWABLE_TYPE); + expr, EXPRmode, definitions.JAVA_THROWABLE_TYPE()); return gen.Select(tree.pos, expr1, definitions.THROW); case Return(Tree expr): @@ -2096,7 +2096,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { Tree expr1 = transform( expr, EXPRmode, enclFun.type().resultType()); return copy.Return(tree, expr1) - .setSymbol(enclFun).setType(definitions.ALL_TYPE); + .setSymbol(enclFun).setType(definitions.ALL_TYPE()); } else { return error(tree.pos, "return outside method definition"); } diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java index 1f4b75ed09..b27def2224 100644 --- a/sources/scalac/typechecker/RefCheck.java +++ b/sources/scalac/typechecker/RefCheck.java @@ -164,7 +164,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { case MethodType(Symbol[] tparams, Type restp): return Type.MethodType(tparams, Type.AnyType); default: - return defs.ANY_TYPE; + return defs.ANY_TYPE(); } } private void abstractClassError(Symbol clazz, String msg) { @@ -518,7 +518,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { // { if (null == m$) m$ = new m$class; m$ } Symbol eqMethod = getUnaryMemberMethod( - sym.type(), Names.EQEQ, defs.ANY_TYPE); + sym.type(), Names.EQEQ, defs.ANY_TYPE()); Tree body = gen.Block(new Tree[]{ gen.If( gen.Apply( @@ -640,7 +640,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { Symbol equalsSym = new TermSymbol(clazz.pos, Names.equals, clazz, OVERRIDE); Symbol equalsParam = new TermSymbol(clazz.pos, Names.that, equalsSym, PARAM) - .setInfo(defs.ANY_TYPE); + .setInfo(defs.ANY_TYPE()); equalsSym.setInfo( Type.MethodType(new Symbol[]{equalsParam}, defs.BOOLEAN_TYPE)); clazz.info().members().enter(equalsSym); @@ -651,7 +651,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { if (tparams.length != 0) { Type[] targs = new Type[tparams.length]; for (int i = 0; i < targs.length; i++) - targs[i] = defs.ANY_TYPE; + targs[i] = defs.ANY_TYPE(); testtp = testtp.subst(tparams, targs); } } -- cgit v1.2.3