Skip to content

Commit 324516b

Browse files
authored
Merge pull request #15185 from griggt/fix-15166
Avoid overeager completion of Java annotations in classfile parser
2 parents 20e88f3 + bc767cc commit 324516b

File tree

7 files changed

+26
-10
lines changed

7 files changed

+26
-10
lines changed

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -966,8 +966,6 @@ class Definitions {
966966
@tu lazy val ScalaStrictFPAnnot: ClassSymbol = requiredClass("scala.annotation.strictfp")
967967
@tu lazy val ScalaStaticAnnot: ClassSymbol = requiredClass("scala.annotation.static")
968968
@tu lazy val SerialVersionUIDAnnot: ClassSymbol = requiredClass("scala.SerialVersionUID")
969-
@tu lazy val TASTYSignatureAnnot: ClassSymbol = requiredClass("scala.annotation.internal.TASTYSignature")
970-
@tu lazy val TASTYLongSignatureAnnot: ClassSymbol = requiredClass("scala.annotation.internal.TASTYLongSignature")
971969
@tu lazy val TailrecAnnot: ClassSymbol = requiredClass("scala.annotation.tailrec")
972970
@tu lazy val ThreadUnsafeAnnot: ClassSymbol = requiredClass("scala.annotation.threadUnsafe")
973971
@tu lazy val ConstructorOnlyAnnot: ClassSymbol = requiredClass("scala.annotation.constructorOnly")

compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -870,7 +870,7 @@ class ClassfileParser(
870870

871871
/** Parse inner classes. Expects `in.bp` to point to the superclass entry.
872872
* Restores the old `bp`.
873-
* @return true iff classfile is from Scala, so no Java info needs to be read.
873+
* @return Some(unpickler) iff classfile is from Scala, so no Java info needs to be read.
874874
*/
875875
def unpickleOrParseInnerClasses()(using ctx: Context, in: DataReader): Option[Embedded] = {
876876
val oldbp = in.bp
@@ -999,7 +999,7 @@ class ClassfileParser(
999999
// attribute isn't, this classfile is a compilation artifact.
10001000
return Some(NoEmbedded)
10011001

1002-
if (scan(tpnme.RuntimeVisibleAnnotationATTR) || scan(tpnme.RuntimeInvisibleAnnotationATTR)) {
1002+
if (scan(tpnme.ScalaSignatureATTR) && scan(tpnme.RuntimeVisibleAnnotationATTR)) {
10031003
val attrLen = in.nextInt
10041004
val nAnnots = in.nextChar
10051005
var i = 0
@@ -1010,14 +1010,10 @@ class ClassfileParser(
10101010
while (j < nArgs) {
10111011
val argName = pool.getName(in.nextChar)
10121012
if (argName.name == nme.bytes) {
1013-
if (attrClass == defn.ScalaSignatureAnnot)
1013+
if attrClass == defn.ScalaSignatureAnnot then
10141014
return unpickleScala(parseScalaSigBytes)
1015-
else if (attrClass == defn.ScalaLongSignatureAnnot)
1015+
else if attrClass == defn.ScalaLongSignatureAnnot then
10161016
return unpickleScala(parseScalaLongSigBytes)
1017-
else if (attrClass == defn.TASTYSignatureAnnot)
1018-
return unpickleTASTY(parseScalaSigBytes)
1019-
else if (attrClass == defn.TASTYLongSignatureAnnot)
1020-
return unpickleTASTY(parseScalaLongSigBytes)
10211017
}
10221018
parseAnnotArg(skip = true)
10231019
j += 1

library/src/scala/annotation/internal/TASTYLongSignature.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
@Retention(RetentionPolicy.RUNTIME)
99
@Target(ElementType.TYPE)
10+
@Deprecated
1011
public @interface TASTYLongSignature {
1112
public String[] bytes();
1213
}

library/src/scala/annotation/internal/TASTYSignature.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
@Retention(RetentionPolicy.RUNTIME)
99
@Target(ElementType.TYPE)
10+
@Deprecated
1011
public @interface TASTYSignature {
1112
public String bytes();
1213
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import java.lang.annotation.Retention;
2+
import java.lang.annotation.RetentionPolicy;
3+
4+
@InterfaceStability_JAVA_ONLY_1.Evolving(bytes="no")
5+
public class InterfaceAudience_JAVA_ONLY_1 {
6+
@Retention(RetentionPolicy.RUNTIME)
7+
public @interface Public { String bytes(); }
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import java.lang.annotation.Retention;
2+
import java.lang.annotation.RetentionPolicy;
3+
4+
@InterfaceAudience_JAVA_ONLY_1.Public(bytes="yes")
5+
public class InterfaceStability_JAVA_ONLY_1 {
6+
@Retention(RetentionPolicy.RUNTIME)
7+
public @interface Evolving { String bytes(); }
8+
}

tests/pos/i15166/Test_2.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// scalac: -Xfatal-warnings
2+
object Test {
3+
val x: InterfaceAudience_JAVA_ONLY_1.Public = ???
4+
}

0 commit comments

Comments
 (0)