diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java index 2b695bddb..b3839f22f 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java @@ -5,7 +5,6 @@ import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; -import org.apache.commons.io.FileUtils; import org.nativescript.staticbindinggenerator.files.FileSystemHelper; import org.nativescript.staticbindinggenerator.files.impl.ClassesCollection; import org.nativescript.staticbindinggenerator.files.impl.FileSystemHelperImpl; @@ -15,6 +14,7 @@ import org.nativescript.staticbindinggenerator.generating.parsing.checkers.impl.ImplementationObjectCheckerImpl; import org.nativescript.staticbindinggenerator.generating.parsing.classes.hierarchy.generics.GenericHierarchyView; import org.nativescript.staticbindinggenerator.generating.parsing.classes.hierarchy.generics.GenericParameters; +import org.nativescript.staticbindinggenerator.generating.parsing.classes.hierarchy.generics.GenericsAwareClassHierarchyParser; import org.nativescript.staticbindinggenerator.generating.parsing.classes.hierarchy.generics.impl.GenericSignatureReader; import org.nativescript.staticbindinggenerator.generating.parsing.classes.hierarchy.generics.impl.GenericsAwareClassHierarchyParserImpl; import org.nativescript.staticbindinggenerator.generating.parsing.methods.InheritedMethodsCollector; @@ -35,6 +35,7 @@ import org.nativescript.staticbindinggenerator.generating.writing.impl.MethodsWriterImpl; import org.nativescript.staticbindinggenerator.generating.writing.impl.PackageNameWriterImpl; import org.nativescript.staticbindinggenerator.naming.BcelNamingUtil; +import org.nativescript.staticbindinggenerator.naming.JavaClassNames; import java.io.BufferedReader; import java.io.File; @@ -43,7 +44,6 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; -import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; @@ -279,61 +279,99 @@ private String getSimpleClassname(String classname) { } private void writeBinding(Writer w, DataRow dataRow, JavaClass clazz, String packageName, String name) { - GenericHierarchyView genView = new GenericsAwareClassHierarchyParserImpl(new GenericSignatureReader(), classes).getClassHierarchy(clazz); + GenericsAwareClassHierarchyParser genericsAwareClassHierarchyParser = new GenericsAwareClassHierarchyParserImpl(new GenericSignatureReader(), classes); + List userImplementedInterfaces = getInterfacesFromCache(Arrays.asList(dataRow.getInterfaces())); + + if (clazz.isInterface()) { + userImplementedInterfaces.add(clazz); + clazz = getClass(JavaClassNames.BASE_JAVA_CLASS_NAME); + } + + GenericHierarchyView genView = createExtendedClassGenericHierarchyView(genericsAwareClassHierarchyParser, clazz); + Map interfaceGenericHierarchyViews = createInterfaceGenericHierarchyViews(genericsAwareClassHierarchyParser, userImplementedInterfaces); writePackageNameToWriter(w, packageName); writeImportsToWriter(w, clazz, packageName); - writeClassBeginningToWriter(w, clazz, dataRow.getInterfaces(), name, dataRow, genView); + writeClassBeginningToWriter(w, clazz, userImplementedInterfaces, name, dataRow, genView, interfaceGenericHierarchyViews); writeFieldsToWriter(w, clazz); writeConstructorsToWriter(w, clazz, dataRow, name, genView); - writeMethodsToWriter(w, genView, clazz, Arrays.asList(dataRow.getMethods()), Arrays.asList(dataRow.getInterfaces()), packageName); + writeMethodsToWriter(w, genView, interfaceGenericHierarchyViews, clazz, Arrays.asList(dataRow.getMethods()), userImplementedInterfaces, packageName); writeClassEndToWriter(w); } - private void writeClassBeginningToWriter(Writer writer, JavaClass clazz, String[] implementedInterfacesNames, String generatedClassName, DataRow dataRow, GenericHierarchyView genericHierarchyView) { + private Map createInterfaceGenericHierarchyViews(GenericsAwareClassHierarchyParser genericsAwareClassHierarchyParser, List implementedInterfaces) { + Map interfaceGenericHierarchyViews = new HashMap<>(implementedInterfaces.size()); + + for (JavaClass implementedInterface : implementedInterfaces) { + GenericHierarchyView genericHierarchyView = genericsAwareClassHierarchyParser.getClassHierarchy(implementedInterface); + interfaceGenericHierarchyViews.put(implementedInterface, genericHierarchyView); + } + + return interfaceGenericHierarchyViews; + } + + private GenericHierarchyView createExtendedClassGenericHierarchyView(GenericsAwareClassHierarchyParser genericsAwareClassHierarchyParser, JavaClass extendedClass) { + return genericsAwareClassHierarchyParser.getClassHierarchy(extendedClass); + } + + private void writeClassBeginningToWriter(Writer writer, JavaClass clazz, List implementedInterfaces, String generatedClassName, DataRow dataRow, GenericHierarchyView genericHierarchyView, Map interfaceGenericHierarchyViews) { ClassWriter classWriter = new ClassWriterImpl(writer); - StringBuilder extendedClassNameBuilder = new StringBuilder(); - extendedClassNameBuilder.append(BcelNamingUtil.resolveClassName(clazz.getClassName())); - GenericParameters initialClassGenericParameters = genericHierarchyView.getInitialClassGenericParameters(); + boolean hasCustomJsName = !dataRow.getFilename().isEmpty(); + + List implementedInterfacesNames = mapNamesWithGenericArgumentsIfNecessary(implementedInterfaces, interfaceGenericHierarchyViews); + String extendedClassName = mapNameWithGenericArgumentsIfNecessary(clazz, genericHierarchyView); + + if (hasCustomJsName) { + classWriter.writeBeginningOfNamedChildClass(generatedClassName, dataRow.getJsFilename(), extendedClassName, implementedInterfacesNames); + } else { + classWriter.writeBeginningOfChildClass(generatedClassName, extendedClassName, implementedInterfacesNames); + } + } + + private String mapNameWithGenericArgumentsIfNecessary(JavaClass extendedClass, GenericHierarchyView extendedClassGenericHierarchyView) { + return getClassNameWithPossibleGenericArguments(extendedClass, extendedClassGenericHierarchyView); + } + + private List mapNamesWithGenericArgumentsIfNecessary(List implementedInterfaces, Map interfaceGenericHierarchyViews) { + List res = new ArrayList<>(); + + for (JavaClass implementedInterface : implementedInterfaces) { + GenericHierarchyView genericHierarchyView = interfaceGenericHierarchyViews.get(implementedInterface); + String className = getClassNameWithPossibleGenericArguments(implementedInterface, genericHierarchyView); + res.add(className); + } + + return res; + } + + private String getClassNameWithPossibleGenericArguments(JavaClass classToCheck, GenericHierarchyView classToCheckGenericHierarchyView) { + GenericParameters initialClassGenericParameters = classToCheckGenericHierarchyView.getInitialClassGenericParameters(); + StringBuilder classNameBuilder = new StringBuilder(); + classNameBuilder.append(BcelNamingUtil.resolveClassName(classToCheck.getClassName())); if (initialClassGenericParameters != null) { Map initialClassGenericParametersMap = initialClassGenericParameters.getGenericParameters(); int initialClassGenericParametersMapCount = initialClassGenericParametersMap.size(); if (initialClassGenericParametersMapCount > 0) { - extendedClassNameBuilder.append('<'); + classNameBuilder.append('<'); int parameterCounter = 0; for (Map.Entry genericParameter : initialClassGenericParametersMap.entrySet()) { String resolvedGeneriParameterValue = BcelNamingUtil.resolveClassName(genericParameter.getValue()); - extendedClassNameBuilder.append(resolvedGeneriParameterValue); + classNameBuilder.append(resolvedGeneriParameterValue); if (parameterCounter != initialClassGenericParametersMapCount - 1) { - extendedClassNameBuilder.append(", "); + classNameBuilder.append(", "); parameterCounter += 1; } } - extendedClassNameBuilder.append('>'); + classNameBuilder.append('>'); } } - boolean hasCustomJsName = !dataRow.getFilename().isEmpty(); - - String extendedClassName = extendedClassNameBuilder.toString(); - if (hasCustomJsName) { - if (clazz.isInterface()) { // extending an interface - classWriter.writeBeginningOfNamedClassImplementingSingleInterface(generatedClassName, dataRow.getJsFilename(), extendedClassName); - } else { - classWriter.writeBeginningOfNamedChildClass(generatedClassName, dataRow.getJsFilename(), extendedClassName, Arrays.asList(implementedInterfacesNames)); - } - } else { - if (clazz.isInterface()) { // extending an interface - classWriter.writeBeginningOfClassImplementingSingleInterface(generatedClassName, extendedClassName); - } else { - classWriter.writeBeginningOfChildClass(generatedClassName, extendedClassName, Arrays.asList(implementedInterfacesNames)); - } - } + return classNameBuilder.toString(); } private void writeImportsToWriter(Writer writer, JavaClass clazz, String packageName) { @@ -372,32 +410,26 @@ private void writeConstructorsToWriter(Writer writer, JavaClass clazz, DataRow d boolean hasInitMethod = implementationObjectChecker.hasInitMethod(implObjectMethods); boolean hasInitMethod2 = !isApplicationClass && hasInitMethod; - boolean isInterface = clazz.isInterface(); - if (isInterface) { - methodsWriter.writeDefaultConstructor(generatedClassName); - } else { - for (Method method : clazz.getMethods()) { - if (method.getName().equals("") && (method.isPublic() || method.isProtected())) { - JavaMethod javaMethod = new JavaMethodImpl(method, clazz); - ReifiedJavaMethod reifiedJavaMethod = methodSignatureReifier.transformJavaMethod(javaMethod); - methodsWriter.writeConstructor(generatedClassName, reifiedJavaMethod, hasInitMethod2); - } + for (Method method : clazz.getMethods()) { + if (method.getName().equals("") && (method.isPublic() || method.isProtected())) { + JavaMethod javaMethod = new JavaMethodImpl(method, clazz); + ReifiedJavaMethod reifiedJavaMethod = methodSignatureReifier.transformJavaMethod(javaMethod); + methodsWriter.writeConstructor(generatedClassName, reifiedJavaMethod, hasInitMethod2); } } } - private void writeMethodsToWriter(Writer writer, GenericHierarchyView genericHierarchyView, JavaClass clazz, List userImplementedMethods, List userImplementedInterfacesNames, String packageName) { - boolean isInterface = clazz.isInterface(); + private void writeMethodsToWriter(Writer writer, GenericHierarchyView genericHierarchyView, Map interfaceGenericHierarchyViews, JavaClass clazz, List userImplementedMethods, List userImplementedInterfaces, String packageName) { boolean isApplicationClass = androidClassChecker.isApplicationClass(clazz); MethodsWriter methodsWriter = new MethodsWriterImpl(writer, suppressCallJSMethodExceptions, isApplicationClass); - List userImplementedInterfaces = getInterfacesFromCache(userImplementedInterfacesNames); InheritedMethodsCollector inheritedMethodsCollector = new InheritedMethodsCollectorImpl.Builder() .forJavaClass(clazz) .withClassesCache(classes) .withAdditionalImplementedInterfaces(userImplementedInterfaces) .withGenericHierarchyView(genericHierarchyView) + .withInterfacesGenericHierarchyViews(interfaceGenericHierarchyViews) .withPackageName(packageName) .build(); @@ -427,10 +459,8 @@ private void writeMethodsToWriter(Writer writer, GenericHierarchyView genericHie methodsWriter.writeGetInstanceMethod(normalizedClassName); } - if (!isInterface) { - methodsWriter.writeInternalRuntimeHashCodeMethod(); - methodsWriter.writeInternalRuntimeEqualsMethod(); - } + methodsWriter.writeInternalRuntimeHashCodeMethod(); + methodsWriter.writeInternalRuntimeEqualsMethod(); } private boolean areAllArgumentsAndReturnTypePublic(ReifiedJavaMethod method) { @@ -490,4 +520,4 @@ private JavaClass getClass(String className) { return clazz; } -} +} \ No newline at end of file diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/GetInterfaceNames.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/GetInterfaceNames.java index c4977e415..dbf0250b5 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/GetInterfaceNames.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/GetInterfaceNames.java @@ -1,21 +1,22 @@ package org.nativescript.staticbindinggenerator; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; + import java.io.BufferedWriter; import java.io.File; +import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Collections; -import java.util.Enumeration; import java.util.List; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; +import java.util.jar.JarInputStream; +import java.util.zip.ZipEntry; public class GetInterfaceNames { + private static final String CLASS_EXT = ".class"; private static String currentDir; /* @@ -45,37 +46,41 @@ public static void generateInterfaceFile(List rows) out.close(); } - private static void generateInterfaceNames(String pathToJar, List interfacesList) throws IOException, ClassNotFoundException { + private static void generateInterfaceNames(String pathToJar, List interfacesList) { if (pathToJar == null) { return; } - - JarFile jarFile = new JarFile(pathToJar); - Enumeration currentJarFile = jarFile.entries(); - - URLClassLoader cl = getClassLoader(pathToJar); - - while (currentJarFile.hasMoreElements()) { - JarEntry jarEntry = currentJarFile.nextElement(); - - if ((!jarEntry.isDirectory()) && (jarEntry.getName().endsWith(".class"))) { - String className = jarEntry.getName().substring(0, jarEntry.getName().length() - 6); - className = className.replace('/', '.'); - - @SuppressWarnings("rawtypes") - Class c = null; + JarInputStream jis = null; + try { + String name; + jis = new JarInputStream(new FileInputStream(pathToJar)); + for (ZipEntry ze = jis.getNextEntry(); ze != null; ze = jis.getNextEntry()) { try { - c = cl.loadClass(className); - } catch (IllegalAccessError e) { - } catch (NoClassDefFoundError localNoClassDefFoundError) { + name = ze.getName(); + if (name.endsWith(CLASS_EXT)) { + name = name.substring(0, name.length() - CLASS_EXT.length()).replace('/', '.').replace('$', '.'); + ClassParser cp = new ClassParser(jis, name); + JavaClass clazz = cp.parse(); + if (clazz.isInterface()) { + String res = clazz.getClassName().replace('$', '.'); + interfacesList.add(res); + } + } + } catch (IOException e) { + throw new RuntimeException("Error while parsing class file!", e); } - if ((c != null) && (c.isInterface() == true)) { - String res = c.getName().replace('$', '.'); - interfacesList.add(res); + } + } catch (IOException ioe) { + throw new RuntimeException("Error while reading JAR entry!", ioe); + } finally { + if (jis != null) { + try { + jis.close(); + } catch (IOException e) { + e.printStackTrace(); } } } - jarFile.close(); } public static PrintWriter ensureOutputFile(String outputFileName) throws IOException { @@ -89,9 +94,4 @@ public static PrintWriter ensureOutputFile(String outputFileName) throws IOExcep return new PrintWriter(new BufferedWriter(new FileWriter(checkFile.getAbsolutePath(), true))); } - - private static URLClassLoader getClassLoader(String pathToJar) throws MalformedURLException { - URL[] urls = {new URL("jar:file:" + pathToJar + "!/")}; - return URLClassLoader.newInstance(urls); - } } \ No newline at end of file diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/parsing/methods/impl/InheritedMethodsCollectorImpl.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/parsing/methods/impl/InheritedMethodsCollectorImpl.java index e267e50ed..c696faa37 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/parsing/methods/impl/InheritedMethodsCollectorImpl.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/parsing/methods/impl/InheritedMethodsCollectorImpl.java @@ -20,6 +20,7 @@ public class InheritedMethodsCollectorImpl implements InheritedMethodsCollector private final JavaMethodUtils javaMethodUtils; private final JavaClassUtils javaClassUtils; private final GenericHierarchyView genericHierarchyView; + private final Map interfacesGenericHierarchyViews; private final String packageName; private final JavaClass javaClass; private final List implementedInterfaces; @@ -27,6 +28,7 @@ public class InheritedMethodsCollectorImpl implements InheritedMethodsCollector private InheritedMethodsCollectorImpl(Builder builder) { this.classesCache = builder.classesCache; this.genericHierarchyView = builder.genericHierarchyView; + this.interfacesGenericHierarchyViews = builder.interfacesGenericHierarchyViews; this.packageName = builder.packageName; this.javaClass = builder.javaClass; this.implementedInterfaces = builder.interfaces; @@ -75,7 +77,7 @@ public InheritedMethodsView collect() { HashSet visited = new HashSet<>(); // saves some interface traversing for (JavaClass interfaze : implementedInterfaces) { - GenericHierarchyView interfaceGenView = new GenericsAwareClassHierarchyParserImpl(new GenericSignatureReader(), classesCache).getClassHierarchy(interfaze); + GenericHierarchyView interfaceGenView = interfacesGenericHierarchyViews.get(interfaze); findUnimplementedInterfaceMethods(interfaze, visited, allMethods, packageName, toImplement, overridable, interfaceGenView); } @@ -180,6 +182,7 @@ private JavaClass tryGetClassFromCache(String name) { public static class Builder { private Map classesCache; private GenericHierarchyView genericHierarchyView; + private Map interfacesGenericHierarchyViews; private JavaClass javaClass; private List interfaces; private String packageName; @@ -194,6 +197,11 @@ public Builder withGenericHierarchyView(GenericHierarchyView genericHierarchyVie return this; } + public Builder withInterfacesGenericHierarchyViews(Map interfacesGenericHierarchyViews){ + this.interfacesGenericHierarchyViews = interfacesGenericHierarchyViews; + return this; + } + public Builder forJavaClass(JavaClass javaClass) { this.javaClass = javaClass; return this; diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/ClassWriter.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/ClassWriter.java index 029e6b22d..1291e6308 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/ClassWriter.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/ClassWriter.java @@ -3,9 +3,7 @@ import java.util.List; public interface ClassWriter extends JavaCodeWriter { - void writeBeginningOfClassImplementingSingleInterface(String className, String implementedInterfaceName); void writeBeginningOfChildClass(String className, String extendedClassName, List implementedInterfacesNames); - void writeBeginningOfNamedClassImplementingSingleInterface(String className, String jsFileName, String implementedInterfaceName); void writeBeginningOfNamedChildClass(String className, String jsFileName, String extendedClassName, List implementedInterfacesNames); void writeClassEnd(); } diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/MethodsWriter.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/MethodsWriter.java index f70d2aa39..a5d10dd6b 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/MethodsWriter.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/MethodsWriter.java @@ -4,7 +4,6 @@ public interface MethodsWriter extends JavaCodeWriter { void writeMethod(ReifiedJavaMethod method); - void writeDefaultConstructor(String className); void writeConstructor(String className, ReifiedJavaMethod method, boolean hasUserImplementedInitMethod); void writeGetInstanceMethod(String className); void writeInternalRuntimeEqualsMethod(); diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/impl/ClassWriterImpl.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/impl/ClassWriterImpl.java index 638aa0a45..d91c1f4ee 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/impl/ClassWriterImpl.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/impl/ClassWriterImpl.java @@ -19,17 +19,6 @@ public ClassWriterImpl(final Writer writer) { this.writer = writer; } - @Override - public void writeBeginningOfClassImplementingSingleInterface(String className, String implementedInterfaceName) { - writeClassWithName(className); - writer.write(SPACE_LITERAL); - writer.write(IMPLEMENTS_KEYWORD); - writer.write(SPACE_LITERAL); - writer.write(implementedInterfaceName); - writer.write(SPACE_LITERAL); - writer.writeln(OPENING_CURLY_BRACKET_LITERAL); - } - private void writeClassWithName(String className) { writer.write(PUBLIC_CLASS_KEYWORD); writer.write(SPACE_LITERAL); @@ -72,12 +61,6 @@ public void writeBeginningOfChildClass(String className, String extendedClassNam writer.write(OPENING_CURLY_BRACKET_LITERAL); } - @Override - public void writeBeginningOfNamedClassImplementingSingleInterface(String className, String jsFileName, String implementedInterfaceName) { - writer.writeln(String.format(JAVASCRIPT_IMPLEMENTATION_FILE_NAME_PATTERN, jsFileName)); - writeBeginningOfClassImplementingSingleInterface(className, implementedInterfaceName); - } - @Override public void writeBeginningOfNamedChildClass(String className, String jsFileName, String extendedClassName, List implementedInterfacesNames) { writer.writeln(String.format(JAVASCRIPT_IMPLEMENTATION_FILE_NAME_PATTERN, jsFileName)); diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/impl/MethodsWriterImpl.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/impl/MethodsWriterImpl.java index a9d35e565..34f0188af 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/impl/MethodsWriterImpl.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/generating/writing/impl/MethodsWriterImpl.java @@ -130,18 +130,6 @@ private String getThrowsDeclaration(ReifiedJavaMethod method) { } } - @Override - public void writeDefaultConstructor(String className) { - writer.write(PUBLIC_MODIFIER); - writer.write(SPACE_LITERAL); - writer.write(className); - writer.write(OPENING_ROUND_BRACKET_LITERAL); - writer.write(CLOSING_ROUND_BRACKET_LITERAL); - writer.write(OPENING_CURLY_BRACKET_LITERAL); - writer.write(RUNTIME_INIT_INSTANCE_METHOD_CALL_STATEMENT); - writer.write(CLOSING_CURLY_BRACKET_LITERAL); - } - private void writeRuntimeInitCallIfNecessary(ReifiedJavaMethod method) { if (method.getName().equals(ON_CREATE_METHOD_NAME) && isForApplicationClass) { writer.write(RUNTIME_INIT_METHOD_CALL_STATEMENT); diff --git a/test-app/build-tools/static-binding-generator/src/test/java/org/nativescript/staticbindinggenerator/test/GeneratorTest.java b/test-app/build-tools/static-binding-generator/src/test/java/org/nativescript/staticbindinggenerator/test/GeneratorTest.java index d0e6d833e..61d83164b 100644 --- a/test-app/build-tools/static-binding-generator/src/test/java/org/nativescript/staticbindinggenerator/test/GeneratorTest.java +++ b/test-app/build-tools/static-binding-generator/src/test/java/org/nativescript/staticbindinggenerator/test/GeneratorTest.java @@ -86,7 +86,7 @@ public void testCanCompileBindingOfInterfaceWithStaticInitializer() throws Excep Class helloClass = InMemoryJavaCompiler.compile("com.tns.gen.com.example.MyInterface", sourceCode.toString(), options); Assert.assertNotNull(helloClass); - Assert.assertEquals(1, helloClass.getDeclaredMethods().length); + Assert.assertEquals(3, helloClass.getDeclaredMethods().length); // 3 methods (includes 'hashCode__super' and 'equals__super') } @Test