[FIR] Get rid of FirAnnotatedDeclaration

Now all fir declarations have annotations

^KT-49260 Fixed
This commit is contained in:
Dmitriy Novozhilov
2021-10-27 13:03:08 +03:00
committed by TeamCityServer
parent 0eb2d117ef
commit 4490f64666
69 changed files with 282 additions and 336 deletions
@@ -5,12 +5,16 @@
package org.jetbrains.kotlin.analysis.api.fir.renderer
import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions
import org.jetbrains.kotlin.analysis.api.components.RendererModifier
import org.jetbrains.kotlin.analysis.api.fir.types.PublicTypeApproximator
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.PsiSourceNavigator.getRawName
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
@@ -18,10 +22,6 @@ import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions
import org.jetbrains.kotlin.analysis.api.components.RendererModifier
import org.jetbrains.kotlin.analysis.api.fir.types.PublicTypeApproximator
import org.jetbrains.kotlin.fir.analysis.checkers.PsiSourceNavigator.getRawName
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.renderer.render
@@ -37,7 +37,7 @@ internal class FirIdeRenderer private constructor(
private val typeIdeRenderer: ConeTypeIdeRenderer = ConeTypeIdeRenderer(session, options.typeRendererOptions)
private fun StringBuilder.renderAnnotations(annotated: FirAnnotatedDeclaration) {
private fun StringBuilder.renderAnnotations(annotated: FirDeclaration) {
if (RendererModifier.ANNOTATIONS in options.modifiers) {
renderAnnotations(typeIdeRenderer, annotated.annotations, session)
}
@@ -8,31 +8,31 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.annotations
import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.resolved
import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny
import org.jetbrains.kotlin.fir.declarations.resolved
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.name.ClassId
internal fun FirAnnotation.getClassId(session: FirSession): ClassId? =
coneClassLikeType?.fullyExpandedType(session)?.classId
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.toAnnotationsList() = withFir { fir ->
internal fun FirRefWithValidityCheck<FirDeclaration>.toAnnotationsList() = withFir { fir ->
fir.annotations.map { KtFirAnnotationCall(this, it) }
}
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.containsAnnotation(classId: ClassId): Boolean =
internal fun FirRefWithValidityCheck<FirDeclaration>.containsAnnotation(classId: ClassId): Boolean =
withFirByType(ResolveType.AnnotationType) { fir ->
fir.annotations.any { it.getClassId(fir.moduleData.session) == classId }
}
internal fun FirRefWithValidityCheck<FirAnnotatedDeclaration>.getAnnotationClassIds(): Collection<ClassId> =
internal fun FirRefWithValidityCheck<FirDeclaration>.getAnnotationClassIds(): Collection<ClassId> =
withFirByType(ResolveType.AnnotationType) { fir ->
fir.annotations.mapNotNull { it.getClassId(fir.moduleData.session) }
}
@@ -5,7 +5,10 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.providers
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
@@ -25,10 +28,10 @@ internal class FirIdeBuiltinsAndCloneableSessionProvider(override val symbolProv
override fun getFirFilesByPackage(fqName: FqName): List<FirFile> = emptyList()
@FirProviderInternals
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) = shouldNotBeCalled()
override fun recordGeneratedClass(owner: FirDeclaration, klass: FirRegularClass) = shouldNotBeCalled()
@FirProviderInternals
override fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration) = shouldNotBeCalled()
override fun recordGeneratedMember(owner: FirDeclaration, klass: FirDeclaration) = shouldNotBeCalled()
override fun getClassNamesInPackage(fqName: FqName): Set<Name> = shouldNotBeCalled()
@@ -5,7 +5,10 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.providers
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
@@ -27,10 +30,10 @@ internal class FirIdeLibrariesSessionProvider(
override fun getFirFilesByPackage(fqName: FqName): List<FirFile> = emptyList()
@FirProviderInternals
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) = shouldNotBeCalled()
override fun recordGeneratedClass(owner: FirDeclaration, klass: FirRegularClass) = shouldNotBeCalled()
@FirProviderInternals
override fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration) = shouldNotBeCalled()
override fun recordGeneratedMember(owner: FirDeclaration, klass: FirDeclaration) = shouldNotBeCalled()
override fun getClassNamesInPackage(fqName: FqName): Set<Name> = shouldNotBeCalled()
@@ -14,7 +14,10 @@ import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.NoMutableState
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.originalForSubstitutionOverride
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
@@ -88,12 +91,12 @@ internal class FirIdeProvider(
@FirProviderInternals
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) {
override fun recordGeneratedClass(owner: FirDeclaration, klass: FirRegularClass) {
TODO()
}
@FirProviderInternals
override fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration) {
override fun recordGeneratedMember(owner: FirDeclaration, klass: FirDeclaration) {
TODO()
}
@@ -5,16 +5,16 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.transformers
import org.jetbrains.kotlin.analysis.low.level.api.fir.FirPhaseRunner
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDeclarationDesignationWithFile
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveTreeBuilder
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ensurePhase
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.FirAnnotationArgumentsResolveTransformer
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.analysis.low.level.api.fir.FirPhaseRunner
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirDeclarationDesignationWithFile
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveTreeBuilder
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ensurePhase
internal class FirDesignatedAnnotationArgumentsResolveTransformerForIDE(
private val designation: FirDeclarationDesignationWithFile,
@@ -67,11 +67,9 @@ internal class FirDesignatedAnnotationArgumentsResolveTransformerForIDE(
}
override fun ensureResolved(declaration: FirDeclaration) {
if (declaration is FirAnnotatedDeclaration) {
val unresolvedAnnotation = declaration.annotations.firstOrNull { it.annotationTypeRef !is FirResolvedTypeRef }
check(unresolvedAnnotation == null) {
"Unexpected annotationTypeRef annotation, expected resolvedType but actual ${unresolvedAnnotation?.annotationTypeRef}"
}
val unresolvedAnnotation = declaration.annotations.firstOrNull { it.annotationTypeRef !is FirResolvedTypeRef }
check(unresolvedAnnotation == null) {
"Unexpected annotationTypeRef annotation, expected resolvedType but actual ${unresolvedAnnotation?.annotationTypeRef}"
}
when (declaration) {
is FirSimpleFunction, is FirConstructor, is FirAnonymousInitializer ->
@@ -69,7 +69,6 @@ fun main(args: Array<String>) {
alias<FirConstructor>("ConstructorChecker")
alias<FirFile>("FileChecker")
alias<FirTypeParameter>("FirTypeParameterChecker")
alias<FirAnnotatedDeclaration>("FirAnnotatedDeclarationChecker")
alias<FirTypeAlias>("TypeAliasChecker")
alias<FirAnonymousFunction>("AnonymousFunctionChecker")
alias<FirPropertyAccessor>("PropertyAccessorChecker")
@@ -14,13 +14,9 @@ object JvmDeclarationCheckers : DeclarationCheckers() {
FirJvmExternalDeclarationChecker,
FirJvmNameChecker,
FirJvmDefaultChecker,
FirJvmFunctionDelegateMemberNameClashChecker
)
override val annotatedDeclarationCheckers: Set<FirAnnotatedDeclarationChecker>
get() = setOf(
FirJvmFunctionDelegateMemberNameClashChecker,
FirJvmStaticChecker,
FirRepeatableAnnotationChecker
FirRepeatableAnnotationChecker,
)
override val classCheckers: Set<FirClassChecker>
@@ -7,13 +7,13 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration
import org.jetbrains.kotlin.config.JvmDefaultMode
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.context.findClosest
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.jvm.checkers.isCompiledToJvmDefault
import org.jetbrains.kotlin.fir.analysis.jvm.checkers.isJvm6
import org.jetbrains.kotlin.fir.containingClass
@@ -22,57 +22,54 @@ import org.jetbrains.kotlin.fir.declarations.utils.isInterface
import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.java.jvmDefaultModeState
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions
import org.jetbrains.kotlin.fir.scopes.impl.FirClassUseSiteMemberScope
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionCallableSymbol
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_CLASS_ID
import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_NO_COMPATIBILITY_CLASS_ID
object FirJvmDefaultChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
val jvmDefaultMode = context.session.jvmDefaultModeState
var defaultAnnotation: FirAnnotation? = null
val containingDeclaration = context.findClosest<FirClassLikeDeclaration>()
if (declaration is FirAnnotatedDeclaration) {
val isJvm6 = context.isJvm6()
defaultAnnotation = declaration.getAnnotationByClassId(JVM_DEFAULT_CLASS_ID)
val isJvm6 = context.isJvm6()
val defaultAnnotation = declaration.getAnnotationByClassId(JVM_DEFAULT_CLASS_ID)
if (defaultAnnotation != null) {
if (containingDeclaration !is FirClass || !containingDeclaration.isInterface) {
reporter.reportOn(defaultAnnotation.source, FirJvmErrors.JVM_DEFAULT_NOT_IN_INTERFACE, context)
return
} else if (isJvm6) {
reporter.reportOn(defaultAnnotation.source, FirJvmErrors.JVM_DEFAULT_IN_JVM6_TARGET, "JvmDefault", context)
if (defaultAnnotation != null) {
if (containingDeclaration !is FirClass || !containingDeclaration.isInterface) {
reporter.reportOn(defaultAnnotation.source, FirJvmErrors.JVM_DEFAULT_NOT_IN_INTERFACE, context)
return
} else if (isJvm6) {
reporter.reportOn(defaultAnnotation.source, FirJvmErrors.JVM_DEFAULT_IN_JVM6_TARGET, "JvmDefault", context)
return
} else if (!jvmDefaultMode.isEnabled) {
reporter.reportOn(defaultAnnotation.source, FirJvmErrors.JVM_DEFAULT_IN_DECLARATION, "JvmDefault", context)
return
}
} else {
val annotation = declaration.getAnnotationByClassId(JVM_DEFAULT_NO_COMPATIBILITY_CLASS_ID)
if (annotation != null) {
if (isJvm6) {
reporter.reportOn(
annotation.source,
FirJvmErrors.JVM_DEFAULT_IN_JVM6_TARGET,
"JvmDefaultWithoutCompatibility",
context
)
return
} else if (!jvmDefaultMode.isEnabled) {
reporter.reportOn(defaultAnnotation.source, FirJvmErrors.JVM_DEFAULT_IN_DECLARATION, "JvmDefault", context)
reporter.reportOn(
annotation.source,
FirJvmErrors.JVM_DEFAULT_IN_DECLARATION,
"JvmDefaultWithoutCompatibility",
context
)
return
}
} else {
val annotation = declaration.getAnnotationByClassId(JVM_DEFAULT_NO_COMPATIBILITY_CLASS_ID)
if (annotation != null) {
if (isJvm6) {
reporter.reportOn(
annotation.source,
FirJvmErrors.JVM_DEFAULT_IN_JVM6_TARGET,
"JvmDefaultWithoutCompatibility",
context
)
return
} else if (!jvmDefaultMode.isEnabled) {
reporter.reportOn(
annotation.source,
FirJvmErrors.JVM_DEFAULT_IN_DECLARATION,
"JvmDefaultWithoutCompatibility",
context
)
return
}
}
}
}
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isInline
import org.jetbrains.kotlin.fir.declarations.utils.isOpen
@@ -28,10 +28,6 @@ object FirJvmNameChecker : FirBasicDeclarationChecker() {
private val NAME = Name.identifier("name")
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration !is FirAnnotatedDeclaration) {
return
}
val jvmName = declaration.findJvmNameAnnotation() ?: return
val name = jvmName.findArgumentByName(NAME) ?: return
@@ -60,7 +56,7 @@ object FirJvmNameChecker : FirBasicDeclarationChecker() {
}
}
private fun FirAnnotatedDeclaration.findJvmNameAnnotation(): FirAnnotation? {
private fun FirDeclaration.findJvmNameAnnotation(): FirAnnotation? {
return annotations.firstOrNull {
it.annotationTypeRef.coneType.classId == StandardClassIds.Annotations.JvmName
}
@@ -11,12 +11,12 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.isInterface
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.classKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirAnnotatedDeclarationChecker
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
@@ -31,8 +31,8 @@ import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
object FirJvmStaticChecker : FirAnnotatedDeclarationChecker() {
override fun check(declaration: FirAnnotatedDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
object FirJvmStaticChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration is FirConstructor) {
// WRONG_DECLARATION_TARGET
return
@@ -48,7 +48,7 @@ object FirJvmStaticChecker : FirAnnotatedDeclarationChecker() {
checkAnnotated(declaration, context, reporter, declaration.source)
}
fun checkIfAnnotated(it: FirAnnotatedDeclaration) {
fun checkIfAnnotated(it: FirDeclaration) {
if (!it.hasAnnotation(StandardClassIds.Annotations.JvmStatic)) {
return
}
@@ -63,7 +63,7 @@ object FirJvmStaticChecker : FirAnnotatedDeclarationChecker() {
}
private fun checkAnnotated(
declaration: FirAnnotatedDeclaration,
declaration: FirDeclaration,
context: CheckerContext,
reporter: DiagnosticReporter,
targetSource: KtSourceElement?,
@@ -113,7 +113,7 @@ object FirJvmStaticChecker : FirAnnotatedDeclarationChecker() {
}
private fun checkForInterface(
declaration: FirAnnotatedDeclaration,
declaration: FirDeclaration,
context: CheckerContext,
reporter: DiagnosticReporter,
targetSource: KtSourceElement?,
@@ -195,7 +195,7 @@ object FirJvmStaticChecker : FirAnnotatedDeclarationChecker() {
}
private fun checkStaticOnConstOrJvmField(
declaration: FirAnnotatedDeclaration,
declaration: FirDeclaration,
context: CheckerContext,
reporter: DiagnosticReporter,
targetSource: KtSourceElement?,
@@ -239,11 +239,11 @@ object FirJvmStaticChecker : FirAnnotatedDeclarationChecker() {
private fun FirClassLikeSymbol<*>.isCompanion() = safeAs<FirRegularClassSymbol>()?.isCompanion == true
private fun FirAnnotatedDeclaration.hasAnnotationNamedAs(classId: ClassId): Boolean {
private fun FirDeclaration.hasAnnotationNamedAs(classId: ClassId): Boolean {
return findAnnotation(classId) != null
}
private fun FirAnnotatedDeclaration.findAnnotation(classId: ClassId): FirAnnotation? {
private fun FirDeclaration.findAnnotation(classId: ClassId): FirAnnotation? {
return annotations.firstOrNull {
it.annotationTypeRef.coneType.classId == classId
}
@@ -5,20 +5,19 @@
package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration
//import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.containsRepeatableAnnotation
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirAnnotatedDeclarationChecker
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
import org.jetbrains.kotlin.fir.analysis.checkers.getAllowedAnnotationTargets
import org.jetbrains.kotlin.fir.analysis.checkers.getAnnotationRetention
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.diagnostics.withSuppressedDiagnostics
import org.jetbrains.kotlin.fir.analysis.jvm.checkers.isJvm6
import org.jetbrains.kotlin.fir.declarations.*
@@ -37,10 +36,10 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.StandardClassIds
object FirRepeatableAnnotationChecker : FirAnnotatedDeclarationChecker() {
object FirRepeatableAnnotationChecker : FirBasicDeclarationChecker() {
private val REPEATABLE_ANNOTATION_CONTAINER_NAME = Name.identifier(JvmAbi.REPEATABLE_ANNOTATION_CONTAINER_NAME)
override fun check(declaration: FirAnnotatedDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
val annotationsMap = hashMapOf<ConeKotlinType, MutableList<AnnotationUseSiteTarget?>>()
val session = context.session
@@ -33,8 +33,6 @@ class ComposedDeclarationCheckers : DeclarationCheckers() {
get() = _fileCheckers
override val typeParameterCheckers: Set<FirTypeParameterChecker>
get() = _typeParameterCheckers
override val annotatedDeclarationCheckers: Set<FirAnnotatedDeclarationChecker>
get() = _annotatedDeclarationCheckers
override val typeAliasCheckers: Set<FirTypeAliasChecker>
get() = _typeAliasCheckers
override val anonymousFunctionCheckers: Set<FirAnonymousFunctionChecker>
@@ -65,7 +63,6 @@ class ComposedDeclarationCheckers : DeclarationCheckers() {
private val _constructorCheckers: MutableSet<FirConstructorChecker> = mutableSetOf()
private val _fileCheckers: MutableSet<FirFileChecker> = mutableSetOf()
private val _typeParameterCheckers: MutableSet<FirTypeParameterChecker> = mutableSetOf()
private val _annotatedDeclarationCheckers: MutableSet<FirAnnotatedDeclarationChecker> = mutableSetOf()
private val _typeAliasCheckers: MutableSet<FirTypeAliasChecker> = mutableSetOf()
private val _anonymousFunctionCheckers: MutableSet<FirAnonymousFunctionChecker> = mutableSetOf()
private val _propertyAccessorCheckers: MutableSet<FirPropertyAccessorChecker> = mutableSetOf()
@@ -88,7 +85,6 @@ class ComposedDeclarationCheckers : DeclarationCheckers() {
_constructorCheckers += checkers.constructorCheckers
_fileCheckers += checkers.fileCheckers
_typeParameterCheckers += checkers.typeParameterCheckers
_annotatedDeclarationCheckers += checkers.annotatedDeclarationCheckers
_typeAliasCheckers += checkers.typeAliasCheckers
_anonymousFunctionCheckers += checkers.anonymousFunctionCheckers
_propertyAccessorCheckers += checkers.propertyAccessorCheckers
@@ -28,7 +28,6 @@ abstract class DeclarationCheckers {
open val constructorCheckers: Set<FirConstructorChecker> = emptySet()
open val fileCheckers: Set<FirFileChecker> = emptySet()
open val typeParameterCheckers: Set<FirTypeParameterChecker> = emptySet()
open val annotatedDeclarationCheckers: Set<FirAnnotatedDeclarationChecker> = emptySet()
open val typeAliasCheckers: Set<FirTypeAliasChecker> = emptySet()
open val anonymousFunctionCheckers: Set<FirAnonymousFunctionChecker> = emptySet()
open val propertyAccessorCheckers: Set<FirPropertyAccessorChecker> = emptySet()
@@ -42,21 +41,20 @@ abstract class DeclarationCheckers {
open val variableAssignmentCfaBasedCheckers: Set<AbstractFirPropertyInitializationChecker> = emptySet()
@CheckersComponentInternal internal val allBasicDeclarationCheckers: Set<FirBasicDeclarationChecker> by lazy { basicDeclarationCheckers }
@CheckersComponentInternal internal val allFunctionCheckers: Set<FirFunctionChecker> by lazy { functionCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allSimpleFunctionCheckers: Set<FirSimpleFunctionChecker> by lazy { simpleFunctionCheckers + functionCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allPropertyCheckers: Set<FirPropertyChecker> by lazy { propertyCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allClassCheckers: Set<FirClassChecker> by lazy { classCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allRegularClassCheckers: Set<FirRegularClassChecker> by lazy { regularClassCheckers + classCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allConstructorCheckers: Set<FirConstructorChecker> by lazy { constructorCheckers + functionCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allFileCheckers: Set<FirFileChecker> by lazy { fileCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allTypeParameterCheckers: Set<FirTypeParameterChecker> by lazy { typeParameterCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allAnnotatedDeclarationCheckers: Set<FirAnnotatedDeclarationChecker> by lazy { annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allTypeAliasCheckers: Set<FirTypeAliasChecker> by lazy { typeAliasCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allAnonymousFunctionCheckers: Set<FirAnonymousFunctionChecker> by lazy { anonymousFunctionCheckers + functionCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allPropertyAccessorCheckers: Set<FirPropertyAccessorChecker> by lazy { propertyAccessorCheckers + functionCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allBackingFieldCheckers: Set<FirBackingFieldChecker> by lazy { backingFieldCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allValueParameterCheckers: Set<FirValueParameterChecker> by lazy { valueParameterCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allEnumEntryCheckers: Set<FirEnumEntryChecker> by lazy { enumEntryCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allAnonymousObjectCheckers: Set<FirAnonymousObjectChecker> by lazy { anonymousObjectCheckers + classCheckers + annotatedDeclarationCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allFunctionCheckers: Set<FirFunctionChecker> by lazy { functionCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allSimpleFunctionCheckers: Set<FirSimpleFunctionChecker> by lazy { simpleFunctionCheckers + functionCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allPropertyCheckers: Set<FirPropertyChecker> by lazy { propertyCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allClassCheckers: Set<FirClassChecker> by lazy { classCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allRegularClassCheckers: Set<FirRegularClassChecker> by lazy { regularClassCheckers + classCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allConstructorCheckers: Set<FirConstructorChecker> by lazy { constructorCheckers + functionCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allFileCheckers: Set<FirFileChecker> by lazy { fileCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allTypeParameterCheckers: Set<FirTypeParameterChecker> by lazy { typeParameterCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allTypeAliasCheckers: Set<FirTypeAliasChecker> by lazy { typeAliasCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allAnonymousFunctionCheckers: Set<FirAnonymousFunctionChecker> by lazy { anonymousFunctionCheckers + functionCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allPropertyAccessorCheckers: Set<FirPropertyAccessorChecker> by lazy { propertyAccessorCheckers + functionCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allBackingFieldCheckers: Set<FirBackingFieldChecker> by lazy { backingFieldCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allValueParameterCheckers: Set<FirValueParameterChecker> by lazy { valueParameterCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allEnumEntryCheckers: Set<FirEnumEntryChecker> by lazy { enumEntryCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allAnonymousObjectCheckers: Set<FirAnonymousObjectChecker> by lazy { anonymousObjectCheckers + classCheckers + basicDeclarationCheckers }
@CheckersComponentInternal internal val allAnonymousInitializerCheckers: Set<FirAnonymousInitializerChecker> by lazy { anonymousInitializerCheckers + basicDeclarationCheckers }
}
@@ -10,7 +10,6 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration
* DO NOT MODIFY IT MANUALLY
*/
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
@@ -38,7 +37,6 @@ typealias FirRegularClassChecker = FirDeclarationChecker<FirRegularClass>
typealias FirConstructorChecker = FirDeclarationChecker<FirConstructor>
typealias FirFileChecker = FirDeclarationChecker<FirFile>
typealias FirTypeParameterChecker = FirDeclarationChecker<FirTypeParameter>
typealias FirAnnotatedDeclarationChecker = FirDeclarationChecker<FirAnnotatedDeclaration>
typealias FirTypeAliasChecker = FirDeclarationChecker<FirTypeAlias>
typealias FirAnonymousFunctionChecker = FirDeclarationChecker<FirAnonymousFunction>
typealias FirPropertyAccessorChecker = FirDeclarationChecker<FirPropertyAccessor>
@@ -30,6 +30,9 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
FirInvalidAndDangerousCharactersChecker,
FirAmbiguousAnonymousTypeChecker,
FirExplicitApiDeclarationChecker,
FirAnnotationChecker,
FirPublishedApiChecker,
FirOptInMarkedDeclarationChecker,
)
override val functionCheckers: Set<FirFunctionChecker>
@@ -138,13 +141,6 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
FirTypeParameterSyntaxChecker,
)
override val annotatedDeclarationCheckers: Set<FirAnnotatedDeclarationChecker>
get() = setOf(
FirAnnotationChecker,
FirPublishedApiChecker,
FirOptInMarkedDeclarationChecker,
)
override val typeAliasCheckers: Set<FirTypeAliasChecker>
get() = setOf(
FirTopLevelTypeAliasChecker,
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.fir.analysis.checkers
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
@@ -15,8 +14,8 @@ import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.context.findClosest
import org.jetbrains.kotlin.fir.analysis.diagnostics.withSuppressedDiagnostics
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.withSuppressedDiagnostics
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor
import org.jetbrains.kotlin.fir.expressions.*
@@ -80,11 +79,11 @@ fun FirClassLikeSymbol<*>.getAllowedAnnotationTargets(): Set<KotlinTarget> {
}
}
fun FirAnnotatedDeclaration.getRetentionAnnotation(): FirAnnotation? {
fun FirDeclaration.getRetentionAnnotation(): FirAnnotation? {
return getAnnotationByClassId(StandardClassIds.Annotations.Retention)
}
fun FirAnnotatedDeclaration.getTargetAnnotation(): FirAnnotation? {
fun FirDeclaration.getTargetAnnotation(): FirAnnotation? {
return getAnnotationByClassId(StandardClassIds.Annotations.Target)
}
@@ -5,18 +5,20 @@
package org.jetbrains.kotlin.fir.analysis.checkers
import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.builtins.StandardNames.HASHCODE_NAME
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
import org.jetbrains.kotlin.diagnostics.*
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.*
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.getChild
import org.jetbrains.kotlin.fir.containingClass
import org.jetbrains.kotlin.fir.containingClassForLocalAttr
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -38,6 +40,7 @@ import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.unwrapFakeOverrides
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.psi.KtParameter.VAL_VAR_TOKEN_SET
@@ -370,7 +373,7 @@ private fun lowerThanBound(context: ConeInferenceContext, argument: ConeKotlinTy
}
fun FirMemberDeclaration.isInlineOnly(): Boolean =
isInline && (this as FirAnnotatedDeclaration).hasAnnotation(INLINE_ONLY_ANNOTATION_CLASS_ID)
isInline && hasAnnotation(INLINE_ONLY_ANNOTATION_CLASS_ID)
fun isSubtypeForTypeMismatch(context: ConeInferenceContext, subtype: ConeKotlinType, supertype: ConeKotlinType): Boolean {
val subtypeFullyExpanded = subtype.fullyExpandedType(context.session)
@@ -40,7 +40,7 @@ private data class FirSinceKotlinValue(
val wasExperimentalMarkerClasses: List<FirRegularClassSymbol>
)
fun FirAnnotatedDeclaration.checkSinceKotlinVersionAccessibility(context: CheckerContext): FirSinceKotlinAccessibility {
fun FirDeclaration.checkSinceKotlinVersionAccessibility(context: CheckerContext): FirSinceKotlinAccessibility {
val value = getOwnSinceKotlinVersion(context.session)
val version = value?.apiVersion
val languageVersionSettings = context.session.languageVersionSettings
@@ -59,11 +59,11 @@ fun FirAnnotatedDeclaration.checkSinceKotlinVersionAccessibility(context: Checke
return FirSinceKotlinAccessibility.NotAccessible(version)
}
private fun FirAnnotatedDeclaration.getOwnSinceKotlinVersion(session: FirSession): FirSinceKotlinValue? {
private fun FirDeclaration.getOwnSinceKotlinVersion(session: FirSession): FirSinceKotlinValue? {
var result: FirSinceKotlinValue? = null
// TODO: use-site targeted annotations
fun FirAnnotatedDeclaration.consider() {
fun FirDeclaration.consider() {
val sinceKotlinSingleArgument = getAnnotationByClassId(StandardClassIds.Annotations.SinceKotlin)?.findArgumentByName(StandardClassIds.Annotations.ParameterNames.sinceKotlinVersion)
val apiVersion = ((sinceKotlinSingleArgument as? FirConstExpression<*>)?.value as? String)?.let(ApiVersion.Companion::parse)
if (apiVersion != null) {
@@ -96,7 +96,7 @@ private fun FirAnnotatedDeclaration.getOwnSinceKotlinVersion(session: FirSession
return result
}
private fun FirAnnotatedDeclaration.loadWasExperimentalMarkerClasses(): List<FirRegularClassSymbol> {
private fun FirDeclaration.loadWasExperimentalMarkerClasses(): List<FirRegularClassSymbol> {
val wasExperimental = getAnnotationByClassId(OptInNames.WAS_EXPERIMENTAL_CLASS_ID) ?: return emptyList()
val annotationClasses = wasExperimental.findArgumentByName(OptInNames.WAS_EXPERIMENTAL_ANNOTATION_CLASS) ?: return emptyList()
return annotationClasses.extractClassesFromArgument()
@@ -16,7 +16,8 @@ import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.analysis.checkers.*
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.context.findClosest
import org.jetbrains.kotlin.fir.analysis.diagnostics.*
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.withSuppressedDiagnostics
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.hasBackingField
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
@@ -31,12 +32,12 @@ import org.jetbrains.kotlin.fir.types.customAnnotations
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.StandardClassIds
object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
object FirAnnotationChecker : FirBasicDeclarationChecker() {
private val deprecatedClassId = FqName("kotlin.Deprecated")
private val deprecatedSinceKotlinClassId = FqName("kotlin.DeprecatedSinceKotlin")
override fun check(
declaration: FirAnnotatedDeclaration,
declaration: FirDeclaration,
context: CheckerContext,
reporter: DiagnosticReporter
) {
@@ -75,7 +76,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
}
private fun checkAnnotationTarget(
declaration: FirAnnotatedDeclaration,
declaration: FirDeclaration,
annotation: FirAnnotation,
context: CheckerContext,
reporter: DiagnosticReporter
@@ -124,7 +125,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
}
private fun checkAnnotationUseSiteTarget(
annotated: FirAnnotatedDeclaration,
annotated: FirDeclaration,
annotation: FirAnnotation,
target: AnnotationUseSiteTarget,
context: CheckerContext,
@@ -14,13 +14,13 @@ import org.jetbrains.kotlin.fir.analysis.checkers.getAllowedAnnotationTargets
import org.jetbrains.kotlin.fir.analysis.checkers.getAnnotationClassForOptInMarker
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.withSuppressedDiagnostics
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
object FirOptInMarkedDeclarationChecker : FirAnnotatedDeclarationChecker() {
override fun check(declaration: FirAnnotatedDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
object FirOptInMarkedDeclarationChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
for (annotation in declaration.annotations) {
val annotationClass = annotation.getAnnotationClassForOptInMarker(context.session) ?: continue
withSuppressedDiagnostics(annotation, context) {
@@ -43,4 +43,4 @@ object FirOptInMarkedDeclarationChecker : FirAnnotatedDeclarationChecker() {
}
}
}
}
}
@@ -6,19 +6,19 @@
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.name.StandardClassIds
object FirPublishedApiChecker : FirAnnotatedDeclarationChecker() {
override fun check(declaration: FirAnnotatedDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
object FirPublishedApiChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration !is FirMemberDeclaration) return
if (declaration is FirValueParameter) return
if (declaration.visibility == Visibilities.Internal) return
@@ -6,17 +6,14 @@
package org.jetbrains.kotlin.fir.analysis.checkers.expression
import org.jetbrains.kotlin.config.AnalysisFlags
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.analysis.checkers.*
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.findArgumentByName
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
@@ -27,14 +24,14 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.processDirectlyOverriddenFunctions
import org.jetbrains.kotlin.fir.scopes.processDirectlyOverriddenProperties
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.ensureResolved
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.checkers.OptInNames
import org.jetbrains.kotlin.utils.SmartSet
@@ -57,10 +54,10 @@ object FirOptInUsageBaseChecker {
fun FirBasedSymbol<*>.loadExperimentalitiesFromAnnotationTo(session: FirSession, result: MutableCollection<Experimentality>) {
ensureResolved(FirResolvePhase.STATUS)
@OptIn(SymbolInternals::class)
(fir as? FirAnnotatedDeclaration)?.loadExperimentalitiesFromAnnotationTo(session, result)
fir.loadExperimentalitiesFromAnnotationTo(session, result)
}
private fun FirAnnotatedDeclaration.loadExperimentalitiesFromAnnotationTo(
private fun FirDeclaration.loadExperimentalitiesFromAnnotationTo(
session: FirSession,
result: MutableCollection<Experimentality>
) {
@@ -104,12 +101,12 @@ object FirOptInUsageBaseChecker {
private fun FirBasedSymbol<*>.loadExperimentalities(
context: CheckerContext,
knownExperimentalities: SmartSet<Experimentality>?,
visited: MutableSet<FirAnnotatedDeclaration>,
visited: MutableSet<FirDeclaration>,
fromSetter: Boolean,
dispatchReceiverType: ConeKotlinType?,
): Set<Experimentality> {
ensureResolved(FirResolvePhase.STATUS)
val fir = this.fir as? FirAnnotatedDeclaration ?: return emptySet()
val fir = this.fir
if (!visited.add(fir)) return emptySet()
val result = knownExperimentalities ?: SmartSet.create()
val session = context.session
@@ -176,7 +173,7 @@ object FirOptInUsageBaseChecker {
private fun ConeKotlinType?.addExperimentalities(
context: CheckerContext,
result: SmartSet<Experimentality>,
visited: MutableSet<FirAnnotatedDeclaration> = mutableSetOf()
visited: MutableSet<FirDeclaration> = mutableSetOf()
) {
if (this !is ConeClassLikeType) return
lookupTag.toSymbol(context.session)?.loadExperimentalities(
@@ -87,7 +87,7 @@ class FirSignatureEnhancement(
return enhancements.getOrPut(property) { enhance(property, name) } as FirVariableSymbol<*>
}
private fun FirAnnotatedDeclaration.computeDefaultQualifiers() =
private fun FirDeclaration.computeDefaultQualifiers() =
typeQualifierResolver.extractAndMergeDefaultQualifiers(contextQualifiers, annotations)
private fun enhance(
@@ -97,7 +97,7 @@ private val USE_SITE_TARGET_NAME_MAP = mapOf(
private val DEFAULT_USE_SITE_TARGETS: Set<AnnotationUseSiteTarget> =
USE_SITE_TARGET_NAME_MAP.values.fold(setOf<AnnotationUseSiteTarget>()) { a, b -> a + b } - setOf(AnnotationUseSiteTarget.FILE)
fun FirAnnotatedDeclaration.hasAnnotation(classId: ClassId): Boolean {
fun FirDeclaration.hasAnnotation(classId: ClassId): Boolean {
return annotations.any { it.toAnnotationClassId() == classId }
}
@@ -7,7 +7,10 @@ package org.jetbrains.kotlin.fir.resolve.providers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.name.ClassId
@@ -42,10 +45,10 @@ abstract class FirProvider : FirSessionComponent {
abstract fun getFirFilesByPackage(fqName: FqName): List<FirFile>
@FirProviderInternals
abstract fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass)
abstract fun recordGeneratedClass(owner: FirDeclaration, klass: FirRegularClass)
@FirProviderInternals
abstract fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration)
abstract fun recordGeneratedMember(owner: FirDeclaration, klass: FirDeclaration)
abstract fun getClassNamesInPackage(fqName: FqName): Set<Name>
}
@@ -11,7 +11,7 @@ import kotlinx.collections.immutable.PersistentList
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.NoMutableState
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.extensions.predicate.*
import org.jetbrains.kotlin.fir.resolve.fqName
@@ -25,11 +25,11 @@ abstract class FirPredicateBasedProvider : FirSessionComponent {
}
abstract fun getSymbolsByPredicate(predicate: DeclarationPredicate): List<FirBasedSymbol<*>>
abstract fun getOwnersOfDeclaration(declaration: FirAnnotatedDeclaration): List<FirBasedSymbol<*>>?
abstract fun getOwnersOfDeclaration(declaration: FirDeclaration): List<FirBasedSymbol<*>>?
abstract fun fileHasPluginAnnotations(file: FirFile): Boolean
abstract fun matches(predicate: DeclarationPredicate, declaration: FirAnnotatedDeclaration): Boolean
abstract fun matches(predicate: DeclarationPredicate, declaration: FirDeclaration): Boolean
fun matches(predicates: List<DeclarationPredicate>, declaration: FirAnnotatedDeclaration): Boolean {
fun matches(predicates: List<DeclarationPredicate>, declaration: FirDeclaration): Boolean {
return predicates.any { matches(it, declaration) }
}
}
@@ -52,7 +52,7 @@ class FirPredicateBasedProviderImpl(private val session: FirSession) : FirPredic
return file in cache.filesWithPluginAnnotations
}
fun registerAnnotatedDeclaration(declaration: FirAnnotatedDeclaration, owners: PersistentList<FirAnnotatedDeclaration>) {
fun registerAnnotatedDeclaration(declaration: FirDeclaration, owners: PersistentList<FirDeclaration>) {
cache.ownersForDeclaration[declaration] = owners
registerOwnersDeclarations(declaration, owners)
@@ -66,11 +66,11 @@ class FirPredicateBasedProviderImpl(private val session: FirSession) : FirPredic
cache.filesWithPluginAnnotations += file
}
override fun getOwnersOfDeclaration(declaration: FirAnnotatedDeclaration): List<FirBasedSymbol<*>>? {
override fun getOwnersOfDeclaration(declaration: FirDeclaration): List<FirBasedSymbol<*>>? {
return cache.ownersForDeclaration[declaration]?.map { it.symbol }
}
private fun registerOwnersDeclarations(declaration: FirAnnotatedDeclaration, owners: PersistentList<FirAnnotatedDeclaration>) {
private fun registerOwnersDeclarations(declaration: FirDeclaration, owners: PersistentList<FirDeclaration>) {
val lastOwner = owners.lastOrNull() ?: return
val annotationsFromLastOwner = cache.annotationsOfDeclaration[lastOwner]
val annotationsFromPreviousOwners = cache.parentAnnotationsOfDeclaration[lastOwner]
@@ -82,53 +82,53 @@ class FirPredicateBasedProviderImpl(private val session: FirSession) : FirPredic
// ---------------------------------- Matching ----------------------------------
override fun matches(predicate: DeclarationPredicate, declaration: FirAnnotatedDeclaration): Boolean {
override fun matches(predicate: DeclarationPredicate, declaration: FirDeclaration): Boolean {
return predicate.accept(matcher, declaration)
}
private val matcher = Matcher()
private inner class Matcher : DeclarationPredicateVisitor<Boolean, FirAnnotatedDeclaration>() {
override fun visitPredicate(predicate: DeclarationPredicate, data: FirAnnotatedDeclaration): Boolean {
private inner class Matcher : DeclarationPredicateVisitor<Boolean, FirDeclaration>() {
override fun visitPredicate(predicate: DeclarationPredicate, data: FirDeclaration): Boolean {
throw IllegalStateException("Should not be there")
}
override fun visitAny(predicate: DeclarationPredicate.Any, data: FirAnnotatedDeclaration): Boolean {
override fun visitAny(predicate: DeclarationPredicate.Any, data: FirDeclaration): Boolean {
return true
}
override fun visitAnd(predicate: DeclarationPredicate.And, data: FirAnnotatedDeclaration): Boolean {
override fun visitAnd(predicate: DeclarationPredicate.And, data: FirDeclaration): Boolean {
return predicate.a.accept(this, data) && predicate.b.accept(this, data)
}
override fun visitOr(predicate: DeclarationPredicate.Or, data: FirAnnotatedDeclaration): Boolean {
override fun visitOr(predicate: DeclarationPredicate.Or, data: FirDeclaration): Boolean {
return predicate.a.accept(this, data) || predicate.b.accept(this, data)
}
override fun visitAnnotatedWith(predicate: AnnotatedWith, data: FirAnnotatedDeclaration): Boolean {
override fun visitAnnotatedWith(predicate: AnnotatedWith, data: FirDeclaration): Boolean {
return matchWith(data, predicate.annotations)
}
override fun visitUnderAnnotatedWith(predicate: UnderAnnotatedWith, data: FirAnnotatedDeclaration): Boolean {
override fun visitUnderAnnotatedWith(predicate: UnderAnnotatedWith, data: FirDeclaration): Boolean {
return matchUnder(data, predicate.annotations)
}
override fun visitAnnotatedWithMeta(predicate: AnnotatedWithMeta, data: FirAnnotatedDeclaration): Boolean {
override fun visitAnnotatedWithMeta(predicate: AnnotatedWithMeta, data: FirDeclaration): Boolean {
return matchWith(data, predicate.userDefinedAnnotations)
}
override fun visitUnderMetaAnnotated(predicate: UnderMetaAnnotated, data: FirAnnotatedDeclaration): Boolean {
override fun visitUnderMetaAnnotated(predicate: UnderMetaAnnotated, data: FirDeclaration): Boolean {
return matchUnder(data, predicate.userDefinedAnnotations)
}
private val MetaAnnotated.userDefinedAnnotations: Set<AnnotationFqn>
get() = metaAnnotations.flatMapTo(mutableSetOf()) { registeredPluginAnnotations.getAnnotationsWithMetaAnnotation(it) }
private fun matchWith(declaration: FirAnnotatedDeclaration, annotations: Set<AnnotationFqn>): Boolean {
private fun matchWith(declaration: FirDeclaration, annotations: Set<AnnotationFqn>): Boolean {
return cache.annotationsOfDeclaration[declaration].any { it in annotations }
}
private fun matchUnder(declaration: FirAnnotatedDeclaration, annotations: Set<AnnotationFqn>): Boolean {
private fun matchUnder(declaration: FirDeclaration, annotations: Set<AnnotationFqn>): Boolean {
return cache.parentAnnotationsOfDeclaration[declaration].any { it in annotations }
}
}
@@ -136,13 +136,13 @@ class FirPredicateBasedProviderImpl(private val session: FirSession) : FirPredic
// ---------------------------------- Cache ----------------------------------
private class Cache {
val declarationByAnnotation: Multimap<AnnotationFqn, FirAnnotatedDeclaration> = LinkedHashMultimap.create()
val annotationsOfDeclaration: LinkedHashMultimap<FirAnnotatedDeclaration, AnnotationFqn> = LinkedHashMultimap.create()
val declarationByAnnotation: Multimap<AnnotationFqn, FirDeclaration> = LinkedHashMultimap.create()
val annotationsOfDeclaration: LinkedHashMultimap<FirDeclaration, AnnotationFqn> = LinkedHashMultimap.create()
val declarationsUnderAnnotated: Multimap<AnnotationFqn, FirAnnotatedDeclaration> = LinkedHashMultimap.create()
val parentAnnotationsOfDeclaration: LinkedHashMultimap<FirAnnotatedDeclaration, AnnotationFqn> = LinkedHashMultimap.create()
val declarationsUnderAnnotated: Multimap<AnnotationFqn, FirDeclaration> = LinkedHashMultimap.create()
val parentAnnotationsOfDeclaration: LinkedHashMultimap<FirDeclaration, AnnotationFqn> = LinkedHashMultimap.create()
val ownersForDeclaration: MutableMap<FirAnnotatedDeclaration, PersistentList<FirAnnotatedDeclaration>> = mutableMapOf()
val ownersForDeclaration: MutableMap<FirDeclaration, PersistentList<FirDeclaration>> = mutableMapOf()
val filesWithPluginAnnotations: MutableSet<FirFile> = mutableSetOf()
}
@@ -22,11 +22,11 @@ abstract class FirStatusTransformerExtension(session: FirSession) : FirPredicate
final override val extensionType: KClass<out FirExtension> = FirStatusTransformerExtension::class
abstract fun needTransformStatus(declaration: FirAnnotatedDeclaration): Boolean
abstract fun needTransformStatus(declaration: FirDeclaration): Boolean
protected open fun transformStatus(
status: FirDeclarationStatus,
declaration: FirAnnotatedDeclaration
declaration: FirDeclaration
): FirDeclarationStatus {
return status
}
@@ -6,8 +6,8 @@
package org.jetbrains.kotlin.fir.resolve.inference
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.hasAnnotation
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
import org.jetbrains.kotlin.fir.expressions.FirResolvable
@@ -272,4 +272,4 @@ class FirStubTypeTransformer(
private val BUILDER_INFERENCE_ANNOTATION_CLASS_ID = ClassId.topLevel(BUILDER_INFERENCE_ANNOTATION_FQ_NAME)
fun FirElement.hasBuilderInferenceAnnotation(): Boolean =
(this as? FirAnnotatedDeclaration)?.hasAnnotation(BUILDER_INFERENCE_ANNOTATION_CLASS_ID) == true
(this as? FirDeclaration)?.hasAnnotation(BUILDER_INFERENCE_ANNOTATION_CLASS_ID) == true
@@ -5,7 +5,10 @@
package org.jetbrains.kotlin.fir.resolve.providers.impl
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
@@ -27,10 +30,10 @@ class FirLibrarySessionProvider(
override fun getFirFilesByPackage(fqName: FqName): List<FirFile> = emptyList()
@FirProviderInternals
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) = shouldNotBeCalled()
override fun recordGeneratedClass(owner: FirDeclaration, klass: FirRegularClass) = shouldNotBeCalled()
@FirProviderInternals
override fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration) = shouldNotBeCalled()
override fun recordGeneratedMember(owner: FirDeclaration, klass: FirDeclaration) = shouldNotBeCalled()
override fun getClassNamesInPackage(fqName: FqName): Set<Name> = shouldNotBeCalled()
@@ -78,16 +78,16 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: FirKotli
}
@FirProviderInternals
override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) {
override fun recordGeneratedClass(owner: FirDeclaration, klass: FirRegularClass) {
klass.accept(FirRecorder, FirRecorderData(state, owner.file, session.nameConflictsTracker))
}
@FirProviderInternals
override fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration) {
override fun recordGeneratedMember(owner: FirDeclaration, klass: FirDeclaration) {
klass.accept(FirRecorder, FirRecorderData(state, owner.file, session.nameConflictsTracker))
}
private val FirAnnotatedDeclaration.file: FirFile
private val FirDeclaration.file: FirFile
get() = when (this) {
is FirFile -> this
is FirRegularClass -> getFirClassifierContainerFile(this.symbol.classId)
@@ -220,7 +220,7 @@ class FirStatusResolver(
containingClass?.symbol?.toLookupTag(), forClass = declaration is FirClass
)
val effectiveVisibility = parentEffectiveVisibility.lowerBound(selfEffectiveVisibility, session.typeContext)
val annotations = ((containingProperty ?: declaration) as? FirAnnotatedDeclaration)?.annotations ?: emptyList()
val annotations = (containingProperty ?: declaration).annotations
val hasPublishedApiAnnotation = annotations.any {
it.typeRef.coneTypeSafe<ConeClassLikeType>()?.lookupTag?.classId == StandardClassIds.Annotations.PublishedApi
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.scopes.FirCompositeScope
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.createImportingScopes
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -31,18 +30,18 @@ internal abstract class FirAbstractAnnotationResolveTransformer<D, S>(
val state = beforeChildren(file)
file.transformDeclarations(this, data)
afterChildren(state)
return transformAnnotatedDeclaration(file, data) as FirFile
return transformDeclaration(file, data) as FirFile
}
override fun transformProperty(property: FirProperty, data: D): FirProperty {
return transformAnnotatedDeclaration(property, data) as FirProperty
return transformDeclaration(property, data) as FirProperty
}
override fun transformRegularClass(
regularClass: FirRegularClass,
data: D
): FirStatement {
return transformAnnotatedDeclaration(regularClass, data).also {
return transformDeclaration(regularClass, data).also {
val state = beforeChildren(regularClass)
regularClass.transformDeclarations(this, data)
regularClass.transformCompanionObject(this, data)
@@ -55,7 +54,7 @@ internal abstract class FirAbstractAnnotationResolveTransformer<D, S>(
simpleFunction: FirSimpleFunction,
data: D
): FirSimpleFunction {
return transformAnnotatedDeclaration(simpleFunction, data).also {
return transformDeclaration(simpleFunction, data).also {
val state = beforeChildren(simpleFunction)
simpleFunction.transformValueParameters(this, data)
afterChildren(state)
@@ -66,7 +65,7 @@ internal abstract class FirAbstractAnnotationResolveTransformer<D, S>(
constructor: FirConstructor,
data: D
): FirConstructor {
return transformAnnotatedDeclaration(constructor, data).also {
return transformDeclaration(constructor, data).also {
val state = beforeChildren(constructor)
constructor.transformValueParameters(this, data)
afterChildren(state)
@@ -77,22 +76,19 @@ internal abstract class FirAbstractAnnotationResolveTransformer<D, S>(
valueParameter: FirValueParameter,
data: D
): FirStatement {
return transformAnnotatedDeclaration(valueParameter, data) as FirStatement
return transformDeclaration(valueParameter, data) as FirStatement
}
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: D): FirTypeAlias {
return transformAnnotatedDeclaration(typeAlias, data) as FirTypeAlias
return transformDeclaration(typeAlias, data) as FirTypeAlias
}
override fun transformTypeRef(typeRef: FirTypeRef, data: D): FirTypeRef {
return transformAnnotationContainer(typeRef, data) as FirTypeRef
}
override fun transformAnnotatedDeclaration(
annotatedDeclaration: FirAnnotatedDeclaration,
data: D
): FirAnnotatedDeclaration {
return transformAnnotationContainer(annotatedDeclaration, data) as FirAnnotatedDeclaration
override fun transformDeclaration(declaration: FirDeclaration, data: D): FirDeclaration {
return transformAnnotationContainer(declaration, data) as FirDeclaration
}
override fun transformAnnotationContainer(
@@ -106,7 +102,7 @@ internal abstract class FirAbstractAnnotationResolveTransformer<D, S>(
return element
}
protected open fun beforeChildren(declaration: FirAnnotatedDeclaration): S? {
protected open fun beforeChildren(declaration: FirDeclaration): S? {
return null
}
@@ -12,7 +12,7 @@ import kotlinx.collections.immutable.persistentListOf
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
@@ -82,7 +82,7 @@ private class FirPartialImportResolveTransformer(
private class FirAnnotationResolveTransformer(
session: FirSession,
scopeSession: ScopeSession
) : FirAbstractAnnotationResolveTransformer<Multimap<AnnotationFqn, FirRegularClass>, PersistentList<FirAnnotatedDeclaration>>(session, scopeSession) {
) : FirAbstractAnnotationResolveTransformer<Multimap<AnnotationFqn, FirRegularClass>, PersistentList<FirDeclaration>>(session, scopeSession) {
private val predicateBasedProvider = session.predicateBasedProvider as FirPredicateBasedProviderImpl
var metaAnnotations: Set<AnnotationFqn> = emptySet()
@@ -91,16 +91,16 @@ private class FirAnnotationResolveTransformer(
errorTypeAsResolved = false
)
private var owners: PersistentList<FirAnnotatedDeclaration> = persistentListOf()
private var owners: PersistentList<FirDeclaration> = persistentListOf()
private val classDeclarationsStack = ArrayDeque<FirRegularClass>()
override fun beforeChildren(declaration: FirAnnotatedDeclaration): PersistentList<FirAnnotatedDeclaration> {
override fun beforeChildren(declaration: FirDeclaration): PersistentList<FirDeclaration> {
val current = owners
owners = owners.add(declaration)
return current
}
override fun afterChildren(state: PersistentList<FirAnnotatedDeclaration>?) {
override fun afterChildren(state: PersistentList<FirDeclaration>?) {
requireNotNull(state)
owners = state
}
@@ -135,12 +135,9 @@ private class FirAnnotationResolveTransformer(
}
}
override fun transformAnnotatedDeclaration(
annotatedDeclaration: FirAnnotatedDeclaration,
data: Multimap<AnnotationFqn, FirRegularClass>
): FirAnnotatedDeclaration {
return super.transformAnnotatedDeclaration(annotatedDeclaration, data).also {
predicateBasedProvider.registerAnnotatedDeclaration(annotatedDeclaration, owners)
override fun transformDeclaration(declaration: FirDeclaration, data: Multimap<AnnotationFqn, FirRegularClass>): FirDeclaration {
return super.transformDeclaration(declaration, data).also {
predicateBasedProvider.registerAnnotatedDeclaration(declaration, owners)
}
}
}
@@ -9,12 +9,12 @@ import com.google.common.collect.ArrayListMultimap
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirPluginKey
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
data class GeneratedClass(val klass: FirRegularClass, val owner: FirAnnotatedDeclaration)
data class GeneratedClass(val klass: FirRegularClass, val owner: FirDeclaration)
abstract class GeneratedClassIndex : FirSessionComponent {
companion object {
@@ -23,7 +23,7 @@ abstract class GeneratedClassIndex : FirSessionComponent {
}
}
abstract fun registerClass(klass: FirRegularClass, owner: FirAnnotatedDeclaration)
abstract fun registerClass(klass: FirRegularClass, owner: FirDeclaration)
abstract operator fun get(key: FirPluginKey): List<GeneratedClass>
}
@@ -33,7 +33,7 @@ val FirSession.generatedClassIndex: GeneratedClassIndex by FirSession.sessionCom
private class GeneratedClassIndexImpl : GeneratedClassIndex() {
private val index: ArrayListMultimap<FirPluginKey, GeneratedClass> = ArrayListMultimap.create()
override fun registerClass(klass: FirRegularClass, owner: FirAnnotatedDeclaration) {
override fun registerClass(klass: FirRegularClass, owner: FirDeclaration) {
val key = (klass.origin as FirDeclarationOrigin.Plugin).key
index.put(key, GeneratedClass(klass, owner))
}
@@ -1,39 +0,0 @@
/*
* Copyright 2010-2021 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.
*/
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.visitors.*
/*
* This file was generated automatically
* DO NOT MODIFY IT MANUALLY
*/
sealed class FirAnnotatedDeclaration : FirDeclaration(), FirAnnotationContainer {
abstract override val source: KtSourceElement?
abstract override val symbol: FirBasedSymbol<out FirDeclaration>
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
abstract override val origin: FirDeclarationOrigin
abstract override val attributes: FirDeclarationAttributes
abstract override val annotations: List<FirAnnotation>
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitAnnotatedDeclaration(this, data)
@Suppress("UNCHECKED_CAST")
override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformAnnotatedDeclaration(this, data) as E
abstract override fun replaceResolvePhase(newResolvePhase: FirResolvePhase)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnnotatedDeclaration
}
@@ -26,11 +26,11 @@ import org.jetbrains.kotlin.fir.visitors.*
abstract class FirAnonymousFunction : FirFunction(), FirTypeParametersOwner {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
abstract override val origin: FirDeclarationOrigin
abstract override val attributes: FirDeclarationAttributes
abstract override val annotations: List<FirAnnotation>
abstract override val status: FirDeclarationStatus
abstract override val returnTypeRef: FirTypeRef
abstract override val receiverTypeRef: FirTypeRef?
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousInitializerSymbol
@@ -20,6 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.*
abstract class FirAnonymousInitializer : FirDeclaration(), FirControlFlowGraphOwner {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
abstract override val origin: FirDeclarationOrigin
@@ -37,4 +39,6 @@ abstract class FirAnonymousInitializer : FirDeclaration(), FirControlFlowGraphOw
abstract override fun replaceResolvePhase(newResolvePhase: FirResolvePhase)
abstract override fun replaceControlFlowGraphReference(newControlFlowGraphReference: FirControlFlowGraphReference?)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnonymousInitializer
}
@@ -22,11 +22,11 @@ import org.jetbrains.kotlin.fir.visitors.*
sealed class FirCallableDeclaration : FirTypedDeclaration() {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
abstract override val origin: FirDeclarationOrigin
abstract override val attributes: FirDeclarationAttributes
abstract override val annotations: List<FirAnnotation>
abstract override val typeParameters: List<FirTypeParameterRef>
abstract override val status: FirDeclarationStatus
abstract override val returnTypeRef: FirTypeRef
@@ -20,11 +20,11 @@ import org.jetbrains.kotlin.fir.visitors.*
sealed class FirClassLikeDeclaration : FirMemberDeclaration(), FirStatement {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
abstract override val origin: FirDeclarationOrigin
abstract override val attributes: FirDeclarationAttributes
abstract override val annotations: List<FirAnnotation>
abstract override val typeParameters: List<FirTypeParameterRef>
abstract override val status: FirDeclarationStatus
abstract override val symbol: FirClassLikeSymbol<out FirClassLikeDeclaration>
@@ -6,9 +6,11 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirPureAbstractElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.visitors.*
@@ -17,8 +19,9 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY
*/
sealed class FirDeclaration : FirPureAbstractElement(), FirElement {
sealed class FirDeclaration : FirPureAbstractElement(), FirAnnotationContainer {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract val symbol: FirBasedSymbol<out FirDeclaration>
abstract val moduleData: FirModuleData
abstract val resolvePhase: FirResolvePhase
@@ -32,4 +35,6 @@ sealed class FirDeclaration : FirPureAbstractElement(), FirElement {
transformer.transformDeclaration(this, data) as E
abstract fun replaceResolvePhase(newResolvePhase: FirResolvePhase)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirDeclaration
}
@@ -26,11 +26,11 @@ import org.jetbrains.kotlin.fir.visitors.*
abstract class FirErrorFunction : FirFunction(), FirDiagnosticHolder {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
abstract override val origin: FirDeclarationOrigin
abstract override val attributes: FirDeclarationAttributes
abstract override val annotations: List<FirAnnotation>
abstract override val status: FirDeclarationStatus
abstract override val returnTypeRef: FirTypeRef
abstract override val receiverTypeRef: FirTypeRef?
@@ -18,13 +18,13 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirFile : FirAnnotatedDeclaration() {
abstract class FirFile : FirDeclaration() {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
abstract override val origin: FirDeclarationOrigin
abstract override val attributes: FirDeclarationAttributes
abstract override val annotations: List<FirAnnotation>
abstract val packageDirective: FirPackageDirective
abstract val imports: List<FirImport>
abstract val declarations: List<FirDeclaration>
@@ -26,11 +26,11 @@ import org.jetbrains.kotlin.fir.visitors.*
sealed class FirFunction : FirCallableDeclaration(), FirTargetElement, FirControlFlowGraphOwner, FirStatement {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
abstract override val origin: FirDeclarationOrigin
abstract override val attributes: FirDeclarationAttributes
abstract override val annotations: List<FirAnnotation>
abstract override val typeParameters: List<FirTypeParameterRef>
abstract override val status: FirDeclarationStatus
abstract override val returnTypeRef: FirTypeRef
@@ -17,14 +17,14 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY
*/
sealed class FirMemberDeclaration : FirAnnotatedDeclaration(), FirTypeParameterRefsOwner {
sealed class FirMemberDeclaration : FirDeclaration(), FirTypeParameterRefsOwner {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val symbol: FirBasedSymbol<out FirDeclaration>
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
abstract override val origin: FirDeclarationOrigin
abstract override val attributes: FirDeclarationAttributes
abstract override val annotations: List<FirAnnotation>
abstract override val typeParameters: List<FirTypeParameterRef>
abstract val status: FirDeclarationStatus
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY
*/
abstract class FirTypeParameter : FirTypeParameterRef, FirAnnotatedDeclaration() {
abstract class FirTypeParameter : FirTypeParameterRef, FirDeclaration() {
abstract override val source: KtSourceElement?
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
@@ -20,12 +20,12 @@ import org.jetbrains.kotlin.fir.visitors.*
sealed class FirTypedDeclaration : FirMemberDeclaration() {
abstract override val source: KtSourceElement?
abstract override val annotations: List<FirAnnotation>
abstract override val symbol: FirBasedSymbol<out FirDeclaration>
abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase
abstract override val origin: FirDeclarationOrigin
abstract override val attributes: FirDeclarationAttributes
abstract override val annotations: List<FirAnnotation>
abstract override val typeParameters: List<FirTypeParameterRef>
abstract override val status: FirDeclarationStatus
abstract val returnTypeRef: FirTypeRef
@@ -35,11 +35,11 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
@FirBuilderDsl
interface FirAbstractConstructorBuilder : FirFunctionBuilder {
abstract override var source: KtSourceElement?
abstract override val annotations: MutableList<FirAnnotation>
abstract override var moduleData: FirModuleData
abstract override var resolvePhase: FirResolvePhase
abstract override var origin: FirDeclarationOrigin
abstract override var attributes: FirDeclarationAttributes
abstract override val annotations: MutableList<FirAnnotation>
abstract override var status: FirDeclarationStatus
abstract override var returnTypeRef: FirTypeRef
abstract override var deprecation: DeprecationsPerUseSite?
@@ -42,10 +42,10 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
@FirBuilderDsl
class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBuilder {
override var source: KtSourceElement? = null
override val annotations: MutableList<FirAnnotation> = mutableListOf()
override lateinit var moduleData: FirModuleData
override lateinit var origin: FirDeclarationOrigin
override var attributes: FirDeclarationAttributes = FirDeclarationAttributes()
override val annotations: MutableList<FirAnnotation> = mutableListOf()
override lateinit var returnTypeRef: FirTypeRef
var receiverTypeRef: FirTypeRef? = null
override var deprecation: DeprecationsPerUseSite? = null
@@ -66,10 +66,10 @@ class FirAnonymousFunctionBuilder : FirFunctionBuilder, FirAnnotationContainerBu
override fun build(): FirAnonymousFunction {
return FirAnonymousFunctionImpl(
source,
annotations,
moduleData,
origin,
attributes,
annotations,
returnTypeRef,
receiverTypeRef,
deprecation,
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.declarations.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
@@ -15,6 +16,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.builder.FirDeclarationBuilder
import org.jetbrains.kotlin.fir.declarations.impl.FirAnonymousInitializerImpl
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousInitializerSymbol
@@ -26,7 +28,7 @@ import org.jetbrains.kotlin.fir.visitors.*
*/
@FirBuilderDsl
class FirAnonymousInitializerBuilder : FirDeclarationBuilder {
class FirAnonymousInitializerBuilder : FirDeclarationBuilder, FirAnnotationContainerBuilder {
override var source: KtSourceElement? = null
override lateinit var moduleData: FirModuleData
override var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
@@ -47,6 +49,9 @@ class FirAnonymousInitializerBuilder : FirDeclarationBuilder {
)
}
@Deprecated("Modification of 'annotations' has no impact for FirAnonymousInitializerBuilder", level = DeprecationLevel.HIDDEN)
override val annotations: MutableList<FirAnnotation> = mutableListOf()
}
@OptIn(ExperimentalContracts::class)
@@ -32,11 +32,11 @@ import org.jetbrains.kotlin.fir.visitors.*
@FirBuilderDsl
interface FirClassBuilder : FirDeclarationBuilder, FirAnnotationContainerBuilder {
abstract override var source: KtSourceElement?
abstract override val annotations: MutableList<FirAnnotation>
abstract override var moduleData: FirModuleData
abstract override var resolvePhase: FirResolvePhase
abstract override var origin: FirDeclarationOrigin
abstract override var attributes: FirDeclarationAttributes
abstract override val annotations: MutableList<FirAnnotation>
abstract val typeParameters: MutableList<FirTypeParameterRef>
abstract var status: FirDeclarationStatus
abstract var deprecation: DeprecationsPerUseSite?
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.visitors.*
/*
@@ -22,6 +23,7 @@ import org.jetbrains.kotlin.fir.visitors.*
@FirBuilderDsl
interface FirDeclarationBuilder {
abstract var source: KtSourceElement?
abstract val annotations: MutableList<FirAnnotation>
abstract var moduleData: FirModuleData
abstract var resolvePhase: FirResolvePhase
abstract var origin: FirDeclarationOrigin
@@ -39,11 +39,11 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
@FirBuilderDsl
class FirErrorFunctionBuilder : FirAnnotationContainerBuilder {
override var source: KtSourceElement? = null
override val annotations: MutableList<FirAnnotation> = mutableListOf()
lateinit var moduleData: FirModuleData
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
lateinit var origin: FirDeclarationOrigin
var attributes: FirDeclarationAttributes = FirDeclarationAttributes()
override val annotations: MutableList<FirAnnotation> = mutableListOf()
var deprecation: DeprecationsPerUseSite? = null
var containerSource: DeserializedContainerSource? = null
var dispatchReceiverType: ConeKotlinType? = null
@@ -54,11 +54,11 @@ class FirErrorFunctionBuilder : FirAnnotationContainerBuilder {
override fun build(): FirErrorFunction {
return FirErrorFunctionImpl(
source,
annotations,
moduleData,
resolvePhase,
origin,
attributes,
annotations,
deprecation,
containerSource,
dispatchReceiverType,
@@ -30,11 +30,11 @@ import org.jetbrains.kotlin.fir.visitors.*
@FirBuilderDsl
class FirFileBuilder : FirAnnotationContainerBuilder {
override var source: KtSourceElement? = null
override val annotations: MutableList<FirAnnotation> = mutableListOf()
lateinit var moduleData: FirModuleData
var resolvePhase: FirResolvePhase = FirResolvePhase.RAW_FIR
lateinit var origin: FirDeclarationOrigin
var attributes: FirDeclarationAttributes = FirDeclarationAttributes()
override val annotations: MutableList<FirAnnotation> = mutableListOf()
lateinit var packageDirective: FirPackageDirective
val imports: MutableList<FirImport> = mutableListOf()
val declarations: MutableList<FirDeclaration> = mutableListOf()
@@ -44,11 +44,11 @@ class FirFileBuilder : FirAnnotationContainerBuilder {
override fun build(): FirFile {
return FirFileImpl(
source,
annotations,
moduleData,
resolvePhase,
origin,
attributes,
annotations,
packageDirective,
imports,
declarations,
@@ -32,11 +32,11 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ
@FirBuilderDsl
interface FirFunctionBuilder : FirDeclarationBuilder, FirAnnotationContainerBuilder {
abstract override var source: KtSourceElement?
abstract override val annotations: MutableList<FirAnnotation>
abstract override var moduleData: FirModuleData
abstract override var resolvePhase: FirResolvePhase
abstract override var origin: FirDeclarationOrigin
abstract override var attributes: FirDeclarationAttributes
abstract override val annotations: MutableList<FirAnnotation>
abstract var status: FirDeclarationStatus
abstract var returnTypeRef: FirTypeRef
abstract var deprecation: DeprecationsPerUseSite?
@@ -35,10 +35,10 @@ import org.jetbrains.kotlin.fir.visitors.*
internal class FirAnonymousFunctionImpl(
override val source: KtSourceElement?,
override val annotations: MutableList<FirAnnotation>,
override val moduleData: FirModuleData,
override val origin: FirDeclarationOrigin,
override val attributes: FirDeclarationAttributes,
override val annotations: MutableList<FirAnnotation>,
override var returnTypeRef: FirTypeRef,
override var receiverTypeRef: FirTypeRef?,
override var deprecation: DeprecationsPerUseSite?,
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousInitializerSymbol
@@ -31,6 +32,7 @@ internal class FirAnonymousInitializerImpl(
override var body: FirBlock?,
override val symbol: FirAnonymousInitializerSymbol,
) : FirAnonymousInitializer() {
override val annotations: List<FirAnnotation> get() = emptyList()
override var controlFlowGraphReference: FirControlFlowGraphReference? = null
init {
@@ -48,6 +50,10 @@ internal class FirAnonymousInitializerImpl(
return this
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirAnonymousInitializerImpl {
return this
}
override fun replaceResolvePhase(newResolvePhase: FirResolvePhase) {
resolvePhase = newResolvePhase
}
@@ -34,12 +34,12 @@ import org.jetbrains.kotlin.fir.visitors.*
internal class FirErrorFunctionImpl(
override val source: KtSourceElement?,
override val annotations: MutableList<FirAnnotation>,
override val moduleData: FirModuleData,
@Volatile
override var resolvePhase: FirResolvePhase,
override val origin: FirDeclarationOrigin,
override val attributes: FirDeclarationAttributes,
override val annotations: MutableList<FirAnnotation>,
override var deprecation: DeprecationsPerUseSite?,
override val containerSource: DeserializedContainerSource?,
override val dispatchReceiverType: ConeKotlinType?,
@@ -25,12 +25,12 @@ import org.jetbrains.kotlin.fir.visitors.*
internal class FirFileImpl(
override val source: KtSourceElement?,
override val annotations: MutableList<FirAnnotation>,
override val moduleData: FirModuleData,
@Volatile
override var resolvePhase: FirResolvePhase,
override val origin: FirDeclarationOrigin,
override val attributes: FirDeclarationAttributes,
override val annotations: MutableList<FirAnnotation>,
override var packageDirective: FirPackageDirective,
override val imports: MutableList<FirImport>,
override val declarations: MutableList<FirDeclaration>,
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
import org.jetbrains.kotlin.fir.declarations.FirTypedDeclaration
@@ -152,6 +151,8 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
override fun visitExpression(expression: FirExpression, data: D): R = visitStatement(expression, data)
override fun visitDeclaration(declaration: FirDeclaration, data: D): R = visitAnnotationContainer(declaration, data)
override fun visitTypeParametersOwner(typeParametersOwner: FirTypeParametersOwner, data: D): R = visitTypeParameterRefsOwner(typeParametersOwner, data)
override fun visitTypedDeclaration(typedDeclaration: FirTypedDeclaration, data: D): R = visitMemberDeclaration(typedDeclaration, data)
@@ -162,7 +163,7 @@ abstract class FirDefaultVisitor<out R, in D> : FirVisitor<R, D>() {
override fun visitEnumEntry(enumEntry: FirEnumEntry, data: D): R = visitVariable(enumEntry, data)
override fun visitFile(file: FirFile, data: D): R = visitAnnotatedDeclaration(file, data)
override fun visitFile(file: FirFile, data: D): R = visitDeclaration(file, data)
override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression, data: D): R = visitExpression(anonymousFunctionExpression, data)
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
import org.jetbrains.kotlin.fir.declarations.FirTypedDeclaration
@@ -152,6 +151,8 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitExpression(expression: FirExpression) = visitStatement(expression)
override fun visitDeclaration(declaration: FirDeclaration) = visitAnnotationContainer(declaration)
override fun visitTypeParametersOwner(typeParametersOwner: FirTypeParametersOwner) = visitTypeParameterRefsOwner(typeParametersOwner)
override fun visitTypedDeclaration(typedDeclaration: FirTypedDeclaration) = visitMemberDeclaration(typedDeclaration)
@@ -162,7 +163,7 @@ abstract class FirDefaultVisitorVoid : FirVisitorVoid() {
override fun visitEnumEntry(enumEntry: FirEnumEntry) = visitVariable(enumEntry)
override fun visitFile(file: FirFile) = visitAnnotatedDeclaration(file)
override fun visitFile(file: FirFile) = visitDeclaration(file)
override fun visitAnonymousFunctionExpression(anonymousFunctionExpression: FirAnonymousFunctionExpression) = visitExpression(anonymousFunctionExpression)
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
import org.jetbrains.kotlin.fir.declarations.FirTypedDeclaration
@@ -203,10 +202,6 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformElement(typeParametersOwner, data)
}
open fun transformAnnotatedDeclaration(annotatedDeclaration: FirAnnotatedDeclaration, data: D): FirAnnotatedDeclaration {
return transformElement(annotatedDeclaration, data)
}
open fun transformMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: D): FirMemberDeclaration {
return transformElement(memberDeclaration, data)
}
@@ -731,10 +726,6 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformTypeParametersOwner(typeParametersOwner, data)
}
final override fun visitAnnotatedDeclaration(annotatedDeclaration: FirAnnotatedDeclaration, data: D): FirAnnotatedDeclaration {
return transformAnnotatedDeclaration(annotatedDeclaration, data)
}
final override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: D): FirMemberDeclaration {
return transformMemberDeclaration(memberDeclaration, data)
}
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
import org.jetbrains.kotlin.fir.declarations.FirTypedDeclaration
@@ -174,8 +173,6 @@ abstract class FirVisitor<out R, in D> {
open fun visitTypeParametersOwner(typeParametersOwner: FirTypeParametersOwner, data: D): R = visitElement(typeParametersOwner, data)
open fun visitAnnotatedDeclaration(annotatedDeclaration: FirAnnotatedDeclaration, data: D): R = visitElement(annotatedDeclaration, data)
open fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: D): R = visitElement(memberDeclaration, data)
open fun visitAnonymousInitializer(anonymousInitializer: FirAnonymousInitializer, data: D): R = visitElement(anonymousInitializer, data)
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
import org.jetbrains.kotlin.fir.declarations.FirTypedDeclaration
@@ -202,10 +201,6 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(typeParametersOwner)
}
open fun visitAnnotatedDeclaration(annotatedDeclaration: FirAnnotatedDeclaration) {
visitElement(annotatedDeclaration)
}
open fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration) {
visitElement(memberDeclaration)
}
@@ -730,10 +725,6 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitTypeParametersOwner(typeParametersOwner)
}
final override fun visitAnnotatedDeclaration(annotatedDeclaration: FirAnnotatedDeclaration, data: Nothing?) {
visitAnnotatedDeclaration(annotatedDeclaration)
}
final override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: Nothing?) {
visitMemberDeclaration(memberDeclaration)
}
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.symbols
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
@@ -34,7 +33,7 @@ abstract class FirBasedSymbol<E : FirDeclaration> {
get() = fir.moduleData
val annotations: List<FirAnnotation>
get() = (fir as? FirAnnotatedDeclaration)?.annotations ?: emptyList()
get() = fir.annotations
}
@RequiresOptIn
@@ -26,16 +26,15 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val statement by element(Expression, annotationContainer)
val expression by element(Expression, statement)
val declaration by sealedElement(Declaration)
val declaration by sealedElement(Declaration, annotationContainer)
val typeParameterRefsOwner by sealedElement(Declaration)
val typeParametersOwner by sealedElement(Declaration, typeParameterRefsOwner)
val annotatedDeclaration by sealedElement(Declaration, declaration, annotationContainer)
val memberDeclaration by sealedElement(Declaration, annotatedDeclaration, typeParameterRefsOwner)
val memberDeclaration by sealedElement(Declaration, declaration, typeParameterRefsOwner)
val anonymousInitializer by element(Declaration, declaration, controlFlowGraphOwner)
val typedDeclaration by sealedElement(Declaration, memberDeclaration)
val callableDeclaration by sealedElement(Declaration, typedDeclaration)
val typeParameterRef by element(Declaration)
val typeParameter by element(Declaration, typeParameterRef, annotatedDeclaration)
val typeParameter by element(Declaration, typeParameterRef, declaration)
val variable by sealedElement(Declaration, callableDeclaration, statement)
val valueParameter by element(Declaration, variable, controlFlowGraphOwner)
@@ -55,7 +54,7 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val propertyAccessor by element(Declaration, function, contractDescriptionOwner, typeParametersOwner)
val backingField by element(Declaration, variable, typeParametersOwner, statement)
val constructor by element(Declaration, function, typeParameterRefsOwner)
val file by element(Declaration, annotatedDeclaration)
val file by element(Declaration, declaration)
val packageDirective by element(Other)
val anonymousFunction by element(Declaration, function, typeParametersOwner)
@@ -38,6 +38,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
defaultFalse("hasLazyNestedClassifiers", withGetter = true)
}
impl(anonymousInitializer) {
defaultEmptyList("annotations")
}
impl(anonymousObject)
noImpl(anonymousObjectExpression)
@@ -73,7 +77,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
delegateFields(listOf("aliasName", "importedFqName", "isAllUnder", "source"), "delegate")
}
fun ImplementationContext.commonAnnotationConfig(): Unit {
fun ImplementationContext.commonAnnotationConfig() {
defaultEmptyList("annotations")
default("typeRef") {
value = "annotationTypeRef"
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.plugin
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirPluginKey
import org.jetbrains.kotlin.fir.extensions.FirDeclarationPredicateRegistrar
@@ -26,12 +26,12 @@ class AllOpenStatusTransformer(session: FirSession) : FirStatusTransformerExtens
private val PREDICATE: DeclarationPredicate = hasOrUnder(ALL_OPEN) or metaHasOrUnder(ALL_OPEN)
}
override fun transformStatus(status: FirDeclarationStatus, declaration: FirAnnotatedDeclaration): FirDeclarationStatus {
override fun transformStatus(status: FirDeclarationStatus, declaration: FirDeclaration): FirDeclarationStatus {
if (status.modality != null) return status
return status.transform(modality = Modality.OPEN)
}
override fun needTransformStatus(declaration: FirAnnotatedDeclaration): Boolean {
override fun needTransformStatus(declaration: FirDeclaration): Boolean {
return session.predicateBasedProvider.matches(PREDICATE, declaration)
}
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.plugin
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirPluginKey
@@ -42,7 +41,7 @@ class AllPublicVisibilityTransformer(session: FirSession) : FirStatusTransformer
private val PREDICATE: DeclarationPredicate = hasOrUnder(AllPublicClassId.asSingleFqName())
}
override fun transformStatus(status: FirDeclarationStatus, declaration: FirAnnotatedDeclaration): FirDeclarationStatus {
override fun transformStatus(status: FirDeclarationStatus, declaration: FirDeclaration): FirDeclarationStatus {
val owners = session.predicateBasedProvider.getOwnersOfDeclaration(declaration) ?: emptyList()
val visibility = findVisibility(declaration, owners) ?: return status
if (visibility == status.visibility) return status
@@ -72,7 +71,7 @@ class AllPublicVisibilityTransformer(session: FirSession) : FirStatusTransformer
}
}
override fun needTransformStatus(declaration: FirAnnotatedDeclaration): Boolean {
override fun needTransformStatus(declaration: FirDeclaration): Boolean {
return session.predicateBasedProvider.matches(PREDICATE, declaration)
}