SLC: honor wildcard suppression on declarations

^KT-61734 fixed
This commit is contained in:
Jinseong Jeon
2024-02-22 22:46:45 -08:00
committed by teamcity
parent d63b3e9494
commit afd20b0c2d
11 changed files with 63 additions and 14 deletions
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.annotations.*
import org.jetbrains.kotlin.analysis.api.annotations.KtKClassAnnotationValue.KtNonLocalKClassAnnotationValue
import org.jetbrains.kotlin.analysis.api.components.buildClassType
import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.asJava.classes.annotateByTypeAnnotationProvider
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase
import org.jetbrains.kotlin.light.classes.symbol.getContainingSymbolsWithSelf
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.JvmStandardClassIds
import org.jetbrains.kotlin.name.JvmStandardClassIds.JVM_OVERLOADS_CLASS_ID
@@ -91,6 +93,28 @@ internal fun KtAnnotatedSymbol.hasJvmStaticAnnotation(
internal fun KtAnnotatedSymbol.hasInlineOnlyAnnotation(): Boolean = hasAnnotation(StandardClassIds.Annotations.InlineOnly)
context(KtAnalysisSession)
internal fun KtDeclarationSymbol.suppressWildcardMode(
declarationFilter: (KtDeclarationSymbol) -> Boolean = { true },
): Boolean? {
return getContainingSymbolsWithSelf().firstNotNullOfOrNull { symbol ->
symbol.takeIf(declarationFilter)?.suppressWildcard()
}
}
internal fun KtAnnotatedSymbol.suppressWildcard(): Boolean? {
if (hasJvmWildcardAnnotation()) return true
return getJvmSuppressWildcardsFromAnnotation()
}
internal fun KtAnnotatedSymbol.getJvmSuppressWildcardsFromAnnotation(): Boolean? {
return annotationsByClassId(JvmStandardClassIds.Annotations.JvmSuppressWildcards).firstOrNull()?.let { annoApp ->
(annoApp.arguments.firstOrNull()?.expression as? KtConstantAnnotationValue)?.constantValue?.value as? Boolean
}
}
internal fun KtAnnotatedSymbol.hasJvmWildcardAnnotation(): Boolean = hasAnnotation(JvmStandardClassIds.Annotations.JvmWildcard)
internal fun KtAnnotatedSymbol.findAnnotation(
classId: ClassId,
useSiteTargetFilter: AnnotationUseSiteTargetFilter = AnyAnnotationUseSiteTargetFilter,
@@ -80,6 +80,7 @@ internal class SymbolLightFieldForProperty private constructor(
this@SymbolLightFieldForProperty,
allowErrorTypes = true,
typeMappingMode,
suppressWildcards = propertySymbol.suppressWildcardMode(),
)
} ?: nonExistentType()
}
@@ -269,12 +269,20 @@ internal class SymbolLightAccessorMethod private constructor(
allowErrorTypes = true,
typeMappingMode,
containingClass.isAnnotationType,
suppressWildcards(),
)
} ?: nonExistentType()
}
override fun getReturnType(): PsiType = _returnedType
override fun suppressWildcards(): Boolean? =
withAccessorSymbol { accessorSymbol ->
accessorSymbol.suppressWildcardMode { parent ->
parent !is KtPropertySymbol
}
}
override fun isEquivalentTo(another: PsiElement?): Boolean {
return super.isEquivalentTo(another) || basicIsEquivalentTo(this, another as? PsiField)
}
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier
import org.jetbrains.kotlin.light.classes.symbol.annotations.computeThrowsList
import org.jetbrains.kotlin.light.classes.symbol.annotations.hasDeprecatedAnnotation
import org.jetbrains.kotlin.light.classes.symbol.annotations.suppressWildcardMode
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForInterfaceDefaultImpls
import org.jetbrains.kotlin.light.classes.symbol.compareSymbolPointers
@@ -157,4 +158,9 @@ internal abstract class SymbolLightMethod<FType : KtFunctionLikeSymbol> private
}
override fun hashCode(): Int = kotlinOrigin.hashCode()
override fun suppressWildcards(): Boolean? =
withFunctionSymbol { functionSymbol ->
functionSymbol.suppressWildcardMode()
}
}
@@ -134,4 +134,6 @@ internal abstract class SymbolLightMethodBase(
}
abstract fun isOverride(): Boolean
internal open fun suppressWildcards(): Boolean? = null
}
@@ -234,6 +234,7 @@ internal class SymbolLightSimpleMethod(
allowErrorTypes = true,
typeMappingMode,
this@SymbolLightSimpleMethod.containingClass.isAnnotationType,
suppressWildcards = suppressWildcards(),
)?.let {
annotateByKtType(it.type, ktType, it, modifierList)
}
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.light.classes.symbol.*
import org.jetbrains.kotlin.light.classes.symbol.annotations.annotateByKtType
import org.jetbrains.kotlin.light.classes.symbol.annotations.suppressWildcardMode
import org.jetbrains.kotlin.light.classes.symbol.methods.SymbolLightMethodBase
import org.jetbrains.kotlin.psi.KtParameter
@@ -80,7 +81,8 @@ internal abstract class SymbolLightParameterCommon(
ktType.asPsiTypeElement(
this@SymbolLightParameterCommon,
allowErrorTypes = true,
ktType.typeMappingMode()
ktType.typeMappingMode(),
suppressWildcards = parameterSymbol.suppressWildcardMode(),
)?.let {
annotateByKtType(it.type, ktType, it, modifierList)
}
@@ -90,7 +90,8 @@ internal class SymbolLightParameterForReceiver private constructor(
val psiType = ktType.asPsiTypeElement(
this,
allowErrorTypes = true,
ktType.typeMappingMode()
ktType.typeMappingMode(),
suppressWildcards = receiver.suppressWildcard() ?: method.suppressWildcards(),
)?.let {
annotateByKtType(it.type, ktType, it, modifierList)
}
@@ -44,6 +44,10 @@ import java.util.*
internal fun <L : Any> L.invalidAccess(): Nothing =
error("Cls delegate shouldn't be accessed for symbol light classes! Qualified name: ${javaClass.name}")
context(KtAnalysisSession)
internal fun KtDeclarationSymbol.getContainingSymbolsWithSelf(): Sequence<KtDeclarationSymbol> =
generateSequence(this) { it.getContainingSymbol() }
internal fun KtAnalysisSession.mapType(
type: KtType,
psiContext: PsiElement,
@@ -13,10 +13,10 @@ public final class Inv /* Inv*/<E> {
public final class JvmWildcardAnnotationsKt /* JvmWildcardAnnotationsKt*/ {
@kotlin.jvm.JvmSuppressWildcards(suppress = false)
@org.jetbrains.annotations.NotNull()
public static final Out<Open> bar();// bar()
public static final Out<? extends Open> bar();// bar()
@kotlin.jvm.JvmSuppressWildcards(suppress = false)
public static final int foo(boolean, @org.jetbrains.annotations.NotNull() Out<java.lang.Integer>);// foo(boolean, Out<java.lang.Integer>)
public static final int foo(boolean, @org.jetbrains.annotations.NotNull() Out<? extends java.lang.Integer>);// foo(boolean, Out<? extends java.lang.Integer>)
@kotlin.jvm.JvmSuppressWildcards(suppress = true)
@org.jetbrains.annotations.NotNull()
@@ -27,10 +27,10 @@ public final class JvmWildcardAnnotationsKt /* JvmWildcardAnnotationsKt*/ {
public static final Out<T> foo2();// foo2()
@kotlin.jvm.JvmSuppressWildcards(suppress = true)
public static final int bar(boolean, @org.jetbrains.annotations.NotNull() In<? super java.lang.Long>, long);// bar(boolean, In<? super java.lang.Long>, long)
public static final int bar(boolean, @org.jetbrains.annotations.NotNull() In<java.lang.Long>, long);// bar(boolean, In<java.lang.Long>, long)
@kotlin.jvm.JvmSuppressWildcards(suppress = true)
public static final void deepOpen(@org.jetbrains.annotations.NotNull() Out<? extends Out<? extends Out<? extends Open>>>);// deepOpen(Out<? extends Out<? extends Out<? extends Open>>>)
public static final void deepOpen(@org.jetbrains.annotations.NotNull() Out<Out<Out<Open>>>);// deepOpen(Out<Out<Out<Open>>>)
@org.jetbrains.annotations.NotNull()
public static final OutPair<Final, OutPair<Out<Final>, Out<Final>>> falseTrueFalse();// falseTrueFalse()
@@ -13,19 +13,19 @@ public abstract interface B /* B*/ {
public final class Container /* Container*/ {
@kotlin.jvm.JvmSuppressWildcards(suppress = false)
@org.jetbrains.annotations.NotNull()
public final Out<Open> bar();// bar()
public final Out<? extends Open> bar();// bar()
@kotlin.jvm.JvmSuppressWildcards(suppress = false)
public final int foo(boolean, @org.jetbrains.annotations.NotNull() Out<java.lang.Integer>);// foo(boolean, Out<java.lang.Integer>)
public final int foo(boolean, @org.jetbrains.annotations.NotNull() Out<? extends java.lang.Integer>);// foo(boolean, Out<? extends java.lang.Integer>)
@kotlin.jvm.JvmSuppressWildcards(suppress = true)
public final int bar(boolean, @org.jetbrains.annotations.NotNull() In<? super java.lang.Long>, long);// bar(boolean, In<? super java.lang.Long>, long)
public final int bar(boolean, @org.jetbrains.annotations.NotNull() In<java.lang.Long>, long);// bar(boolean, In<java.lang.Long>, long)
@kotlin.jvm.JvmSuppressWildcards(suppress = true)
public final void deepOpen(@org.jetbrains.annotations.NotNull() Out<? extends Out<? extends Out<? extends Open>>>);// deepOpen(Out<? extends Out<? extends Out<? extends Open>>>)
public final void deepOpen(@org.jetbrains.annotations.NotNull() Out<Out<Out<Open>>>);// deepOpen(Out<Out<Out<Open>>>)
@kotlin.jvm.JvmSuppressWildcards(suppress = true)
public final void zoo(@org.jetbrains.annotations.NotNull() Out<? extends Out<? extends Out<? extends Open>>>, @org.jetbrains.annotations.NotNull() Out<? extends Open>);// zoo(Out<? extends Out<? extends Out<? extends Open>>>, Out<? extends Open>)
public final void zoo(@org.jetbrains.annotations.NotNull() Out<Out<Out<Open>>>, @org.jetbrains.annotations.NotNull() Out<? extends Open>);// zoo(Out<Out<Out<Open>>>, Out<? extends Open>)
@org.jetbrains.annotations.NotNull()
public final OutPair<Final, OutPair<Out<Final>, Out<Final>>> falseTrueFalse();// falseTrueFalse()
@@ -60,10 +60,10 @@ public final class ContainerForPropertyAndAccessors /* ContainerForPropertyAndAc
public final Out<? extends Final> getSimpleOut();// getSimpleOut()
@org.jetbrains.annotations.NotNull()
public final Out<? extends Open> getZoo(@org.jetbrains.annotations.NotNull() Out<? extends Out<? extends Out<? extends Open>>>);// getZoo(Out<? extends Out<? extends Out<? extends Open>>>)
public final Out<Open> getBar();// getBar()
@org.jetbrains.annotations.NotNull()
public final Out<Open> getBar();// getBar()
public final Out<Open> getZoo(@org.jetbrains.annotations.NotNull() Out<? extends Out<? extends Out<? extends Open>>>);// getZoo(Out<? extends Out<? extends Out<? extends Open>>>)
@org.jetbrains.annotations.NotNull()
public final Out<Out<Out<Open>>> getDeepOpen();// getDeepOpen()
@@ -81,7 +81,7 @@ public final class Final /* Final*/ {
public final class HasAnnotation /* HasAnnotation*/ {
public HasAnnotation();// .ctor()
public final void doesNot(@org.jetbrains.annotations.NotNull() Out<? extends Out<? extends Open>>);// doesNot(Out<? extends Out<? extends Open>>)
public final void doesNot(@org.jetbrains.annotations.NotNull() Out<Out<Open>>);// doesNot(Out<Out<Open>>)
public final void parameterDisagrees(@org.jetbrains.annotations.NotNull() Out<java.lang.Integer>);// parameterDisagrees(Out<java.lang.Integer>)
}