summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2012-06-08 09:01:16 -0700
committerAdriaan Moors <adriaan.moors@epfl.ch>2012-06-08 09:01:16 -0700
commit8d0ba32a3fe2a7331e692868b469b95292b4eabc (patch)
treef15e3695f16fb4cf83e643a2b70aadb24874930d /src
parentf42f76b4c6484521c70493207bf92732200e0411 (diff)
parentdab1d0361ff74a2e4500255beba65389f44f34cc (diff)
downloadscala-8d0ba32a3fe2a7331e692868b469b95292b4eabc.tar.gz
scala-8d0ba32a3fe2a7331e692868b469b95292b4eabc.tar.bz2
scala-8d0ba32a3fe2a7331e692868b469b95292b4eabc.zip
Merge pull request #679 from axel22/issue/5853
Fix SI-5853.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/transform/ExtensionMethods.scala17
-rw-r--r--src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala1
2 files changed, 17 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/ExtensionMethods.scala b/src/compiler/scala/tools/nsc/transform/ExtensionMethods.scala
index 31d804b4b5..1c97eaad8b 100644
--- a/src/compiler/scala/tools/nsc/transform/ExtensionMethods.scala
+++ b/src/compiler/scala/tools/nsc/transform/ExtensionMethods.scala
@@ -77,11 +77,26 @@ abstract class ExtensionMethods extends Transform with TypingTransformers {
matching.head
}
+ /** This method removes the `$this` argument from the parameter list a method.
+ *
+ * A method may be a `PolyType`, in which case we tear out the `$this` and the class
+ * type params from its nested `MethodType`.
+ * It may be a `MethodType`, either with a curried parameter list in which the first argument
+ * is a `$this` - we just return the rest of the list.
+ * This means that the corresponding symbol was generated during `extmethods`.
+ *
+ * It may also be a `MethodType` in which the `$this` does not appear in a curried parameter list.
+ * The curried lists disappear during `uncurry`, and the methods may be duplicated afterwards,
+ * for instance, during `specialize`.
+ * In this case, the first argument is `$this` and we just get rid of it.
+ */
private def normalize(stpe: Type, clazz: Symbol): Type = stpe match {
case PolyType(tparams, restpe) =>
GenPolyType(tparams dropRight clazz.typeParams.length, normalize(restpe.substSym(tparams takeRight clazz.typeParams.length, clazz.typeParams), clazz))
- case MethodType(tparams, restpe) =>
+ case MethodType(List(thiz), restpe) if thiz.name == nme.SELF =>
restpe
+ case MethodType(tparams, restpe) =>
+ MethodType(tparams.drop(1), restpe)
case _ =>
stpe
}
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
index ae6ec8511c..4b488a6437 100644
--- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
+++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
@@ -823,6 +823,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
debuglog("%s expands to %s in %s".format(sym, specMember.name.decode, pp(env)))
info(specMember) = NormalizedMember(sym)
overloads(sym) ::= Overload(specMember, env)
+ owner.info.decls.enter(specMember)
specMember
}
}