summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-04-02 10:59:13 +0000
committerMartin Odersky <odersky@gmail.com>2003-04-02 10:59:13 +0000
commitd91518092ea08a22e4461fa32d1e35cc50e55d76 (patch)
treeaa5dcaa6d71c0693f112135970d48246ddcb1b67
parentfee56a72018990ffc943488f64b9236137e4a513 (diff)
downloadscala-d91518092ea08a22e4461fa32d1e35cc50e55d76.tar.gz
scala-d91518092ea08a22e4461fa32d1e35cc50e55d76.tar.bz2
scala-d91518092ea08a22e4461fa32d1e35cc50e55d76.zip
*** empty log message ***
-rw-r--r--sources/scala/Boolean.java8
-rw-r--r--sources/scala/Byte.java6
-rw-r--r--sources/scala/Char.java6
-rw-r--r--sources/scala/Double.java10
-rw-r--r--sources/scala/Float.java11
-rw-r--r--sources/scala/Int.java10
-rw-r--r--sources/scala/Long.java11
-rw-r--r--sources/scala/Short.java5
-rw-r--r--sources/scala/Tuple.tmpl2
-rw-r--r--sources/scala/Unit.java8
-rw-r--r--sources/scalac/backend/Primitives.java48
-rw-r--r--sources/scalac/symtab/Definitions.java4
-rw-r--r--sources/scalac/typechecker/Analyzer.java4
-rw-r--r--sources/scalac/typechecker/RefCheck.java131
-rw-r--r--test/files/pos/patterns.scala4
-rw-r--r--test/pos/patterns.scala4
16 files changed, 151 insertions, 121 deletions
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));
diff --git a/test/files/pos/patterns.scala b/test/files/pos/patterns.scala
index 5680b093ef..9af176a9f8 100644
--- a/test/files/pos/patterns.scala
+++ b/test/files/pos/patterns.scala
@@ -1,7 +1,7 @@
trait Option[a] {}
case class Some[a](x: a) extends Option[a] {
override def toString(): scala.String = "Some(" + x + ")";
- override def == (that: Any): Boolean = that match {
+ override def equals(that: Any): Boolean = that match {
case Some(x) => this.x == x
case _ => false
}
@@ -9,7 +9,7 @@ case class Some[a](x: a) extends Option[a] {
}
case class None[a] extends Option[a] {
override def toString(): scala.String = "None";
- override def == (that: Any) = that match {
+ override def equals(that: Any) = that match {
case None => true
case _ => false
}
diff --git a/test/pos/patterns.scala b/test/pos/patterns.scala
index 5680b093ef..9af176a9f8 100644
--- a/test/pos/patterns.scala
+++ b/test/pos/patterns.scala
@@ -1,7 +1,7 @@
trait Option[a] {}
case class Some[a](x: a) extends Option[a] {
override def toString(): scala.String = "Some(" + x + ")";
- override def == (that: Any): Boolean = that match {
+ override def equals(that: Any): Boolean = that match {
case Some(x) => this.x == x
case _ => false
}
@@ -9,7 +9,7 @@ case class Some[a](x: a) extends Option[a] {
}
case class None[a] extends Option[a] {
override def toString(): scala.String = "None";
- override def == (that: Any) = that match {
+ override def equals(that: Any) = that match {
case None => true
case _ => false
}