From a6a5c0866b3d84dc109fb038df9a4561d7232f4e Mon Sep 17 00:00:00 2001 From: Renaud Pawlak Date: Tue, 26 Sep 2017 14:09:22 +0200 Subject: [PATCH] fixed hidden variables in inner classes --- .../transpiler/Java2TypeScriptTranslator.java | 21 +++++++++------- .../test/transpiler/StructuralTests.java | 8 +++++++ .../structural/InnerClassFieldClash.java | 24 +++++++++++++++++++ 3 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 transpiler/src/test/java/source/structural/InnerClassFieldClash.java diff --git a/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java b/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java index be334450..5cc2aeb5 100644 --- a/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java +++ b/transpiler/src/main/java/org/jsweet/transpiler/Java2TypeScriptTranslator.java @@ -645,8 +645,8 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter { if (globals || adaptedQualId != null) { ModuleImportDescriptor moduleImport = getModuleImportDescriptor(importedName, importedClass); if (moduleImport != null) { - useModule(false, moduleImport.getTargetPackage(), importDecl, moduleImport.getImportedName(), - moduleImport.getPathToImportedClass(), null); + useModule(false, moduleImport.getTargetPackage(), importDecl, + moduleImport.getImportedName(), moduleImport.getPathToImportedClass(), null); } } } @@ -3145,13 +3145,16 @@ public class Java2TypeScriptTranslator extends AbstractTreePrinter { print("this."); JCClassDecl parent = getParent(JCClassDecl.class); int level = 0; - boolean foundInParent = false; - while (getScope(level++).innerClassNotStatic) { - parent = getParent(JCClassDecl.class, parent); - if (parent != null - && Util.findFirstDeclarationInClassAndSuperClasses(parent.sym, accessedElementName, kind) != null) { - foundInParent = true; - break; + boolean foundInParent = Util.findFirstDeclarationInClassAndSuperClasses(parent.sym, accessedElementName, + kind) != null; + if (!foundInParent) { + while (getScope(level++).innerClassNotStatic) { + parent = getParent(JCClassDecl.class, parent); + if (parent != null && Util.findFirstDeclarationInClassAndSuperClasses(parent.sym, accessedElementName, + kind) != null) { + foundInParent = true; + break; + } } } if (foundInParent && level > 0) { diff --git a/transpiler/src/test/java/org/jsweet/test/transpiler/StructuralTests.java b/transpiler/src/test/java/org/jsweet/test/transpiler/StructuralTests.java index 5207ca2a..b1d59457 100644 --- a/transpiler/src/test/java/org/jsweet/test/transpiler/StructuralTests.java +++ b/transpiler/src/test/java/org/jsweet/test/transpiler/StructuralTests.java @@ -44,6 +44,7 @@ import source.structural.GlobalsAccess; import source.structural.Inheritance; import source.structural.InheritanceOrderInSameFile; import source.structural.InnerClass; +import source.structural.InnerClassFieldClash; import source.structural.InnerClassNotStatic; import source.structural.InnerClassUse; import source.structural.InnerClassWithAbstractClassAndInterface; @@ -340,6 +341,13 @@ public class StructuralTests extends AbstractTest { }, getSourceFile(InstanceOf.class)); } + @Test + public void testInnerClassFieldClash() { + eval((logHandler, r) -> { + logHandler.assertNoProblems(); + }, getSourceFile(InnerClassFieldClash.class)); + } + @Test public void testReplaceAnnotation() { createTranspiler(new JSweetFactory() { diff --git a/transpiler/src/test/java/source/structural/InnerClassFieldClash.java b/transpiler/src/test/java/source/structural/InnerClassFieldClash.java new file mode 100644 index 00000000..d08f84a5 --- /dev/null +++ b/transpiler/src/test/java/source/structural/InnerClassFieldClash.java @@ -0,0 +1,24 @@ +package source.structural; + +public class InnerClassFieldClash { + + public static void main() { + new InnerClassFieldClash().setup(); + } + + int a = 0; + + void setup() { + new B().f(); + } + + class B { + + int a = 1; + + void f() { + assert a == 1; + } + + } +}