From f836278acc3b5393ba2721b2f04dfef15ca84a49 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 14 Jul 2014 13:01:06 +0400 Subject: [PATCH] J2K: Fixed conversion of .class #KT-5428 Fixed --- .../jet/j2k/visitors/ExpressionVisitor.kt | 32 +++++++++++++++++-- .../JavaToKotlinConverterTestGenerated.java | 5 +++ .../classExpression/primitivesAndArrays.java | 10 ++++++ .../classExpression/primitivesAndArrays.kt | 14 ++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 j2k/tests/testData/ast/classExpression/primitivesAndArrays.java create mode 100644 j2k/tests/testData/ast/classExpression/primitivesAndArrays.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt index 1ea80bc6291..9e3b5efea90 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt @@ -17,6 +17,7 @@ package org.jetbrains.jet.j2k.visitors import com.intellij.psi.* +import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.tree.IElementType import org.jetbrains.jet.j2k.ast.* import org.jetbrains.jet.lang.types.expressions.OperatorConventions @@ -35,6 +36,8 @@ import com.intellij.psi.impl.light.LightField import org.jetbrains.jet.lang.resolve.java.JvmAbi import org.jetbrains.jet.lang.psi.JetParameter import org.jetbrains.jet.lang.psi.JetNamedDeclaration +import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType +import org.jetbrains.jet.lang.resolve.name.FqName open class ExpressionVisitor(private val converter: Converter) : JavaElementVisitor() { private val typeConverter = converter.typeConverter @@ -105,8 +108,29 @@ open class ExpressionVisitor(private val converter: Converter) : JavaElementVisi } override fun visitClassObjectAccessExpression(expression: PsiClassObjectAccessExpression) { - val typeElement = converter.convertTypeElement(expression.getOperand()) - result = MethodCallExpression.buildNotNull(null, "javaClass", listOf(), listOf(typeElement.`type`.toNotNullType())) + val operand = expression.getOperand() + val typeName = operand.getType().getCanonicalText() + val primitiveType = JvmPrimitiveType.values().firstOrNull { it.getName() == typeName } + val wrapperTypeName = if (primitiveType != null) { + primitiveType.getWrapperFqName() + } + else if (typeName == "void") { // by unknown reason it's not in JvmPrimitiveType enum + FqName("java.lang.Void") + } + else { + val typeElement = converter.convertTypeElement(operand) + result = MethodCallExpression.buildNotNull(null, "javaClass", listOf(), listOf(typeElement.`type`.toNotNullType())) + return + } + + //TODO: need more correct way to detect if short name is ok + val qualifiedName = wrapperTypeName.asString() + val classNameToUse = if (qualifiedName in needQualifierNameSet) + qualifiedName + else + wrapperTypeName.shortName().asString() + result = QualifiedExpression(Identifier(classNameToUse, false).assignPrototype(operand), + Identifier("TYPE", false).assignNoPrototype()) } override fun visitConditionalExpression(expression: PsiConditionalExpression) { @@ -429,4 +453,8 @@ open class ExpressionVisitor(private val converter: Converter) : JavaElementVisi } return "" } + + class object { + private val needQualifierNameSet = setOf("java.lang.Byte", "java.lang.Double", "java.lang.Float", "java.lang.Long", "java.lang.Short") + } } 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 93979347a88..3ef6819568d 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -737,6 +737,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/classExpression/objectClass.java"); } + @TestMetadata("primitivesAndArrays.java") + public void testPrimitivesAndArrays() throws Exception { + doTest("j2k/tests/testData/ast/classExpression/primitivesAndArrays.java"); + } + @TestMetadata("stringClass.java") public void testStringClass() throws Exception { doTest("j2k/tests/testData/ast/classExpression/stringClass.java"); diff --git a/j2k/tests/testData/ast/classExpression/primitivesAndArrays.java b/j2k/tests/testData/ast/classExpression/primitivesAndArrays.java new file mode 100644 index 00000000000..45b288e5a07 --- /dev/null +++ b/j2k/tests/testData/ast/classExpression/primitivesAndArrays.java @@ -0,0 +1,10 @@ +public class A { + public static void main(String[] args) { + System.out.println(void.class); + System.out.println(int.class); + System.out.println(double.class); + System.out.println(int[].class); + System.out.println(Object[].class); + System.out.println(Object[][].class); + } +} diff --git a/j2k/tests/testData/ast/classExpression/primitivesAndArrays.kt b/j2k/tests/testData/ast/classExpression/primitivesAndArrays.kt new file mode 100644 index 00000000000..732a3eb49d7 --- /dev/null +++ b/j2k/tests/testData/ast/classExpression/primitivesAndArrays.kt @@ -0,0 +1,14 @@ +public class A { + class object { + public fun main(args: Array) { + System.out.println(Void.TYPE) + System.out.println(Integer.TYPE) + System.out.println(java.lang.Double.TYPE) + System.out.println(javaClass()) + System.out.println(javaClass>()) + System.out.println(javaClass>>()) + } + } +} + +fun main(args: Array) = A.main(args) \ No newline at end of file