From e789026291444dcf5ca9ea898074c82e4550fc99 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 5 Jun 2014 20:46:51 +0400 Subject: [PATCH] Java to Kotlin converter: converting usages of Kotlin class object members --- .../jetbrains/jet/j2k/visitors/ExpressionVisitor.kt | 12 +++++++++++- .../j2k/test/JavaToKotlinConverterTestGenerated.java | 5 +++++ j2k/tests/testData/KotlinApi.kt | 8 ++++++++ .../ast/kotlinApiAccess/ClassObjectMembers.java | 10 ++++++++++ .../ast/kotlinApiAccess/ClassObjectMembers.kt | 9 +++++++++ 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 j2k/tests/testData/ast/kotlinApiAccess/ClassObjectMembers.java create mode 100644 j2k/tests/testData/ast/kotlinApiAccess/ClassObjectMembers.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt index ef5f3c70b3a..22dc3910907 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt @@ -32,6 +32,7 @@ import org.jetbrains.jet.lang.psi.JetClassOrObject import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.isExtensionDeclaration import org.jetbrains.jet.lang.psi.JetPropertyAccessor +import com.intellij.psi.impl.light.LightField open class ExpressionVisitor(protected val converter: Converter, private val usageReplacementMap: Map = mapOf()) : JavaElementVisitor() { @@ -292,7 +293,16 @@ open class ExpressionVisitor(protected val converter: Converter, else if (qualifier != null && qualifier.getType() is PsiArrayType && referencedName == "length") { identifier = Identifier("size", isNullable) } - else if (qualifier == null) { + else if (qualifier != null) { + if (referencedName == "object$") { + val target = expression.getReference()?.resolve() + if (target is LightField) { //TODO: should be KotlinLightField with check of origin here, see KT-5188 + result = converter.convertExpression(qualifier) + return + } + } + } + else { val target = expression.getReference()?.resolve() if (target is PsiClass) { 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 3650d0e49f9..a27e7406e53 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -1556,6 +1556,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("j2k/tests/testData/ast/kotlinApiAccess"), Pattern.compile("^(.+)\\.java$"), true); } + @TestMetadata("ClassObjectMembers.java") + public void testClassObjectMembers() throws Exception { + doTest("j2k/tests/testData/ast/kotlinApiAccess/ClassObjectMembers.java"); + } + @TestMetadata("ExtensionFunction.java") public void testExtensionFunction() throws Exception { doTest("j2k/tests/testData/ast/kotlinApiAccess/ExtensionFunction.java"); diff --git a/j2k/tests/testData/KotlinApi.kt b/j2k/tests/testData/KotlinApi.kt index 098ec57d4f6..728b86f8be5 100644 --- a/j2k/tests/testData/KotlinApi.kt +++ b/j2k/tests/testData/KotlinApi.kt @@ -2,6 +2,14 @@ package kotlinApi public open class KotlinClass { public var property: String = "" + + class object { + public fun statucFun(p: Int): Int = p + public var staticVar: Int = 1 + public var staticProperty: Int + get() = 1 + set(value) {} + } } public fun globalFunction(s: String): String = s diff --git a/j2k/tests/testData/ast/kotlinApiAccess/ClassObjectMembers.java b/j2k/tests/testData/ast/kotlinApiAccess/ClassObjectMembers.java new file mode 100644 index 00000000000..a22a7e21c52 --- /dev/null +++ b/j2k/tests/testData/ast/kotlinApiAccess/ClassObjectMembers.java @@ -0,0 +1,10 @@ +//file +import kotlinApi.KotlinClass; + +class C { + int foo() { + KotlinClass.staticVar = KotlinClass.staticVar * 2; + KotlinClass.object$.setStaticProperty(KotlinClass.object$.getStaticVar() + KotlinClass.object$.getStaticProperty()); + return KotlinClass.object$.statucFun(1); + } +} diff --git a/j2k/tests/testData/ast/kotlinApiAccess/ClassObjectMembers.kt b/j2k/tests/testData/ast/kotlinApiAccess/ClassObjectMembers.kt new file mode 100644 index 00000000000..d161dc928a2 --- /dev/null +++ b/j2k/tests/testData/ast/kotlinApiAccess/ClassObjectMembers.kt @@ -0,0 +1,9 @@ +import kotlinApi.KotlinClass + +class C() { + fun foo(): Int { + KotlinClass.staticVar = KotlinClass.staticVar * 2 + KotlinClass.staticProperty = KotlinClass.staticVar + KotlinClass.staticProperty + return KotlinClass.statucFun(1) + } +} \ No newline at end of file