J2K: Fixed conversion of <primitive type>.class
#KT-5428 Fixed
This commit is contained in:
@@ -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)
|
||||
Reference in New Issue
Block a user