43
43
import com .oracle .graal .python .annotations .ArgumentClinic ;
44
44
import com .oracle .graal .python .annotations .ArgumentClinic .PrimitiveType ;
45
45
import com .oracle .graal .python .annotations .ClinicConverterFactory ;
46
- import com .oracle .graal .python .annotations .ClinicConverterFactory .ClinicArgument ;
47
46
48
47
import javax .lang .model .element .Element ;
49
48
import javax .lang .model .element .ElementKind ;
50
49
import javax .lang .model .element .ExecutableElement ;
51
50
import javax .lang .model .element .Modifier ;
52
51
import javax .lang .model .element .TypeElement ;
52
+ import javax .lang .model .element .VariableElement ;
53
53
import java .util .HashMap ;
54
+ import java .util .List ;
54
55
import java .util .Map ;
55
56
56
57
public class ConverterFactory {
57
58
public static final String CLINIC_PACKAGE = "com.oracle.graal.python.nodes.function.builtins.clinic" ;
58
59
60
+ enum Param {
61
+ /**
62
+ * The default value {@link ArgumentClinic#defaultValue()}.
63
+ */
64
+ DefaultValue ,
65
+ /**
66
+ * The flag {@link ArgumentClinic#useDefaultForNone()}.
67
+ */
68
+ UseDefaultForNone ,
69
+ /**
70
+ * The name of the builtin function.
71
+ */
72
+ BuiltinName ,
73
+ /**
74
+ * The index of the argument.
75
+ */
76
+ ArgumentIndex ,
77
+ /**
78
+ * The name of the argument.
79
+ */
80
+ ArgumentName ,
81
+ /**
82
+ * Extra argument provided in {@link ArgumentClinic#args()}.
83
+ */
84
+ Extra ,
85
+ }
86
+
87
+
59
88
private static final Map <TypeElement , ConverterFactory > cache = new HashMap <>();
60
89
61
90
public final String fullClassName ;
62
91
public final String className ;
63
92
public final String methodName ;
64
- public final int paramCount ;
65
- public final ClinicArgument [] clinicArgs ;
93
+ public final int extraParamCount ;
94
+ public final Param [] params ;
66
95
public final PrimitiveType [] acceptedPrimitiveTypes ;
67
96
68
- private ConverterFactory (String fullClassName , String className , String methodName , int paramCount , ClinicArgument [] clinicArgs , PrimitiveType [] acceptedPrimitiveTypes ) {
97
+ private ConverterFactory (String fullClassName , String className , String methodName , int extraParamCount , Param [] params , PrimitiveType [] acceptedPrimitiveTypes ) {
69
98
this .fullClassName = fullClassName ;
70
99
this .className = className ;
71
100
this .methodName = methodName ;
72
- this .paramCount = paramCount ;
73
- this .clinicArgs = clinicArgs ;
101
+ this .extraParamCount = extraParamCount ;
102
+ this .params = params ;
74
103
this .acceptedPrimitiveTypes = acceptedPrimitiveTypes ;
75
104
}
76
105
77
- private ConverterFactory (String className , ClinicArgument [] clinicArgs , PrimitiveType [] acceptedPrimitiveTypes ) {
78
- this (CLINIC_PACKAGE + "." + className , className , "create" , 0 , clinicArgs , acceptedPrimitiveTypes );
106
+ private ConverterFactory (String className , Param [] params , PrimitiveType [] acceptedPrimitiveTypes ) {
107
+ this (CLINIC_PACKAGE + "." + className , className , "create" , 0 , params , acceptedPrimitiveTypes );
79
108
}
80
109
81
110
private static final ConverterFactory BuiltinBoolean = new ConverterFactory ("JavaBooleanConvertorNodeGen" ,
82
- new ClinicArgument []{ClinicArgument .DefaultValue },
111
+ new Param []{Param .DefaultValue },
83
112
new PrimitiveType []{PrimitiveType .Boolean });
84
113
85
114
private static final ConverterFactory BuiltinString = new ConverterFactory ("JavaStringConvertorNodeGen" ,
86
- new ClinicArgument []{ClinicArgument .BuiltinName },
115
+ new Param []{Param .BuiltinName },
87
116
new PrimitiveType []{});
88
117
89
118
private static final ConverterFactory BuiltinStringWithDefault = new ConverterFactory ("JavaStringConvertorWithDefaultValueNodeGen" ,
90
- new ClinicArgument []{ClinicArgument .BuiltinName , ClinicArgument .DefaultValue , ClinicArgument .UseDefaultForNone },
119
+ new Param []{Param .BuiltinName , Param .DefaultValue , Param .UseDefaultForNone },
91
120
new PrimitiveType []{});
92
121
93
122
private static final ConverterFactory BuiltinInt = new ConverterFactory ("JavaIntConversionNodeGen" ,
94
- new ClinicArgument []{ClinicArgument .DefaultValue , ClinicArgument .UseDefaultForNone },
123
+ new Param []{Param .DefaultValue , Param .UseDefaultForNone },
95
124
new PrimitiveType []{PrimitiveType .Int });
96
125
97
126
private static final ConverterFactory BuiltinCodePoint = new ConverterFactory ("CodePointConversionNodeGen" ,
98
- new ClinicArgument []{ClinicArgument .BuiltinName , ClinicArgument .DefaultValue , ClinicArgument .UseDefaultForNone },
127
+ new Param []{Param .BuiltinName , Param .DefaultValue , Param .UseDefaultForNone },
99
128
new PrimitiveType []{});
100
129
101
130
private static final ConverterFactory BuiltinBuffer = new ConverterFactory ("BufferConversionNodeGen" ,
102
- new ClinicArgument []{},
131
+ new Param []{},
103
132
new PrimitiveType []{});
104
133
105
134
private static final ConverterFactory BuiltinIndex = new ConverterFactory ("IndexConversionNodeGen" ,
106
- new ClinicArgument []{ClinicArgument .DefaultValue , ClinicArgument .UseDefaultForNone },
135
+ new Param []{Param .DefaultValue , Param .UseDefaultForNone },
107
136
new PrimitiveType []{PrimitiveType .Int });
108
137
109
138
private static final ConverterFactory BuiltinNone = new ConverterFactory ("DefaultValueNode" ,
110
- new ClinicArgument []{ClinicArgument .DefaultValue , ClinicArgument .UseDefaultForNone },
139
+ new Param []{Param .DefaultValue , Param .UseDefaultForNone },
111
140
new PrimitiveType []{PrimitiveType .Boolean , PrimitiveType .Int , PrimitiveType .Long , PrimitiveType .Double });
112
141
113
142
public static ConverterFactory getBuiltin (ArgumentClinic annotation ) {
@@ -149,8 +178,27 @@ public static ConverterFactory getForClass(TypeElement conversionClass) throws P
149
178
String fullClassName = conversionClass .toString ();
150
179
String className = conversionClass .getSimpleName ().toString ();
151
180
String methodName = e .getSimpleName ().toString ();
152
- int paramCount = ((ExecutableElement ) e ).getParameters ().size () - annot .clinicArgs ().length ;
153
- factory = new ConverterFactory (fullClassName , className , methodName , paramCount , annot .clinicArgs (), annot .shortCircuitPrimitive ());
181
+ List <? extends VariableElement > params = ((ExecutableElement ) e ).getParameters ();
182
+ Param [] args = new Param [params .size ()];
183
+ int extraParamCount = 0 ;
184
+ for (int i = 0 ; i < args .length ; ++i ) {
185
+ VariableElement param = params .get (i );
186
+ if (param .getAnnotation (ClinicConverterFactory .ArgumentIndex .class ) != null ) {
187
+ args [i ] = Param .ArgumentIndex ;
188
+ } else if (param .getAnnotation (ClinicConverterFactory .ArgumentName .class ) != null ) {
189
+ args [i ] = Param .ArgumentName ;
190
+ } else if (param .getAnnotation (ClinicConverterFactory .BuiltinName .class ) != null ) {
191
+ args [i ] = Param .BuiltinName ;
192
+ } else if (param .getAnnotation (ClinicConverterFactory .DefaultValue .class ) != null ) {
193
+ args [i ] = Param .DefaultValue ;
194
+ } else if (param .getAnnotation (ClinicConverterFactory .UseDefaultForNone .class ) != null ) {
195
+ args [i ] = Param .UseDefaultForNone ;
196
+ } else {
197
+ args [i ] = Param .Extra ;
198
+ extraParamCount ++;
199
+ }
200
+ }
201
+ factory = new ConverterFactory (fullClassName , className , methodName , extraParamCount , args , annot .shortCircuitPrimitive ());
154
202
}
155
203
}
156
204
if (factory == null ) {
@@ -163,6 +211,6 @@ public static ConverterFactory getForClass(TypeElement conversionClass) throws P
163
211
public static ConverterFactory forCustomConversion (TypeElement type , String methodName ) {
164
212
String fullClassName = type .getQualifiedName ().toString ();
165
213
String className = type .getSimpleName ().toString ();
166
- return new ConverterFactory (fullClassName , className , methodName , 0 , new ClinicArgument [0 ], new PrimitiveType [0 ]);
214
+ return new ConverterFactory (fullClassName , className , methodName , 0 , new Param [0 ], new PrimitiveType [0 ]);
167
215
}
168
216
}
0 commit comments