KT-13146 J2K recursion while converting self-referenced anonymous functions (#956)

This commit is contained in:
Simon Ogorodnik
2016-09-26 13:47:31 +03:00
committed by Dmitry Jemerov
parent 33d33ab144
commit 47bfb8133d
8 changed files with 109 additions and 0 deletions
@@ -538,6 +538,15 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
val qualifier = expression.qualifierExpression
var identifier = Identifier.withNoPrototype(referenceName, isNullable)
expression.getContainingClass()?.getParentOfType<PsiVariable>(false)?.let {
if (it == expression.qualifierExpression?.reference?.resolve()) {
result = QualifiedExpression(ThisExpression(Identifier.Empty).assignNoPrototype(), identifier)
return
}
}
if (qualifier != null && qualifier.type is PsiArrayType && referenceName == "length") {
identifier = Identifier.withNoPrototype("size", isNullable)
}
+17
View File
@@ -0,0 +1,17 @@
public class Test {
public Runnable someRunnable = new Runnable() {
@Override
public void run() {
someRunnable.run();
}
};
}
public class Test2 {
private Runnable someRunnable = new Runnable() {
@Override
public void run() {
someRunnable.run();
}
};
}
+15
View File
@@ -0,0 +1,15 @@
class Test {
var someRunnable: Runnable = object : Runnable {
override fun run() {
this.run()
}
}
}
class Test2 {
private val someRunnable = object : Runnable {
override fun run() {
this.run()
}
}
}
@@ -0,0 +1,11 @@
public class Test {
public void someMethod() {
Runnable someRunnable = new Runnable() {
@Override
public void run() {
someRunnable.run();
}
};
}
}
@@ -0,0 +1,9 @@
class Test {
fun someMethod() {
val someRunnable = object : Runnable {
override fun run() {
this.run()
}
}
}
}
@@ -149,6 +149,27 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
}
}
@TestMetadata("j2k/testData/fileOrElement/anonymousClass")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class AnonymousClass extends AbstractJavaToKotlinConverterForWebDemoTest {
public void testAllFilesPresentInAnonymousClass() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/anonymousClass"), Pattern.compile("^(.+)\\.java$"), true);
}
@TestMetadata("kt-13146.java")
public void testKt_13146() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/anonymousClass/kt-13146.java");
doTest(fileName);
}
@TestMetadata("localSelfReference.java")
public void testLocalSelfReference() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/anonymousClass/localSelfReference.java");
doTest(fileName);
}
}
@TestMetadata("j2k/testData/fileOrElement/arrayAccessExpression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -149,6 +149,27 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
}
}
@TestMetadata("j2k/testData/fileOrElement/anonymousClass")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class AnonymousClass extends AbstractJavaToKotlinConverterSingleFileTest {
public void testAllFilesPresentInAnonymousClass() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/anonymousClass"), Pattern.compile("^(.+)\\.java$"), true);
}
@TestMetadata("kt-13146.java")
public void testKt_13146() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/anonymousClass/kt-13146.java");
doTest(fileName);
}
@TestMetadata("localSelfReference.java")
public void testLocalSelfReference() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/anonymousClass/localSelfReference.java");
doTest(fileName);
}
}
@TestMetadata("j2k/testData/fileOrElement/arrayAccessExpression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -71,6 +71,12 @@ public class TypeAliasesTestsGenerated extends AbstractTypeAliasesTests {
doTest(fileName);
}
@TestMetadata("typeAliasConstructorAccessor.kt")
public void testTypeAliasConstructorAccessor() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasConstructorAccessor.kt");
doTest(fileName);
}
@TestMetadata("typeAliasObject.kt")
public void testTypeAliasObject() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt");