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.*
import org.jetbrains.kotlin.analysis.api.annotations.KtKClassAnnotationValue.KtNonLocalKClassAnnotationValue import org.jetbrains.kotlin.analysis.api.annotations.KtKClassAnnotationValue.KtNonLocalKClassAnnotationValue
import org.jetbrains.kotlin.analysis.api.components.buildClassType 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.KtFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol 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.builtins.StandardNames
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase 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.ClassId
import org.jetbrains.kotlin.name.JvmStandardClassIds import org.jetbrains.kotlin.name.JvmStandardClassIds
import org.jetbrains.kotlin.name.JvmStandardClassIds.JVM_OVERLOADS_CLASS_ID 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) 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( internal fun KtAnnotatedSymbol.findAnnotation(
classId: ClassId, classId: ClassId,
useSiteTargetFilter: AnnotationUseSiteTargetFilter = AnyAnnotationUseSiteTargetFilter, useSiteTargetFilter: AnnotationUseSiteTargetFilter = AnyAnnotationUseSiteTargetFilter,
@@ -80,6 +80,7 @@ internal class SymbolLightFieldForProperty private constructor(
this@SymbolLightFieldForProperty, this@SymbolLightFieldForProperty,
allowErrorTypes = true, allowErrorTypes = true,
typeMappingMode, typeMappingMode,
suppressWildcards = propertySymbol.suppressWildcardMode(),
) )
} ?: nonExistentType() } ?: nonExistentType()
} }
@@ -269,12 +269,20 @@ internal class SymbolLightAccessorMethod private constructor(
allowErrorTypes = true, allowErrorTypes = true,
typeMappingMode, typeMappingMode,
containingClass.isAnnotationType, containingClass.isAnnotationType,
suppressWildcards(),
) )
} ?: nonExistentType() } ?: nonExistentType()
} }
override fun getReturnType(): PsiType = _returnedType override fun getReturnType(): PsiType = _returnedType
override fun suppressWildcards(): Boolean? =
withAccessorSymbol { accessorSymbol ->
accessorSymbol.suppressWildcardMode { parent ->
parent !is KtPropertySymbol
}
}
override fun isEquivalentTo(another: PsiElement?): Boolean { override fun isEquivalentTo(another: PsiElement?): Boolean {
return super.isEquivalentTo(another) || basicIsEquivalentTo(this, another as? PsiField) 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.asJava.elements.KtLightIdentifier
import org.jetbrains.kotlin.light.classes.symbol.annotations.computeThrowsList 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.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.SymbolLightClassBase
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForInterfaceDefaultImpls import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForInterfaceDefaultImpls
import org.jetbrains.kotlin.light.classes.symbol.compareSymbolPointers 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 hashCode(): Int = kotlinOrigin.hashCode()
override fun suppressWildcards(): Boolean? =
withFunctionSymbol { functionSymbol ->
functionSymbol.suppressWildcardMode()
}
} }
@@ -134,4 +134,6 @@ internal abstract class SymbolLightMethodBase(
} }
abstract fun isOverride(): Boolean abstract fun isOverride(): Boolean
internal open fun suppressWildcards(): Boolean? = null
} }
@@ -234,6 +234,7 @@ internal class SymbolLightSimpleMethod(
allowErrorTypes = true, allowErrorTypes = true,
typeMappingMode, typeMappingMode,
this@SymbolLightSimpleMethod.containingClass.isAnnotationType, this@SymbolLightSimpleMethod.containingClass.isAnnotationType,
suppressWildcards = suppressWildcards(),
)?.let { )?.let {
annotateByKtType(it.type, ktType, it, modifierList) 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.builtins.StandardNames
import org.jetbrains.kotlin.light.classes.symbol.* import org.jetbrains.kotlin.light.classes.symbol.*
import org.jetbrains.kotlin.light.classes.symbol.annotations.annotateByKtType 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.light.classes.symbol.methods.SymbolLightMethodBase
import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtParameter
@@ -80,7 +81,8 @@ internal abstract class SymbolLightParameterCommon(
ktType.asPsiTypeElement( ktType.asPsiTypeElement(
this@SymbolLightParameterCommon, this@SymbolLightParameterCommon,
allowErrorTypes = true, allowErrorTypes = true,
ktType.typeMappingMode() ktType.typeMappingMode(),
suppressWildcards = parameterSymbol.suppressWildcardMode(),
)?.let { )?.let {
annotateByKtType(it.type, ktType, it, modifierList) annotateByKtType(it.type, ktType, it, modifierList)
} }
@@ -90,7 +90,8 @@ internal class SymbolLightParameterForReceiver private constructor(
val psiType = ktType.asPsiTypeElement( val psiType = ktType.asPsiTypeElement(
this, this,
allowErrorTypes = true, allowErrorTypes = true,
ktType.typeMappingMode() ktType.typeMappingMode(),
suppressWildcards = receiver.suppressWildcard() ?: method.suppressWildcards(),
)?.let { )?.let {
annotateByKtType(it.type, ktType, it, modifierList) annotateByKtType(it.type, ktType, it, modifierList)
} }
@@ -44,6 +44,10 @@ import java.util.*
internal fun <L : Any> L.invalidAccess(): Nothing = internal fun <L : Any> L.invalidAccess(): Nothing =
error("Cls delegate shouldn't be accessed for symbol light classes! Qualified name: ${javaClass.name}") 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( internal fun KtAnalysisSession.mapType(
type: KtType, type: KtType,
psiContext: PsiElement, psiContext: PsiElement,
@@ -13,10 +13,10 @@ public final class Inv /* Inv*/<E> {
public final class JvmWildcardAnnotationsKt /* JvmWildcardAnnotationsKt*/ { public final class JvmWildcardAnnotationsKt /* JvmWildcardAnnotationsKt*/ {
@kotlin.jvm.JvmSuppressWildcards(suppress = false) @kotlin.jvm.JvmSuppressWildcards(suppress = false)
@org.jetbrains.annotations.NotNull() @org.jetbrains.annotations.NotNull()
public static final Out<Open> bar();// bar() public static final Out<? extends Open> bar();// bar()
@kotlin.jvm.JvmSuppressWildcards(suppress = false) @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) @kotlin.jvm.JvmSuppressWildcards(suppress = true)
@org.jetbrains.annotations.NotNull() @org.jetbrains.annotations.NotNull()
@@ -27,10 +27,10 @@ public final class JvmWildcardAnnotationsKt /* JvmWildcardAnnotationsKt*/ {
public static final Out<T> foo2();// foo2() public static final Out<T> foo2();// foo2()
@kotlin.jvm.JvmSuppressWildcards(suppress = true) @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) @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() @org.jetbrains.annotations.NotNull()
public static final OutPair<Final, OutPair<Out<Final>, Out<Final>>> falseTrueFalse();// falseTrueFalse() 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*/ { public final class Container /* Container*/ {
@kotlin.jvm.JvmSuppressWildcards(suppress = false) @kotlin.jvm.JvmSuppressWildcards(suppress = false)
@org.jetbrains.annotations.NotNull() @org.jetbrains.annotations.NotNull()
public final Out<Open> bar();// bar() public final Out<? extends Open> bar();// bar()
@kotlin.jvm.JvmSuppressWildcards(suppress = false) @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) @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) @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) @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() @org.jetbrains.annotations.NotNull()
public final OutPair<Final, OutPair<Out<Final>, Out<Final>>> falseTrueFalse();// falseTrueFalse() 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() public final Out<? extends Final> getSimpleOut();// getSimpleOut()
@org.jetbrains.annotations.NotNull() @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() @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() @org.jetbrains.annotations.NotNull()
public final Out<Out<Out<Open>>> getDeepOpen();// getDeepOpen() public final Out<Out<Out<Open>>> getDeepOpen();// getDeepOpen()
@@ -81,7 +81,7 @@ public final class Final /* Final*/ {
public final class HasAnnotation /* HasAnnotation*/ { public final class HasAnnotation /* HasAnnotation*/ {
public HasAnnotation();// .ctor() 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>) public final void parameterDisagrees(@org.jetbrains.annotations.NotNull() Out<java.lang.Integer>);// parameterDisagrees(Out<java.lang.Integer>)
} }