Java to Kotlin converter: fixed bug with secondary constructor conversion

This commit is contained in:
Valentin Kipyatkov
2014-06-25 20:20:53 +04:00
parent 0edd9d24be
commit 467ca77854
4 changed files with 62 additions and 9 deletions
@@ -308,19 +308,23 @@ class ExpressionVisitor(private val converter: Converter,
}
override fun visitReferenceExpression(expression: PsiReferenceExpression) {
val referencedName = expression.getReferenceName()!!
val target = expression.getReference()?.resolve()
val isNullable = if (target is PsiVariable) typeConverter.variableNullability(target).isNullable(converter.settings) else false
val referencedName = expression.getReferenceName()!!
var identifier: Expression = Identifier(referencedName, isNullable).assignNoPrototype()
val qualifier = expression.getQualifierExpression()
val containingConstructor = expression.getContainingConstructor()
val insideSecondaryConstructor = containingConstructor != null && !containingConstructor.isPrimaryConstructor()
if (insideSecondaryConstructor && (expression.getReference()?.resolve() as? PsiField)?.getContainingClass() == containingConstructor!!.getContainingClass()) {
identifier = QualifiedExpression(FactoryFunction.tempValIdentifier(), Identifier(referencedName, isNullable).assignNoPrototype())
if (insideSecondaryConstructor &&
isQualifierEmptyOrThis(expression) &&
(expression.getReference()?.resolve() as? PsiField)?.getContainingClass() == containingConstructor!!.getContainingClass()) {
result = QualifiedExpression(FactoryFunction.tempValIdentifier(), Identifier(referencedName, isNullable).assignNoPrototype())
return
}
else if (qualifier != null && qualifier.getType() is PsiArrayType && referencedName == "length") {
var identifier = Identifier(referencedName, isNullable).assignNoPrototype()
val qualifier = expression.getQualifierExpression()
if (qualifier != null && qualifier.getType() is PsiArrayType && referencedName == "length") {
identifier = Identifier("size", isNullable).assignNoPrototype()
}
else if (qualifier != null) {
@@ -16,14 +16,17 @@
package org.jetbrains.jet.j2k.test;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;
import java.io.File;
import java.util.regex.Pattern;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.test.InnerTestClasses;
import org.jetbrains.jet.test.TestMetadata;
import java.io.File;
import java.util.regex.Pattern;
import org.jetbrains.jet.j2k.test.AbstractJavaToKotlinConverterTest;
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@@ -868,6 +871,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv
doTest("j2k/tests/testData/ast/constructors/privateConstructors.java");
}
@TestMetadata("qualifiedRefInFactoryFun.java")
public void testQualifiedRefInFactoryFun() throws Exception {
doTest("j2k/tests/testData/ast/constructors/qualifiedRefInFactoryFun.java");
}
@TestMetadata("withManyDefaultParams.java")
public void testWithManyDefaultParams() throws Exception {
doTest("j2k/tests/testData/ast/constructors/withManyDefaultParams.java");
@@ -0,0 +1,24 @@
//file
class C {
private final int arg1;
private final int arg2;
private final int arg3;
C(int arg1, int arg2, int arg3) {
this.arg1 = arg1;
this.arg2 = arg2;
this.arg3 = arg3;
}
C(int arg1, int arg2, C other) {
this(arg1, arg2, 0);
System.out.println(this.arg1 + other.arg2);
}
}
class User {
void foo() {
C c1 = new C(100, 100, 100);
C c2 = new C(100, 100, c1);
}
}
@@ -0,0 +1,17 @@
class C(private val arg1: Int, private val arg2: Int, private val arg3: Int) {
class object {
fun create(arg1: Int, arg2: Int, other: C): C {
val __ = C(arg1, arg2, 0)
System.out.println(__.arg1 + other.arg2)
return __
}
}
}
class User {
fun foo() {
val c1 = C(100, 100, 100)
val c2 = C.create(100, 100, c1)
}
}