changeset 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 edafbaef3059
children 009842dce4f0
files graal/com.oracle.graal.code/src/com/oracle/graal/code/DisassemblerProvider.java graal/com.oracle.graal.code/src/com/oracle/graal/code/HexCodeFile.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/LoopNodeFactory.java graal/com.oracle.jvmci.service.processor/src/com/oracle/jvmci/service/processor/ServiceProviderProcessor.java
diffstat 2 files changed, 10 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/LoopNodeFactory.java	Thu Jun 04 16:50:51 2015 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/LoopNodeFactory.java	Thu Jun 04 16:51:37 2015 +0200
@@ -22,9 +22,10 @@
  */
 package com.oracle.graal.truffle;
 
+import com.oracle.jvmci.service.*;
 import com.oracle.truffle.api.nodes.*;
 
-public interface LoopNodeFactory extends PrioritizedServiceProvider {
+public interface LoopNodeFactory extends PrioritizedServiceProvider, Service {
 
     LoopNode create(RepeatingNode repeatingNode);
 
--- a/graal/com.oracle.jvmci.service.processor/src/com/oracle/jvmci/service/processor/ServiceProviderProcessor.java	Thu Jun 04 16:50:51 2015 +0200
+++ b/graal/com.oracle.jvmci.service.processor/src/com/oracle/jvmci/service/processor/ServiceProviderProcessor.java	Thu Jun 04 16:51:37 2015 +0200
@@ -38,6 +38,7 @@
 public class ServiceProviderProcessor extends AbstractProcessor {
 
     private final Set<TypeElement> processed = new HashSet<>();
+    private TypeElement baseJVMCIServiceInterface;
 
     @Override
     public SourceVersion getSupportedSourceVersion() {
@@ -45,6 +46,11 @@
     }
 
     private boolean verifyAnnotation(TypeMirror serviceInterface, TypeElement serviceProvider) {
+        if (!processingEnv.getTypeUtils().isSubtype(serviceInterface, baseJVMCIServiceInterface.asType())) {
+            String msg = String.format("Service interface class %s doesn't extend JVMCI service interface %s", serviceInterface, baseJVMCIServiceInterface);
+            processingEnv.getMessager().printMessage(Kind.ERROR, msg, serviceProvider);
+            return false;
+        }
         if (!processingEnv.getTypeUtils().isSubtype(serviceProvider.asType(), serviceInterface)) {
             String msg = String.format("Service provider class %s doesn't implement service interface %s", serviceProvider.getSimpleName(), serviceInterface);
             processingEnv.getMessager().printMessage(Kind.ERROR, msg, serviceProvider);
@@ -101,6 +107,8 @@
             return true;
         }
 
+        baseJVMCIServiceInterface = processingEnv.getElementUtils().getTypeElement("com.oracle.jvmci.service.Service");
+
         for (Element element : roundEnv.getElementsAnnotatedWith(ServiceProvider.class)) {
             assert element.getKind().isClass();
             processElement((TypeElement) element);