diff options
author | mihaylov <mihaylov@epfl.ch> | 2004-07-19 08:35:36 +0000 |
---|---|---|
committer | mihaylov <mihaylov@epfl.ch> | 2004-07-19 08:35:36 +0000 |
commit | b1b396567e011083b80c548251be091586c32acc (patch) | |
tree | 96d8adf7eaf6f9bed209c73a4441305feffa7c59 | |
parent | 259f4d27458fc1aedee00e9d2a644d34455dea6c (diff) | |
download | scala-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-x | sources/scala/tools/scalac/typechecker/RefCheck.scala | 32 |
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(); |