summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormihaylov <mihaylov@epfl.ch>2004-07-19 08:35:36 +0000
committermihaylov <mihaylov@epfl.ch>2004-07-19 08:35:36 +0000
commitb1b396567e011083b80c548251be091586c32acc (patch)
tree96d8adf7eaf6f9bed209c73a4441305feffa7c59
parent259f4d27458fc1aedee00e9d2a644d34455dea6c (diff)
downloadscala-b1b396567e011083b80c548251be091586c32acc.tar.gz
scala-b1b396567e011083b80c548251be091586c32acc.tar.bz2
scala-b1b396567e011083b80c548251be091586c32acc.zip
- Look for the most specific alternative of the...
- Look for the most specific alternative of the == method when generating the equals method for case classes
-rwxr-xr-xsources/scala/tools/scalac/typechecker/RefCheck.scala32
1 files changed, 32 insertions, 0 deletions
diff --git a/sources/scala/tools/scalac/typechecker/RefCheck.scala b/sources/scala/tools/scalac/typechecker/RefCheck.scala
index f97b1f77fd..04ede04094 100755
--- a/sources/scala/tools/scalac/typechecker/RefCheck.scala
+++ b/sources/scala/tools/scalac/typechecker/RefCheck.scala
@@ -612,10 +612,42 @@ class RefCheck(globl: scalac.Global) extends Transformer(globl) {
getMethod(site, name,
tp => tp.paramSectionCount() == 1 && tp.firstParams().length == 0);
+/*
private def getUnaryMemberMethod(site: Type, name: Name, paramtype: Type): Symbol =
getMethod(site, name,
tp => { val params = tp.firstParams();
params.length == 1 && paramtype.isSubType(params(0).getType()) });
+*/
+
+ private def getUnaryMemberMethod(site: Type, name: Name, paramtype: Type): Symbol = {
+ val sym = getMember(site, name);
+ sym.getType() match {
+ case Type$OverloadedType(alts, alttypes) => {
+ var member: Symbol = null;
+ var memberparamtype: Type = null;
+ var i = 0; while (i < alts.length) {
+ val params = alttypes(i).firstParams();
+ if (params.length == 1) {
+ val altparamtype = params(0).getType();
+ if (paramtype.isSubType(altparamtype)) {
+ if (member == null || altparamtype.isSubType(memberparamtype)) {
+ member = alts(i);
+ memberparamtype = altparamtype;
+ }
+ }
+ }
+ i = i + 1
+ }
+ if (member != null) return member;
+ }
+ case _ =>
+ val params = sym.getType().firstParams();
+ if (params.length == 1 && paramtype.isSubType(params(0).getType())) return sym;
+ }
+ throw new ApplicationError(
+ " no method " + name + " of required kind among " + sym.getType() + " at " + site);
+ }
+
private def caseFields(clazz: ClassSymbol): Array[Tree] = {
var ct = clazz.primaryConstructor().getType();