From d91518092ea08a22e4461fa32d1e35cc50e55d76 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 2 Apr 2003 10:59:13 +0000 Subject: *** empty log message *** --- sources/scala/Boolean.java | 8 ++ sources/scala/Byte.java | 6 -- sources/scala/Char.java | 6 -- sources/scala/Double.java | 10 ++- sources/scala/Float.java | 11 ++- sources/scala/Int.java | 10 ++- sources/scala/Long.java | 11 ++- sources/scala/Short.java | 5 -- sources/scala/Tuple.tmpl | 2 +- sources/scala/Unit.java | 8 ++ sources/scalac/backend/Primitives.java | 48 +++++------ sources/scalac/symtab/Definitions.java | 4 +- sources/scalac/typechecker/Analyzer.java | 4 +- sources/scalac/typechecker/RefCheck.java | 131 ++++++++++++++++--------------- 14 files changed, 147 insertions(+), 117 deletions(-) (limited to 'sources') diff --git a/sources/scala/Boolean.java b/sources/scala/Boolean.java index 30acc6effd..94c332ed6a 100644 --- a/sources/scala/Boolean.java +++ b/sources/scala/Boolean.java @@ -62,4 +62,12 @@ public abstract class Boolean extends AnyVal { public boolean equals(java.lang.Object obj) { return obj instanceof Boolean && $eq$eq(((Boolean)obj).asBoolean()); } + + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $eq$eq(java.lang.Object obj) { return equals(obj); } + + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $bang$eq(java.lang.Object obj) { return !equals(obj); } } diff --git a/sources/scala/Byte.java b/sources/scala/Byte.java index 965d52f9d3..1a7e7a3190 100644 --- a/sources/scala/Byte.java +++ b/sources/scala/Byte.java @@ -11,11 +11,5 @@ package scala; - public abstract class Byte extends Short { - public String toString() { return String.valueOf(asByte()); } - public int hashCode() { return asInt(); } - public boolean equals(java.lang.Object obj) { - return obj instanceof Byte && $eq$eq(((Byte)obj).asByte()); - } } diff --git a/sources/scala/Char.java b/sources/scala/Char.java index aa03382a4c..74516ab3af 100644 --- a/sources/scala/Char.java +++ b/sources/scala/Char.java @@ -16,8 +16,6 @@ public abstract class Char extends Int { public String toString() { return String.valueOf((char)asInt()); } - public int hashCode() { return asInt(); } - /** @meta method scala.Boolean; */ public boolean isDigit() { return Character.isDigit((char)asInt()); } @@ -33,8 +31,4 @@ public abstract class Char extends Int { /** @meta method scala.Boolean; */ public boolean isWhitespace() { return Character.isWhitespace((char)asInt()); } - - public boolean equals(java.lang.Object obj) { - return obj instanceof Char && $eq$eq(((Char)obj).asChar()); - } } diff --git a/sources/scala/Double.java b/sources/scala/Double.java index 8531ac55d6..ff90a5b60b 100644 --- a/sources/scala/Double.java +++ b/sources/scala/Double.java @@ -11,7 +11,6 @@ package scala; - public abstract class Double extends AnyVal { public abstract double asDouble(); public abstract float asFloat(); @@ -59,7 +58,16 @@ public abstract class Double extends AnyVal { long bits = java.lang.Double.doubleToLongBits(asDouble()); return (int)(bits ^ (bits >>> 32)); } + public boolean equals(java.lang.Object obj) { return obj instanceof Double && $eq$eq(((Double)obj).asDouble()); } + + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $eq$eq(java.lang.Object obj) { return equals(obj); } + + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $bang$eq(java.lang.Object obj) { return !equals(obj); } } diff --git a/sources/scala/Float.java b/sources/scala/Float.java index 3d3567f25e..b32844d526 100644 --- a/sources/scala/Float.java +++ b/sources/scala/Float.java @@ -49,7 +49,12 @@ public abstract class Float extends Double { public String toString() { return String.valueOf(asFloat()); } public String $plus(String that) { return this + that; } public int hashCode() { return java.lang.Float.floatToIntBits(asFloat()); } - public boolean equals(java.lang.Object obj) { - return obj instanceof Float && $eq$eq(((Float)obj).asFloat()); - } + + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $eq$eq(java.lang.Object obj) { return equals(obj); } + + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $bang$eq(java.lang.Object obj) { return !equals(obj); } } diff --git a/sources/scala/Int.java b/sources/scala/Int.java index ac05f5dcc1..7e740f149b 100644 --- a/sources/scala/Int.java +++ b/sources/scala/Int.java @@ -94,7 +94,11 @@ public abstract class Int extends Long { public int hashCode() { return asInt(); } - public boolean equals(java.lang.Object obj) { - return obj instanceof Int && $eq$eq(((Int)obj).asInt()); - } + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $eq$eq(java.lang.Object obj) { return equals(obj); } + + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $bang$eq(java.lang.Object obj) { return !equals(obj); } } diff --git a/sources/scala/Long.java b/sources/scala/Long.java index a23ec04322..a473bdb2ef 100644 --- a/sources/scala/Long.java +++ b/sources/scala/Long.java @@ -71,7 +71,12 @@ public abstract class Long extends Float { public String toString() { return String.valueOf(asLong()); } public String $plus(String that) { return this + that; } public int hashCode() { return (int)(asLong() ^ (asLong() >>> 32)); } - public boolean equals(java.lang.Object obj) { - return obj instanceof Long && $eq$eq(((Long)obj).asLong()); - } + + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $eq$eq(java.lang.Object obj) { return equals(obj); } + + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $bang$eq(java.lang.Object obj) { return !equals(obj); } } diff --git a/sources/scala/Short.java b/sources/scala/Short.java index 453b2adf59..24d019eb77 100644 --- a/sources/scala/Short.java +++ b/sources/scala/Short.java @@ -13,9 +13,4 @@ package scala; public abstract class Short extends Int { - public String toString() { return String.valueOf(asShort()); } - public int hashCode() { return asInt(); } - public boolean equals(java.lang.Object obj) { - return obj instanceof Short && $eq$eq(((Short)obj).asShort()); - } } diff --git a/sources/scala/Tuple.tmpl b/sources/scala/Tuple.tmpl index 6bd5931247..59170a251d 100644 --- a/sources/scala/Tuple.tmpl +++ b/sources/scala/Tuple.tmpl @@ -13,7 +13,7 @@ package scala { override def hashCode() = [#hash-code#]; - override def == (other: Any) = + override def equals (other: Any) = if (other is Tuple[#n#][#type-params#]) { val that = other as Tuple[#n#][#type-params#]; [#equal#] diff --git a/sources/scala/Unit.java b/sources/scala/Unit.java index e86f295278..af81ff3585 100644 --- a/sources/scala/Unit.java +++ b/sources/scala/Unit.java @@ -29,4 +29,12 @@ public abstract class Unit extends AnyVal { public String toString() { return "()"; } + + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $eq$eq(java.lang.Object obj) { return equals(obj); } + + /** @meta method (scala.Any)scala.Boolean; + */ + public boolean $bang$eq(java.lang.Object obj) { return !equals(obj); } } diff --git a/sources/scalac/backend/Primitives.java b/sources/scalac/backend/Primitives.java index 85633e6dce..d7e6ba3a5e 100644 --- a/sources/scalac/backend/Primitives.java +++ b/sources/scalac/backend/Primitives.java @@ -351,8 +351,8 @@ public class Primitives { addPrimitive(defs.TOSTRING, Primitive.TOSTRING); // scala.Unit - // !!! addAll(defs.UNIT_CLASS, Names.EQ, Primitive.EQ, 1); - // !!! addAll(defs.UNIT_CLASS, Names.NE, Primitive.NE, 1); + addAll(defs.UNIT_CLASS, Names.EQ, Primitive.EQ, 1); + addAll(defs.UNIT_CLASS, Names.NE, Primitive.NE, 1); addAll(defs.UNIT_CLASS, Names.equals, Primitive.EQUALS, 1); addAll(defs.UNIT_CLASS, Names.hashCode, Primitive.HASHCODE, 1); addAll(defs.UNIT_CLASS, Names.toString, Primitive.TOSTRING, 1); @@ -360,8 +360,8 @@ public class Primitives { // !!! addAll(defs.UNIT_CLASS, Names.ADD, Primitive.CONCAT, 1); // scala.Boolean - addAll(defs.BOOLEAN_CLASS, Names.EQ, Primitive.EQ, 1); - addAll(defs.BOOLEAN_CLASS, Names.NE, Primitive.NE, 1); + addAll(defs.BOOLEAN_CLASS, Names.EQ, Primitive.EQ, 2); + addAll(defs.BOOLEAN_CLASS, Names.NE, Primitive.NE, 2); addAll(defs.BOOLEAN_CLASS, Names.equals, Primitive.EQUALS, 1); addAll(defs.BOOLEAN_CLASS, Names.hashCode, Primitive.HASHCODE, 1); addAll(defs.BOOLEAN_CLASS, Names.toString, Primitive.TOSTRING, 1); @@ -375,24 +375,24 @@ public class Primitives { // !!! addAll(defs.BOOLEAN_CLASS, Names.ADD, Primitive.CONCAT, 1); // scala.Byte - addAll(defs.BYTE_CLASS, Names.equals, Primitive.EQUALS, 1); - addAll(defs.BYTE_CLASS, Names.hashCode, Primitive.HASHCODE, 1); - addAll(defs.BYTE_CLASS, Names.toString, Primitive.TOSTRING, 1); + //addAll(defs.BYTE_CLASS, Names.equals, Primitive.EQUALS, 1); + //addAll(defs.BYTE_CLASS, Names.hashCode, Primitive.HASHCODE, 1); + //addAll(defs.BYTE_CLASS, Names.toString, Primitive.TOSTRING, 1); // scala.Short - addAll(defs.SHORT_CLASS, Names.equals, Primitive.EQUALS, 1); - addAll(defs.SHORT_CLASS, Names.hashCode, Primitive.HASHCODE, 1); - addAll(defs.SHORT_CLASS, Names.toString, Primitive.TOSTRING, 1); + //addAll(defs.SHORT_CLASS, Names.equals, Primitive.EQUALS, 1); + //addAll(defs.SHORT_CLASS, Names.hashCode, Primitive.HASHCODE, 1); + //addAll(defs.SHORT_CLASS, Names.toString, Primitive.TOSTRING, 1); // scala.Char - addAll(defs.CHAR_CLASS, Names.equals, Primitive.EQUALS, 1); - addAll(defs.CHAR_CLASS, Names.hashCode, Primitive.HASHCODE, 1); + //addAll(defs.CHAR_CLASS, Names.equals, Primitive.EQUALS, 1); + //addAll(defs.CHAR_CLASS, Names.hashCode, Primitive.HASHCODE, 1); addAll(defs.CHAR_CLASS, Names.toString, Primitive.TOSTRING, 1); // scala.Int - addAll(defs.INT_CLASS, Names.EQ, Primitive.EQ, 4); - addAll(defs.INT_CLASS, Names.NE, Primitive.NE, 4); - addAll(defs.INT_CLASS, Names.equals, Primitive.EQUALS, 1); + addAll(defs.INT_CLASS, Names.EQ, Primitive.EQ, 5); + addAll(defs.INT_CLASS, Names.NE, Primitive.NE, 5); + //addAll(defs.INT_CLASS, Names.equals, Primitive.EQUALS, 1); addAll(defs.INT_CLASS, Names.hashCode, Primitive.HASHCODE, 1); addAll(defs.INT_CLASS, Names.toString, Primitive.TOSTRING, 1); addAll(defs.INT_CLASS, Names.NOT, Primitive.NOT, 2); @@ -413,9 +413,9 @@ public class Primitives { addAll(defs.INT_CLASS, Names.ASR, Primitive.ASR, 2); // scala.Long - addAll(defs.LONG_CLASS, Names.EQ, Primitive.EQ, 3); - addAll(defs.LONG_CLASS, Names.NE, Primitive.NE, 3); - addAll(defs.LONG_CLASS, Names.equals, Primitive.EQUALS, 1); + addAll(defs.LONG_CLASS, Names.EQ, Primitive.EQ, 4); + addAll(defs.LONG_CLASS, Names.NE, Primitive.NE, 4); + //addAll(defs.LONG_CLASS, Names.equals, Primitive.EQUALS, 1); addAll(defs.LONG_CLASS, Names.hashCode, Primitive.HASHCODE, 1); addAll(defs.LONG_CLASS, Names.toString, Primitive.TOSTRING, 1); addAll(defs.LONG_CLASS, Names.NOT, Primitive.NOT, 1); @@ -436,9 +436,9 @@ public class Primitives { addAll(defs.LONG_CLASS, Names.ASR, Primitive.ASR, 1); // scala.Float - addAll(defs.FLOAT_CLASS, Names.EQ, Primitive.EQ, 2); - addAll(defs.FLOAT_CLASS, Names.NE, Primitive.NE, 2); - addAll(defs.FLOAT_CLASS, Names.equals, Primitive.EQUALS, 1); + addAll(defs.FLOAT_CLASS, Names.EQ, Primitive.EQ, 3); + addAll(defs.FLOAT_CLASS, Names.NE, Primitive.NE, 3); + //addAll(defs.FLOAT_CLASS, Names.equals, Primitive.EQUALS, 1); addAll(defs.FLOAT_CLASS, Names.hashCode, Primitive.HASHCODE, 1); addAll(defs.FLOAT_CLASS, Names.toString, Primitive.TOSTRING, 1); addAdd(defs.FLOAT_CLASS, 2); @@ -452,9 +452,9 @@ public class Primitives { addAll(defs.FLOAT_CLASS, Names.GE, Primitive.GE, 2); // scala.Double - addAll(defs.DOUBLE_CLASS, Names.EQ, Primitive.EQ, 1); - addAll(defs.DOUBLE_CLASS, Names.NE, Primitive.NE, 1); - addAll(defs.DOUBLE_CLASS, Names.equals, Primitive.EQUALS, 1); + addAll(defs.DOUBLE_CLASS, Names.EQ, Primitive.EQ, 2); + addAll(defs.DOUBLE_CLASS, Names.NE, Primitive.NE, 2); + //addAll(defs.DOUBLE_CLASS, Names.equals, Primitive.EQUALS, 1); addAll(defs.DOUBLE_CLASS, Names.hashCode, Primitive.HASHCODE, 1); addAll(defs.DOUBLE_CLASS, Names.toString, Primitive.TOSTRING, 1); addPrimitive(AS_BVALUE, Primitive.AS_BVALUE); diff --git a/sources/scalac/symtab/Definitions.java b/sources/scalac/symtab/Definitions.java index 3fe8cc7dee..93ab003055 100644 --- a/sources/scalac/symtab/Definitions.java +++ b/sources/scalac/symtab/Definitions.java @@ -303,13 +303,13 @@ public class Definitions { ANY_CLASS.members().enter(IS); EQEQ = new TermSymbol( - Position.NOPOS, Names.EQEQ, ANY_CLASS, 0); + Position.NOPOS, Names.EQEQ, ANY_CLASS, Modifiers.FINAL); 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, 0); + Position.NOPOS, Names.BANGEQ, ANY_CLASS, Modifiers.FINAL); BANGEQ.setInfo(Type.MethodType(new Symbol[]{newParameter(BANGEQ, ANY_TYPE)}, BOOLEAN_TYPE)); ANY_CLASS.members().enter(BANGEQ); diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java index 6e7930c32b..b0a0d58798 100644 --- a/sources/scalac/typechecker/Analyzer.java +++ b/sources/scalac/typechecker/Analyzer.java @@ -131,6 +131,8 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { // expressions may be packages and // Java statics modules. + static final int baseModes = EXPRmode | PATTERNmode | CONSTRmode; + // Helper definitions --------------------------------------------------------- /** The qualifier type of a potential application of the `match' method. @@ -2031,7 +2033,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { case Typed(Tree expr, Tree tpe): Tree tpe1 = transform(tpe, TYPEmode); - Tree expr1 = transform(expr, mode, tpe1.type); + Tree expr1 = transform(expr, mode & baseModes, tpe1.type); return copy.Typed(tree, expr1, tpe1) .setType(tpe1.type); diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java index d18daac17f..aac469d161 100644 --- a/sources/scalac/typechecker/RefCheck.java +++ b/sources/scalac/typechecker/RefCheck.java @@ -28,7 +28,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { private Symbol[] refsym = new Symbol[4]; private int level; private HashMap symIndex = new HashMap(); - private Definitions definitions = global.definitions; + private Definitions defs = global.definitions; void pushLevel() { level++; @@ -120,7 +120,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { public Tree nullTree(int pos, Type tp) { return gen.TypeApply( - gen.Ident(pos, definitions.NULL), + gen.Ident(pos, defs.NULL), new Tree[]{gen.mkType(pos, tp)}); } @@ -157,12 +157,14 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { .setInfo(sym.type()); Tree vdef = gen.ValDef(mvar, nullTree(tree.pos, sym.type())); - // { if (m$ == null[T]) m$ = new m$class; m$ } + // { if (null[T] == m$) m$ = new m$class; m$ } + Symbol eqMethod = getMemberMethod( + sym.type(), Names.EQEQ, defs.ANY_TYPE); Tree body = gen.Block(new Tree[]{ gen.If( gen.Apply( - gen.Select(gen.mkRef(tree.pos, mvar), definitions.EQEQ), - new Tree[]{nullTree(tree.pos, sym.type())}), + gen.Select(nullTree(tree.pos, sym.type()), eqMethod), + new Tree[]{gen.mkRef(tree.pos, mvar)}), gen.Assign(gen.mkRef(tree.pos, mvar), alloc), gen.Block(tree.pos, Tree.EMPTY_ARRAY)), gen.mkRef(tree.pos, mvar)}); @@ -179,10 +181,34 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { Symbol sym = clazz.info().lookupNonPrivate(name); return sym.kind == VAL && (sym.owner() == clazz || - !definitions.JAVA_OBJECT_CLASS.isSubClass(sym.owner()) && + !defs.JAVA_OBJECT_CLASS.isSubClass(sym.owner()) && (sym.flags & DEFERRED) == 0); } + private Symbol getMember(Type site, Name name) { + Symbol sym = site.lookupNonPrivate(name); + assert sym.kind == VAL; + return sym; + } + + private Symbol getMemberMethod(Type site, Name name, Type paramtype) { + Symbol sym = getMember(site, name); + switch (sym.type()) { + case OverloadedType(Symbol[] alts, Type[] alttypes): + for (int i = 0; i < alts.length; i++) { + if (hasParam(alttypes[i], paramtype)) return alts[i]; + } + } + assert hasParam(sym.type(), paramtype) + : "no (" + paramtype + ")-method " + name + " among " + sym.type() + " at " + site; + return sym; + } + + private boolean hasParam(Type tp, Type paramtype) { + Symbol[] params = tp.firstParams(); + return params.length == 1 && paramtype.isSubType(params[0].type()); + } + private Tree[] caseFields(ClassSymbol clazz) { Symbol[] vparams = clazz.constructor().type().firstParams(); Tree[] fields = new Tree[vparams.length]; @@ -196,7 +222,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { private Tree toStringMethod(ClassSymbol clazz) { Symbol toStringSym = new TermSymbol( clazz.pos, Names.toString, clazz, OVERRIDE) - .setInfo(definitions.TOSTRING.type()); + .setInfo(defs.TOSTRING.type()); clazz.info().members().enter(toStringSym); Tree[] fields = caseFields(clazz); Tree body; @@ -207,35 +233,36 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { body = gen.mkStringLit( clazz.pos, NameTransformer.decode(clazz.name).toString() + "("); for (int i = 0; i < fields.length; i++) { + String str = (i == fields.length - 1) ? ")" : ","; body = gen.Apply( - gen.Select(body, definitions.STRING_PLUS_ANY), + gen.Select(body, defs.STRING_PLUS_ANY), new Tree[]{fields[i]}); body = gen.Apply( - gen.Select(body, definitions.STRING_PLUS_ANY), - new Tree[]{gen.mkStringLit(clazz.pos, (i == fields.length - 1) ? ")" : ",")}); + gen.Select(body, defs.STRING_PLUS_ANY), + new Tree[]{gen.mkStringLit(clazz.pos, str)}); } } return gen.DefDef(clazz.pos, toStringSym, body); } private Tree equalsMethod(ClassSymbol clazz) { - Symbol equalsSym = new TermSymbol(clazz.pos, Names.EQEQ, clazz, OVERRIDE); + Symbol equalsSym = new TermSymbol(clazz.pos, Names.equals, clazz, OVERRIDE); Symbol equalsParam = new TermSymbol(clazz.pos, Names.that, equalsSym, PARAM) - .setInfo(definitions.ANY_TYPE); + .setInfo(defs.ANY_TYPE); equalsSym.setInfo( - Type.MethodType(new Symbol[]{equalsParam}, definitions.BOOLEAN_TYPE)); + Type.MethodType(new Symbol[]{equalsParam}, defs.BOOLEAN_TYPE)); clazz.info().members().enter(equalsSym); Tree[] fields = caseFields(clazz); - Tree[] patargs = patternVars(clazz, equalsSym); Type constrtype = clazz.constructor().type(); switch (constrtype) { case PolyType(Symbol[] tparams, Type restp): Type[] targs = new Type[tparams.length]; for (int i = 0; i < targs.length; i++) - targs[i] = definitions.ANY_TYPE; + targs[i] = defs.ANY_TYPE; constrtype = restp.subst(tparams, targs); } + Tree[] patargs = patternVars(clazz.pos, constrtype, equalsSym); Tree pattern = make.Apply( clazz.pos, gen.mkType(clazz.pos, constrtype), patargs) .setType(clazz.type()); @@ -246,64 +273,67 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { rhs = eqOp(fields[0], patargs[0]); for (int i = 1; i < fields.length; i++) { rhs = gen.Apply( - gen.Select(rhs, definitions.AMPAMP()), + gen.Select(rhs, defs.AMPAMP()), new Tree[]{eqOp(fields[i], patargs[i])}); } } CaseDef case1 = (Tree.CaseDef) make.CaseDef( clazz.pos, pattern, Tree.Empty, rhs) - .setType(definitions.BOOLEAN_TYPE); + .setType(defs.BOOLEAN_TYPE); CaseDef case2 = (Tree.CaseDef) make.CaseDef(clazz.pos, - patternVar(clazz.pos, Names.WILDCARD, equalsSym), + patternVar(clazz.pos, Names.WILDCARD, defs.ANY_TYPE, equalsSym), Tree.Empty, gen.mkBooleanLit(clazz.pos, false)) - .setType(definitions.BOOLEAN_TYPE); + .setType(defs.BOOLEAN_TYPE); Tree body = make.Apply(clazz.pos, gen.Select( gen.mkRef(clazz.pos, Type.localThisType, equalsParam), - definitions.MATCH), + defs.MATCH), new Tree[]{make.Visitor(clazz.pos, new CaseDef[]{case1, case2}) - .setType(definitions.BOOLEAN_TYPE)}) - .setType(definitions.BOOLEAN_TYPE); + .setType(defs.BOOLEAN_TYPE)}) + .setType(defs.BOOLEAN_TYPE); return gen.DefDef(clazz.pos, equalsSym, body); } //where - private Tree patternVar(int pos, Name name, Symbol owner) { + private Tree patternVar(int pos, Name name, Type tp, Symbol owner) { return make.Ident(pos, name) - .setSymbol(new TermSymbol(pos, name, owner, 0) - .setType(definitions.ANY_TYPE)) - .setType(definitions.ANY_TYPE); + .setSymbol(new TermSymbol(pos, name, owner, 0).setType(tp)) + .setType(tp); } - private Tree[] patternVars(ClassSymbol clazz, Symbol owner) { - Symbol[] vparams = clazz.constructor().type().firstParams(); + private Tree[] patternVars(int pos, Type constrtype, Symbol owner) { + Symbol[] vparams = constrtype.firstParams(); Tree[] pats = new Tree[vparams.length]; for (int i = 0; i < pats.length; i++) { - pats[i] = patternVar(clazz.pos, vparams[i].name, owner); + pats[i] = patternVar( + pos, vparams[i].name, vparams[i].type(), owner); } return pats; } private Tree eqOp(Tree l, Tree r) { - return gen.Apply(gen.Select(l, definitions.EQEQ), new Tree[]{r}); + Symbol eqMethod = getMemberMethod(l.type, Names.EQEQ, r.type); + return gen.Apply(gen.Select(l, eqMethod), new Tree[]{r}); } private Tree hashCodeMethod(ClassSymbol clazz) { Symbol hashCodeSym = new TermSymbol( clazz.pos, Names.hashCode, clazz, OVERRIDE) - .setInfo(definitions.HASHCODE.type()); + .setInfo(defs.HASHCODE.type()); clazz.info().members().enter(hashCodeSym); Tree[] fields = caseFields(clazz); - Symbol getClassSym = getMember(clazz.type(), Names.getClass); - Symbol addSym = intMethod(Names.ADD); - Symbol mulSym = intMethod(Names.MUL); + Symbol getClassMethod = getMember(clazz.type(), Names.getClass); + Symbol addMethod = getMemberMethod( + defs.INT_TYPE, Names.ADD, defs.INT_TYPE); + Symbol mulMethod = getMemberMethod( + defs.INT_TYPE, Names.MUL, defs.INT_TYPE); Tree body = gen.Apply( gen.Select( gen.Apply( - gen.mkRef(clazz.pos, clazz.thisType(), getClassSym), + gen.mkRef(clazz.pos, clazz.thisType(), getClassMethod), Tree.EMPTY_ARRAY), - getMember(getClassSym.type().resultType(), Names.hashCode)), + getMember(getClassMethod.type().resultType(), Names.hashCode)), Tree.EMPTY_ARRAY); for (int i = 0; i < fields.length; i++) { Tree operand = gen.Apply( @@ -315,37 +345,14 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { gen.Apply( gen.Select( gen.Apply( - gen.Select(body, mulSym), + gen.Select(body, mulMethod), new Tree[]{gen.mkIntLit(clazz.pos, 41)}), - addSym), + addMethod), new Tree[]{operand}); } return gen.DefDef(clazz.pos, hashCodeSym, body); } // where - private Symbol getMember(Type site, Name name) { - Symbol sym = site.lookupNonPrivate(name); - assert sym.kind == VAL; - return sym; - } - - private Symbol intMethod(Name name) { - Symbol sym = getMember(definitions.INT_TYPE, name); - switch (sym.type()) { - case OverloadedType(Symbol[] alts, Type[] alttypes): - for (int i = 0; i < alts.length; i++) { - if (hasIntParam(alttypes[i])) return alts[i]; - } - } - assert hasIntParam(sym.type()) : "no int method among " + sym.type(); - return sym; - } - - private boolean hasIntParam(Type tp) { - Symbol[] params = tp.firstParams(); - return params.length == 1 && - params[0].type().isSameAs(definitions.INT_TYPE); - } private Template addCaseMethods(Template templ, Symbol sym) { if (sym.kind == CLASS && (sym.flags & CASE) != 0) { @@ -359,7 +366,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds { TreeList ts = new TreeList(); if (!hasImplementation(clazz, Names.toString)) ts.append(toStringMethod(clazz)); - if (!hasImplementation(clazz, Names.EQEQ)) + if (!hasImplementation(clazz, Names.equals)) ts.append(equalsMethod(clazz)); if (!hasImplementation(clazz, Names.hashCode)) ts.append(hashCodeMethod(clazz)); -- cgit v1.2.3