From ec493efd85bbd6b358717280bb45fad86204e641 Mon Sep 17 00:00:00 2001 From: noti0na1 Date: Tue, 23 Jul 2019 01:10:45 -0400 Subject: [PATCH 1/2] Fix #6868: Move adding annotation constructor after setting classinfo --- .../tools/dotc/core/classfile/ClassfileParser.scala | 7 ++++--- .../dotc/core/unpickleScala2/Scala2Unpickler.scala | 5 +++-- .../annotation-with-inner-class-ref/MyJava_1.java | 13 +++++++++++++ .../annotation-with-inner-class-ref/MyScala_2.scala | 6 ++++++ 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyJava_1.java create mode 100644 tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyScala_2.scala diff --git a/compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala b/compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala index 7a99fb341b9f..802ca48437db 100644 --- a/compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala +++ b/compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala @@ -166,13 +166,14 @@ class ClassfileParser( for (i <- 0 until in.nextChar) parseMember(method = false) for (i <- 0 until in.nextChar) parseMember(method = true) classInfo = parseAttributes(classRoot.symbol, classInfo) - if (isAnnotation) addAnnotationConstructor(classInfo) classRoot.registerCompanion(moduleRoot.symbol) moduleRoot.registerCompanion(classRoot.symbol) - setClassInfo(classRoot, classInfo, fromScala2 = false) - setClassInfo(moduleRoot, staticInfo, fromScala2 = false) + setClassInfo(classRoot, classInfo, fromScala2 = false, isAnnotation = isAnnotation) + setClassInfo(moduleRoot, staticInfo, fromScala2 = false, isAnnotation = isAnnotation) + + if (isAnnotation) addAnnotationConstructor(classInfo) } else if (result == Some(NoEmbedded)) { for (sym <- List(moduleRoot.sourceModule, moduleRoot.symbol, classRoot.symbol)) { classRoot.owner.asClass.delete(sym) diff --git a/compiler/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala b/compiler/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala index a2dc5c7a0a82..6cb135429f38 100644 --- a/compiler/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala +++ b/compiler/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala @@ -95,7 +95,7 @@ object Scala2Unpickler { cls.enter(constr, scope) } - def setClassInfo(denot: ClassDenotation, info: Type, fromScala2: Boolean, selfInfo: Type = NoType)(implicit ctx: Context): Unit = { + def setClassInfo(denot: ClassDenotation, info: Type, fromScala2: Boolean, selfInfo: Type = NoType, isAnnotation: Boolean = false)(implicit ctx: Context): Unit = { val cls = denot.classSymbol val (tparams, TempClassInfoType(parents, decls, clazz)) = info match { case TempPolyType(tps, cinfo) => (tps, cinfo) @@ -120,7 +120,8 @@ object Scala2Unpickler { if (tsym.exists) tsym.setFlag(TypeParam) else denot.enter(tparam, decls) } - if (!denot.flagsUNSAFE.isAllOf(JavaModule)) ensureConstructor(denot.symbol.asClass, decls) + if (!denot.flagsUNSAFE.isAllOf(JavaModule) && !isAnnotation) + ensureConstructor(denot.symbol.asClass, decls) val scalacCompanion = denot.classSymbol.scalacLinkedClass diff --git a/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyJava_1.java b/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyJava_1.java new file mode 100644 index 000000000000..d99ad0334a5e --- /dev/null +++ b/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyJava_1.java @@ -0,0 +1,13 @@ +public @interface MyJava_1 { + + public MyClassTypeA typeA() default MyClassTypeA.A; + + public MyClassTypeB typeB(); + + public enum MyClassTypeA { + A + } + + public @interface MyClassTypeB {} +} + diff --git a/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyScala_2.scala b/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyScala_2.scala new file mode 100644 index 000000000000..cd91b7c619b2 --- /dev/null +++ b/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyScala_2.scala @@ -0,0 +1,6 @@ +object MyScala { + def a(mj: MyJava_1): Unit = { + println("MyJava") + } +} + From c5ae624933deade0db86bac1817ec39d9ac6f44e Mon Sep 17 00:00:00 2001 From: noti0na1 Date: Tue, 23 Jul 2019 01:58:23 -0400 Subject: [PATCH 2/2] Extend test to use annotation constructor --- .../annotation-with-inner-class-ref/MyJava_1.java | 8 +++++--- .../annotation-with-inner-class-ref/MyScala_2.scala | 7 +++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyJava_1.java b/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyJava_1.java index d99ad0334a5e..916297cbc569 100644 --- a/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyJava_1.java +++ b/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyJava_1.java @@ -1,11 +1,13 @@ public @interface MyJava_1 { - public MyClassTypeA typeA() default MyClassTypeA.A; + public String value() default "MyJava"; - public MyClassTypeB typeB(); + public MyClassTypeA typeA(); + + public MyClassTypeB typeB() default @MyClassTypeB; public enum MyClassTypeA { - A + A, B } public @interface MyClassTypeB {} diff --git a/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyScala_2.scala b/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyScala_2.scala index cd91b7c619b2..e0fd84008f39 100644 --- a/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyScala_2.scala +++ b/tests/pos-java-interop-separate/annotation-with-inner-class-ref/MyScala_2.scala @@ -1,6 +1,13 @@ +@MyJava_1("MyScala1", typeA = MyJava_1.MyClassTypeA.B) object MyScala { def a(mj: MyJava_1): Unit = { println("MyJava") } + + @MyJava_1(typeA = MyJava_1.MyClassTypeA.A) + def b(): Int = 1 + + @MyJava_1(value = "MyScala2", typeA = MyJava_1.MyClassTypeA.B) + def c(): Int = 2 }