From 94d27581473d54645529adef27c2e183221d5a51 Mon Sep 17 00:00:00 2001 From: Lukas Rytz Date: Wed, 27 Jan 2010 10:23:31 +0000 Subject: close #2868. --- .../tools/nsc/symtab/classfile/UnPickler.scala | 39 +++++++++++----------- test/files/pos/t2868/Jann.java | 5 +++ test/files/pos/t2868/Nest.java | 3 ++ test/files/pos/t2868/pick_1.scala | 7 ++++ test/files/pos/t2868/test_2.scala | 6 ++++ 5 files changed, 41 insertions(+), 19 deletions(-) create mode 100644 test/files/pos/t2868/Jann.java create mode 100644 test/files/pos/t2868/Nest.java create mode 100644 test/files/pos/t2868/pick_1.scala create mode 100644 test/files/pos/t2868/test_2.scala diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala index 8258878376..b5cb171ed1 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/UnPickler.scala @@ -381,26 +381,28 @@ abstract class UnPickler { /** Read an annotation argument, which is pickled either * as a Constant or a Tree. */ - private def readAnnotArg(): Tree = { + private def readAnnotArg(i: Int): Tree = { if (peekByte() == TREE) { - readTree() + at(i, readTree) } else { - val const = readConstant() + val const = at(i, readConstant) Literal(const).setType(const.tpe) } } /** Read a ClassfileAnnotArg (argument to a classfile annotation) */ - private def readClassfileAnnotArg(): ClassfileAnnotArg = peekByte() match { - case ANNOTINFO => - NestedAnnotArg(readAnnotation()) - case ANNOTARGARRAY => - readByte() - val end = readNat() + readIndex - ArrayAnnotArg(until(end, readClassfileAnnotArgRef).toArray) - case _ => - LiteralAnnotArg(readConstant()) + private def readClassfileAnnotArg(i: Int): ClassfileAnnotArg = bytes(index(i)) match { + case ANNOTINFO => + NestedAnnotArg(at(i, readAnnotation)) + case ANNOTARGARRAY => + at(i, () => { + readByte() // skip the `annotargarray` tag + val end = readNat() + readIndex + ArrayAnnotArg(until(end, () => readClassfileAnnotArg(readNat())).toArray) + }) + case _ => + LiteralAnnotArg(at(i, readConstant)) } /** Read an AnnotationInfo. Not to be called directly, use @@ -412,10 +414,13 @@ abstract class UnPickler { val assocs = new ListBuffer[(Name, ClassfileAnnotArg)] while (readIndex != end) { val argref = readNat() - if (isNameEntry(argref)) - assocs += ((at(argref, readName), readClassfileAnnotArgRef)) + if (isNameEntry(argref)) { + val name = at(argref, readName) + val arg = readClassfileAnnotArg(readNat()) + assocs += ((name, arg)) + } else - args += at(argref, readAnnotArg) + args += readAnnotArg(argref) } AnnotationInfo(atp, args.toList, assocs.toList) } @@ -726,10 +731,6 @@ abstract class UnPickler { private def readSymbolRef(): Symbol = at(readNat(), readSymbol) private def readTypeRef(): Type = at(readNat(), readType) private def readConstantRef(): Constant = at(readNat(), readConstant) - private def readAnnotArgRef(): Tree = - at(readNat(), readAnnotArg) - private def readClassfileAnnotArgRef(): ClassfileAnnotArg = - at(readNat(), readClassfileAnnotArg) private def readAnnotationRef(): AnnotationInfo = at(readNat(), readAnnotation) private def readModifiersRef(): Modifiers = diff --git a/test/files/pos/t2868/Jann.java b/test/files/pos/t2868/Jann.java new file mode 100644 index 0000000000..f5b68de7b0 --- /dev/null +++ b/test/files/pos/t2868/Jann.java @@ -0,0 +1,5 @@ +public @interface Jann { + public String str(); + public Nest inn(); + public int[] arr(); +} diff --git a/test/files/pos/t2868/Nest.java b/test/files/pos/t2868/Nest.java new file mode 100644 index 0000000000..53652291ad --- /dev/null +++ b/test/files/pos/t2868/Nest.java @@ -0,0 +1,3 @@ +public @interface Nest { + public int value(); +} diff --git a/test/files/pos/t2868/pick_1.scala b/test/files/pos/t2868/pick_1.scala new file mode 100644 index 0000000000..e91728ec2f --- /dev/null +++ b/test/files/pos/t2868/pick_1.scala @@ -0,0 +1,7 @@ +class ann(s: String) extends StaticAnnotation +class pick { + final val s = "bang!" + @ann("bang!") def foo = 1 + @Jann(str = "bang!", inn = new Nest(1), arr = Array(1, 2)) def bar = 2 + @Jann(str = "bang!", inn = new Nest(1), arr = Array(1, 2)) def baz = 3 +} diff --git a/test/files/pos/t2868/test_2.scala b/test/files/pos/t2868/test_2.scala new file mode 100644 index 0000000000..f11ef0fae2 --- /dev/null +++ b/test/files/pos/t2868/test_2.scala @@ -0,0 +1,6 @@ +class test { + val l = (new pick).s + val u = (new pick).foo + val c = (new pick).bar + val k = (new pick).baz +} -- cgit v1.2.3