4343import com .oracle .graal .python .annotations .ArgumentClinic ;
4444import com .oracle .graal .python .annotations .ArgumentClinic .PrimitiveType ;
4545import com .oracle .graal .python .annotations .ClinicConverterFactory ;
46- import com .oracle .graal .python .annotations .ClinicConverterFactory .ClinicArgument ;
4746
4847import javax .lang .model .element .Element ;
4948import javax .lang .model .element .ElementKind ;
5049import javax .lang .model .element .ExecutableElement ;
5150import javax .lang .model .element .Modifier ;
5251import javax .lang .model .element .TypeElement ;
52+ import javax .lang .model .element .VariableElement ;
5353import java .util .HashMap ;
54+ import java .util .List ;
5455import java .util .Map ;
5556
5657public class ConverterFactory {
5758 public static final String CLINIC_PACKAGE = "com.oracle.graal.python.nodes.function.builtins.clinic" ;
5859
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+
5988 private static final Map <TypeElement , ConverterFactory > cache = new HashMap <>();
6089
6190 public final String fullClassName ;
6291 public final String className ;
6392 public final String methodName ;
64- public final int paramCount ;
65- public final ClinicArgument [] clinicArgs ;
93+ public final int extraParamCount ;
94+ public final Param [] params ;
6695 public final PrimitiveType [] acceptedPrimitiveTypes ;
6796
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 ) {
6998 this .fullClassName = fullClassName ;
7099 this .className = className ;
71100 this .methodName = methodName ;
72- this .paramCount = paramCount ;
73- this .clinicArgs = clinicArgs ;
101+ this .extraParamCount = extraParamCount ;
102+ this .params = params ;
74103 this .acceptedPrimitiveTypes = acceptedPrimitiveTypes ;
75104 }
76105
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 );
79108 }
80109
81110 private static final ConverterFactory BuiltinBoolean = new ConverterFactory ("JavaBooleanConvertorNodeGen" ,
82- new ClinicArgument []{ClinicArgument .DefaultValue },
111+ new Param []{Param .DefaultValue },
83112 new PrimitiveType []{PrimitiveType .Boolean });
84113
85114 private static final ConverterFactory BuiltinString = new ConverterFactory ("JavaStringConvertorNodeGen" ,
86- new ClinicArgument []{ClinicArgument .BuiltinName },
115+ new Param []{Param .BuiltinName },
87116 new PrimitiveType []{});
88117
89118 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 },
91120 new PrimitiveType []{});
92121
93122 private static final ConverterFactory BuiltinInt = new ConverterFactory ("JavaIntConversionNodeGen" ,
94- new ClinicArgument []{ClinicArgument .DefaultValue , ClinicArgument .UseDefaultForNone },
123+ new Param []{Param .DefaultValue , Param .UseDefaultForNone },
95124 new PrimitiveType []{PrimitiveType .Int });
96125
97126 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 },
99128 new PrimitiveType []{});
100129
101130 private static final ConverterFactory BuiltinBuffer = new ConverterFactory ("BufferConversionNodeGen" ,
102- new ClinicArgument []{},
131+ new Param []{},
103132 new PrimitiveType []{});
104133
105134 private static final ConverterFactory BuiltinIndex = new ConverterFactory ("IndexConversionNodeGen" ,
106- new ClinicArgument []{ClinicArgument .DefaultValue , ClinicArgument .UseDefaultForNone },
135+ new Param []{Param .DefaultValue , Param .UseDefaultForNone },
107136 new PrimitiveType []{PrimitiveType .Int });
108137
109138 private static final ConverterFactory BuiltinNone = new ConverterFactory ("DefaultValueNode" ,
110- new ClinicArgument []{ClinicArgument .DefaultValue , ClinicArgument .UseDefaultForNone },
139+ new Param []{Param .DefaultValue , Param .UseDefaultForNone },
111140 new PrimitiveType []{PrimitiveType .Boolean , PrimitiveType .Int , PrimitiveType .Long , PrimitiveType .Double });
112141
113142 public static ConverterFactory getBuiltin (ArgumentClinic annotation ) {
@@ -149,8 +178,27 @@ public static ConverterFactory getForClass(TypeElement conversionClass) throws P
149178 String fullClassName = conversionClass .toString ();
150179 String className = conversionClass .getSimpleName ().toString ();
151180 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 ());
154202 }
155203 }
156204 if (factory == null ) {
@@ -163,6 +211,6 @@ public static ConverterFactory getForClass(TypeElement conversionClass) throws P
163211 public static ConverterFactory forCustomConversion (TypeElement type , String methodName ) {
164212 String fullClassName = type .getQualifiedName ().toString ();
165213 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 ]);
167215 }
168216}
0 commit comments