comparison graal/com.oracle.jvmci.service.processor/src/com/oracle/jvmci/service/processor/ServiceProviderProcessor.java @ 21726:22fe59641ba0

require that @ServiceProvider is only used for JVMCI services
author Doug Simon <doug.simon@oracle.com>
date Thu, 04 Jun 2015 16:51:37 +0200
parents 93f282187d90
children
comparison
equal deleted inserted replaced
21725:edafbaef3059 21726:22fe59641ba0
36 36
37 @SupportedAnnotationTypes("com.oracle.jvmci.service.ServiceProvider") 37 @SupportedAnnotationTypes("com.oracle.jvmci.service.ServiceProvider")
38 public class ServiceProviderProcessor extends AbstractProcessor { 38 public class ServiceProviderProcessor extends AbstractProcessor {
39 39
40 private final Set<TypeElement> processed = new HashSet<>(); 40 private final Set<TypeElement> processed = new HashSet<>();
41 private TypeElement baseJVMCIServiceInterface;
41 42
42 @Override 43 @Override
43 public SourceVersion getSupportedSourceVersion() { 44 public SourceVersion getSupportedSourceVersion() {
44 return SourceVersion.latest(); 45 return SourceVersion.latest();
45 } 46 }
46 47
47 private boolean verifyAnnotation(TypeMirror serviceInterface, TypeElement serviceProvider) { 48 private boolean verifyAnnotation(TypeMirror serviceInterface, TypeElement serviceProvider) {
49 if (!processingEnv.getTypeUtils().isSubtype(serviceInterface, baseJVMCIServiceInterface.asType())) {
50 String msg = String.format("Service interface class %s doesn't extend JVMCI service interface %s", serviceInterface, baseJVMCIServiceInterface);
51 processingEnv.getMessager().printMessage(Kind.ERROR, msg, serviceProvider);
52 return false;
53 }
48 if (!processingEnv.getTypeUtils().isSubtype(serviceProvider.asType(), serviceInterface)) { 54 if (!processingEnv.getTypeUtils().isSubtype(serviceProvider.asType(), serviceInterface)) {
49 String msg = String.format("Service provider class %s doesn't implement service interface %s", serviceProvider.getSimpleName(), serviceInterface); 55 String msg = String.format("Service provider class %s doesn't implement service interface %s", serviceProvider.getSimpleName(), serviceInterface);
50 processingEnv.getMessager().printMessage(Kind.ERROR, msg, serviceProvider); 56 processingEnv.getMessager().printMessage(Kind.ERROR, msg, serviceProvider);
51 return false; 57 return false;
52 } 58 }
99 public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { 105 public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
100 if (roundEnv.processingOver()) { 106 if (roundEnv.processingOver()) {
101 return true; 107 return true;
102 } 108 }
103 109
110 baseJVMCIServiceInterface = processingEnv.getElementUtils().getTypeElement("com.oracle.jvmci.service.Service");
111
104 for (Element element : roundEnv.getElementsAnnotatedWith(ServiceProvider.class)) { 112 for (Element element : roundEnv.getElementsAnnotatedWith(ServiceProvider.class)) {
105 assert element.getKind().isClass(); 113 assert element.getKind().isClass();
106 processElement((TypeElement) element); 114 processElement((TypeElement) element);
107 } 115 }
108 116