diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index f185daed4d3..4ea6b14b32c 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -58,6 +58,7 @@ object ConversionsRunner { +ForConversion(context) +ForInConversion() +CollectionOperationsConversion(context) + +TypeParametersNullabilityConversion() +ArrayOperationsConversion(context) +TypeMappingConversion(context) +ImplicitCastsConversion(context) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TypeParametersNullabilityConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TypeParametersNullabilityConversion.kt new file mode 100644 index 00000000000..5e8f7dfd9a8 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TypeParametersNullabilityConversion.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.j2k.conversions + +import org.jetbrains.kotlin.j2k.ast.Nullability +import org.jetbrains.kotlin.j2k.tree.* +import org.jetbrains.kotlin.j2k.tree.impl.* + + +class TypeParametersNullabilityConversion : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + if (element !is JKTypeParameterList) return recurse(element) + val typeParametersNullabilityMap = + element.typeParameters.map { typeParameter -> + typeParameter.name.value to typeParameter.hasNullableUpperBounds() + }.toMap() + return JKTypeParameterListImpl( + element.typeParameters.map { typeParameter -> + val name = typeParameter.name.value + JKTypeParameterImpl( + JKNameIdentifierImpl(name), + typeParameter.upperBounds.map { upperBoundTypeElement -> + JKTypeElementImpl( + upperBoundTypeElement.type.makeTypeParametersNotNull(typeParametersNullabilityMap) + ) + } + ) + } + ) + } + + private fun JKType.makeTypeParametersNotNull(nullabilityMap: Map): JKType = + when (this) { + is JKClassType -> + JKClassTypeImpl( + classReference, + parameters.map { it.makeTypeParametersNotNull(nullabilityMap) }, + nullability + ) + is JKTypeParameterType -> + nullabilityMap[name] + ?.takeIf { nullability == Nullability.Default } + ?.let { isNullable -> + JKTypeParameterTypeImpl( + name, + if (isNullable) Nullability.NotNull else Nullability.Nullable + ) + } ?: this + + is JKVarianceTypeParameterType -> + JKVarianceTypeParameterTypeImpl( + variance, + boundType.makeTypeParametersNotNull(nullabilityMap) + ) + else -> this + } + + private fun JKTypeParameter.hasNullableUpperBounds(): Boolean = + upperBounds.any { it.type.isNullable() } +} \ No newline at end of file