# HG changeset patch # User Jaroslav Tulach # Date 1432542990 -7200 # Node ID c2b006c5e15fe05e868a3cff68c7295551aca882 # Parent 2405d3b983cc53df9da0e8aeaa3e3094f57c4314 Testing the annotation processor using the @ExpectedError annotation as suggested by Christian Humer diff -r 2405d3b983cc -r c2b006c5e15f graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/processor/TruffleProcessorTest.java --- 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; + } + } } diff -r 2405d3b983cc -r c2b006c5e15f graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/verify/VerifyTruffleProcessor.java --- 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 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); } /**