summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2012-07-17 01:19:58 -0700
committerAdriaan Moors <adriaan.moors@epfl.ch>2012-07-17 01:19:58 -0700
commit0cfd858a38ddf0ac83d9bbefe85110f88dc707c0 (patch)
treec35a1655b6139a931dc32246815e7017cdccfbe4 /src
parentd9629db638ab1c63ca1eb7170c84a34112235204 (diff)
parent7c42b5aa4de0d88e02b73bdcda49309bde834be6 (diff)
downloadscala-0cfd858a38ddf0ac83d9bbefe85110f88dc707c0.tar.gz
scala-0cfd858a38ddf0ac83d9bbefe85110f88dc707c0.tar.bz2
scala-0cfd858a38ddf0ac83d9bbefe85110f88dc707c0.zip
Merge pull request #915 from gkossakowski/SI-6035-specialized-flag
SI-6035: Specialization and separate compilation.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/transform/UnCurry.scala6
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala13
2 files changed, 13 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
index 663b3dd2e9..de0650b2ea 100644
--- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala
+++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
@@ -564,12 +564,6 @@ abstract class UnCurry extends InfoTransform
}
val sym = tree.symbol
- // Take a pass looking for @specialize annotations and set all
- // their SPECIALIZE flags for cheaper recognition.
- if ((sym ne null) && (sym.isClass || sym.isMethod)) {
- for (tp <- sym.typeParams ; if tp hasAnnotation SpecializedClass)
- tp setFlag SPECIALIZED
- }
val result = (
// TODO - settings.noassertions.value temporarily retained to avoid
// breakage until a reasonable interface is settled upon.
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
index f67cec730b..b544407286 100644
--- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
@@ -19,6 +19,10 @@ import symtab.Flags._
* of class-members which are private up to an enclosing non-package
* class, in order to avoid overriding conflicts.
*
+ * This phase also sets SPECIALIZED flag on type parameters with
+ * `@specialized` annotation. We put this logic here because the
+ * flag must be set before pickling.
+ *
* @author Martin Odersky
* @version 1.0
*/
@@ -208,6 +212,15 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT
case TypeApply(sel @ Select(This(_), name), args) =>
mayNeedProtectedAccessor(sel, args, false)
+ // set a flag for all type parameters with `@specialized` annotation so it can be pickled
+ case typeDef: TypeDef if typeDef.symbol.deSkolemize.hasAnnotation(definitions.SpecializedClass) =>
+ debuglog("setting SPECIALIZED flag on typeDef.symbol.deSkolemize where typeDef = " + typeDef)
+ // we need to deSkolemize symbol so we get the same symbol as others would get when
+ // inspecting type parameter from "outside"; see the discussion of skolems here:
+ // https://groups.google.com/d/topic/scala-internals/0j8laVNTQsI/discussion
+ typeDef.symbol.deSkolemize.setFlag(SPECIALIZED)
+ typeDef
+
case sel @ Select(qual @ This(_), name) =>
// warn if they are selecting a private[this] member which
// also exists in a superclass, because they may be surprised