diff --git a/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java b/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java index 44d1294f..c01c122b 100644 --- a/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java +++ b/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java @@ -673,8 +673,27 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter { } } + Stack overloadStack = new Stack<>(); + @Override public void scan(JCTree t) { + // grab the types in overloaded method because they may use + // other types necessary for the instanceof implementation + // (see #342) + if (t instanceof JCMethodDecl) { + JCMethodDecl method = (JCMethodDecl) t; + if (context.isInvalidOverload(method.sym)) { + Overload overload = context.getOverload((ClassSymbol) method.sym.getEnclosingElement(), + method.sym); + if (!overloadStack.contains(overload)) { + overloadStack.push(overload); + for (JCTree overloadedMethod : overload.methods) { + this.scan(overloadedMethod); + } + overloadStack.pop(); + } + } + } if (t != null && t.type != null && t.type.tsym instanceof ClassSymbol) { if (!(t instanceof JCTypeApply)) { checkType(t.type.tsym); diff --git a/transpiler/src/test/java/org/jsweet/test/transpiler/OverloadTests.java b/transpiler/src/test/java/org/jsweet/test/transpiler/OverloadTests.java index 08eb5b05..4ab6e8f2 100644 --- a/transpiler/src/test/java/org/jsweet/test/transpiler/OverloadTests.java +++ b/transpiler/src/test/java/org/jsweet/test/transpiler/OverloadTests.java @@ -50,6 +50,11 @@ import source.overload.WrongOverloadWithSpecialParameters; import source.overload.WrongOverloads; import source.overload.WrongOverloadsWithDefaultMethods; import source.overload.WrongOverloadsWithNonCoreMethod; +import source.overload.visitor.A1; +import source.overload.visitor.A2; +import source.overload.visitor.A3; +import source.overload.visitor.F; +import source.overload.visitor.F1; public class OverloadTests extends AbstractTest { @@ -263,4 +268,12 @@ public class OverloadTests extends AbstractTest { }, getSourceFile(AbstractMethodOverloadInAnonymousClass.class)); } + @Test + public void testVisitor() { + transpile((logHandler) -> { + logHandler.assertNoProblems(); + }, getSourceFile(A1.class), getSourceFile(A2.class), getSourceFile(A3.class), getSourceFile(F1.class), getSourceFile(F.class)); + } + + } diff --git a/transpiler/src/test/java/source/overload/visitor/A1.java b/transpiler/src/test/java/source/overload/visitor/A1.java new file mode 100644 index 00000000..08e2f58a --- /dev/null +++ b/transpiler/src/test/java/source/overload/visitor/A1.java @@ -0,0 +1,5 @@ +package source.overload.visitor; + +public class A1 { + +} diff --git a/transpiler/src/test/java/source/overload/visitor/A2.java b/transpiler/src/test/java/source/overload/visitor/A2.java new file mode 100644 index 00000000..89fb4dae --- /dev/null +++ b/transpiler/src/test/java/source/overload/visitor/A2.java @@ -0,0 +1,5 @@ +package source.overload.visitor; + +public class A2 { + +} diff --git a/transpiler/src/test/java/source/overload/visitor/A3.java b/transpiler/src/test/java/source/overload/visitor/A3.java new file mode 100644 index 00000000..19fe5734 --- /dev/null +++ b/transpiler/src/test/java/source/overload/visitor/A3.java @@ -0,0 +1,5 @@ +package source.overload.visitor; + +public class A3 { + +} diff --git a/transpiler/src/test/java/source/overload/visitor/F.java b/transpiler/src/test/java/source/overload/visitor/F.java new file mode 100644 index 00000000..afeabc57 --- /dev/null +++ b/transpiler/src/test/java/source/overload/visitor/F.java @@ -0,0 +1,9 @@ +package source.overload.visitor; + +public class F extends F1 { + + @Override + public void visit(A1 param) { + } + +} diff --git a/transpiler/src/test/java/source/overload/visitor/F1.java b/transpiler/src/test/java/source/overload/visitor/F1.java new file mode 100644 index 00000000..d39403e6 --- /dev/null +++ b/transpiler/src/test/java/source/overload/visitor/F1.java @@ -0,0 +1,14 @@ +package source.overload.visitor; + +public class F1 { + + public void visit(A1 param) { + } + + public void visit(A2 param) { + } + + public void visit(A3 param) { + } + +}