--- a/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java +++ a/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java @@ -26,6 +26,7 @@ package com.sun.tools.javac.processing; import java.lang.reflect.*; +import java.net.URI; import java.util.*; import java.util.Map.Entry; import java.util.logging.Level; @@ -83,6 +84,7 @@ import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Names; import com.sun.tools.javac.util.Options; +import javax.tools.StandardLocation; import static javax.tools.StandardLocation.*; import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag.*; @@ -102,6 +104,8 @@ private static final Logger LOGGER = Logger.getLogger(JavacProcessingEnvironment.class.getName()); + private static final Set blackList = new HashSet(){{add("org.netbeans.modules.openide.util.NbBundleProcessor");}}; //NOI18N + Options options; private final boolean printProcessorInfo; @@ -732,7 +736,23 @@ } if (matchedNames.size() > 0 || ps.contributed) { - boolean processingResult = callProcessor(ps.processor, typeElements, renv); + RoundEnvironment currentRenv; + if (blackList.contains(ps.processor.getClass().getName())) { + final Set extElements = new HashSet(rootElements); + final Map> processorGeneratedCache = new HashMap>(); + for (Element rootElement : rootElements) { + if ((rootElement.getKind().isClass() || rootElement.getKind().isInterface()) && !isProcessorGenerated((TypeElement)rootElement, processorGeneratedCache)) { + final Element encElement = rootElement.getEnclosingElement(); + assert encElement.getKind() == ElementKind.PACKAGE; + extElements.addAll(encElement.getEnclosedElements()); + } + } + currentRenv = new JavacRoundEnvironment(false, false, extElements, JavacProcessingEnvironment.this); + } else { + currentRenv = renv; + } + + boolean processingResult = callProcessor(ps.processor, typeElements, currentRenv); ps.contributed = true; ps.removeSupportedOptions(unmatchedProcessorOptions); @@ -769,6 +789,31 @@ filer.displayState(); } + private boolean isProcessorGenerated(final TypeElement topLevel, final Map> cache) { + final JavaFileObject sourceFile = ((ClassSymbol)topLevel).sourcefile; + if (sourceFile == null) { + return false; + } + final String pkg = ((PackageElement)topLevel.getEnclosingElement()).getQualifiedName().toString(); + Set cacheLine = cache.get(pkg); + if (cacheLine == null) { + final JavaFileManager fileManager = context.get(JavaFileManager.class); + cacheLine = new HashSet(); + cache.put(pkg,cacheLine); + try { + final Iterable content = fileManager.list( + StandardLocation.SOURCE_OUTPUT, + pkg, + EnumSet.of(JavaFileObject.Kind.SOURCE), + false); + for (JavaFileObject jfo : content) { + cacheLine.add(jfo.toUri()); + } + } catch (IOException ioe) {/*pass*/} + } + return cacheLine.contains(sourceFile.toUri()); + } + /** * Computes the set of annotations on the symbol in question. * Leave class public for external testing purposes.