Commit ac16a36a authored by Jinseong Jeon's avatar Jinseong Jeon
Browse files

KT UAST: do not add nullability annotation to generic reified type

^KTIJ-28879 fixed
parent 1d6f6cd0
Branches unavailable Tags unavailable
No related merge requests found
Showing with 93 additions and 6 deletions
+93 -6
......@@ -79,6 +79,10 @@ abstract class UastFakeSourceLightMethodBase<T : KtDeclaration>(
}
override fun computeNullability(): KtTypeNullability? {
if (baseResolveProviderService.hasInheritedGenericType(original)) {
// Inherited generic type: nullity will be determined at use-site
return null
}
if (isSuspendFunction()) {
// suspend fun returns Any?, which is mapped to @Nullable java.lang.Object
return KtTypeNullability.NULLABLE
......
......@@ -35,13 +35,15 @@ class UastKotlinPsiParameter internal constructor(
get() = annotationsPart.getOrBuild {
val annotations = SmartList<PsiAnnotation>()
val nullability = baseResolveProviderService.nullability(ktParameter)
if (nullability != null && nullability != KtTypeNullability.UNKNOWN) {
annotations.add(
UastFakeLightNullabilityAnnotation(nullability, this)
)
val hasInheritedGenericType = baseResolveProviderService.hasInheritedGenericType(ktParameter)
if (!hasInheritedGenericType) {
val nullability = baseResolveProviderService.nullability(ktParameter)
if (nullability != null && nullability != KtTypeNullability.UNKNOWN) {
annotations.add(
UastFakeLightNullabilityAnnotation(nullability, this)
)
}
}
ktParameter.annotationEntries.mapTo(annotations) { entry ->
KtLightAnnotationForSourceEntry(
name = entry.shortName?.identifier,
......
......@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.uast.*
import com.intellij.platform.uast.testFramework.env.findElementByTextFromPsi
import com.intellij.psi.PsiAnnotation
import com.intellij.psi.PsiParameter
import com.intellij.psi.PsiTypes
import org.jetbrains.kotlin.psi.KtDestructuringDeclaration
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
......@@ -383,6 +384,31 @@ interface UastApiFixtureTestBase : UastPluginSelection {
})
}
fun checkReifiedTypeNullability_generic(myFixture: JavaCodeInsightTestFixture) {
myFixture.configureByText(
"main.kt", """
inline fun <reified T> inlineReified(t: T): T { return t }
inline fun <reified T> T.inlineReifiedExtension(t: T): T { return this }
""".trimIndent()
)
val uFile = myFixture.file.toUElement()!!
uFile.accept(object : AbstractUastVisitor() {
override fun visitMethod(node: UMethod): Boolean {
val annotations = node.javaPsi.annotations
TestCase.assertTrue(annotations.isEmpty())
return super.visitMethod(node)
}
override fun visitParameter(node: UParameter): Boolean {
val annotations = (node.javaPsi as? PsiParameter)?.annotations
TestCase.assertTrue(annotations?.isEmpty() == true)
return super.visitParameter(node)
}
})
}
fun checkInheritedGenericTypeNullability(myFixture: JavaCodeInsightTestFixture) {
myFixture.configureByText(
"main.kt", """
......@@ -523,6 +549,34 @@ interface UastApiFixtureTestBase : UastPluginSelection {
})
}
fun checkGenericTypeNullability_reified(myFixture: JavaCodeInsightTestFixture) {
myFixture.configureByText(
"main.kt", """
inline fun <reified T> inlineReified(t: T): T { return t }
inline fun <reified T> T.inlineReifiedExtension(t: T) { this }
""".trimIndent()
)
val uFile = myFixture.file.toUElement()!!
val service = ApplicationManager.getApplication().getService(BaseKotlinUastResolveProviderService::class.java)
uFile.accept(object : AbstractUastVisitor() {
override fun visitMethod(node: UMethod): Boolean {
TestCase.assertTrue(node.uAnnotations.isEmpty())
TestCase.assertTrue(
node.returnType == PsiTypes.voidType() || service.hasInheritedGenericType(node.sourcePsi!!)
)
return super.visitMethod(node)
}
override fun visitParameter(node: UParameter): Boolean {
TestCase.assertTrue(node.uAnnotations.isEmpty())
TestCase.assertTrue(service.hasInheritedGenericType(node.sourcePsi!!))
return super.visitParameter(node)
}
})
}
fun checkImplicitReceiverType(myFixture: JavaCodeInsightTestFixture) {
myFixture.addClass(
"""
......
......@@ -61,6 +61,17 @@ internal class UastFakeDeserializedSymbolLightMethod(
override fun computeNullability(): KtTypeNullability? {
return analyzeForUast(context) {
val functionSymbol = original.restoreSymbol() ?: return@analyzeForUast null
functionSymbol.psi?.let { psi ->
val hasInheritedGenericType = baseResolveProviderService.hasInheritedGenericType(psi)
if (hasInheritedGenericType) {
// Inherited generic type: nullity will be determined at use-site
return@analyzeForUast null
}
}
if (functionSymbol.isSuspend) {
// suspend fun returns Any?, which is mapped to @Nullable java.lang.Object
return@analyzeForUast KtTypeNullability.NULLABLE
}
functionSymbol.returnType.nullability
}
}
......
......@@ -61,6 +61,10 @@ class FirUastApiFixtureTest : KotlinLightCodeInsightFixtureTestCase(), UastApiFi
checkReifiedTypeNullability(myFixture)
}
fun testReifiedTypeNullability_generic() {
checkReifiedTypeNullability_generic(myFixture)
}
fun testInheritedGenericTypeNullability() {
checkInheritedGenericTypeNullability(myFixture)
}
......@@ -69,6 +73,10 @@ class FirUastApiFixtureTest : KotlinLightCodeInsightFixtureTestCase(), UastApiFi
checkInheritedGenericTypeNullability_propertyAndAccessor(myFixture)
}
fun testGenericTypeNullability_reified() {
checkGenericTypeNullability_reified(myFixture)
}
fun testImplicitReceiverType() {
checkImplicitReceiverType(myFixture)
}
......
......@@ -59,6 +59,10 @@ class FE1UastApiFixtureTest : KotlinLightCodeInsightFixtureTestCase(), UastApiFi
checkReifiedTypeNullability(myFixture)
}
fun testReifiedTypeNullability_generic() {
checkReifiedTypeNullability_generic(myFixture)
}
fun testInheritedGenericTypeNullability() {
checkInheritedGenericTypeNullability(myFixture)
}
......@@ -67,6 +71,10 @@ class FE1UastApiFixtureTest : KotlinLightCodeInsightFixtureTestCase(), UastApiFi
checkInheritedGenericTypeNullability_propertyAndAccessor(myFixture)
}
fun testGenericTypeNullability_reified() {
checkGenericTypeNullability_reified(myFixture)
}
fun testImplicitReceiverType() {
checkImplicitReceiverType(myFixture)
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment