Mercurial > hg > graal-jvmci-8
changeset 8998:d2c34ddac70f
Merge.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Thu, 11 Apr 2013 10:39:03 +0200 |
parents | 508ae1a5cada (diff) 6d86ce1297bc (current diff) |
children | eae432b7c462 9f3a77848ea2 |
files | graal/com.oracle.graal.service.processor/src/com/oracle/graal/service/processor/ServiceProviderProcessor.java |
diffstat | 2 files changed, 43 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.runtime/src/com/oracle/graal/api/runtime/ServiceProvider.java Wed Apr 10 20:43:15 2013 -0700 +++ b/graal/com.oracle.graal.api.runtime/src/com/oracle/graal/api/runtime/ServiceProvider.java Thu Apr 11 10:39:03 2013 +0200 @@ -24,7 +24,7 @@ import java.lang.annotation.*; -@Retention(RetentionPolicy.SOURCE) +@Retention(RetentionPolicy.CLASS) @Target(ElementType.TYPE) public @interface ServiceProvider {
--- a/graal/com.oracle.graal.service.processor/src/com/oracle/graal/service/processor/ServiceProviderProcessor.java Wed Apr 10 20:43:15 2013 -0700 +++ b/graal/com.oracle.graal.service.processor/src/com/oracle/graal/service/processor/ServiceProviderProcessor.java Thu Apr 11 10:39:03 2013 +0200 @@ -29,6 +29,7 @@ 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.*; @@ -81,27 +82,57 @@ return true; } + private void processElement(TypeElement serviceProvider) { + ServiceProvider annotation = serviceProvider.getAnnotation(ServiceProvider.class); + if (annotation != null) { + try { + annotation.value(); + } catch (MirroredTypeException ex) { + TypeMirror serviceInterface = ex.getTypeMirror(); + if (verifyAnnotation(serviceInterface, serviceProvider)) { + String interfaceName = ex.getTypeMirror().toString(); + addProvider(interfaceName, serviceProvider); + } + } + } + } + + 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 + } + } + } + @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { if (roundEnv.processingOver()) { + processOldElements(); generateServicesFiles(); return true; } for (Element element : roundEnv.getElementsAnnotatedWith(ServiceProvider.class)) { assert element.getKind().isClass(); - ServiceProvider annotation = element.getAnnotation(ServiceProvider.class); - try { - annotation.value(); - } catch (MirroredTypeException ex) { - TypeMirror serviceInterface = ex.getTypeMirror(); - TypeElement serviceProvider = (TypeElement) element; - if (verifyAnnotation(serviceInterface, serviceProvider)) { - String interfaceName = ex.getTypeMirror().toString(); - addProvider(interfaceName, serviceProvider); - } - } + processElement((TypeElement) element); } + return true; } }