5
5
6
6
import org .apache .bcel .classfile .JavaClass ;
7
7
import org .apache .bcel .classfile .Method ;
8
- import org .apache .commons .io .FileUtils ;
9
8
import org .nativescript .staticbindinggenerator .files .FileSystemHelper ;
10
9
import org .nativescript .staticbindinggenerator .files .impl .ClassesCollection ;
11
10
import org .nativescript .staticbindinggenerator .files .impl .FileSystemHelperImpl ;
15
14
import org .nativescript .staticbindinggenerator .generating .parsing .checkers .impl .ImplementationObjectCheckerImpl ;
16
15
import org .nativescript .staticbindinggenerator .generating .parsing .classes .hierarchy .generics .GenericHierarchyView ;
17
16
import org .nativescript .staticbindinggenerator .generating .parsing .classes .hierarchy .generics .GenericParameters ;
17
+ import org .nativescript .staticbindinggenerator .generating .parsing .classes .hierarchy .generics .GenericsAwareClassHierarchyParser ;
18
18
import org .nativescript .staticbindinggenerator .generating .parsing .classes .hierarchy .generics .impl .GenericSignatureReader ;
19
19
import org .nativescript .staticbindinggenerator .generating .parsing .classes .hierarchy .generics .impl .GenericsAwareClassHierarchyParserImpl ;
20
20
import org .nativescript .staticbindinggenerator .generating .parsing .methods .InheritedMethodsCollector ;
35
35
import org .nativescript .staticbindinggenerator .generating .writing .impl .MethodsWriterImpl ;
36
36
import org .nativescript .staticbindinggenerator .generating .writing .impl .PackageNameWriterImpl ;
37
37
import org .nativescript .staticbindinggenerator .naming .BcelNamingUtil ;
38
+ import org .nativescript .staticbindinggenerator .naming .JavaClassNames ;
38
39
39
40
import java .io .BufferedReader ;
40
41
import java .io .File ;
43
44
import java .io .IOException ;
44
45
import java .io .InputStreamReader ;
45
46
import java .io .PrintStream ;
46
- import java .nio .charset .Charset ;
47
47
import java .nio .file .Files ;
48
48
import java .nio .file .Paths ;
49
49
import java .util .ArrayList ;
@@ -279,61 +279,99 @@ private String getSimpleClassname(String classname) {
279
279
}
280
280
281
281
private void writeBinding (Writer w , DataRow dataRow , JavaClass clazz , String packageName , String name ) {
282
- GenericHierarchyView genView = new GenericsAwareClassHierarchyParserImpl (new GenericSignatureReader (), classes ).getClassHierarchy (clazz );
282
+ GenericsAwareClassHierarchyParser genericsAwareClassHierarchyParser = new GenericsAwareClassHierarchyParserImpl (new GenericSignatureReader (), classes );
283
+ List <JavaClass > userImplementedInterfaces = getInterfacesFromCache (Arrays .asList (dataRow .getInterfaces ()));
284
+
285
+ if (clazz .isInterface ()) {
286
+ userImplementedInterfaces .add (clazz );
287
+ clazz = getClass (JavaClassNames .BASE_JAVA_CLASS_NAME );
288
+ }
289
+
290
+ GenericHierarchyView genView = createExtendedClassGenericHierarchyView (genericsAwareClassHierarchyParser , clazz );
291
+ Map <JavaClass , GenericHierarchyView > interfaceGenericHierarchyViews = createInterfaceGenericHierarchyViews (genericsAwareClassHierarchyParser , userImplementedInterfaces );
283
292
284
293
writePackageNameToWriter (w , packageName );
285
294
writeImportsToWriter (w , clazz , packageName );
286
- writeClassBeginningToWriter (w , clazz , dataRow . getInterfaces () , name , dataRow , genView );
295
+ writeClassBeginningToWriter (w , clazz , userImplementedInterfaces , name , dataRow , genView , interfaceGenericHierarchyViews );
287
296
writeFieldsToWriter (w , clazz );
288
297
writeConstructorsToWriter (w , clazz , dataRow , name , genView );
289
- writeMethodsToWriter (w , genView , clazz , Arrays .asList (dataRow .getMethods ()), Arrays . asList ( dataRow . getInterfaces ()) , packageName );
298
+ writeMethodsToWriter (w , genView , interfaceGenericHierarchyViews , clazz , Arrays .asList (dataRow .getMethods ()), userImplementedInterfaces , packageName );
290
299
writeClassEndToWriter (w );
291
300
}
292
301
293
- private void writeClassBeginningToWriter (Writer writer , JavaClass clazz , String [] implementedInterfacesNames , String generatedClassName , DataRow dataRow , GenericHierarchyView genericHierarchyView ) {
302
+ private Map <JavaClass , GenericHierarchyView > createInterfaceGenericHierarchyViews (GenericsAwareClassHierarchyParser genericsAwareClassHierarchyParser , List <JavaClass > implementedInterfaces ) {
303
+ Map <JavaClass , GenericHierarchyView > interfaceGenericHierarchyViews = new HashMap <>(implementedInterfaces .size ());
304
+
305
+ for (JavaClass implementedInterface : implementedInterfaces ) {
306
+ GenericHierarchyView genericHierarchyView = genericsAwareClassHierarchyParser .getClassHierarchy (implementedInterface );
307
+ interfaceGenericHierarchyViews .put (implementedInterface , genericHierarchyView );
308
+ }
309
+
310
+ return interfaceGenericHierarchyViews ;
311
+ }
312
+
313
+ private GenericHierarchyView createExtendedClassGenericHierarchyView (GenericsAwareClassHierarchyParser genericsAwareClassHierarchyParser , JavaClass extendedClass ) {
314
+ return genericsAwareClassHierarchyParser .getClassHierarchy (extendedClass );
315
+ }
316
+
317
+ private void writeClassBeginningToWriter (Writer writer , JavaClass clazz , List <JavaClass > implementedInterfaces , String generatedClassName , DataRow dataRow , GenericHierarchyView genericHierarchyView , Map <JavaClass , GenericHierarchyView > interfaceGenericHierarchyViews ) {
294
318
ClassWriter classWriter = new ClassWriterImpl (writer );
295
- StringBuilder extendedClassNameBuilder = new StringBuilder ();
296
- extendedClassNameBuilder .append (BcelNamingUtil .resolveClassName (clazz .getClassName ()));
297
319
298
- GenericParameters initialClassGenericParameters = genericHierarchyView .getInitialClassGenericParameters ();
320
+ boolean hasCustomJsName = !dataRow .getFilename ().isEmpty ();
321
+
322
+ List <String > implementedInterfacesNames = mapNamesWithGenericArgumentsIfNecessary (implementedInterfaces , interfaceGenericHierarchyViews );
323
+ String extendedClassName = mapNameWithGenericArgumentsIfNecessary (clazz , genericHierarchyView );
324
+
325
+ if (hasCustomJsName ) {
326
+ classWriter .writeBeginningOfNamedChildClass (generatedClassName , dataRow .getJsFilename (), extendedClassName , implementedInterfacesNames );
327
+ } else {
328
+ classWriter .writeBeginningOfChildClass (generatedClassName , extendedClassName , implementedInterfacesNames );
329
+ }
330
+ }
331
+
332
+ private String mapNameWithGenericArgumentsIfNecessary (JavaClass extendedClass , GenericHierarchyView extendedClassGenericHierarchyView ) {
333
+ return getClassNameWithPossibleGenericArguments (extendedClass , extendedClassGenericHierarchyView );
334
+ }
335
+
336
+ private List <String > mapNamesWithGenericArgumentsIfNecessary (List <JavaClass > implementedInterfaces , Map <JavaClass , GenericHierarchyView > interfaceGenericHierarchyViews ) {
337
+ List <String > res = new ArrayList <>();
338
+
339
+ for (JavaClass implementedInterface : implementedInterfaces ) {
340
+ GenericHierarchyView genericHierarchyView = interfaceGenericHierarchyViews .get (implementedInterface );
341
+ String className = getClassNameWithPossibleGenericArguments (implementedInterface , genericHierarchyView );
342
+ res .add (className );
343
+ }
344
+
345
+ return res ;
346
+ }
347
+
348
+ private String getClassNameWithPossibleGenericArguments (JavaClass classToCheck , GenericHierarchyView classToCheckGenericHierarchyView ) {
349
+ GenericParameters initialClassGenericParameters = classToCheckGenericHierarchyView .getInitialClassGenericParameters ();
350
+ StringBuilder classNameBuilder = new StringBuilder ();
351
+ classNameBuilder .append (BcelNamingUtil .resolveClassName (classToCheck .getClassName ()));
299
352
300
353
if (initialClassGenericParameters != null ) {
301
354
Map <String , String > initialClassGenericParametersMap = initialClassGenericParameters .getGenericParameters ();
302
355
int initialClassGenericParametersMapCount = initialClassGenericParametersMap .size ();
303
356
304
357
if (initialClassGenericParametersMapCount > 0 ) {
305
- extendedClassNameBuilder .append ('<' );
358
+ classNameBuilder .append ('<' );
306
359
int parameterCounter = 0 ;
307
360
for (Map .Entry <String , String > genericParameter : initialClassGenericParametersMap .entrySet ()) {
308
361
String resolvedGeneriParameterValue = BcelNamingUtil .resolveClassName (genericParameter .getValue ());
309
- extendedClassNameBuilder .append (resolvedGeneriParameterValue );
362
+ classNameBuilder .append (resolvedGeneriParameterValue );
310
363
311
364
if (parameterCounter != initialClassGenericParametersMapCount - 1 ) {
312
- extendedClassNameBuilder .append (", " );
365
+ classNameBuilder .append (", " );
313
366
parameterCounter += 1 ;
314
367
}
315
368
}
316
- extendedClassNameBuilder .append ('>' );
369
+ classNameBuilder .append ('>' );
317
370
}
318
371
319
372
}
320
373
321
- boolean hasCustomJsName = !dataRow .getFilename ().isEmpty ();
322
-
323
- String extendedClassName = extendedClassNameBuilder .toString ();
324
- if (hasCustomJsName ) {
325
- if (clazz .isInterface ()) { // extending an interface
326
- classWriter .writeBeginningOfNamedClassImplementingSingleInterface (generatedClassName , dataRow .getJsFilename (), extendedClassName );
327
- } else {
328
- classWriter .writeBeginningOfNamedChildClass (generatedClassName , dataRow .getJsFilename (), extendedClassName , Arrays .asList (implementedInterfacesNames ));
329
- }
330
- } else {
331
- if (clazz .isInterface ()) { // extending an interface
332
- classWriter .writeBeginningOfClassImplementingSingleInterface (generatedClassName , extendedClassName );
333
- } else {
334
- classWriter .writeBeginningOfChildClass (generatedClassName , extendedClassName , Arrays .asList (implementedInterfacesNames ));
335
- }
336
- }
374
+ return classNameBuilder .toString ();
337
375
}
338
376
339
377
private void writeImportsToWriter (Writer writer , JavaClass clazz , String packageName ) {
@@ -372,32 +410,26 @@ private void writeConstructorsToWriter(Writer writer, JavaClass clazz, DataRow d
372
410
boolean hasInitMethod = implementationObjectChecker .hasInitMethod (implObjectMethods );
373
411
boolean hasInitMethod2 = !isApplicationClass && hasInitMethod ;
374
412
375
- boolean isInterface = clazz .isInterface ();
376
- if (isInterface ) {
377
- methodsWriter .writeDefaultConstructor (generatedClassName );
378
- } else {
379
- for (Method method : clazz .getMethods ()) {
380
- if (method .getName ().equals ("<init>" ) && (method .isPublic () || method .isProtected ())) {
381
- JavaMethod javaMethod = new JavaMethodImpl (method , clazz );
382
- ReifiedJavaMethod reifiedJavaMethod = methodSignatureReifier .transformJavaMethod (javaMethod );
383
- methodsWriter .writeConstructor (generatedClassName , reifiedJavaMethod , hasInitMethod2 );
384
- }
413
+ for (Method method : clazz .getMethods ()) {
414
+ if (method .getName ().equals ("<init>" ) && (method .isPublic () || method .isProtected ())) {
415
+ JavaMethod javaMethod = new JavaMethodImpl (method , clazz );
416
+ ReifiedJavaMethod reifiedJavaMethod = methodSignatureReifier .transformJavaMethod (javaMethod );
417
+ methodsWriter .writeConstructor (generatedClassName , reifiedJavaMethod , hasInitMethod2 );
385
418
}
386
419
}
387
420
}
388
421
389
- private void writeMethodsToWriter (Writer writer , GenericHierarchyView genericHierarchyView , JavaClass clazz , List <String > userImplementedMethods , List <String > userImplementedInterfacesNames , String packageName ) {
390
- boolean isInterface = clazz .isInterface ();
422
+ private void writeMethodsToWriter (Writer writer , GenericHierarchyView genericHierarchyView , Map <JavaClass , GenericHierarchyView > interfaceGenericHierarchyViews , JavaClass clazz , List <String > userImplementedMethods , List <JavaClass > userImplementedInterfaces , String packageName ) {
391
423
boolean isApplicationClass = androidClassChecker .isApplicationClass (clazz );
392
424
393
425
MethodsWriter methodsWriter = new MethodsWriterImpl (writer , suppressCallJSMethodExceptions , isApplicationClass );
394
426
395
- List <JavaClass > userImplementedInterfaces = getInterfacesFromCache (userImplementedInterfacesNames );
396
427
InheritedMethodsCollector inheritedMethodsCollector = new InheritedMethodsCollectorImpl .Builder ()
397
428
.forJavaClass (clazz )
398
429
.withClassesCache (classes )
399
430
.withAdditionalImplementedInterfaces (userImplementedInterfaces )
400
431
.withGenericHierarchyView (genericHierarchyView )
432
+ .withInterfacesGenericHierarchyViews (interfaceGenericHierarchyViews )
401
433
.withPackageName (packageName )
402
434
.build ();
403
435
@@ -427,10 +459,8 @@ private void writeMethodsToWriter(Writer writer, GenericHierarchyView genericHie
427
459
methodsWriter .writeGetInstanceMethod (normalizedClassName );
428
460
}
429
461
430
- if (!isInterface ) {
431
- methodsWriter .writeInternalRuntimeHashCodeMethod ();
432
- methodsWriter .writeInternalRuntimeEqualsMethod ();
433
- }
462
+ methodsWriter .writeInternalRuntimeHashCodeMethod ();
463
+ methodsWriter .writeInternalRuntimeEqualsMethod ();
434
464
}
435
465
436
466
private boolean areAllArgumentsAndReturnTypePublic (ReifiedJavaMethod method ) {
@@ -490,4 +520,4 @@ private JavaClass getClass(String className) {
490
520
491
521
return clazz ;
492
522
}
493
- }
523
+ }
0 commit comments