[FIR] CustomAnnotationTypeAttribute: support type aliases
^KTIJ-23547 ^KTIJ-24141
This commit is contained in:
committed by
Space Team
parent
0e2967e520
commit
73cdaf5c3c
+6
@@ -106,6 +106,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends
|
|||||||
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt");
|
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("typeAnnotationsWithTypeAlias.kt")
|
||||||
|
public void testTypeAnnotationsWithTypeAlias() throws Exception {
|
||||||
|
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
@TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/contracts")
|
@TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/contracts")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+4
-1
@@ -81,6 +81,9 @@ private fun ConeKotlinType.customAnnotationsWithLazyResolve(phase: FirResolvePha
|
|||||||
val custom = attributes.custom ?: return emptyList()
|
val custom = attributes.custom ?: return emptyList()
|
||||||
val annotations = custom.annotations.ifEmpty { return emptyList() }
|
val annotations = custom.annotations.ifEmpty { return emptyList() }
|
||||||
|
|
||||||
custom.containerSymbol?.lazyResolveToPhase(phase)
|
for (containerSymbol in custom.containerSymbols) {
|
||||||
|
containerSymbol.lazyResolveToPhase(phase)
|
||||||
|
}
|
||||||
|
|
||||||
return annotations
|
return annotations
|
||||||
}
|
}
|
||||||
|
|||||||
+6
@@ -106,6 +106,12 @@ public class FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends
|
|||||||
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt");
|
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("typeAnnotationsWithTypeAlias.kt")
|
||||||
|
public void testTypeAnnotationsWithTypeAlias() throws Exception {
|
||||||
|
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
@TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/contracts")
|
@TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/contracts")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+6
@@ -106,6 +106,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated e
|
|||||||
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt");
|
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/setterWithAnnotations.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("typeAnnotationsWithTypeAlias.kt")
|
||||||
|
public void testTypeAnnotationsWithTypeAlias() throws Exception {
|
||||||
|
runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/typeAnnotationsWithTypeAlias.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
@TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/contracts")
|
@TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/contracts")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
fun foo(): @Anno3 @Anno2 @Anno1 BaseInterface
|
||||||
+33
@@ -0,0 +1,33 @@
|
|||||||
|
KtFunctionSymbol:
|
||||||
|
annotationsList: []
|
||||||
|
callableIdIfNonLocal: /foo
|
||||||
|
contextReceivers: []
|
||||||
|
contractEffects: []
|
||||||
|
hasStableParameterNames: true
|
||||||
|
isBuiltinFunctionInvoke: false
|
||||||
|
isExtension: false
|
||||||
|
isExternal: false
|
||||||
|
isInfix: false
|
||||||
|
isInline: false
|
||||||
|
isOperator: false
|
||||||
|
isOverride: false
|
||||||
|
isStatic: false
|
||||||
|
isSuspend: false
|
||||||
|
modality: FINAL
|
||||||
|
name: foo
|
||||||
|
origin: SOURCE
|
||||||
|
receiverParameter: null
|
||||||
|
returnType: [
|
||||||
|
Anno3()
|
||||||
|
psi: KtAnnotationEntry
|
||||||
|
Anno2()
|
||||||
|
psi: KtAnnotationEntry
|
||||||
|
Anno1()
|
||||||
|
psi: KtAnnotationEntry
|
||||||
|
] @R|Anno3|() @R|Anno2|() @R|Anno1|() @R|Anno3|() SecondTypeAlias
|
||||||
|
symbolKind: TOP_LEVEL
|
||||||
|
typeParameters: []
|
||||||
|
valueParameters: []
|
||||||
|
visibility: Public
|
||||||
|
getContainingModule: KtSourceModule "Sources of main"
|
||||||
|
deprecationStatus: null
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1
|
||||||
|
// PRETTY_RENDERER_OPTION: FULLY_EXPANDED_TYPES
|
||||||
|
@Target(AnnotationTarget.TYPE)
|
||||||
|
annotation class Anno1
|
||||||
|
@Target(AnnotationTarget.TYPE)
|
||||||
|
annotation class Anno2
|
||||||
|
@Target(AnnotationTarget.TYPE)
|
||||||
|
annotation class Anno3
|
||||||
|
|
||||||
|
interface BaseInterface
|
||||||
|
|
||||||
|
typealias FirstTypeAlias = @Anno1 BaseInterface
|
||||||
|
typealias SecondTypeAlias = @Anno2 FirstTypeAlias
|
||||||
|
|
||||||
|
fun f<caret>oo(): @Anno3 SecondTypeAlias {
|
||||||
|
|
||||||
|
}
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
fun foo(): @Anno1 @Anno2 @Anno3 BaseInterface
|
||||||
+33
@@ -0,0 +1,33 @@
|
|||||||
|
KtFunctionSymbol:
|
||||||
|
annotationsList: []
|
||||||
|
callableIdIfNonLocal: /foo
|
||||||
|
contextReceivers: []
|
||||||
|
contractEffects: []
|
||||||
|
hasStableParameterNames: true
|
||||||
|
isBuiltinFunctionInvoke: false
|
||||||
|
isExtension: false
|
||||||
|
isExternal: false
|
||||||
|
isInfix: false
|
||||||
|
isInline: false
|
||||||
|
isOperator: false
|
||||||
|
isOverride: false
|
||||||
|
isStatic: false
|
||||||
|
isSuspend: false
|
||||||
|
modality: FINAL
|
||||||
|
name: foo
|
||||||
|
origin: SOURCE
|
||||||
|
receiverParameter: null
|
||||||
|
returnType: [
|
||||||
|
Anno1()
|
||||||
|
psi: KtAnnotationEntry
|
||||||
|
Anno2()
|
||||||
|
psi: KtAnnotationEntry
|
||||||
|
Anno3()
|
||||||
|
psi: KtAnnotationEntry
|
||||||
|
] @R|Anno1|() @R|Anno2|() @R|Anno3|() BaseInterface
|
||||||
|
symbolKind: TOP_LEVEL
|
||||||
|
typeParameters: []
|
||||||
|
valueParameters: []
|
||||||
|
visibility: Public
|
||||||
|
getContainingModule: KtSourceModule "Sources of main"
|
||||||
|
deprecationStatus: null
|
||||||
+2
-9
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -8,21 +8,17 @@ package org.jetbrains.kotlin.fir.resolve.transformers
|
|||||||
import kotlinx.collections.immutable.PersistentList
|
import kotlinx.collections.immutable.PersistentList
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
import kotlinx.collections.immutable.toPersistentList
|
import kotlinx.collections.immutable.toPersistentList
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType
|
import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
|
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isData
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
|
import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||||
import org.jetbrains.kotlin.fir.extensions.FirSupertypeGenerationExtension
|
import org.jetbrains.kotlin.fir.extensions.FirSupertypeGenerationExtension
|
||||||
import org.jetbrains.kotlin.fir.extensions.extensionService
|
import org.jetbrains.kotlin.fir.extensions.extensionService
|
||||||
import org.jetbrains.kotlin.fir.extensions.supertypeGenerators
|
import org.jetbrains.kotlin.fir.extensions.supertypeGenerators
|
||||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.*
|
import org.jetbrains.kotlin.fir.resolve.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.isLocalClassOrAnonymousObject
|
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.isLocalClassOrAnonymousObject
|
||||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeTypeParameterSupertype
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeTypeParameterSupertype
|
||||||
@@ -36,16 +32,13 @@ import org.jetbrains.kotlin.fir.scopes.impl.wrapNestedClassifierScopeWithSubstit
|
|||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
|
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
|
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
import org.jetbrains.kotlin.fir.visitors.transformSingle
|
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.StandardClassIds
|
|
||||||
import org.jetbrains.kotlin.types.model.TypeArgumentMarker
|
import org.jetbrains.kotlin.types.model.TypeArgumentMarker
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
|
|
||||||
@@ -368,7 +361,7 @@ open class FirSupertypeResolverVisitor(
|
|||||||
val resolvedTypesRefs = transformer.withFile(useSiteFile) {
|
val resolvedTypesRefs = transformer.withFile(useSiteFile) {
|
||||||
resolveSuperTypeRefs(
|
resolveSuperTypeRefs(
|
||||||
transformer,
|
transformer,
|
||||||
ScopeClassDeclaration(scopes, classDeclarationsStack)
|
ScopeClassDeclaration(scopes, classDeclarationsStack, classLikeDeclaration),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+7
-2
@@ -13,15 +13,20 @@ import kotlin.reflect.KClass
|
|||||||
|
|
||||||
class CustomAnnotationTypeAttribute(
|
class CustomAnnotationTypeAttribute(
|
||||||
val annotations: List<FirAnnotation>,
|
val annotations: List<FirAnnotation>,
|
||||||
val containerSymbol: FirBasedSymbol<out FirDeclaration>? = null,
|
val containerSymbols: List<FirBasedSymbol<out FirDeclaration>> = emptyList(),
|
||||||
) : ConeAttribute<CustomAnnotationTypeAttribute>() {
|
) : ConeAttribute<CustomAnnotationTypeAttribute>() {
|
||||||
|
constructor(annotations: List<FirAnnotation>, containerSymbol: FirBasedSymbol<out FirDeclaration>?) : this(
|
||||||
|
annotations,
|
||||||
|
listOfNotNull(containerSymbol),
|
||||||
|
)
|
||||||
|
|
||||||
override fun union(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute? = null
|
override fun union(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute? = null
|
||||||
|
|
||||||
override fun intersect(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute? = null
|
override fun intersect(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute? = null
|
||||||
|
|
||||||
override fun add(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute {
|
override fun add(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute {
|
||||||
if (other == null || other === this) return this
|
if (other == null || other === this) return this
|
||||||
return CustomAnnotationTypeAttribute(annotations + other.annotations, containerSymbol)
|
return CustomAnnotationTypeAttribute(annotations + other.annotations, containerSymbols + other.containerSymbols)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun isSubtypeOf(other: CustomAnnotationTypeAttribute?): Boolean = true
|
override fun isSubtypeOf(other: CustomAnnotationTypeAttribute?): Boolean = true
|
||||||
|
|||||||
Reference in New Issue
Block a user