Mercurial > hg > truffle
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); } }