/******************************************************************************* * Copyright (c) 2010 Walter Harley and others * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * eclipse@cafewalter.com - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.apt.pluggable.tests.processors.buildertester; import java.io.IOException; import java.io.PrintWriter; import java.util.Set; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedOptions; import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic.Kind; import javax.tools.JavaFileObject; import org.eclipse.jdt.apt.pluggable.tests.annotations.FinalRoundTestTrigger; /** * Do nothing when first triggered; then, in the final round, generate a * new type that is annotated with {@link FinalRoundTestTrigger}. * Used to verify that a new type generated in the final round does not get * annotations processed, but does get compiled. The JSR269 spec is somewhat * vague about whether it should be possible to generate a new type during * the final round (since the final round does not happen until after a * round in which no new types are generated); but apparently javac behaves * this way. * <p> * See <a href="http://bugs.eclipse.org/329156">Bug 329156</a> and <a * href="http://bugs.sun.com/view_bug.do?bug_id=6634138">the corresponding * bug in javac</a>, which Sun fixed. */ @SupportedAnnotationTypes( { "org.eclipse.jdt.apt.pluggable.tests.annotations.FinalRoundTestTrigger" }) @SupportedSourceVersion(SourceVersion.RELEASE_6) @SupportedOptions( {}) public class TestFinalRoundProc extends AbstractProcessor { private static int _numRounds; public static int getNumRounds() { return _numRounds; } public static void resetNumRounds() { _numRounds = 0; } @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { if (roundEnv.processingOver()) { createFile(); } _numRounds++; return true; } private void createFile() { PrintWriter pw = null; try { JavaFileObject jfo = processingEnv.getFiler().createSourceFile("g.FinalRoundGen"); pw = new PrintWriter(jfo.openWriter()); pw.println("package g;"); pw.println("import org.eclipse.jdt.apt.pluggable.tests.annotations.FinalRoundTestTrigger;"); pw.println("@FinalRoundTestTrigger"); pw.println("public class FinalRoundGen {}"); } catch (IOException e) { e.printStackTrace(); processingEnv.getMessager().printMessage(Kind.ERROR, "Unable to create source file! Exception message was: " + e.getMessage()); } finally { if (pw != null) { pw.close(); } } } }