25
25
import javax .lang .model .element .AnnotationMirror ;
26
26
import javax .lang .model .element .Element ;
27
27
import javax .lang .model .element .ElementKind ;
28
+ import javax .lang .model .element .ExecutableElement ;
28
29
import javax .lang .model .element .Name ;
29
30
import javax .lang .model .element .TypeElement ;
30
31
import javax .lang .model .util .Elements ;
@@ -57,31 +58,31 @@ public synchronized void init(ProcessingEnvironment processingEnv) {
57
58
filer = processingEnv .getFiler ();
58
59
messager = processingEnv .getMessager ();
59
60
60
- messager . printMessage ( Diagnostic . Kind . WARNING , "JavaSwiftProcessor init started" );
61
+ note ( "JavaSwiftProcessor init started" );
61
62
62
63
String packageJson = processingEnv .getOptions ().get (PACKAGE_OPTION );
63
64
64
65
moduleDescriptor = new Gson ().fromJson (packageJson , SwiftModuleDescriptor .class );
65
66
if (moduleDescriptor == null ) {
66
- messager . printMessage ( Diagnostic . Kind . ERROR , "No package description with option: com.readdle.codegen.package" , null );
67
+ error ( null , "No package description with option: com.readdle.codegen.package" );
67
68
return ;
68
69
}
69
70
70
- messager . printMessage ( Diagnostic . Kind . WARNING , "Package moduleName: " + moduleDescriptor .moduleName );
71
+ note ( "Package moduleName: " + moduleDescriptor .moduleName );
71
72
72
73
if (moduleDescriptor .importPackages != null ) {
73
74
for (String anImport : moduleDescriptor .importPackages ) {
74
- messager . printMessage ( Diagnostic . Kind . WARNING , "Package import: " + anImport );
75
+ note ( "Package import: " + anImport );
75
76
}
76
77
}
77
78
78
79
if (moduleDescriptor .customTypeMappings != null ) {
79
80
for (String key : moduleDescriptor .customTypeMappings .keySet ()) {
80
- messager . printMessage ( Diagnostic . Kind . WARNING , "Package custom mapping: " + key + " -> " + moduleDescriptor .customTypeMappings .get (key ));
81
+ note ( "Package custom mapping: " + key + " -> " + moduleDescriptor .customTypeMappings .get (key ));
81
82
}
82
83
}
83
84
84
- messager . printMessage ( Diagnostic . Kind . WARNING , "JavaSwiftProcessor init finished successfully" );
85
+ note ( "JavaSwiftProcessor init finished successfully" );
85
86
}
86
87
87
88
@ Override
@@ -120,7 +121,7 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
120
121
121
122
private boolean processImpl (Set <? extends TypeElement > annotations , RoundEnvironment roundEnv ) {
122
123
Filer filer = processingEnv .getFiler ();
123
- messager . printMessage ( Diagnostic . Kind . WARNING , "JavaSwiftProcessor start code generation" );
124
+ note ( "JavaSwiftProcessor start code generation" );
124
125
125
126
try {
126
127
generateJavaSwift (filer );
@@ -129,13 +130,13 @@ private boolean processImpl(Set<? extends TypeElement> annotations, RoundEnviron
129
130
error (null , "Can't write to file: " + e .getMessage ());
130
131
}
131
132
132
- messager . printMessage ( Diagnostic . Kind . WARNING , "SwiftValue to process: "
133
+ note ( "SwiftValue to process: "
133
134
+ roundEnv .getElementsAnnotatedWith (SwiftValue .class ).size ());
134
- messager . printMessage ( Diagnostic . Kind . WARNING , "SwiftReference to process: "
135
+ note ( "SwiftReference to process: "
135
136
+ roundEnv .getElementsAnnotatedWith (SwiftReference .class ).size ());
136
- messager . printMessage ( Diagnostic . Kind . WARNING , "SwiftDelegate to process: "
137
+ note ( "SwiftDelegate to process: "
137
138
+ roundEnv .getElementsAnnotatedWith (SwiftDelegate .class ).size ());
138
- messager . printMessage ( Diagnostic . Kind . WARNING , "SwiftBlock to process: "
139
+ note ( "SwiftBlock to process: "
139
140
+ roundEnv .getElementsAnnotatedWith (SwiftBlock .class ).size ());
140
141
141
142
Map <String , SwiftValueDescriptor > swiftValues = new HashMap <>();
@@ -201,7 +202,7 @@ private boolean processImpl(Set<? extends TypeElement> annotations, RoundEnviron
201
202
TypeElement typeElement = (TypeElement ) annotatedElement ;
202
203
203
204
try {
204
- SwiftDelegateDescriptor delegateDescriptor = new SwiftDelegateDescriptor (typeElement , filer , this );
205
+ SwiftDelegateDescriptor delegateDescriptor = new SwiftDelegateDescriptor (typeElement , filer , messager , this );
205
206
swiftDelegates .put (delegateDescriptor .simpleTypeName , delegateDescriptor );
206
207
}
207
208
catch (IllegalArgumentException e ) {
@@ -241,9 +242,9 @@ private boolean processImpl(Set<? extends TypeElement> annotations, RoundEnviron
241
242
try {
242
243
File file = valueDescriptor .generateCode ();
243
244
/* Logging */
244
- messager . printMessage ( Diagnostic . Kind . WARNING , "Generate SwiftValue " + file .getName () + ":" );
245
+ note ( "Generate SwiftValue " + file .getName () + ":" );
245
246
for (WritableElement function : valueDescriptor .getFunctions ()) {
246
- messager . printMessage ( Diagnostic . Kind . NOTE , function .toString (valueDescriptor .getJavaFullName ()));
247
+ note ( function .toString (valueDescriptor .getJavaFullName ()));
247
248
}
248
249
/* Logging */
249
250
} catch (IOException e ) {
@@ -257,9 +258,9 @@ private boolean processImpl(Set<? extends TypeElement> annotations, RoundEnviron
257
258
try {
258
259
File file = referenceDescriptor .generateCode ();
259
260
/* Logging */
260
- messager . printMessage ( Diagnostic . Kind . WARNING , "Generate SwiftReference " + file .getName () + ":" );
261
+ note ( "Generate SwiftReference " + file .getName () + ":" );
261
262
for (WritableElement function : referenceDescriptor .functions ) {
262
- messager . printMessage ( Diagnostic . Kind . NOTE , function .toString (referenceDescriptor .getJavaFullName ()));
263
+ note ( function .toString (referenceDescriptor .getJavaFullName ()));
263
264
}
264
265
/* Logging */
265
266
} catch (IOException e ) {
@@ -273,9 +274,9 @@ private boolean processImpl(Set<? extends TypeElement> annotations, RoundEnviron
273
274
try {
274
275
File file = delegateDescriptor .generateCode ();
275
276
/* Logging */
276
- messager . printMessage ( Diagnostic . Kind . WARNING , "Generate SwiftDelegate" + file .getName () + ":" );
277
+ note ( "Generate SwiftDelegate" + file .getName () + ":" );
277
278
for (WritableElement function : delegateDescriptor .functions ) {
278
- messager . printMessage ( Diagnostic . Kind . NOTE , function .toString (delegateDescriptor .getJavaFullName ()));
279
+ note ( function .toString (delegateDescriptor .getJavaFullName ()));
279
280
}
280
281
/* Logging */
281
282
} catch (IOException e ) {
@@ -289,7 +290,7 @@ private boolean processImpl(Set<? extends TypeElement> annotations, RoundEnviron
289
290
try {
290
291
File file = blockDescriptor .generateCode ();
291
292
/* Logging */
292
- messager . printMessage ( Diagnostic . Kind . WARNING , "Generate SwiftBlock" + file .getName ());
293
+ note ( "Generate SwiftBlock" + file .getName ());
293
294
/* Logging */
294
295
} catch (IOException e ) {
295
296
e .printStackTrace ();
@@ -298,7 +299,7 @@ private boolean processImpl(Set<? extends TypeElement> annotations, RoundEnviron
298
299
}
299
300
}
300
301
301
- messager . printMessage ( Diagnostic . Kind . WARNING , "JavaSwiftProcessor finished successfully!" );
302
+ note ( "JavaSwiftProcessor finished successfully!" );
302
303
303
304
return false ;
304
305
}
@@ -307,7 +308,7 @@ private void generateJavaSwift(Filer filer) throws IOException {
307
308
String swiftFilePath = filer .getResource (StandardLocation .SOURCE_OUTPUT , FOLDER , "SwiftJava.swift" ).toUri ().getPath ();
308
309
File swiftExtensionFile = new File (swiftFilePath );
309
310
swiftExtensionFile .getParentFile ().mkdir ();
310
- messager . printMessage ( Diagnostic . Kind . WARNING , "JavaSwiftProcessor will generate sources at: " + swiftExtensionFile .getParent ());
311
+ note ( "JavaSwiftProcessor will generate sources at: " + swiftExtensionFile .getParent ());
311
312
SwiftWriter swiftWriter = new SwiftWriter (swiftExtensionFile );
312
313
swiftWriter .emitImports (new String [0 ]);
313
314
swiftWriter .emitEmptyLine ();
@@ -329,11 +330,25 @@ private void generateJavaSwift(Filer filer) throws IOException {
329
330
swiftWriter .close ();
330
331
}
331
332
332
- private void error (Element e , String msg , Object ... args ) {
333
+ void note (String msg ) {
334
+ messager .printMessage (Diagnostic .Kind .WARNING , msg );
335
+ }
336
+
337
+ void error (Element e , String msg , Object ... args ) {
333
338
messager .printMessage (Diagnostic .Kind .ERROR , String .format (msg , args ), e );
334
339
}
335
340
336
- static boolean isNullable (Element element ) {
341
+ boolean isNullable (Element element ) {
342
+ note ("Check nullability " + element .asType ().toString ());
343
+ if (element .asType ().getKind ().isPrimitive ()) {
344
+ return false ;
345
+ }
346
+ if (element .getKind () == ElementKind .METHOD ) {
347
+ ExecutableElement executableElement = (ExecutableElement ) element ;
348
+ if (executableElement .getReturnType ().getKind ().isPrimitive ()) {
349
+ return false ;
350
+ }
351
+ }
337
352
List <? extends AnnotationMirror > mirrors = element .getAnnotationMirrors ();
338
353
for (AnnotationMirror mirror : mirrors ) {
339
354
Name simpleName = mirror .getAnnotationType ().asElement ().getSimpleName ();
@@ -347,6 +362,17 @@ static boolean isNullable(Element element) {
347
362
return true ;
348
363
}
349
364
365
+ boolean isUnsigned (Element element ) {
366
+ List <? extends AnnotationMirror > mirrors = element .getAnnotationMirrors ();
367
+ for (AnnotationMirror mirror : mirrors ) {
368
+ Name simpleName = mirror .getAnnotationType ().asElement ().getSimpleName ();
369
+ if (simpleName .contentEquals ("Unsigned" )) {
370
+ return true ;
371
+ }
372
+ }
373
+ return false ;
374
+ }
375
+
350
376
static String replaceLast (String text , char replace , char replacement ) {
351
377
int index = text .lastIndexOf (replace );
352
378
if (index >= 0 ) {
@@ -356,12 +382,26 @@ static String replaceLast(String text, char replace, char replacement) {
356
382
}
357
383
358
384
public SwiftEnvironment .Type parseJavaType (String javaType ) {
359
- if (moduleDescriptor .customTypeMappings .containsKey (javaType )) {
385
+ if (moduleDescriptor .customTypeMappings != null && moduleDescriptor . customTypeMappings .containsKey (javaType )) {
360
386
return new SwiftEnvironment .Type (moduleDescriptor .customTypeMappings .get (javaType ), javaType );
361
387
}
362
388
switch (javaType ) {
363
389
case "void" :
364
390
return null ;
391
+ case "byte" :
392
+ return new SwiftEnvironment .Type ("Int8" , javaType );
393
+ case "short" :
394
+ return new SwiftEnvironment .Type ("Int16" , javaType );
395
+ case "int" :
396
+ return new SwiftEnvironment .Type ("Int" , javaType );
397
+ case "long" :
398
+ return new SwiftEnvironment .Type ("Int64" , javaType );
399
+ case "float" :
400
+ return new SwiftEnvironment .Type ("Float" , javaType );
401
+ case "double" :
402
+ return new SwiftEnvironment .Type ("Double" , javaType );
403
+ case "boolean" :
404
+ return new SwiftEnvironment .Type ("Bool" , javaType );
365
405
case "java.lang.Integer" :
366
406
return new SwiftEnvironment .Type ("Int" , javaType );
367
407
case "java.lang.Byte" :
0 commit comments