Search in sources :

Example 1 with LanguageCompiler

use of org.eclipse.ceylon.compiler.java.tools.LanguageCompiler in project ceylon by eclipse.

the class JavacProcessingEnvironment method discoverAndRunProcs.

private void discoverAndRunProcs(Context context, Set<TypeElement> annotationsPresent, List<ClassSymbol> topLevelClasses, List<PackageSymbol> packageInfoFiles) {
    Map<String, TypeElement> unmatchedAnnotations = new HashMap<String, TypeElement>(annotationsPresent.size());
    for (TypeElement a : annotationsPresent) {
        unmatchedAnnotations.put(a.getQualifiedName().toString(), a);
    }
    // Give "*" processors a chance to match
    if (unmatchedAnnotations.size() == 0)
        unmatchedAnnotations.put("", null);
    DiscoveredProcessors.ProcessorStateIterator psi = discoveredProcs.iterator();
    // TODO: Create proper argument values; need past round
    // information to fill in this constructor.  Note that the 1
    // st round of processing could be the last round if there
    // were parse errors on the initial source files; however, we
    // are not doing processing in that case.
    Set<Element> rootElements = new LinkedHashSet<Element>();
    rootElements.addAll(topLevelClasses);
    rootElements.addAll(packageInfoFiles);
    rootElements = Collections.unmodifiableSet(rootElements);
    RoundEnvironment renv = new JavacRoundEnvironment(false, false, rootElements, JavacProcessingEnvironment.this);
    while (unmatchedAnnotations.size() > 0 && psi.hasNext()) {
        ProcessorState ps = psi.next();
        Set<String> matchedNames = new HashSet<String>();
        Set<TypeElement> typeElements = new LinkedHashSet<TypeElement>();
        for (Map.Entry<String, TypeElement> entry : unmatchedAnnotations.entrySet()) {
            String unmatchedAnnotationName = entry.getKey();
            if (ps.annotationSupported(unmatchedAnnotationName)) {
                matchedNames.add(unmatchedAnnotationName);
                TypeElement te = entry.getValue();
                if (te != null)
                    typeElements.add(te);
            }
        }
        if (matchedNames.size() > 0 || ps.contributed) {
            // Ceylon: set the output module for APT-generated files
            LanguageCompiler compiler = (LanguageCompiler) LanguageCompiler.instance(context);
            if (compiler.getCompiledModules().size() == 1) {
                CeyloncFileManager fm = (CeyloncFileManager) context.get(JavaFileManager.class);
                fm.setModule(compiler.getCompiledModules().iterator().next());
                fm.setAptRound(true);
            } else {
                log.error("Running APT processors while compiling more than one module is not supported yet");
            }
            boolean processingResult = callProcessor(ps.processor, typeElements, renv);
            ps.contributed = true;
            ps.removeSupportedOptions(unmatchedProcessorOptions);
            if (printProcessorInfo || verbose) {
                log.printLines("x.print.processor.info", ps.processor.getClass().getName(), matchedNames.toString(), processingResult);
            }
            if (processingResult) {
                unmatchedAnnotations.keySet().removeAll(matchedNames);
            }
        }
    }
    unmatchedAnnotations.remove("");
    if (lint && unmatchedAnnotations.size() > 0) {
        // Remove annotations processed by javac
        unmatchedAnnotations.keySet().removeAll(platformAnnotations);
        if (unmatchedAnnotations.size() > 0) {
            log = Log.instance(context);
            log.warning("proc.annotations.without.processors", unmatchedAnnotations.keySet());
        }
    }
    // Run contributing processors that haven't run yet
    psi.runContributingProcs(renv);
    // Debugging
    if (options.isSet("displayFilerState"))
        filer.displayState();
}
Also used : JavaFileManager(org.eclipse.ceylon.javax.tools.JavaFileManager) StandardJavaFileManager(org.eclipse.ceylon.javax.tools.StandardJavaFileManager) LanguageCompiler(org.eclipse.ceylon.compiler.java.tools.LanguageCompiler) CeyloncFileManager(org.eclipse.ceylon.compiler.java.tools.CeyloncFileManager)

Aggregations

CeyloncFileManager (org.eclipse.ceylon.compiler.java.tools.CeyloncFileManager)1 LanguageCompiler (org.eclipse.ceylon.compiler.java.tools.LanguageCompiler)1 JavaFileManager (org.eclipse.ceylon.javax.tools.JavaFileManager)1 StandardJavaFileManager (org.eclipse.ceylon.javax.tools.StandardJavaFileManager)1