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
|
package org.jetbrains.jet.j2k.visitors
|
||||||
|
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import com.intellij.psi.tree.IElementType
|
import com.intellij.psi.tree.IElementType
|
||||||
import org.jetbrains.jet.j2k.ast.*
|
import org.jetbrains.jet.j2k.ast.*
|
||||||
import org.jetbrains.jet.lang.types.expressions.OperatorConventions
|
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.resolve.java.JvmAbi
|
||||||
import org.jetbrains.jet.lang.psi.JetParameter
|
import org.jetbrains.jet.lang.psi.JetParameter
|
||||||
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
|
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() {
|
open class ExpressionVisitor(private val converter: Converter) : JavaElementVisitor() {
|
||||||
private val typeConverter = converter.typeConverter
|
private val typeConverter = converter.typeConverter
|
||||||
@@ -105,8 +108,29 @@ open class ExpressionVisitor(private val converter: Converter) : JavaElementVisi
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitClassObjectAccessExpression(expression: PsiClassObjectAccessExpression) {
|
override fun visitClassObjectAccessExpression(expression: PsiClassObjectAccessExpression) {
|
||||||
val typeElement = converter.convertTypeElement(expression.getOperand())
|
val operand = expression.getOperand()
|
||||||
result = MethodCallExpression.buildNotNull(null, "javaClass", listOf(), listOf(typeElement.`type`.toNotNullType()))
|
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) {
|
override fun visitConditionalExpression(expression: PsiConditionalExpression) {
|
||||||
@@ -429,4 +453,8 @@ open class ExpressionVisitor(private val converter: Converter) : JavaElementVisi
|
|||||||
}
|
}
|
||||||
return ""
|
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");
|
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")
|
@TestMetadata("stringClass.java")
|
||||||
public void testStringClass() throws Exception {
|
public void testStringClass() throws Exception {
|
||||||
doTest("j2k/tests/testData/ast/classExpression/stringClass.java");
|
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