From d154d2e25b79a60fe447757e0573a8a5f17b793c Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 16 Jul 2014 19:12:04 +0400 Subject: [PATCH] Fixed assertion + refactored code making it more simple --- .../jetbrains/jet/j2k/visitors/TypeVisitor.kt | 34 +++++-------------- .../JavaToKotlinConverterTestGenerated.java | 5 +++ .../ast/typeParameters/rawTypeCast.java | 8 +++++ .../ast/typeParameters/rawTypeCast.kt | 11 ++++++ 4 files changed, 33 insertions(+), 25 deletions(-) create mode 100644 j2k/tests/testData/ast/typeParameters/rawTypeCast.java create mode 100644 j2k/tests/testData/ast/typeParameters/rawTypeCast.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.kt index 2db88fd1b88..045f38ba97d 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.kt @@ -22,8 +22,6 @@ import org.jetbrains.jet.j2k.ast.* import com.intellij.openapi.util.text.StringUtil import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType import org.jetbrains.jet.j2k.TypeConverter -import java.util.ArrayList -import org.jetbrains.jet.j2k.singleOrNull2 import org.jetbrains.jet.j2k.Converter private val PRIMITIVE_TYPES_NAMES = JvmPrimitiveType.values().map { it.getName() } @@ -84,39 +82,25 @@ class TypeVisitor(private val converter: Converter) : PsiTypeVisitor() { private fun getShortName(className: String): String = className.substring(className.lastIndexOf('.') + 1) private fun convertTypeArgs(classType: PsiClassType): List { - val resolvedClassTypeParams = createRawTypesForResolvedReference(classType) - - if (classType.getParameterCount() == 0 && resolvedClassTypeParams.size() > 0) { - if ((resolvedClassTypeParams.singleOrNull2() as? ClassType)?.referenceElement?.name?.name == "Any") { - return listOf(StarProjectionType().assignNoPrototype()) - } - else { - return resolvedClassTypeParams - } + if (classType.getParameterCount() == 0) { + return createTypeArgsForRawTypeUsage(classType) } else { return typeConverter.convertTypes(classType.getParameters()) } } - private fun createRawTypesForResolvedReference(classType: PsiClassType): List { - val typeArgs = ArrayList() + private fun createTypeArgsForRawTypeUsage(classType: PsiClassType): List { if (classType is PsiClassReferenceType) { - val resolve = classType.getReference().resolve() - if (resolve is PsiClass) { - for (typeParam in resolve.getTypeParameters()) { - val superTypes = typeParam.getSuperTypes() - val boundType = if (superTypes.size > 0) { - ClassType(constructReferenceElement(superTypes.first()), Nullability.Default, converter.settings) - } - else { - StarProjectionType() - } - typeArgs.add(boundType) + val targetClass = classType.getReference().resolve() as? PsiClass + if (targetClass != null) { + return targetClass.getTypeParameters().map { + val superType = it.getSuperTypes().first() // there must be at least one super type always + ClassType(constructReferenceElement(superType), Nullability.Default, converter.settings).assignNoPrototype() } } } - return typeArgs + return listOf() } override fun visitWildcardType(wildcardType: PsiWildcardType): Type { 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 34aee83dc4b..3b10a1a121e 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -3138,6 +3138,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/typeParameters/needTypeArgs.java"); } + @TestMetadata("rawTypeCast.java") + public void testRawTypeCast() throws Exception { + doTest("j2k/tests/testData/ast/typeParameters/rawTypeCast.java"); + } + @TestMetadata("traitDoubleParametrizationWithTwoBoundsWithExtending.java") public void testTraitDoubleParametrizationWithTwoBoundsWithExtending() throws Exception { doTest("j2k/tests/testData/ast/typeParameters/traitDoubleParametrizationWithTwoBoundsWithExtending.java"); diff --git a/j2k/tests/testData/ast/typeParameters/rawTypeCast.java b/j2k/tests/testData/ast/typeParameters/rawTypeCast.java new file mode 100644 index 00000000000..6dd7a9c0817 --- /dev/null +++ b/j2k/tests/testData/ast/typeParameters/rawTypeCast.java @@ -0,0 +1,8 @@ +import java.util.*; + +class A { + public static Map foo() { + Properties props = new Properties(); + return new HashMap<>((Map)props); + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/typeParameters/rawTypeCast.kt b/j2k/tests/testData/ast/typeParameters/rawTypeCast.kt new file mode 100644 index 00000000000..e02a6606171 --- /dev/null +++ b/j2k/tests/testData/ast/typeParameters/rawTypeCast.kt @@ -0,0 +1,11 @@ +import java.util.* +import kotlin.Map + +class A { + class object { + public fun foo(): Map { + val props = Properties() + return HashMap(props as Map) + } + } +} \ No newline at end of file