diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt index 581eaa0f9b8..4a165da519d 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt @@ -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) { diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java index e323e9c0edd..3018e941da3 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -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"); diff --git a/j2k/tests/testData/ast/constructors/qualifiedRefInFactoryFun.java b/j2k/tests/testData/ast/constructors/qualifiedRefInFactoryFun.java new file mode 100644 index 00000000000..fd5ddcf15b5 --- /dev/null +++ b/j2k/tests/testData/ast/constructors/qualifiedRefInFactoryFun.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); + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/constructors/qualifiedRefInFactoryFun.kt b/j2k/tests/testData/ast/constructors/qualifiedRefInFactoryFun.kt new file mode 100644 index 00000000000..1de8e8850ba --- /dev/null +++ b/j2k/tests/testData/ast/constructors/qualifiedRefInFactoryFun.kt @@ -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) + } +} \ No newline at end of file