New J2K: Fix raw types in new expression

This commit is contained in:
Ilya Kirillov
2019-01-10 16:55:07 +03:00
committed by Ilya Kirillov
parent 9b73db4308
commit 46c7cd4b40
2 changed files with 30 additions and 9 deletions
@@ -41,11 +41,12 @@ class TypeMappingConversion(val context: ConversionContext) : RecursiveApplicabl
JKTypeElementImpl(newType) JKTypeElementImpl(newType)
} }
is JKJavaNewExpression -> { is JKJavaNewExpression -> {
val newClassSymbol = element.classSymbol.mapClassSymbol(null)
recurse( recurse(
JKJavaNewExpressionImpl( JKJavaNewExpressionImpl(
element.classSymbol.mapClassSymbol(null), newClassSymbol,
element::arguments.detached(), element::arguments.detached(),
element::typeArgumentList.detached(), element::typeArgumentList.detached().fixTypeArguments(newClassSymbol),
element::classBody.detached() 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 { private fun JKType.refineNullability(typeElement: JKTypeElement): JKType {
if (nullability == Nullability.Default && this is JKClassType) { if (nullability == Nullability.Default && this is JKClassType) {
val newNullability = calculateNullability(typeElement) val newNullability = calculateNullability(typeElement)
@@ -259,13 +259,7 @@ fun JKJavaPrimitiveType.isNumberType() =
inline fun <reified T : JKType> T.addTypeParametersToRawProjectionType(typeParameter: JKType): T = inline fun <reified T : JKType> T.addTypeParametersToRawProjectionType(typeParameter: JKType): T =
if (this is JKClassType && parameters.isEmpty()) { if (this is JKClassType && parameters.isEmpty()) {
val resolvedClass = classReference.target val parametersCount = classReference.expectedTypeParametersCount()
val parametersCount =
when (resolvedClass) {
is PsiClass -> resolvedClass.typeParameters.size
is KtClass -> resolvedClass.typeParameters.size
else -> 0
}
val typeParameters = List(parametersCount) { typeParameter } val typeParameters = List(parametersCount) { typeParameter }
JKClassTypeImpl( JKClassTypeImpl(
classReference, classReference,
@@ -274,6 +268,15 @@ inline fun <reified T : JKType> T.addTypeParametersToRawProjectionType(typeParam
) as T ) as T
} else this } 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 = fun JKClassSymbol.isArrayType(): Boolean =
fqName in fqName in
JKJavaPrimitiveTypeImpl.KEYWORD_TO_INSTANCE.values JKJavaPrimitiveTypeImpl.KEYWORD_TO_INSTANCE.values