From 46c7cd4b402f08c09a9779a129f5f1553a30d640 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 10 Jan 2019 16:55:07 +0300 Subject: [PATCH] New J2K: Fix raw types in `new` expression --- .../j2k/conversions/TypeMappingConversion.kt | 22 +++++++++++++++++-- .../org/jetbrains/kotlin/j2k/tree/types.kt | 17 ++++++++------ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TypeMappingConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TypeMappingConversion.kt index 9bf5751d832..95647108307 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TypeMappingConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TypeMappingConversion.kt @@ -41,11 +41,12 @@ class TypeMappingConversion(val context: ConversionContext) : RecursiveApplicabl JKTypeElementImpl(newType) } is JKJavaNewExpression -> { + val newClassSymbol = element.classSymbol.mapClassSymbol(null) recurse( JKJavaNewExpressionImpl( - element.classSymbol.mapClassSymbol(null), + newClassSymbol, element::arguments.detached(), - element::typeArgumentList.detached(), + element::typeArgumentList.detached().fixTypeArguments(newClassSymbol), element::classBody.detached() ) ) @@ -54,6 +55,23 @@ class TypeMappingConversion(val context: ConversionContext) : RecursiveApplicabl } } + private fun JKTypeArgumentList.fixTypeArguments(classSymbol: JKClassSymbol): JKTypeArgumentList { + if (typeArguments.isNotEmpty()) return this + val typeParametersCount = classSymbol.expectedTypeParametersCount() + return when (typeParametersCount) { + 0 -> this + else -> JKTypeArgumentListImpl(List(typeParametersCount) { + JKTypeElementImpl( + kotlinTypeByName( + KotlinBuiltIns.FQ_NAMES.any.toSafe().asString(), + context.symbolProvider, + Nullability.Nullable + ) + ) + }) + } + } + private fun JKType.refineNullability(typeElement: JKTypeElement): JKType { if (nullability == Nullability.Default && this is JKClassType) { val newNullability = calculateNullability(typeElement) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt index 5c51e7b9459..a6385b9f650 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt @@ -259,13 +259,7 @@ fun JKJavaPrimitiveType.isNumberType() = inline fun T.addTypeParametersToRawProjectionType(typeParameter: JKType): T = if (this is JKClassType && parameters.isEmpty()) { - val resolvedClass = classReference.target - val parametersCount = - when (resolvedClass) { - is PsiClass -> resolvedClass.typeParameters.size - is KtClass -> resolvedClass.typeParameters.size - else -> 0 - } + val parametersCount = classReference.expectedTypeParametersCount() val typeParameters = List(parametersCount) { typeParameter } JKClassTypeImpl( classReference, @@ -274,6 +268,15 @@ inline fun T.addTypeParametersToRawProjectionType(typeParam ) as T } else this +fun JKClassSymbol.expectedTypeParametersCount(): Int { + val resolvedClass = target + return when (resolvedClass) { + is PsiClass -> resolvedClass.typeParameters.size + is KtClass -> resolvedClass.typeParameters.size + else -> 0 + } +} + fun JKClassSymbol.isArrayType(): Boolean = fqName in JKJavaPrimitiveTypeImpl.KEYWORD_TO_INSTANCE.values