summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-01-13 14:28:33 +0100
committerJason Zaugg <jzaugg@gmail.com>2013-01-13 14:28:33 +0100
commit39352fe0f3048e86b339db4b40851a9f27c7a6ef (patch)
tree61b2a320eaed14eb14531321a4ce0d5f020f02c8
parent5d65772762072aa950a488c666673dc248b01d6d (diff)
downloadscala-39352fe0f3048e86b339db4b40851a9f27c7a6ef.tar.gz
scala-39352fe0f3048e86b339db4b40851a9f27c7a6ef.tar.bz2
scala-39352fe0f3048e86b339db4b40851a9f27c7a6ef.zip
SI-6082 Conditionally expand @ann(x) to @ann(value = x)
... if the annotation has an argument with the name `value`. Doing so unconditionally obscures error messages. We still require that arguments to ClassFileAnnotations are named, other than for this special case.
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala11
-rw-r--r--test/files/neg/t6082.check13
-rw-r--r--test/files/neg/t6082.scala2
3 files changed, 22 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 386eec207a..0ca1e01114 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -3637,15 +3637,18 @@ trait Typers extends Modes with Adaptations with Tags {
} else if (argss.length > 1) {
reportAnnotationError(MultipleArgumentListForAnnotationError(ann))
} else {
- val args =
- if (argss.head.length == 1 && !isNamed(argss.head.head))
- List(new AssignOrNamedArg(Ident(nme.value), argss.head.head))
- else argss.head
val annScope = annType.decls
.filter(sym => sym.isMethod && !sym.isConstructor && sym.isJavaDefined)
val names = new scala.collection.mutable.HashSet[Symbol]
+ def hasValue = names exists (_.name == nme.value)
names ++= (if (isJava) annScope.iterator
else typedFun.tpe.params.iterator)
+ val args = argss match {
+ case List(List(arg)) if !isNamed(arg) && hasValue =>
+ List(new AssignOrNamedArg(Ident(nme.value), arg))
+ case as :: _ => as
+ }
+
val nvPairs = args map {
case arg @ AssignOrNamedArg(Ident(name), rhs) =>
val sym = if (isJava) annScope.lookup(name)
diff --git a/test/files/neg/t6082.check b/test/files/neg/t6082.check
new file mode 100644
index 0000000000..b68de5ce08
--- /dev/null
+++ b/test/files/neg/t6082.check
@@ -0,0 +1,13 @@
+t6082.scala:1: 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 annot(notValue: String) extends annotation.ClassfileAnnotation
+ ^
+t6082.scala:2: error: classfile annotation arguments have to be supplied as named arguments
+@annot("") class C
+ ^
+t6082.scala:2: error: annotation annot is missing argument notValue
+@annot("") class C
+ ^
+one warning found
+two errors found
diff --git a/test/files/neg/t6082.scala b/test/files/neg/t6082.scala
new file mode 100644
index 0000000000..30de91a4c9
--- /dev/null
+++ b/test/files/neg/t6082.scala
@@ -0,0 +1,2 @@
+class annot(notValue: String) extends annotation.ClassfileAnnotation
+@annot("") class C \ No newline at end of file