fixed hidden variables in inner classes

This commit is contained in:
Renaud Pawlak 2017-09-26 14:09:22 +02:00
parent 7ad1657c0f
commit a6a5c0866b
3 changed files with 44 additions and 9 deletions

View File

@ -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) {

View File

@ -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() {

View File

@ -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;
}
}
}