Mercurial > hg > graal-compiler
changeset 9145:57f85e39c75f
Move logic from ServiceProviderProcessor to mx.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Tue, 16 Apr 2013 15:27:22 +0200 |
parents | 025448743177 |
children | b67a0963fb00 a38d748d4130 |
files | graal/com.oracle.graal.service.processor/src/com/oracle/graal/service/processor/ServiceProviderProcessor.java |
diffstat | 1 files changed, 16 insertions(+), 56 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.service.processor/src/com/oracle/graal/service/processor/ServiceProviderProcessor.java Tue Apr 16 15:27:17 2013 +0200 +++ b/graal/com.oracle.graal.service.processor/src/com/oracle/graal/service/processor/ServiceProviderProcessor.java Tue Apr 16 15:27:22 2013 +0200 @@ -29,7 +29,6 @@ import javax.lang.model.*; import javax.lang.model.element.*; import javax.lang.model.type.*; -import javax.lang.model.util.*; import javax.tools.Diagnostic.Kind; import javax.tools.*; @@ -39,38 +38,7 @@ @SupportedAnnotationTypes("com.oracle.graal.api.runtime.ServiceProvider") public class ServiceProviderProcessor extends AbstractProcessor { - private Map<String, Set<TypeElement>> serviceMap; - - public ServiceProviderProcessor() { - serviceMap = new HashMap<>(); - } - - private void addProvider(String serviceName, TypeElement serviceProvider) { - Set<TypeElement> providers = serviceMap.get(serviceName); - if (providers == null) { - providers = new HashSet<>(); - serviceMap.put(serviceName, providers); - } - providers.add(serviceProvider); - } - - private void generateServicesFiles() { - Filer filer = processingEnv.getFiler(); - for (Map.Entry<String, Set<TypeElement>> entry : serviceMap.entrySet()) { - String filename = "META-INF/services/" + entry.getKey(); - TypeElement[] providers = entry.getValue().toArray(new TypeElement[0]); - try { - FileObject servicesFile = filer.createResource(StandardLocation.CLASS_OUTPUT, "", filename, providers); - PrintWriter writer = new PrintWriter(new OutputStreamWriter(servicesFile.openOutputStream(), "UTF-8")); - for (TypeElement provider : providers) { - writer.println(provider.getQualifiedName()); - } - writer.close(); - } catch (IOException e) { - processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage()); - } - } - } + private final Set<TypeElement> processed = new HashSet<>(); private boolean verifyAnnotation(TypeMirror serviceInterface, TypeElement serviceProvider) { if (!processingEnv.getTypeUtils().isSubtype(serviceProvider.asType(), serviceInterface)) { @@ -83,6 +51,11 @@ } private void processElement(TypeElement serviceProvider) { + if (processed.contains(serviceProvider)) { + return; + } + + processed.add(serviceProvider); ServiceProvider annotation = serviceProvider.getAnnotation(ServiceProvider.class); if (annotation != null) { try { @@ -91,40 +64,27 @@ TypeMirror serviceInterface = ex.getTypeMirror(); if (verifyAnnotation(serviceInterface, serviceProvider)) { String interfaceName = ex.getTypeMirror().toString(); - addProvider(interfaceName, serviceProvider); + createProviderFile(serviceProvider, interfaceName); } } } } - private void processOldElements() { - Filer filer = processingEnv.getFiler(); - Elements elements = processingEnv.getElementUtils(); - for (String key : serviceMap.keySet()) { - String filename = "META-INF/services/" + key; - try { - FileObject servicesFile = filer.getResource(StandardLocation.CLASS_OUTPUT, "", filename); - BufferedReader reader = new BufferedReader(new InputStreamReader(servicesFile.openInputStream(), "UTF-8")); - String line; - while ((line = reader.readLine()) != null) { - TypeElement serviceProvider = elements.getTypeElement(line); - if (serviceProvider != null) { - processElement(serviceProvider); - } - } - reader.close(); - servicesFile.delete(); - } catch (IOException e) { - // old services file not found: do nothing - } + private void createProviderFile(TypeElement serviceProvider, String interfaceName) { + String filename = "META-INF/providers/" + serviceProvider.getQualifiedName(); + try { + FileObject file = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", filename, serviceProvider); + PrintWriter writer = new PrintWriter(new OutputStreamWriter(file.openOutputStream(), "UTF-8")); + writer.println(interfaceName); + writer.close(); + } catch (IOException e) { + processingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage(), serviceProvider); } } @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { if (roundEnv.processingOver()) { - processOldElements(); - generateServicesFiles(); return true; }