@@ -55,20 +55,22 @@ public String generateDtsContent(List<JavaClass> javaClasses) {
55
55
JavaClass currClass = javaClasses .get (i );
56
56
currentFileClassname = currClass .getClassName ();
57
57
boolean isInterface = currClass .isInterface ();
58
+ boolean isAbstract = currClass .isAbstract ();
58
59
59
60
this .indent = closePackage (this .prevClass , currClass );
60
61
this .indent = openPackage (this .prevClass , currClass );
61
62
62
63
String tabs = getTabs (this .indent );
63
64
64
65
JavaClass superClass = getSuperClass (currClass );
65
- String extendsLine = getExtendsLine (superClass );
66
+ List <JavaClass > interfaces = getInterfaces (currClass );
67
+ String extendsLine = getExtendsLine (superClass , interfaces );
66
68
67
69
if (getSimpleClassname (currClass ).equals ("AccessibilityDelegate" )) {
68
70
sbContent .appendln (tabs + "export class " + getFullClassNameConcatenated (currClass ) + extendsLine + " {" );
69
71
}
70
72
else {
71
- sbContent .appendln (tabs + "export class " + getSimpleClassname (currClass ) + extendsLine + " {" );
73
+ sbContent .appendln (tabs + "export" + ( isAbstract && ! isInterface ? " abstract " : " " ) + " class " + getSimpleClassname (currClass ) + extendsLine + " {" );
72
74
}
73
75
// process member scope
74
76
@@ -78,6 +80,7 @@ public String generateDtsContent(List<JavaClass> javaClasses) {
78
80
79
81
List <Method > allInterfacesMethods = getAllInterfacesMethods (allInterfaces );
80
82
Set <Field > allInterfaceFields = getAllInterfacesFields (allInterfaces );
83
+
81
84
processInterfaceConstructor (currClass , allInterfacesMethods );
82
85
83
86
for (Method m : allInterfacesMethods ) {
@@ -101,6 +104,14 @@ public String generateDtsContent(List<JavaClass> javaClasses) {
101
104
// process member scope end
102
105
}
103
106
107
+ if (isAbstract && !isInterface ) {
108
+ List <JavaClass > allInterfaces = getAllInterfaces (currClass );
109
+ List <Method > allInterfacesMethods = getAllInterfacesMethods (allInterfaces );
110
+ for (Method m : allInterfacesMethods ) {
111
+ processMethod (m , currClass );
112
+ }
113
+ }
114
+
104
115
sbContent .appendln (tabs + "}" );
105
116
if (getSimpleClassname (currClass ).equals ("AccessibilityDelegate" )) {
106
117
String innerClassAlias = "export type " + getSimpleClassname (currClass ) + " = " + getFullClassNameConcatenated (currClass );
@@ -124,12 +135,24 @@ public String generateDtsContent(List<JavaClass> javaClasses) {
124
135
return sbHeaders .toString () + sbContent .toString ();
125
136
}
126
137
127
- private String getExtendsLine (JavaClass superClass ) {
138
+ private String getExtendsLine (JavaClass superClass , List < JavaClass > interfaces ) {
128
139
if (superClass == null ) {
129
140
return "" ;
130
141
}
131
142
132
- return " extends " + superClass .getClassName ().replaceAll ("\\ $" , "\\ ." );
143
+ StringBuilder implementsSegmentSb = new StringBuilder ();
144
+ String implementsSegment = "" ;
145
+ if (interfaces .size () > 0 ) {
146
+ implementsSegmentSb .append (" implements " );
147
+
148
+ for (JavaClass clazz : interfaces ) {
149
+ implementsSegmentSb .append (clazz .getClassName ().replaceAll ("\\ $" , "\\ ." ) + ", " );
150
+ }
151
+
152
+ implementsSegment = implementsSegmentSb .substring (0 , implementsSegmentSb .lastIndexOf ("," ));
153
+ }
154
+
155
+ return " extends " + superClass .getClassName ().replaceAll ("\\ $" , "\\ ." ) + implementsSegment ;
133
156
}
134
157
135
158
private int closePackage (JavaClass prevClass , JavaClass currClass ) {
@@ -255,7 +278,7 @@ private void generateInterfaceConstructorContent(JavaClass classInterface, Strin
255
278
private void generateInterfaceConstructorCommentBlock (JavaClass classInterface , String tabs ) {
256
279
sbContent .appendln (tabs + "/**" );
257
280
sbContent .appendln (tabs + " * Constructs a new instance of the " + classInterface .getClassName () + " interface with the provided implementation." );
258
- sbContent .appendln (tabs + " * @param implementation - allows implementor to define their own logic for all public methods." );
281
+ // sbContent.appendln(tabs + " * @param implementation - allows implementor to define their own logic for all public methods."); // <- causes too much noise
259
282
sbContent .appendln (tabs + " */" );
260
283
}
261
284
@@ -270,13 +293,28 @@ private List<JavaClass> getAllInterfaces(JavaClass classInterface) {
270
293
271
294
interfaces .add (clazz );
272
295
273
- String [] interfaceNames = clazz .getInterfaceNames ();
296
+ classQueue .addAll (getInterfaces (clazz ));
297
+ }
298
+
299
+ return interfaces ;
300
+ }
301
+
302
+ private List <JavaClass > getInterfaces (JavaClass classInterface ) {
303
+ List <JavaClass > interfaces = new ArrayList <>();
274
304
275
- for (String intface : interfaceNames ) {
276
- JavaClass clazz1 = ClassRepo .findClass (intface );
305
+ String [] interfaceNames = classInterface .getInterfaceNames ();
306
+ for (String intface : interfaceNames ) {
307
+ JavaClass clazz1 = ClassRepo .findClass (intface );
308
+ String className = clazz1 .getClassName ();
277
309
278
- classQueue .add (clazz1 );
310
+ // TODO: Pete: Hardcoded until we figure out how to go around the 'type incompatible with Object' issue
311
+ if (className .equals ("java.util.Iterator" ) ||
312
+ className .equals ("android.animation.TypeEvaluator" ) ||
313
+ className .equals ("java.lang.Comparable" )) {
314
+ continue ;
279
315
}
316
+
317
+ interfaces .add (clazz1 );
280
318
}
281
319
282
320
return interfaces ;
@@ -304,14 +342,19 @@ private Set<Field> getAllInterfacesFields(List<JavaClass> interfaces) {
304
342
}
305
343
//method related
306
344
private void processMethod (Method m , JavaClass clazz ) {
345
+ String name = m .getName ();
346
+
347
+ // TODO: Pete: won't generate static initializers as invalid typescript properties
348
+ if (clazz .isInterface () && name .equals ("<clinit>" )) {
349
+ return ;
350
+ }
307
351
308
352
loadBaseMethods (clazz ); //loaded in "baseMethodNames" and "baseMethods"
309
353
310
354
String tabs = getTabs (this .indent + 1 );
311
355
312
356
cacheMethodBySignature (m ); //cached in "mapNameMethod"
313
357
314
- String name = m .getName ();
315
358
316
359
//generate base method content
317
360
if (baseMethodNames .contains (name )) {
0 commit comments