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:
|