Skip to content

Commit c94a3d2

Browse files
authored
Merge pull request #17 from NativeScript/pete/fix-conflicting-namespaces
Fix conflicting top-level namespace hijacking
2 parents 99787e7 + bd4f2a5 commit c94a3d2

File tree

1 file changed

+52
-5
lines changed

1 file changed

+52
-5
lines changed

dts-generator/src/main/java/com/telerik/dts/DtsApi.java

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,16 @@ public class DtsApi {
3333
private Set<String> baseMethodNames;
3434
private List<Method> baseMethods;
3535
private Map<String, Method> mapNameMethod;
36+
private Map<String, String> aliasedTypes;
37+
private String[] namespaceParts;
3638
private int indent = 0;
3739

38-
3940
public DtsApi() {
4041
this.indent = 0;
4142

4243
overrideFieldComparator();
44+
45+
this.aliasedTypes = new HashMap<>();
4346
}
4447

4548
public String generateDtsContent(List<JavaClass> javaClasses) {
@@ -64,6 +67,11 @@ public String generateDtsContent(List<JavaClass> javaClasses) {
6467
continue;
6568
}
6669

70+
// check if processed class hijacks a namespace
71+
// TODO: optimize
72+
73+
this.namespaceParts = currentFileClassname.split("\\.");
74+
6775
boolean isInterface = currClass.isInterface();
6876
boolean isAbstract = currClass.isAbstract();
6977

@@ -166,13 +174,48 @@ private String getExtendsLine(JavaClass superClass, List<JavaClass> interfaces)
166174
implementsSegmentSb.append(" implements ");
167175

168176
for (JavaClass clazz : interfaces) {
169-
implementsSegmentSb.append(clazz.getClassName().replaceAll("\\$", "\\.") + ", ");
177+
String implementedInterface = clazz.getClassName().replaceAll("\\$", "\\.");
178+
if(!typeBelongsInCurrentTopLevelNamespace(implementedInterface)) {
179+
implementedInterface = getAliasedClassName(implementedInterface);
180+
}
181+
182+
implementsSegmentSb.append(implementedInterface + ", ");
170183
}
171184

172185
implementsSegment = implementsSegmentSb.substring(0, implementsSegmentSb.lastIndexOf(","));
186+
187+
}
188+
189+
String extendedClass = superClass.getClassName().replaceAll("\\$", "\\.");
190+
if(!typeBelongsInCurrentTopLevelNamespace(extendedClass)) {
191+
extendedClass = getAliasedClassName(extendedClass);
192+
}
193+
194+
return " extends " + extendedClass + implementsSegment;
195+
}
196+
197+
private String getAliasedClassName(String className) {
198+
String aliasedType = aliasedTypes.get(className);
199+
if (aliasedType == null) {
200+
aliasedType = mangleClassname(className);
201+
aliasedTypes.put(className, aliasedType);
202+
203+
sbHeaders.append("import ");
204+
sbHeaders.append(aliasedType);
205+
sbHeaders.append(" = ");
206+
sbHeaders.append(className);
207+
sbHeaders.appendln(";");
173208
}
174209

175-
return " extends " + superClass.getClassName().replaceAll("\\$", "\\.") + implementsSegment;
210+
return aliasedType;
211+
}
212+
213+
private boolean typeBelongsInCurrentTopLevelNamespace(String className) {
214+
return className.startsWith(this.namespaceParts[0] + ".");
215+
}
216+
217+
private String mangleClassname(String className) {
218+
return className.replaceAll("\\.", "");
176219
}
177220

178221
private int closePackage(JavaClass prevClass, JavaClass currClass) {
@@ -641,8 +684,12 @@ private void convertToTypeScriptType(Type type, StringBuilder tsType) {
641684
typeName = typeName.replaceAll("\\$", "\\.");
642685
}
643686

644-
// TODO: Pete:
645-
tsType.append(typeName);
687+
if (!typeBelongsInCurrentTopLevelNamespace(typeName) && !typeName.startsWith("java.util.function.")) {
688+
tsType.append(getAliasedClassName(typeName));
689+
} else {
690+
tsType.append(typeName);
691+
}
692+
646693
addReference(type);
647694
} else {
648695
throw new RuntimeException("Unhandled type=" + type.getSignature());

0 commit comments

Comments
 (0)