mirror of
https://github.com/cincheo/jsweet.git
synced 2025-12-14 23:09:22 +00:00
experimental option
This commit is contained in:
parent
b5c1a139c4
commit
5ee9bcd3d9
@ -173,7 +173,7 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
|
|||||||
|
|
||||||
|
|
||||||
/* Set to true to expose the overloads in the interfaces (will cause issues with abstract classes) */
|
/* Set to true to expose the overloads in the interfaces (will cause issues with abstract classes) */
|
||||||
private boolean __EXPERIMENTAL_expose = false;
|
public static boolean __EXPERIMENTAL_expose = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of the field where the parent class is stored in the generated
|
* The name of the field where the parent class is stored in the generated
|
||||||
@ -599,8 +599,10 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
|
|||||||
private PackageSymbol topLevelPackage;
|
private PackageSymbol topLevelPackage;
|
||||||
|
|
||||||
public void useModule(ModuleImportDescriptor moduleImport) {
|
public void useModule(ModuleImportDescriptor moduleImport) {
|
||||||
useModule(false, moduleImport.isDirect(), moduleImport.getTargetPackage(), null, moduleImport.getImportedName(),
|
if (moduleImport != null) {
|
||||||
moduleImport.getPathToImportedClass(), null);
|
useModule(false, moduleImport.isDirect(), moduleImport.getTargetPackage(), null,
|
||||||
|
moduleImport.getImportedName(), moduleImport.getPathToImportedClass(), null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void useModule(boolean require, boolean direct, PackageElement targetPackage, JCTree sourceTree,
|
private void useModule(boolean require, boolean direct, PackageElement targetPackage, JCTree sourceTree,
|
||||||
@ -2359,12 +2361,14 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
|
|||||||
println().println().printIndent();
|
println().println().printIndent();
|
||||||
printCoreMethodDelegate = false;
|
printCoreMethodDelegate = false;
|
||||||
}
|
}
|
||||||
if (__EXPERIMENTAL_expose && isInterfaceMethod(parent, methodDecl) && !methodDecl.sym.isConstructor()) {
|
// add overloads in interfaces when the expose option is on
|
||||||
printCoreMethodDelegate = true;
|
// if (__EXPERIMENTAL_expose && isInterfaceMethod(parent, methodDecl)
|
||||||
visitMethodDef(overload.coreMethod);
|
// && !methodDecl.sym.isConstructor()) {
|
||||||
println().println().printIndent();
|
// printCoreMethodDelegate = true;
|
||||||
printCoreMethodDelegate = false;
|
// visitMethodDef(overload.coreMethod);
|
||||||
}
|
// println().println().printIndent();
|
||||||
|
// printCoreMethodDelegate = false;
|
||||||
|
// }
|
||||||
} else {
|
} else {
|
||||||
inCoreWrongOverload = true;
|
inCoreWrongOverload = true;
|
||||||
if (methodDecl.sym.isDefault() || (!methodDecl.sym.isConstructor()
|
if (methodDecl.sym.isDefault() || (!methodDecl.sym.isConstructor()
|
||||||
@ -2392,14 +2396,27 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
|
|||||||
if (addCoreMethod) {
|
if (addCoreMethod) {
|
||||||
visitMethodDef(overload.coreMethod);
|
visitMethodDef(overload.coreMethod);
|
||||||
overload.printed = true;
|
overload.printed = true;
|
||||||
if (!isInterfaceMethod(parent, methodDecl)) {
|
if (!isInterfaceMethod(parent, methodDecl) || __EXPERIMENTAL_expose) {
|
||||||
println().println().printIndent();
|
println().println().printIndent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isInterfaceMethod(parent, methodDecl)) {
|
if (isInterfaceMethod(parent, methodDecl)) {
|
||||||
|
// add overloads in interfaces when the expose option is on
|
||||||
if (context.options.isGenerateOverloadStubs() && !__EXPERIMENTAL_expose) {
|
if (context.options.isGenerateOverloadStubs() && !__EXPERIMENTAL_expose) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// if (__EXPERIMENTAL_expose) {
|
||||||
|
// if (methodDecl.sym.owner != parent.sym) {
|
||||||
|
// for (JCVariableDecl param : methodDecl.params) {
|
||||||
|
// List<Type> typeParameters = methodDecl.getTypeParameters().stream()
|
||||||
|
// .map(t -> t.type).collect(Collectors.toList());
|
||||||
|
// if (param.getType().type instanceof TypeVar
|
||||||
|
// && !typeParameters.contains(param.getType().type)) {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2620,6 +2637,19 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
|
|||||||
print(";");
|
print(";");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (__EXPERIMENTAL_expose && inOverload && isInterfaceMethod(parent, methodDecl)) {
|
||||||
|
new UsedTypesScanner().scan(methodDecl);
|
||||||
|
|
||||||
|
//MEMORISER TOUTES LES METHODES INJECTES ICI ET LES IMPLEMENTER DANS LES ABSTRACT CLASSES SI ELLES N'EXISTENT PAS!!!!!
|
||||||
|
|
||||||
|
// if (methodDecl.getReturnType().type.tsym instanceof TypeElement && Util.isSourceElement(methodDecl.getReturnType().type.tsym)) {
|
||||||
|
// if (context.useModules) {
|
||||||
|
// useModule(getModuleImportDescriptor(methodDecl.getReturnType().type.tsym.getSimpleName().toString(), (TypeElement)methodDecl.getReturnType().type.tsym));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
print(";");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (methodDecl.getBody() == null && !(inCoreWrongOverload && !getScope().declareClassScope)
|
if (methodDecl.getBody() == null && !(inCoreWrongOverload && !getScope().declareClassScope)
|
||||||
|| (methodDecl.mods.getFlags().contains(Modifier.DEFAULT) && !getScope().defaultMethodScope)) {
|
|| (methodDecl.mods.getFlags().contains(Modifier.DEFAULT) && !getScope().defaultMethodScope)) {
|
||||||
if (!getScope().interfaceScope && methodDecl.getModifiers().getFlags().contains(Modifier.ABSTRACT)
|
if (!getScope().interfaceScope && methodDecl.getModifiers().getFlags().contains(Modifier.ABSTRACT)
|
||||||
@ -3301,7 +3331,12 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
|
|||||||
StringBuilder sb = new StringBuilder(executable.getSimpleName().toString());
|
StringBuilder sb = new StringBuilder(executable.getSimpleName().toString());
|
||||||
sb.append("$");
|
sb.append("$");
|
||||||
for (VariableElement p : executable.getParameters()) {
|
for (VariableElement p : executable.getParameters()) {
|
||||||
sb.append(context.modelTypes.erasure(p.asType()).toString().replace('.', '_').replace("[]", "_A"));
|
if (__EXPERIMENTAL_expose && p.asType().getKind() == TypeKind.TYPEVAR) {
|
||||||
|
// hack so that the name is compatible with the name exposed in the interface
|
||||||
|
sb.append("java_lang_Object");
|
||||||
|
} else {
|
||||||
|
sb.append(context.modelTypes.erasure(p.asType()).toString().replace('.', '_').replace("[]", "_A"));
|
||||||
|
}
|
||||||
sb.append("$");
|
sb.append("$");
|
||||||
}
|
}
|
||||||
if (!executable.getParameters().isEmpty()) {
|
if (!executable.getParameters().isEmpty()) {
|
||||||
@ -5061,8 +5096,6 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter {
|
|||||||
name = variablePrefix + (++index);
|
name = variablePrefix + (++index);
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println(" => " + getCurrent());
|
|
||||||
|
|
||||||
int position = stack.size() - 2;
|
int position = stack.size() - 2;
|
||||||
while (position >= 0 && !(stack.get(position) instanceof JCMethodDecl)) {
|
while (position >= 0 && !(stack.get(position) instanceof JCMethodDecl)) {
|
||||||
if (stack.get(position) instanceof JCBlock) {
|
if (stack.get(position) instanceof JCBlock) {
|
||||||
|
|||||||
@ -298,60 +298,85 @@ public class OverloadScanner extends AbstractTreeScanner {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void safeAdd(Types types, Overload overload, JCMethodDecl method) {
|
private static void safeAdd(Types types, Overload targetOverload, JCMethodDecl method) {
|
||||||
if (!overload.methods.contains(method) && !hasMethodType(types, overload, method)) {
|
if (method.body == null) {
|
||||||
overload.methods.add(method);
|
return;
|
||||||
|
}
|
||||||
|
if (!targetOverload.methods.contains(method) && !hasMethodType(types, targetOverload, method)) {
|
||||||
|
targetOverload.methods.add(method);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Merges the given overload with another one.
|
* Merges the given overload with another one.
|
||||||
*/
|
*/
|
||||||
public void merge(Types types, Overload otherOverload) {
|
public void merge(Types types, Overload targetOverload, boolean ignoreOverrides) {
|
||||||
// merge default methods
|
// merge default methods
|
||||||
for (JCMethodDecl m : methods) {
|
for (JCMethodDecl m : methods) {
|
||||||
if (m.getModifiers().getFlags().contains(Modifier.DEFAULT)) {
|
if (m.getModifiers().getFlags().contains(Modifier.DEFAULT)) {
|
||||||
boolean overriden = false;
|
boolean overriden = false;
|
||||||
for (JCMethodDecl subm : new ArrayList<>(otherOverload.methods)) {
|
for (JCMethodDecl subm : new ArrayList<>(targetOverload.methods)) {
|
||||||
if (subm.getParameters().size() == m.getParameters().size()) {
|
if (subm.getParameters().size() == m.getParameters().size()) {
|
||||||
overriden = true;
|
overriden = true;
|
||||||
for (int i = 0; i < subm.getParameters().size(); i++) {
|
for (int i = 0; i < subm.getParameters().size(); i++) {
|
||||||
if (!types.isAssignable(m.getParameters().get(i).type,
|
if (!types.isAssignable(types.erasureRecursive(m.getParameters().get(i).type),
|
||||||
subm.getParameters().get(i).type)) {
|
types.erasureRecursive(subm.getParameters().get(i).type))) {
|
||||||
overriden = false;
|
overriden = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!overriden) {
|
if (!overriden) {
|
||||||
safeAdd(types, otherOverload, m);
|
safeAdd(types, targetOverload, m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// merge other methods
|
// merge other methods
|
||||||
boolean merge = false;
|
if (ignoreOverrides) {
|
||||||
for (JCMethodDecl subm : new ArrayList<>(otherOverload.methods)) {
|
boolean merge = false;
|
||||||
boolean overrides = false;
|
for (JCMethodDecl subm : new ArrayList<>(targetOverload.methods)) {
|
||||||
for (JCMethodDecl m : new ArrayList<>(methods)) {
|
boolean overrides = false;
|
||||||
if (subm.getParameters().size() == m.getParameters().size()) {
|
for (JCMethodDecl m : new ArrayList<>(methods)) {
|
||||||
overrides = true;
|
if (subm.getParameters().size() == m.getParameters().size()) {
|
||||||
for (int i = 0; i < subm.getParameters().size(); i++) {
|
overrides = true;
|
||||||
if (!types.isAssignable(m.getParameters().get(i).type, subm.getParameters().get(i).type)) {
|
for (int i = 0; i < subm.getParameters().size(); i++) {
|
||||||
overrides = false;
|
if (!types.isAssignable(types.erasureRecursive(m.getParameters().get(i).type),
|
||||||
|
types.erasureRecursive(subm.getParameters().get(i).type))) {
|
||||||
|
overrides = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
merge = merge || !overrides;
|
||||||
}
|
}
|
||||||
merge = merge || !overrides;
|
|
||||||
}
|
|
||||||
|
|
||||||
merge = merge || methods.size() > 1;
|
merge = merge || methods.size() > 1;
|
||||||
|
|
||||||
if (merge) {
|
if (merge) {
|
||||||
|
for (JCMethodDecl m : methods) {
|
||||||
|
safeAdd(types, targetOverload, m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
for (JCMethodDecl m : methods) {
|
for (JCMethodDecl m : methods) {
|
||||||
safeAdd(types, otherOverload, m);
|
boolean overriden = false;
|
||||||
|
for (JCMethodDecl subm : new ArrayList<>(targetOverload.methods)) {
|
||||||
|
if (subm.getParameters().size() == m.getParameters().size()) {
|
||||||
|
overriden = true;
|
||||||
|
for (int i = 0; i < subm.getParameters().size(); i++) {
|
||||||
|
if (!types.isAssignable(types.erasureRecursive(m.getParameters().get(i).type),
|
||||||
|
types.erasureRecursive(subm.getParameters().get(i).type))) {
|
||||||
|
overriden = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!overriden) {
|
||||||
|
safeAdd(types, targetOverload, m);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,11 +395,14 @@ public class OverloadScanner extends AbstractTreeScanner {
|
|||||||
}
|
}
|
||||||
Overload superOverload = context.getOverload(clazz, method.sym);
|
Overload superOverload = context.getOverload(clazz, method.sym);
|
||||||
if (superOverload != null && superOverload != overload) {
|
if (superOverload != null && superOverload != overload) {
|
||||||
superOverload.merge(types, overload);
|
if (!context.options.isGenerateOverloadStubs() || Java2TypeScriptTranslator.__EXPERIMENTAL_expose) {
|
||||||
if (!context.options.isGenerateOverloadStubs()) {
|
overload.merge(types, superOverload, true);
|
||||||
overload.merge(types, superOverload);
|
|
||||||
}
|
}
|
||||||
|
superOverload.merge(types, overload, true);
|
||||||
}
|
}
|
||||||
|
// if (Comparable.class.getName().equals(clazz.getQualifiedName().toString()) && superOverload != null && superOverload.methods.size() > 1) {
|
||||||
|
// System.out.println();
|
||||||
|
// }
|
||||||
inspectSuperTypes((ClassSymbol) clazz.getSuperclass().tsym, overload, method);
|
inspectSuperTypes((ClassSymbol) clazz.getSuperclass().tsym, overload, method);
|
||||||
for (Type t : clazz.getInterfaces()) {
|
for (Type t : clazz.getInterfaces()) {
|
||||||
inspectSuperTypes((ClassSymbol) t.tsym, overload, method);
|
inspectSuperTypes((ClassSymbol) t.tsym, overload, method);
|
||||||
@ -440,7 +468,7 @@ public class OverloadScanner extends AbstractTreeScanner {
|
|||||||
scan(cu);
|
scan(cu);
|
||||||
}
|
}
|
||||||
// another pass to complete subclasses
|
// another pass to complete subclasses
|
||||||
if (!context.options.isGenerateOverloadStubs()) {
|
if (!context.options.isGenerateOverloadStubs() || Java2TypeScriptTranslator.__EXPERIMENTAL_expose) {
|
||||||
for (JCCompilationUnit cu : cuList) {
|
for (JCCompilationUnit cu : cuList) {
|
||||||
scan(cu);
|
scan(cu);
|
||||||
}
|
}
|
||||||
@ -453,7 +481,7 @@ public class OverloadScanner extends AbstractTreeScanner {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//context.dumpOverloads(System.out);
|
context.dumpOverloads(System.out);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user