< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.processor/src/org/graalvm/compiler/replacements/processor/GeneratedPlugin.java

Print this page
rev 52509 : [mq]: graal2


  35 import javax.lang.model.type.DeclaredType;
  36 import javax.lang.model.type.TypeMirror;
  37 import javax.lang.model.type.TypeVariable;
  38 import javax.lang.model.type.WildcardType;
  39 
  40 import org.graalvm.compiler.processor.AbstractProcessor;
  41 import org.graalvm.compiler.replacements.processor.InjectedDependencies.Dependency;
  42 import org.graalvm.compiler.replacements.processor.InjectedDependencies.WellKnownDependency;
  43 
  44 public abstract class GeneratedPlugin {
  45 
  46     protected final ExecutableElement intrinsicMethod;
  47     private boolean needInjectionProvider;
  48 
  49     private String pluginName;
  50 
  51     public GeneratedPlugin(ExecutableElement intrinsicMethod) {
  52         this.intrinsicMethod = intrinsicMethod;
  53         this.needInjectionProvider = false;
  54         // Lets keep generated class names short to mitigate hitting file name length limits.
  55         this.pluginName = intrinsicMethod.getSimpleName().toString();
  56     }
  57 
  58     protected abstract TypeElement getAnnotationClass(AbstractProcessor processor);
  59 
  60     public String getPluginName() {
  61         return pluginName;
  62     }
  63 
  64     public void setPluginName(String pluginName) {
  65         this.pluginName = pluginName;
  66     }
  67 
  68     public void generate(AbstractProcessor processor, PrintWriter out) {
  69         out.printf("    //        class: %s\n", intrinsicMethod.getEnclosingElement());
  70         out.printf("    //       method: %s\n", intrinsicMethod);
  71         out.printf("    // generated-by: %s\n", getClass().getName());
  72         out.printf("    private static final class %s extends GeneratedInvocationPlugin {\n", pluginName);
  73         out.printf("\n");
  74         out.printf("        @Override\n");
  75         out.printf("        public boolean execute(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode[] args) {\n");
  76         InjectedDependencies deps = createExecute(processor, out);
  77         out.printf("        }\n");
  78         out.printf("        @Override\n");
  79         out.printf("        public Class<? extends Annotation> getSource() {\n");
  80         out.printf("            return %s.class;\n", getAnnotationClass(processor).getQualifiedName().toString().replace('$', '.'));
  81         out.printf("        }\n");
  82 
  83         createPrivateMembers(processor, out, deps);
  84 
  85         out.printf("    }\n");
  86     }
  87 
  88     public void register(PrintWriter out) {
  89         out.printf("        plugins.register(new %s(", pluginName);
  90         if (needInjectionProvider) {
  91             out.printf("injection");
  92         }
  93         out.printf("), %s.class, \"%s\"", intrinsicMethod.getEnclosingElement(), intrinsicMethod.getSimpleName());
  94         if (!intrinsicMethod.getModifiers().contains(Modifier.STATIC)) {
  95             out.printf(", InvocationPlugin.Receiver.class");
  96         }
  97         for (VariableElement arg : intrinsicMethod.getParameters()) {
  98             out.printf(", %s.class", getErasedType(arg.asType()));
  99         }
 100         out.printf(");\n");
 101     }
 102 
 103     public abstract void extraImports(Set<String> imports);
 104 
 105     protected abstract InjectedDependencies createExecute(AbstractProcessor processor, PrintWriter out);


 149                 return false;
 150             case TYPEVAR:
 151                 return true;
 152             case WILDCARD:
 153                 return ((WildcardType) type).getExtendsBound() != null;
 154             case ARRAY:
 155                 return hasUncheckedWarning(((ArrayType) type).getComponentType());
 156             default:
 157                 return false;
 158         }
 159     }
 160 
 161     private void createPrivateMembers(AbstractProcessor processor, PrintWriter out, InjectedDependencies deps) {
 162         if (!deps.isEmpty()) {
 163             out.printf("\n");
 164             for (Dependency dep : deps) {
 165                 out.printf("        private final %s %s;\n", dep.type, dep.name);
 166             }
 167 
 168             out.printf("\n");
 169             out.printf("        private %s(InjectionProvider injection) {\n", pluginName);
 170             for (Dependency dep : deps) {
 171                 out.printf("            this.%s = %s;\n", dep.name, dep.inject(processor, intrinsicMethod));
 172             }
 173             out.printf("        }\n");
 174 
 175             needInjectionProvider = true;
 176         }
 177     }
 178 
 179     protected static String getReturnKind(ExecutableElement method) {
 180         switch (method.getReturnType().getKind()) {
 181             case BOOLEAN:
 182             case BYTE:
 183             case SHORT:
 184             case CHAR:
 185             case INT:
 186                 return "Int";
 187             case LONG:
 188                 return "Long";
 189             case FLOAT:




  35 import javax.lang.model.type.DeclaredType;
  36 import javax.lang.model.type.TypeMirror;
  37 import javax.lang.model.type.TypeVariable;
  38 import javax.lang.model.type.WildcardType;
  39 
  40 import org.graalvm.compiler.processor.AbstractProcessor;
  41 import org.graalvm.compiler.replacements.processor.InjectedDependencies.Dependency;
  42 import org.graalvm.compiler.replacements.processor.InjectedDependencies.WellKnownDependency;
  43 
  44 public abstract class GeneratedPlugin {
  45 
  46     protected final ExecutableElement intrinsicMethod;
  47     private boolean needInjectionProvider;
  48 
  49     private String pluginName;
  50 
  51     public GeneratedPlugin(ExecutableElement intrinsicMethod) {
  52         this.intrinsicMethod = intrinsicMethod;
  53         this.needInjectionProvider = false;
  54         // Lets keep generated class names short to mitigate hitting file name length limits.
  55         this.pluginName = "Plugin_" + intrinsicMethod.getEnclosingElement().getSimpleName() + "_" + intrinsicMethod.getSimpleName().toString();
  56     }
  57 
  58     protected abstract TypeElement getAnnotationClass(AbstractProcessor processor);
  59 
  60     public String getPluginName() {
  61         return pluginName;
  62     }
  63 
  64     public void setPluginName(String pluginName) {
  65         this.pluginName = pluginName;
  66     }
  67 
  68     public void generate(AbstractProcessor processor, PrintWriter out) {
  69         out.printf("//        class: %s\n", intrinsicMethod.getEnclosingElement());
  70         out.printf("//       method: %s\n", intrinsicMethod);
  71         out.printf("// generated-by: %s\n", getClass().getName());
  72         out.printf("final class %s extends GeneratedInvocationPlugin {\n", pluginName);
  73         out.printf("\n");
  74         out.printf("    @Override\n");
  75         out.printf("    public boolean execute(GraphBuilderContext b, ResolvedJavaMethod targetMethod, InvocationPlugin.Receiver receiver, ValueNode[] args) {\n");
  76         InjectedDependencies deps = createExecute(processor, out);
  77         out.printf("    }\n");
  78         out.printf("    @Override\n");
  79         out.printf("    public Class<? extends Annotation> getSource() {\n");
  80         out.printf("        return %s.class;\n", getAnnotationClass(processor).getQualifiedName().toString().replace('$', '.'));
  81         out.printf("    }\n");
  82 
  83         createPrivateMembers(processor, out, deps);
  84 
  85         out.printf("}\n");
  86     }
  87 
  88     public void register(PrintWriter out) {
  89         out.printf("        plugins.register(new %s(", pluginName);
  90         if (needInjectionProvider) {
  91             out.printf("injection");
  92         }
  93         out.printf("), %s.class, \"%s\"", intrinsicMethod.getEnclosingElement(), intrinsicMethod.getSimpleName());
  94         if (!intrinsicMethod.getModifiers().contains(Modifier.STATIC)) {
  95             out.printf(", InvocationPlugin.Receiver.class");
  96         }
  97         for (VariableElement arg : intrinsicMethod.getParameters()) {
  98             out.printf(", %s.class", getErasedType(arg.asType()));
  99         }
 100         out.printf(");\n");
 101     }
 102 
 103     public abstract void extraImports(Set<String> imports);
 104 
 105     protected abstract InjectedDependencies createExecute(AbstractProcessor processor, PrintWriter out);


 149                 return false;
 150             case TYPEVAR:
 151                 return true;
 152             case WILDCARD:
 153                 return ((WildcardType) type).getExtendsBound() != null;
 154             case ARRAY:
 155                 return hasUncheckedWarning(((ArrayType) type).getComponentType());
 156             default:
 157                 return false;
 158         }
 159     }
 160 
 161     private void createPrivateMembers(AbstractProcessor processor, PrintWriter out, InjectedDependencies deps) {
 162         if (!deps.isEmpty()) {
 163             out.printf("\n");
 164             for (Dependency dep : deps) {
 165                 out.printf("    private final %s %s;\n", dep.type, dep.name);
 166             }
 167 
 168             out.printf("\n");
 169             out.printf("    %s(NodeIntrinsicPluginFactory.InjectionProvider injection) {\n", pluginName);
 170             for (Dependency dep : deps) {
 171                 out.printf("        this.%s = %s;\n", dep.name, dep.inject(processor, intrinsicMethod));
 172             }
 173             out.printf("    }\n");
 174 
 175             needInjectionProvider = true;
 176         }
 177     }
 178 
 179     protected static String getReturnKind(ExecutableElement method) {
 180         switch (method.getReturnType().getKind()) {
 181             case BOOLEAN:
 182             case BYTE:
 183             case SHORT:
 184             case CHAR:
 185             case INT:
 186                 return "Int";
 187             case LONG:
 188                 return "Long";
 189             case FLOAT:


< prev index next >