Skip to content

Commit

Permalink
Merge pull request #15185 from griggt/fix-15166
Browse files Browse the repository at this point in the history
Avoid overeager completion of Java annotations in classfile parser
  • Loading branch information
smarter authored May 23, 2022
2 parents 20e88f3 + bc767cc commit 324516b
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 10 deletions.
2 changes: 0 additions & 2 deletions compiler/src/dotty/tools/dotc/core/Definitions.scala
Original file line number Diff line number Diff line change
Expand Up @@ -966,8 +966,6 @@ class Definitions {
@tu lazy val ScalaStrictFPAnnot: ClassSymbol = requiredClass("scala.annotation.strictfp")
@tu lazy val ScalaStaticAnnot: ClassSymbol = requiredClass("scala.annotation.static")
@tu lazy val SerialVersionUIDAnnot: ClassSymbol = requiredClass("scala.SerialVersionUID")
@tu lazy val TASTYSignatureAnnot: ClassSymbol = requiredClass("scala.annotation.internal.TASTYSignature")
@tu lazy val TASTYLongSignatureAnnot: ClassSymbol = requiredClass("scala.annotation.internal.TASTYLongSignature")
@tu lazy val TailrecAnnot: ClassSymbol = requiredClass("scala.annotation.tailrec")
@tu lazy val ThreadUnsafeAnnot: ClassSymbol = requiredClass("scala.annotation.threadUnsafe")
@tu lazy val ConstructorOnlyAnnot: ClassSymbol = requiredClass("scala.annotation.constructorOnly")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -870,7 +870,7 @@ class ClassfileParser(

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

if (scan(tpnme.RuntimeVisibleAnnotationATTR) || scan(tpnme.RuntimeInvisibleAnnotationATTR)) {
if (scan(tpnme.ScalaSignatureATTR) && scan(tpnme.RuntimeVisibleAnnotationATTR)) {
val attrLen = in.nextInt
val nAnnots = in.nextChar
var i = 0
Expand All @@ -1010,14 +1010,10 @@ class ClassfileParser(
while (j < nArgs) {
val argName = pool.getName(in.nextChar)
if (argName.name == nme.bytes) {
if (attrClass == defn.ScalaSignatureAnnot)
if attrClass == defn.ScalaSignatureAnnot then
return unpickleScala(parseScalaSigBytes)
else if (attrClass == defn.ScalaLongSignatureAnnot)
else if attrClass == defn.ScalaLongSignatureAnnot then
return unpickleScala(parseScalaLongSigBytes)
else if (attrClass == defn.TASTYSignatureAnnot)
return unpickleTASTY(parseScalaSigBytes)
else if (attrClass == defn.TASTYLongSignatureAnnot)
return unpickleTASTY(parseScalaLongSigBytes)
}
parseAnnotArg(skip = true)
j += 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Deprecated
public @interface TASTYLongSignature {
public String[] bytes();
}
1 change: 1 addition & 0 deletions library/src/scala/annotation/internal/TASTYSignature.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Deprecated
public @interface TASTYSignature {
public String bytes();
}
8 changes: 8 additions & 0 deletions tests/pos/i15166/InterfaceAudience_JAVA_ONLY_1.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@InterfaceStability_JAVA_ONLY_1.Evolving(bytes="no")
public class InterfaceAudience_JAVA_ONLY_1 {
@Retention(RetentionPolicy.RUNTIME)
public @interface Public { String bytes(); }
}
8 changes: 8 additions & 0 deletions tests/pos/i15166/InterfaceStability_JAVA_ONLY_1.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@InterfaceAudience_JAVA_ONLY_1.Public(bytes="yes")
public class InterfaceStability_JAVA_ONLY_1 {
@Retention(RetentionPolicy.RUNTIME)
public @interface Evolving { String bytes(); }
}
4 changes: 4 additions & 0 deletions tests/pos/i15166/Test_2.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// scalac: -Xfatal-warnings
object Test {
val x: InterfaceAudience_JAVA_ONLY_1.Public = ???
}

0 comments on commit 324516b

Please sign in to comment.