aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/core/Definitions.scala2
-rw-r--r--src/dotty/tools/dotc/core/pickling/ClassfileParser.scala29
-rw-r--r--src/scala/annotation/internal/TASTYLongSignature.java12
-rw-r--r--src/scala/annotation/internal/TASTYSignature.java12
-rw-r--r--tests/pos/sepComp/A_1.scala13
-rw-r--r--tests/pos/sepComp/B_2.scala13
6 files changed, 74 insertions, 7 deletions
diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala
index 7accf9148..7de254008 100644
--- a/src/dotty/tools/dotc/core/Definitions.scala
+++ b/src/dotty/tools/dotc/core/Definitions.scala
@@ -335,6 +335,8 @@ class Definitions {
lazy val ContravariantBetweenClass = ctx.requiredClass("dotty.annotation.internal.ContravariantBetween")
lazy val ScalaSignatureAnnot = ctx.requiredClass("scala.reflect.ScalaSignature")
lazy val ScalaLongSignatureAnnot = ctx.requiredClass("scala.reflect.ScalaLongSignature")
+ lazy val TASTYSignatureAnnot = ctx.requiredClass("scala.annotation.internal.TASTYSignature")
+ lazy val TASTYLongSignatureAnnot = ctx.requiredClass("scala.annotation.internal.TASTYLongSignature")
lazy val DeprecatedAnnot = ctx.requiredClass("scala.deprecated")
lazy val MigrationAnnot = ctx.requiredClass("scala.annotation.migration")
lazy val AnnotationDefaultAnnot = ctx.requiredClass("dotty.annotation.internal.AnnotationDefault")
diff --git a/src/dotty/tools/dotc/core/pickling/ClassfileParser.scala b/src/dotty/tools/dotc/core/pickling/ClassfileParser.scala
index 3d47678b7..21c9aa84d 100644
--- a/src/dotty/tools/dotc/core/pickling/ClassfileParser.scala
+++ b/src/dotty/tools/dotc/core/pickling/ClassfileParser.scala
@@ -664,11 +664,17 @@ class ClassfileParser(
i < attrs
}
- def unpickle(bytes: Array[Byte]): Boolean = {
+ def unpickleScala(bytes: Array[Byte]): Boolean = {
new UnPickler(bytes, classRoot, moduleRoot)(ctx).run()
true
}
+ def unpickleTASTY(bytes: Array[Byte]): Boolean = {
+ new DottyUnpickler(bytes)
+ .enter(roots = Set(classRoot, moduleRoot, moduleRoot.sourceModule))
+ true
+ }
+
def parseScalaSigBytes: Array[Byte] = {
val tag = in.nextByte.toChar
assert(tag == STRING_TAG, tag)
@@ -688,6 +694,11 @@ class ClassfileParser(
pool.getBytes(entries.toList)
}
+ if (scan(tpnme.TASTYATTR)) {
+ val attrLen = in.nextInt
+ return unpickleTASTY(in.nextBytes(attrLen))
+ }
+
if (scan(tpnme.RuntimeAnnotationATTR)) {
val attrLen = in.nextInt
val nAnnots = in.nextChar
@@ -698,12 +709,16 @@ class ClassfileParser(
var j = 0
while (j < nArgs) {
val argName = pool.getName(in.nextChar)
- if (attrClass == defn.ScalaSignatureAnnot && argName == nme.bytes)
- return unpickle(parseScalaSigBytes)
- else if (attrClass == defn.ScalaLongSignatureAnnot && argName == nme.bytes)
- return unpickle(parseScalaLongSigBytes)
- else
- parseAnnotArg(skip = true)
+ if (argName == nme.bytes)
+ if (attrClass == defn.ScalaSignatureAnnot)
+ return unpickleScala(parseScalaSigBytes)
+ else if (attrClass == defn.ScalaLongSignatureAnnot)
+ return unpickleScala(parseScalaLongSigBytes)
+ else if (attrClass == defn.TASTYSignatureAnnot)
+ return unpickleTASTY(parseScalaSigBytes)
+ else if (attrClass == defn.TASTYLongSignatureAnnot)
+ return unpickleTASTY(parseScalaLongSigBytes)
+ parseAnnotArg(skip = true)
j += 1
}
i += 1
diff --git a/src/scala/annotation/internal/TASTYLongSignature.java b/src/scala/annotation/internal/TASTYLongSignature.java
new file mode 100644
index 000000000..2278da258
--- /dev/null
+++ b/src/scala/annotation/internal/TASTYLongSignature.java
@@ -0,0 +1,12 @@
+package scala.annotation.internal;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface TASTYLongSignature {
+ public String[] bytes();
+}
diff --git a/src/scala/annotation/internal/TASTYSignature.java b/src/scala/annotation/internal/TASTYSignature.java
new file mode 100644
index 000000000..a6372f008
--- /dev/null
+++ b/src/scala/annotation/internal/TASTYSignature.java
@@ -0,0 +1,12 @@
+package scala.annotation.internal;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface TASTYSignature {
+ public String bytes();
+}
diff --git a/tests/pos/sepComp/A_1.scala b/tests/pos/sepComp/A_1.scala
new file mode 100644
index 000000000..03d574705
--- /dev/null
+++ b/tests/pos/sepComp/A_1.scala
@@ -0,0 +1,13 @@
+package sepComp
+
+class A(y: Int) {
+
+ val x: Int = y
+
+}
+
+object A {
+
+ def apply(x: Int) = new A(22)
+
+}
diff --git a/tests/pos/sepComp/B_2.scala b/tests/pos/sepComp/B_2.scala
new file mode 100644
index 000000000..3a503b352
--- /dev/null
+++ b/tests/pos/sepComp/B_2.scala
@@ -0,0 +1,13 @@
+package sepComp
+
+class B extends A(22) {
+
+ val y: Int = this.x
+
+ val a = A(33)
+
+ println(a.x)
+
+}
+
+