From 0268e03cb461b0c7e8ae2082894988395fc0994a Mon Sep 17 00:00:00 2001 From: Eugene Burmako Date: Tue, 28 Jan 2014 19:37:59 +0300 Subject: SI-8118 simplifies Annotation down to a plain Tree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As per https://groups.google.com/forum/#!topic/scala-internals/8v2UL-LR9yY, annotations don’t have to be represented as AnnotationInfos and can be reduced to plain Trees. Due to compatibility reasons and because of the limitations of the cake pattern used in implementing current version of Reflection, we can’t just say `type Annotation = Tree`, however what we can definitely do is to deprecate all the methods on Annotation and expose `tree: Tree` instead. --- .../files/run/macro-vampire-false-warning/Macros_1.scala | 4 ++-- test/files/run/reflection-java-annotations.check | 3 +++ test/files/run/reflection-java-annotations/Test_2.scala | 2 ++ test/files/run/reflection-scala-annotations.check | 7 +++++++ test/files/run/reflection-scala-annotations.scala | 16 ++++++++++++++++ test/files/run/t6860.scala | 2 +- test/files/run/t8190.check | 4 ---- test/files/run/t8190.scala | 12 ++++-------- 8 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 test/files/run/reflection-scala-annotations.check create mode 100644 test/files/run/reflection-scala-annotations.scala (limited to 'test/files') diff --git a/test/files/run/macro-vampire-false-warning/Macros_1.scala b/test/files/run/macro-vampire-false-warning/Macros_1.scala index 0912bfba0c..51869d214f 100644 --- a/test/files/run/macro-vampire-false-warning/Macros_1.scala +++ b/test/files/run/macro-vampire-false-warning/Macros_1.scala @@ -10,8 +10,8 @@ object Macros { def selFieldImpl(c: Context) = { import c.universe._ val field = c.macroApplication.symbol - val bodyAnn = field.annotations.filter(_.tpe <:< typeOf[body]).head - c.Expr[Any](bodyAnn.scalaArgs.head) + val bodyAnn = field.annotations.filter(_.tree.tpe <:< typeOf[body]).head + c.Expr[Any](bodyAnn.tree.children(1)) } def mkObjectImpl(c: Context)(xs: c.Expr[Any]*) = { diff --git a/test/files/run/reflection-java-annotations.check b/test/files/run/reflection-java-annotations.check index 2d37fff1f4..72d40989fe 100644 --- a/test/files/run/reflection-java-annotations.check +++ b/test/files/run/reflection-java-annotations.check @@ -1 +1,4 @@ +warning: there were 1 deprecation warning(s); re-run with -deprecation for details List(JavaComplexAnnotation_1(v1 = 1, v10 = "hello", v101 = [101, 101], v102 = [102, 102], v103 = ['g', 'g'], v104 = [104, 104], v105 = [105L, 105L], v106 = [106.0, 106.0], v107 = [107.0, 107.0], v108 = [false, true], v11 = classOf[JavaAnnottee_1], v110 = ["hello", "world"], v111 = [classOf[JavaSimpleAnnotation_1], classOf[JavaComplexAnnotation_1]], v112 = [FOO, BAR], v113 = [JavaSimpleAnnotation_1(v1 = 21, v10 = "world2", v11 = classOf[JavaComplexAnnotation_1], v12 = BAR, v2 = 22, v3 = '\027', v4 = 24, v5 = 25L, v6 = 26.0, v7 = 27.0, v8 = false)], v12 = FOO, v13 = JavaSimpleAnnotation_1(v1 = 11, v10 = "world1", v11 = classOf[JavaSimpleAnnotation_1], v12 = FOO, v2 = 12, v3 = '\r', v4 = 14, v5 = 15L, v6 = 16.0, v7 = 17.0, v8 = false), v2 = 2, v3 = '\03', v4 = 4, v5 = 5L, v6 = 6.0, v7 = 7.0, v8 = false)) +======= +new JavaComplexAnnotation_1(v1 = 1, v10 = "hello", v101 = Array(101, 101), v102 = Array(102, 102), v103 = Array('g', 'g'), v104 = Array(104, 104), v105 = Array(105L, 105L), v106 = Array(106.0, 106.0), v107 = Array(107.0, 107.0), v108 = Array(false, true), v11 = classOf[JavaAnnottee_1], v110 = Array("hello", "world"), v111 = Array(classOf[JavaSimpleAnnotation_1], classOf[JavaComplexAnnotation_1]), v112 = Array(FOO, BAR), v113 = Array(new JavaSimpleAnnotation_1(v1 = 21, v10 = "world2", v11 = classOf[JavaComplexAnnotation_1], v12 = BAR, v2 = 22, v3 = '\027', v4 = 24, v5 = 25L, v6 = 26.0, v7 = 27.0, v8 = false)), v12 = FOO, v13 = new JavaSimpleAnnotation_1(v1 = 11, v10 = "world1", v11 = classOf[JavaSimpleAnnotation_1], v12 = FOO, v2 = 12, v3 = '\r', v4 = 14, v5 = 15L, v6 = 16.0, v7 = 17.0, v8 = false), v2 = 2, v3 = '\03', v4 = 4, v5 = 5L, v6 = 6.0, v7 = 7.0, v8 = false) diff --git a/test/files/run/reflection-java-annotations/Test_2.scala b/test/files/run/reflection-java-annotations/Test_2.scala index d2c3157071..5c9e9afdb7 100644 --- a/test/files/run/reflection-java-annotations/Test_2.scala +++ b/test/files/run/reflection-java-annotations/Test_2.scala @@ -4,4 +4,6 @@ object Test extends App { sym.typeSignature sym.annotations foreach (_.javaArgs) println(sym.annotations) + println("=======") + sym.annotations.map(_.tree).map(println) } \ No newline at end of file diff --git a/test/files/run/reflection-scala-annotations.check b/test/files/run/reflection-scala-annotations.check new file mode 100644 index 0000000000..5bc2786161 --- /dev/null +++ b/test/files/run/reflection-scala-annotations.check @@ -0,0 +1,7 @@ +reflection-scala-annotations.scala:5: warning: Implementation restriction: subclassing Classfile does not +make your annotation visible at runtime. If that is what +you want, you must write the annotation class in Java. +class jann(x: Int, y: Array[Int]) extends ClassfileAnnotation + ^ +new sann(1, immutable.this.List.apply[Int](1, 2)) +new jann(y = Array(1, 2), x = 2) diff --git a/test/files/run/reflection-scala-annotations.scala b/test/files/run/reflection-scala-annotations.scala new file mode 100644 index 0000000000..f6a6895ee0 --- /dev/null +++ b/test/files/run/reflection-scala-annotations.scala @@ -0,0 +1,16 @@ +import scala.reflect.runtime.universe._ +import scala.annotation._ + +class sann(x: Int, y: List[Int]) extends StaticAnnotation +class jann(x: Int, y: Array[Int]) extends ClassfileAnnotation + +@sann(1, List(1, 2)) +class S + +@jann(y = Array(1, 2), x = 2) +class J + +object Test extends App { + println(symbolOf[S].annotations.head.tree) + println(symbolOf[J].annotations.head.tree) +} diff --git a/test/files/run/t6860.scala b/test/files/run/t6860.scala index 2dcc2a67f7..1391af3430 100644 --- a/test/files/run/t6860.scala +++ b/test/files/run/t6860.scala @@ -13,7 +13,7 @@ object Test { def main(args: Array[String]): Unit = { val members = typeOf[A].declarations.toList - val tpes = members flatMap (_.annotations) map (_.tpe) + val tpes = members flatMap (_.annotations) map (_.tree.tpe) tpes.map(_.toString).sorted foreach println } diff --git a/test/files/run/t8190.check b/test/files/run/t8190.check index 2362af7320..d117bf3294 100644 --- a/test/files/run/t8190.check +++ b/test/files/run/t8190.check @@ -1,8 +1,4 @@ Annotation -JavaArgument -LiteralArgument -ArrayArgument -NestedArgument Constant Mirror Name diff --git a/test/files/run/t8190.scala b/test/files/run/t8190.scala index f8abb73f15..012d0ad347 100644 --- a/test/files/run/t8190.scala +++ b/test/files/run/t8190.scala @@ -4,10 +4,6 @@ trait Overloads { // makes sure noone erases to Any or AnyRef def test(x: AnyRef) = "AnyRef" def test(x: Annotation) = "Annotation" - def test(x: JavaArgument) = "JavaArgument" - def test(x: LiteralArgument) = "LiteralArgument" - def test(x: ArrayArgument) = "ArrayArgument" - def test(x: NestedArgument) = "NestedArgument" def test(x: Constant) = "Constant" def test(x: Mirror) = "Mirror" def test(x: Name) = "Name" @@ -110,14 +106,14 @@ object Test extends App with Overloads { types = types.filter(_ != "ModifiersCreator") // type ModifiersCreator = ModifiersExtractor types = types.filter(_ != "FlagSet") // type FlagSet types = types.filter(_ != "RuntimeClass") // type RuntimeClass = java.lang.Class[_] + types = types.filter(_ != "JavaArgument") // deprecated + types = types.filter(_ != "LiteralArgument") // deprecated + types = types.filter(_ != "ArrayArgument") // deprecated + types = types.filter(_ != "NestedArgument") // deprecated val diff = types.toList diff buf.toList println("uncovered type members: " + diff) } record(test(null: Annotation)) - record(test(null: JavaArgument)) - record(test(null: LiteralArgument)) - record(test(null: ArrayArgument)) - record(test(null: NestedArgument)) record(test(null: Constant)) record(test(null: Mirror)) record(test(null: Name)) -- cgit v1.2.3