@@ -55,20 +55,22 @@ public String generateDtsContent(List<JavaClass> javaClasses) {
5555 JavaClass currClass = javaClasses .get (i );
5656 currentFileClassname = currClass .getClassName ();
5757 boolean isInterface = currClass .isInterface ();
58+ boolean isAbstract = currClass .isAbstract ();
5859
5960 this .indent = closePackage (this .prevClass , currClass );
6061 this .indent = openPackage (this .prevClass , currClass );
6162
6263 String tabs = getTabs (this .indent );
6364
6465 JavaClass superClass = getSuperClass (currClass );
65- String extendsLine = getExtendsLine (superClass );
66+ List <JavaClass > interfaces = getInterfaces (currClass );
67+ String extendsLine = getExtendsLine (superClass , interfaces );
6668
6769 if (getSimpleClassname (currClass ).equals ("AccessibilityDelegate" )) {
6870 sbContent .appendln (tabs + "export class " + getFullClassNameConcatenated (currClass ) + extendsLine + " {" );
6971 }
7072 else {
71- sbContent .appendln (tabs + "export class " + getSimpleClassname (currClass ) + extendsLine + " {" );
73+ sbContent .appendln (tabs + "export" + ( isAbstract && ! isInterface ? " abstract " : " " ) + " class " + getSimpleClassname (currClass ) + extendsLine + " {" );
7274 }
7375 // process member scope
7476
@@ -78,6 +80,7 @@ public String generateDtsContent(List<JavaClass> javaClasses) {
7880
7981 List <Method > allInterfacesMethods = getAllInterfacesMethods (allInterfaces );
8082 Set <Field > allInterfaceFields = getAllInterfacesFields (allInterfaces );
83+
8184 processInterfaceConstructor (currClass , allInterfacesMethods );
8285
8386 for (Method m : allInterfacesMethods ) {
@@ -101,6 +104,14 @@ public String generateDtsContent(List<JavaClass> javaClasses) {
101104 // process member scope end
102105 }
103106
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+
104115 sbContent .appendln (tabs + "}" );
105116 if (getSimpleClassname (currClass ).equals ("AccessibilityDelegate" )) {
106117 String innerClassAlias = "export type " + getSimpleClassname (currClass ) + " = " + getFullClassNameConcatenated (currClass );
@@ -124,12 +135,24 @@ public String generateDtsContent(List<JavaClass> javaClasses) {
124135 return sbHeaders .toString () + sbContent .toString ();
125136 }
126137
127- private String getExtendsLine (JavaClass superClass ) {
138+ private String getExtendsLine (JavaClass superClass , List < JavaClass > interfaces ) {
128139 if (superClass == null ) {
129140 return "" ;
130141 }
131142
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 ;
133156 }
134157
135158 private int closePackage (JavaClass prevClass , JavaClass currClass ) {
@@ -255,7 +278,7 @@ private void generateInterfaceConstructorContent(JavaClass classInterface, Strin
255278 private void generateInterfaceConstructorCommentBlock (JavaClass classInterface , String tabs ) {
256279 sbContent .appendln (tabs + "/**" );
257280 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
259282 sbContent .appendln (tabs + " */" );
260283 }
261284
@@ -270,13 +293,28 @@ private List<JavaClass> getAllInterfaces(JavaClass classInterface) {
270293
271294 interfaces .add (clazz );
272295
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 <>();
274304
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 ();
277309
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 ;
279315 }
316+
317+ interfaces .add (clazz1 );
280318 }
281319
282320 return interfaces ;
@@ -304,14 +342,19 @@ private Set<Field> getAllInterfacesFields(List<JavaClass> interfaces) {
304342 }
305343 //method related
306344 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+ }
307351
308352 loadBaseMethods (clazz ); //loaded in "baseMethodNames" and "baseMethods"
309353
310354 String tabs = getTabs (this .indent + 1 );
311355
312356 cacheMethodBySignature (m ); //cached in "mapNameMethod"
313357
314- String name = m .getName ();
315358
316359 //generate base method content
317360 if (baseMethodNames .contains (name )) {
0 commit comments