changeset 21480:c2b006c5e15f

Testing the annotation processor using the @ExpectedError annotation as suggested by Christian Humer
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Mon, 25 May 2015 10:36:30 +0200
parents 2405d3b983cc
children bb51b9a142b3
files graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/processor/TruffleProcessorTest.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/verify/VerifyTruffleProcessor.java
diffstat 2 files changed, 56 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/processor/TruffleProcessorTest.java	Mon May 25 09:09:07 2015 +0200
+++ b/graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/processor/TruffleProcessorTest.java	Mon May 25 10:36:30 2015 +0200
@@ -22,6 +22,8 @@
  */
 package com.oracle.truffle.api.dsl.test.processor;
 
+import com.oracle.truffle.api.dsl.ExpectError;
+import com.oracle.truffle.api.nodes.Node;
 import com.oracle.truffle.dsl.processor.verify.VerifyTruffleProcessor;
 import java.util.Locale;
 import java.util.ServiceLoader;
@@ -35,6 +37,10 @@
  * Verify errors emitted by the processor.
  */
 public class TruffleProcessorTest {
+    //
+    // AnnotationProcessor test using the NetBeans style
+    //
+
     @Test
     public void childCannotBeFinal() throws Exception {
         // @formatter:off
@@ -78,4 +84,16 @@
         }
         fail(sb.toString());
     }
+
+    //
+    // and now the Truffle traditional way
+    //
+
+    abstract class MyNode extends Node {
+        @ExpectError("@Child field cannot be final") @Child final MyNode first;
+
+        MyNode(MyNode n) {
+            this.first = n;
+        }
+    }
 }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/verify/VerifyTruffleProcessor.java	Mon May 25 09:09:07 2015 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/verify/VerifyTruffleProcessor.java	Mon May 25 10:36:30 2015 +0200
@@ -34,6 +34,7 @@
 import javax.tools.Diagnostic.Kind;
 
 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
+import com.oracle.truffle.api.dsl.ExpectError;
 import com.oracle.truffle.api.nodes.Node.Child;
 
 @SupportedAnnotationTypes({"com.oracle.truffle.api.CompilerDirectives.TruffleBoundary", "com.oracle.truffle.api.nodes.Node.Child"})
@@ -116,10 +117,45 @@
 
         for (Element e : roundEnv.getElementsAnnotatedWith(Child.class)) {
             if (e.getModifiers().contains(Modifier.FINAL)) {
-                errorMessage(e, "@Child field cannot be final");
+                emitError("@Child field cannot be final", e);
+                continue;
+            }
+            assertNoErrorExpected(e);
+        }
+        return false;
+    }
+
+    void assertNoErrorExpected(Element e) {
+        TypeElement eee = processingEnv.getElementUtils().getTypeElement(ExpectError.class.getName());
+        for (AnnotationMirror am : e.getAnnotationMirrors()) {
+            if (am.getAnnotationType().asElement() == eee) {
+                processingEnv.getMessager().printMessage(Kind.ERROR, "Expected an error, but none found!", e);
             }
         }
-        return false;
+    }
+
+    void emitError(String msg, Element e) {
+        TypeElement eee = processingEnv.getElementUtils().getTypeElement(ExpectError.class.getName());
+        for (AnnotationMirror am : e.getAnnotationMirrors()) {
+            if (am.getAnnotationType().asElement() == eee) {
+                Map<? extends ExecutableElement, ? extends AnnotationValue> vals = am.getElementValues();
+                if (vals.size() == 1) {
+                    AnnotationValue av = vals.values().iterator().next();
+                    if (av.getValue() instanceof List) {
+                        List<?> arr = (List<?>) av.getValue();
+                        for (Object o : arr) {
+                            if (o instanceof AnnotationValue) {
+                                AnnotationValue ov = (AnnotationValue) o;
+                                if (msg.equals(ov.getValue())) {
+                                    return;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        processingEnv.getMessager().printMessage(Kind.ERROR, msg, e);
     }
 
     /**