diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/LanguageRegistrationProcessor.java @ 21716:2f9e4d984d16

Give languages a chance to do implicit exports. Prefer explicit exports over implicit ones.
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Thu, 04 Jun 2015 08:08:05 +0200
parents 31fc2fce38f3
children 45083be8a812
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/LanguageRegistrationProcessor.java	Thu Jun 04 01:00:44 2015 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/LanguageRegistrationProcessor.java	Thu Jun 04 08:08:05 2015 +0200
@@ -37,33 +37,50 @@
 
 @SupportedAnnotationTypes("com.oracle.truffle.api.*")
 public final class LanguageRegistrationProcessor extends AbstractProcessor {
+    private final List<TypeElement> registrations = new ArrayList<>();
+
     @Override
     public SourceVersion getSupportedSourceVersion() {
         return SourceVersion.latest();
     }
 
-    private void createProviderFile(TypeElement language, Registration annotation) {
+    private void generateFile(List<TypeElement> languages) {
         String filename = "META-INF/truffle/language";
-        try {
-            FileObject file = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", filename, language);
-            Properties p = new Properties();
-            String className = processingEnv.getElementUtils().getBinaryName(language).toString();
-            p.setProperty("name", annotation.name());
-            p.setProperty("className", className);
+        Properties p = new Properties();
+        int cnt = 0;
+        for (TypeElement l : languages) {
+            Registration annotation = l.getAnnotation(Registration.class);
+            if (annotation == null) {
+                continue;
+            }
+            String prefix = "language" + ++cnt + ".";
+            String className = processingEnv.getElementUtils().getBinaryName(l).toString();
+            p.setProperty(prefix + "name", annotation.name());
+            p.setProperty(prefix + "className", className);
             String[] mimes = annotation.mimeType();
             for (int i = 0; i < mimes.length; i++) {
-                p.setProperty("mimeType." + i, mimes[i]);
+                p.setProperty(prefix + "mimeType." + i, mimes[i]);
             }
-            try (OutputStream os = file.openOutputStream()) {
-                p.store(os, "Generated by " + LanguageRegistrationProcessor.class.getName());
+        }
+        if (cnt > 0) {
+            try {
+                FileObject file = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", filename, languages.toArray(new Element[0]));
+                try (OutputStream os = file.openOutputStream()) {
+                    p.store(os, "Generated by " + LanguageRegistrationProcessor.class.getName());
+                }
+            } catch (IOException e) {
+                processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage(), languages.get(0));
             }
-        } catch (IOException e) {
-            processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage(), language);
         }
     }
 
     @Override
     public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+        if (roundEnv.processingOver()) {
+            generateFile(registrations);
+            registrations.clear();
+            return true;
+        }
         for (Element e : roundEnv.getElementsAnnotatedWith(Registration.class)) {
             Registration annotation = e.getAnnotation(Registration.class);
             if (annotation != null && e.getKind() == ElementKind.CLASS) {
@@ -103,7 +120,7 @@
                     continue;
                 }
                 assertNoErrorExpected(e);
-                createProviderFile((TypeElement) e, annotation);
+                registrations.add((TypeElement) e);
             }
         }