J2K: Fixed conversion of <primitive type>.class

#KT-5428 Fixed
This commit is contained in:
Valentin Kipyatkov
2014-07-14 13:01:06 +04:00
parent a2fa5bc536
commit f836278acc
4 changed files with 59 additions and 2 deletions
@@ -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")
}
}
@@ -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");
@@ -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);
}
}
@@ -0,0 +1,14 @@
public class A {
class object {
public fun main(args: Array<String>) {
System.out.println(Void.TYPE)
System.out.println(Integer.TYPE)
System.out.println(java.lang.Double.TYPE)
System.out.println(javaClass<IntArray>())
System.out.println(javaClass<Array<Any>>())
System.out.println(javaClass<Array<Array<Any>>>())
}
}
}
fun main(args: Array<String>) = A.main(args)