[FIR] Rename FirStatusOwner back to FirMemberDeclaration

This commit is contained in:
Dmitriy Novozhilov
2021-06-29 10:18:16 +03:00
parent f400477c70
commit 5816d7ae9f
58 changed files with 242 additions and 244 deletions
@@ -24,7 +24,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
val staticScope = javaClass.scopeProvider.getStaticScope(javaClass, session, ScopeSession()) val staticScope = javaClass.scopeProvider.getStaticScope(javaClass, session, ScopeSession())
renderer.renderAnnotations(javaClass) renderer.renderAnnotations(javaClass)
renderer.visitStatusOwner(javaClass) renderer.visitMemberDeclaration(javaClass)
renderer.renderSupertypes(javaClass) renderer.renderSupertypes(javaClass)
renderer.renderInBraces { renderer.renderInBraces {
val renderedDeclarations = mutableListOf<FirDeclaration>() val renderedDeclarations = mutableListOf<FirDeclaration>()
@@ -553,7 +553,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val OVERRIDES by object : DiagnosticGroup("overrides") { val OVERRIDES by object : DiagnosticGroup("overrides") {
val NOTHING_TO_OVERRIDE by error<KtModifierListOwner>(PositioningStrategy.OVERRIDE_MODIFIER) { val NOTHING_TO_OVERRIDE by error<KtModifierListOwner>(PositioningStrategy.OVERRIDE_MODIFIER) {
parameter<FirStatusOwner>("declaration") parameter<FirMemberDeclaration>("declaration")
} }
val CANNOT_WEAKEN_ACCESS_PRIVILEGE by error<KtModifierListOwner>(PositioningStrategy.VISIBILITY_MODIFIER) { val CANNOT_WEAKEN_ACCESS_PRIVILEGE by error<KtModifierListOwner>(PositioningStrategy.VISIBILITY_MODIFIER) {
@@ -606,25 +606,25 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
} }
val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error<KtNamedDeclaration>(PositioningStrategy.DECLARATION_RETURN_TYPE) { val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error<KtNamedDeclaration>(PositioningStrategy.DECLARATION_RETURN_TYPE) {
parameter<FirStatusOwner>("function") parameter<FirMemberDeclaration>("function")
parameter<FirStatusOwner>("superFunction") parameter<FirMemberDeclaration>("superFunction")
} }
val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error<KtNamedDeclaration>(PositioningStrategy.DECLARATION_RETURN_TYPE) { val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error<KtNamedDeclaration>(PositioningStrategy.DECLARATION_RETURN_TYPE) {
parameter<FirStatusOwner>("property") parameter<FirMemberDeclaration>("property")
parameter<FirStatusOwner>("superProperty") parameter<FirMemberDeclaration>("superProperty")
} }
val VAR_TYPE_MISMATCH_ON_OVERRIDE by error<KtNamedDeclaration>(PositioningStrategy.DECLARATION_RETURN_TYPE) { val VAR_TYPE_MISMATCH_ON_OVERRIDE by error<KtNamedDeclaration>(PositioningStrategy.DECLARATION_RETURN_TYPE) {
parameter<FirStatusOwner>("variable") parameter<FirMemberDeclaration>("variable")
parameter<FirStatusOwner>("superVariable") parameter<FirMemberDeclaration>("superVariable")
} }
val VAR_OVERRIDDEN_BY_VAL by error<KtNamedDeclaration>(PositioningStrategy.VAL_OR_VAR_NODE) { val VAR_OVERRIDDEN_BY_VAL by error<KtNamedDeclaration>(PositioningStrategy.VAL_OR_VAR_NODE) {
parameter<FirStatusOwner>("overridingDeclaration") parameter<FirMemberDeclaration>("overridingDeclaration")
parameter<FirStatusOwner>("overriddenDeclaration") parameter<FirMemberDeclaration>("overriddenDeclaration")
} }
val NON_FINAL_MEMBER_IN_FINAL_CLASS by warning<KtNamedDeclaration>(PositioningStrategy.OPEN_MODIFIER) val NON_FINAL_MEMBER_IN_FINAL_CLASS by warning<KtNamedDeclaration>(PositioningStrategy.OPEN_MODIFIER)
val NON_FINAL_MEMBER_IN_OBJECT by warning<KtNamedDeclaration>(PositioningStrategy.OPEN_MODIFIER) val NON_FINAL_MEMBER_IN_OBJECT by warning<KtNamedDeclaration>(PositioningStrategy.OPEN_MODIFIER)
val VIRTUAL_MEMBER_HIDDEN by error<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME) { val VIRTUAL_MEMBER_HIDDEN by error<KtNamedDeclaration>(PositioningStrategy.DECLARATION_NAME) {
parameter<FirStatusOwner>("declared") parameter<FirMemberDeclaration>("declared")
parameter<FirRegularClass>("overriddenContainer") parameter<FirRegularClass>("overriddenContainer")
} }
} }
@@ -651,21 +651,21 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val FUNCTIONS by object : DiagnosticGroup("Functions") { val FUNCTIONS by object : DiagnosticGroup("Functions") {
val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error<KtFunction>(PositioningStrategy.MODALITY_MODIFIER) { val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error<KtFunction>(PositioningStrategy.MODALITY_MODIFIER) {
parameter<FirStatusOwner>("function") parameter<FirMemberDeclaration>("function")
parameter<FirClass>("containingClass") parameter<FirClass>("containingClass")
} }
val ABSTRACT_FUNCTION_WITH_BODY by error<KtFunction>(PositioningStrategy.MODALITY_MODIFIER) { val ABSTRACT_FUNCTION_WITH_BODY by error<KtFunction>(PositioningStrategy.MODALITY_MODIFIER) {
parameter<FirStatusOwner>("function") parameter<FirMemberDeclaration>("function")
} }
val NON_ABSTRACT_FUNCTION_WITH_NO_BODY by error<KtFunction>(PositioningStrategy.DECLARATION_SIGNATURE) { val NON_ABSTRACT_FUNCTION_WITH_NO_BODY by error<KtFunction>(PositioningStrategy.DECLARATION_SIGNATURE) {
parameter<FirStatusOwner>("function") parameter<FirMemberDeclaration>("function")
} }
val PRIVATE_FUNCTION_WITH_NO_BODY by error<KtFunction>(PositioningStrategy.VISIBILITY_MODIFIER) { val PRIVATE_FUNCTION_WITH_NO_BODY by error<KtFunction>(PositioningStrategy.VISIBILITY_MODIFIER) {
parameter<FirStatusOwner>("function") parameter<FirMemberDeclaration>("function")
} }
val NON_MEMBER_FUNCTION_NO_BODY by error<KtFunction>(PositioningStrategy.DECLARATION_SIGNATURE) { val NON_MEMBER_FUNCTION_NO_BODY by error<KtFunction>(PositioningStrategy.DECLARATION_SIGNATURE) {
parameter<FirStatusOwner>("function") parameter<FirMemberDeclaration>("function")
} }
val FUNCTION_DECLARATION_WITH_NO_NAME by error<KtFunction>(PositioningStrategy.DECLARATION_SIGNATURE) val FUNCTION_DECLARATION_WITH_NO_NAME by error<KtFunction>(PositioningStrategy.DECLARATION_SIGNATURE)
@@ -695,7 +695,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val PROPERTIES_AND_ACCESSORS by object : DiagnosticGroup("Properties & accessors") { val PROPERTIES_AND_ACCESSORS by object : DiagnosticGroup("Properties & accessors") {
val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error<KtModifierListOwner>(PositioningStrategy.MODALITY_MODIFIER) { val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error<KtModifierListOwner>(PositioningStrategy.MODALITY_MODIFIER) {
parameter<FirStatusOwner>("property") parameter<FirMemberDeclaration>("property")
parameter<FirClass>("containingClass") parameter<FirClass>("containingClass")
} }
val PRIVATE_PROPERTY_IN_INTERFACE by error<KtProperty>(PositioningStrategy.VISIBILITY_MODIFIER) val PRIVATE_PROPERTY_IN_INTERFACE by error<KtProperty>(PositioningStrategy.VISIBILITY_MODIFIER)
@@ -1031,7 +1031,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
private val exposedVisibilityDiagnosticInit: DiagnosticBuilder.() -> Unit = { private val exposedVisibilityDiagnosticInit: DiagnosticBuilder.() -> Unit = {
parameter<EffectiveVisibility>("elementVisibility") parameter<EffectiveVisibility>("elementVisibility")
parameter<FirStatusOwner>("restrictingDeclaration") parameter<FirMemberDeclaration>("restrictingDeclaration")
parameter<EffectiveVisibility>("restrictingVisibility") parameter<EffectiveVisibility>("restrictingVisibility")
} }
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
object FirJvmExternalDeclarationChecker : FirBasicDeclarationChecker() { object FirJvmExternalDeclarationChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration !is FirStatusOwner) return if (declaration !is FirMemberDeclaration) return
if (!declaration.isExternal) return if (!declaration.isExternal) return
val source = declaration.source ?: return val source = declaration.source ?: return
if (source.kind is FirFakeSourceElementKind) return if (source.kind is FirFakeSourceElementKind) return
@@ -18,9 +18,9 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
@@ -218,15 +218,15 @@ object FirErrors {
val EXPERIMENTAL_ANNOTATION_WITH_WRONG_RETENTION by error0<KtAnnotationEntry>() val EXPERIMENTAL_ANNOTATION_WITH_WRONG_RETENTION by error0<KtAnnotationEntry>()
// Exposed visibility // Exposed visibility
val EXPOSED_TYPEALIAS_EXPANDED_TYPE by error3<KtNamedDeclaration, EffectiveVisibility, FirStatusOwner, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME) val EXPOSED_TYPEALIAS_EXPANDED_TYPE by error3<KtNamedDeclaration, EffectiveVisibility, FirMemberDeclaration, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
val EXPOSED_FUNCTION_RETURN_TYPE by error3<KtNamedDeclaration, EffectiveVisibility, FirStatusOwner, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME) val EXPOSED_FUNCTION_RETURN_TYPE by error3<KtNamedDeclaration, EffectiveVisibility, FirMemberDeclaration, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
val EXPOSED_RECEIVER_TYPE by error3<KtTypeReference, EffectiveVisibility, FirStatusOwner, EffectiveVisibility>() val EXPOSED_RECEIVER_TYPE by error3<KtTypeReference, EffectiveVisibility, FirMemberDeclaration, EffectiveVisibility>()
val EXPOSED_PROPERTY_TYPE by error3<KtNamedDeclaration, EffectiveVisibility, FirStatusOwner, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME) val EXPOSED_PROPERTY_TYPE by error3<KtNamedDeclaration, EffectiveVisibility, FirMemberDeclaration, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
val EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR by warning3<KtNamedDeclaration, EffectiveVisibility, FirStatusOwner, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME) val EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR by warning3<KtNamedDeclaration, EffectiveVisibility, FirMemberDeclaration, EffectiveVisibility>(SourceElementPositioningStrategies.DECLARATION_NAME)
val EXPOSED_PARAMETER_TYPE by error3<KtParameter, EffectiveVisibility, FirStatusOwner, EffectiveVisibility>() val EXPOSED_PARAMETER_TYPE by error3<KtParameter, EffectiveVisibility, FirMemberDeclaration, EffectiveVisibility>()
val EXPOSED_SUPER_INTERFACE by error3<KtTypeReference, EffectiveVisibility, FirStatusOwner, EffectiveVisibility>() val EXPOSED_SUPER_INTERFACE by error3<KtTypeReference, EffectiveVisibility, FirMemberDeclaration, EffectiveVisibility>()
val EXPOSED_SUPER_CLASS by error3<KtTypeReference, EffectiveVisibility, FirStatusOwner, EffectiveVisibility>() val EXPOSED_SUPER_CLASS by error3<KtTypeReference, EffectiveVisibility, FirMemberDeclaration, EffectiveVisibility>()
val EXPOSED_TYPE_PARAMETER_BOUND by error3<KtTypeReference, EffectiveVisibility, FirStatusOwner, EffectiveVisibility>() val EXPOSED_TYPE_PARAMETER_BOUND by error3<KtTypeReference, EffectiveVisibility, FirMemberDeclaration, EffectiveVisibility>()
// Modifiers // Modifiers
val INAPPLICABLE_INFIX_MODIFIER by error0<PsiElement>() val INAPPLICABLE_INFIX_MODIFIER by error0<PsiElement>()
@@ -338,7 +338,7 @@ object FirErrors {
val EXPRESSION_OF_NULLABLE_TYPE_IN_CLASS_LITERAL_LHS by error1<PsiElement, ConeKotlinType>() val EXPRESSION_OF_NULLABLE_TYPE_IN_CLASS_LITERAL_LHS by error1<PsiElement, ConeKotlinType>()
// overrides // overrides
val NOTHING_TO_OVERRIDE by error1<KtModifierListOwner, FirStatusOwner>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER) val NOTHING_TO_OVERRIDE by error1<KtModifierListOwner, FirMemberDeclaration>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER)
val CANNOT_WEAKEN_ACCESS_PRIVILEGE by error3<KtModifierListOwner, Visibility, FirCallableDeclaration, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val CANNOT_WEAKEN_ACCESS_PRIVILEGE by error3<KtModifierListOwner, Visibility, FirCallableDeclaration, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
val CANNOT_CHANGE_ACCESS_PRIVILEGE by error3<KtModifierListOwner, Visibility, FirCallableDeclaration, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val CANNOT_CHANGE_ACCESS_PRIVILEGE by error3<KtModifierListOwner, Visibility, FirCallableDeclaration, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
val OVERRIDING_FINAL_MEMBER by error2<KtNamedDeclaration, FirCallableDeclaration, Name>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER) val OVERRIDING_FINAL_MEMBER by error2<KtNamedDeclaration, FirCallableDeclaration, Name>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER)
@@ -350,13 +350,13 @@ object FirErrors {
val MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED by error2<KtClassOrObject, FirClass, FirCallableDeclaration>(SourceElementPositioningStrategies.DECLARATION_NAME) val MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED by error2<KtClassOrObject, FirClass, FirCallableDeclaration>(SourceElementPositioningStrategies.DECLARATION_NAME)
val OVERRIDING_FINAL_MEMBER_BY_DELEGATION by error2<KtClassOrObject, FirCallableDeclaration, FirCallableDeclaration>(SourceElementPositioningStrategies.DECLARATION_NAME) val OVERRIDING_FINAL_MEMBER_BY_DELEGATION by error2<KtClassOrObject, FirCallableDeclaration, FirCallableDeclaration>(SourceElementPositioningStrategies.DECLARATION_NAME)
val DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE by warning2<KtClassOrObject, FirCallableDeclaration, FirCallableDeclaration>(SourceElementPositioningStrategies.DECLARATION_NAME) val DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE by warning2<KtClassOrObject, FirCallableDeclaration, FirCallableDeclaration>(SourceElementPositioningStrategies.DECLARATION_NAME)
val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error2<KtNamedDeclaration, FirStatusOwner, FirStatusOwner>(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE) val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error2<KtNamedDeclaration, FirMemberDeclaration, FirMemberDeclaration>(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE)
val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error2<KtNamedDeclaration, FirStatusOwner, FirStatusOwner>(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE) val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error2<KtNamedDeclaration, FirMemberDeclaration, FirMemberDeclaration>(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE)
val VAR_TYPE_MISMATCH_ON_OVERRIDE by error2<KtNamedDeclaration, FirStatusOwner, FirStatusOwner>(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE) val VAR_TYPE_MISMATCH_ON_OVERRIDE by error2<KtNamedDeclaration, FirMemberDeclaration, FirMemberDeclaration>(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE)
val VAR_OVERRIDDEN_BY_VAL by error2<KtNamedDeclaration, FirStatusOwner, FirStatusOwner>(SourceElementPositioningStrategies.VAL_OR_VAR_NODE) val VAR_OVERRIDDEN_BY_VAL by error2<KtNamedDeclaration, FirMemberDeclaration, FirMemberDeclaration>(SourceElementPositioningStrategies.VAL_OR_VAR_NODE)
val NON_FINAL_MEMBER_IN_FINAL_CLASS by warning0<KtNamedDeclaration>(SourceElementPositioningStrategies.OPEN_MODIFIER) val NON_FINAL_MEMBER_IN_FINAL_CLASS by warning0<KtNamedDeclaration>(SourceElementPositioningStrategies.OPEN_MODIFIER)
val NON_FINAL_MEMBER_IN_OBJECT by warning0<KtNamedDeclaration>(SourceElementPositioningStrategies.OPEN_MODIFIER) val NON_FINAL_MEMBER_IN_OBJECT by warning0<KtNamedDeclaration>(SourceElementPositioningStrategies.OPEN_MODIFIER)
val VIRTUAL_MEMBER_HIDDEN by error2<KtNamedDeclaration, FirStatusOwner, FirRegularClass>(SourceElementPositioningStrategies.DECLARATION_NAME) val VIRTUAL_MEMBER_HIDDEN by error2<KtNamedDeclaration, FirMemberDeclaration, FirRegularClass>(SourceElementPositioningStrategies.DECLARATION_NAME)
// Redeclarations // Redeclarations
val MANY_COMPANION_OBJECTS by error0<KtObjectDeclaration>(SourceElementPositioningStrategies.COMPANION_OBJECT) val MANY_COMPANION_OBJECTS by error0<KtObjectDeclaration>(SourceElementPositioningStrategies.COMPANION_OBJECT)
@@ -369,11 +369,11 @@ object FirErrors {
val LOCAL_INTERFACE_NOT_ALLOWED by error1<KtNamedDeclaration, Name>(SourceElementPositioningStrategies.DECLARATION_NAME) val LOCAL_INTERFACE_NOT_ALLOWED by error1<KtNamedDeclaration, Name>(SourceElementPositioningStrategies.DECLARATION_NAME)
// Functions // Functions
val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error2<KtFunction, FirStatusOwner, FirClass>(SourceElementPositioningStrategies.MODALITY_MODIFIER) val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error2<KtFunction, FirMemberDeclaration, FirClass>(SourceElementPositioningStrategies.MODALITY_MODIFIER)
val ABSTRACT_FUNCTION_WITH_BODY by error1<KtFunction, FirStatusOwner>(SourceElementPositioningStrategies.MODALITY_MODIFIER) val ABSTRACT_FUNCTION_WITH_BODY by error1<KtFunction, FirMemberDeclaration>(SourceElementPositioningStrategies.MODALITY_MODIFIER)
val NON_ABSTRACT_FUNCTION_WITH_NO_BODY by error1<KtFunction, FirStatusOwner>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val NON_ABSTRACT_FUNCTION_WITH_NO_BODY by error1<KtFunction, FirMemberDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
val PRIVATE_FUNCTION_WITH_NO_BODY by error1<KtFunction, FirStatusOwner>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val PRIVATE_FUNCTION_WITH_NO_BODY by error1<KtFunction, FirMemberDeclaration>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
val NON_MEMBER_FUNCTION_NO_BODY by error1<KtFunction, FirStatusOwner>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val NON_MEMBER_FUNCTION_NO_BODY by error1<KtFunction, FirMemberDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
val FUNCTION_DECLARATION_WITH_NO_NAME by error0<KtFunction>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val FUNCTION_DECLARATION_WITH_NO_NAME by error0<KtFunction>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
val ANONYMOUS_FUNCTION_WITH_NAME by error0<KtFunction>() val ANONYMOUS_FUNCTION_WITH_NAME by error0<KtFunction>()
val ANONYMOUS_FUNCTION_PARAMETER_WITH_DEFAULT_VALUE by error0<KtParameter>(SourceElementPositioningStrategies.PARAMETER_DEFAULT_VALUE) val ANONYMOUS_FUNCTION_PARAMETER_WITH_DEFAULT_VALUE by error0<KtParameter>(SourceElementPositioningStrategies.PARAMETER_DEFAULT_VALUE)
@@ -392,7 +392,7 @@ object FirErrors {
val FUN_INTERFACE_WITH_SUSPEND_FUNCTION by error0<KtDeclaration>(SourceElementPositioningStrategies.FUN_INTERFACE) val FUN_INTERFACE_WITH_SUSPEND_FUNCTION by error0<KtDeclaration>(SourceElementPositioningStrategies.FUN_INTERFACE)
// Properties & accessors // Properties & accessors
val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error2<KtModifierListOwner, FirStatusOwner, FirClass>(SourceElementPositioningStrategies.MODALITY_MODIFIER) val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error2<KtModifierListOwner, FirMemberDeclaration, FirClass>(SourceElementPositioningStrategies.MODALITY_MODIFIER)
val PRIVATE_PROPERTY_IN_INTERFACE by error0<KtProperty>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val PRIVATE_PROPERTY_IN_INTERFACE by error0<KtProperty>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
val ABSTRACT_PROPERTY_WITH_INITIALIZER by error0<KtExpression>() val ABSTRACT_PROPERTY_WITH_INITIALIZER by error0<KtExpression>()
val PROPERTY_INITIALIZER_IN_INTERFACE by error0<KtExpression>() val PROPERTY_INITIALIZER_IN_INTERFACE by error0<KtExpression>()
@@ -39,7 +39,7 @@ internal fun checkConstantArguments(
} }
expression is FirConstExpression<*> expression is FirConstExpression<*>
|| expressionSymbol is FirEnumEntry || expressionSymbol is FirEnumEntry
|| (expressionSymbol as? FirStatusOwner)?.isConst == true || (expressionSymbol as? FirMemberDeclaration)?.isConst == true
|| expressionSymbol is FirConstructor && classKindOfParent == ClassKind.ANNOTATION_CLASS -> { || expressionSymbol is FirConstructor && classKindOfParent == ClassKind.ANNOTATION_CLASS -> {
//DO NOTHING //DO NOTHING
} }
@@ -84,8 +84,8 @@ internal fun checkConstantArguments(
expressionSymbol is FirField -> { expressionSymbol is FirField -> {
//TODO: fix checking of Java fields initializer //TODO: fix checking of Java fields initializer
if ( if (
!(expressionSymbol as FirStatusOwner).status.isStatic !(expressionSymbol as FirMemberDeclaration).status.isStatic
|| (expressionSymbol as FirStatusOwner).status.modality != Modality.FINAL || (expressionSymbol as FirMemberDeclaration).status.modality != Modality.FINAL
) )
return ConstantArgumentKind.NOT_CONST return ConstantArgumentKind.NOT_CONST
} }
@@ -235,7 +235,7 @@ fun FirClass.modality(): Modality? {
/** /**
* returns implicit modality by FirMemberDeclaration<*> * returns implicit modality by FirMemberDeclaration<*>
*/ */
fun FirStatusOwner.implicitModality(context: CheckerContext): Modality { fun FirMemberDeclaration.implicitModality(context: CheckerContext): Modality {
if (this is FirRegularClass && (this.classKind == ClassKind.CLASS || this.classKind == ClassKind.OBJECT)) { if (this is FirRegularClass && (this.classKind == ClassKind.CLASS || this.classKind == ClassKind.OBJECT)) {
if (this.classKind == ClassKind.INTERFACE) return Modality.ABSTRACT if (this.classKind == ClassKind.INTERFACE) return Modality.ABSTRACT
return Modality.FINAL return Modality.FINAL
@@ -381,7 +381,7 @@ private fun lowerThanBound(context: ConeInferenceContext, argument: ConeKotlinTy
return false return false
} }
fun FirStatusOwner.isInlineOnly(): Boolean = isInline && (this as FirAnnotatedDeclaration).hasAnnotation(INLINE_ONLY_ANNOTATION_CLASS_ID) fun FirMemberDeclaration.isInlineOnly(): Boolean = isInline && (this as FirAnnotatedDeclaration).hasAnnotation(INLINE_ONLY_ANNOTATION_CLASS_ID)
fun isSubtypeForTypeMismatch(context: ConeInferenceContext, subtype: ConeKotlinType, supertype: ConeKotlinType): Boolean { fun isSubtypeForTypeMismatch(context: ConeInferenceContext, subtype: ConeKotlinType, supertype: ConeKotlinType): Boolean {
val subtypeFullyExpanded = subtype.fullyExpandedType(context.session) val subtypeFullyExpanded = subtype.fullyExpandedType(context.session)
@@ -29,7 +29,7 @@ object FirClassVarianceChecker : FirClassChecker() {
} }
for (member in declaration.declarations) { for (member in declaration.declarations) {
if (member is FirStatusOwner) { if (member is FirMemberDeclaration) {
if (Visibilities.isPrivate(member.status.visibility)) { if (Visibilities.isPrivate(member.status.visibility)) {
continue continue
} }
@@ -52,8 +52,8 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
} }
private fun isExpectAndActual(declaration1: FirDeclaration, declaration2: FirDeclaration): Boolean { private fun isExpectAndActual(declaration1: FirDeclaration, declaration2: FirDeclaration): Boolean {
if (declaration1 !is FirStatusOwner) return false if (declaration1 !is FirMemberDeclaration) return false
if (declaration2 !is FirStatusOwner) return false if (declaration2 !is FirMemberDeclaration) return false
return (declaration1.status.isExpect && declaration2.status.isActual) || return (declaration1.status.isExpect && declaration2.status.isActual) ||
(declaration1.status.isActual && declaration2.status.isExpect) (declaration1.status.isActual && declaration2.status.isExpect)
} }
@@ -90,7 +90,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
if (areCompatibleMainFunctions(declaration, containingFile, conflicting, actualConflictingFile)) return if (areCompatibleMainFunctions(declaration, containingFile, conflicting, actualConflictingFile)) return
if (isExpectAndActual(declaration, conflicting)) return if (isExpectAndActual(declaration, conflicting)) return
if ( if (
conflicting is FirStatusOwner && conflicting is FirMemberDeclaration &&
!session.visibilityChecker.isVisible(conflicting, session, containingFile, emptyList(), null) !session.visibilityChecker.isVisible(conflicting, session, containingFile, emptyList(), null)
) return ) return
declarationConflictingSymbols.getOrPut(declaration) { SmartSet.create() }.add(conflictingSymbol) declarationConflictingSymbols.getOrPut(declaration) { SmartSet.create() }.add(conflictingSymbol)
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
object FirCyclicTypeBoundsChecker : FirBasicDeclarationChecker() { object FirCyclicTypeBoundsChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration !is FirStatusOwner) return if (declaration !is FirMemberDeclaration) return
if (declaration is FirConstructor || declaration is FirTypeAlias) return if (declaration is FirConstructor || declaration is FirTypeAlias) return
val processed = mutableSetOf<Name>() val processed = mutableSetOf<Name>()
@@ -43,7 +43,7 @@ private inline fun isInsideSpecificClass(
context.containingDeclarations.asReversed().any { it is FirRegularClass && predicate.invoke(it) } context.containingDeclarations.asReversed().any { it is FirRegularClass && predicate.invoke(it) }
} }
internal fun FirStatusOwner.isEffectivelyExpect( internal fun FirMemberDeclaration.isEffectivelyExpect(
containingClass: FirRegularClass?, containingClass: FirRegularClass?,
context: CheckerContext, context: CheckerContext,
): Boolean { ): Boolean {
@@ -52,7 +52,7 @@ internal fun FirStatusOwner.isEffectivelyExpect(
return containingClass != null && isInsideExpectClass(containingClass, context) return containingClass != null && isInsideExpectClass(containingClass, context)
} }
internal fun FirStatusOwner.isEffectivelyExternal( internal fun FirMemberDeclaration.isEffectivelyExternal(
containingClass: FirRegularClass?, containingClass: FirRegularClass?,
context: CheckerContext, context: CheckerContext,
): Boolean { ): Boolean {
@@ -76,7 +76,7 @@ internal fun FirStatusOwner.isEffectivelyExternal(
// TODO: check class too // TODO: check class too
internal fun checkExpectDeclarationVisibilityAndBody( internal fun checkExpectDeclarationVisibilityAndBody(
declaration: FirStatusOwner, declaration: FirMemberDeclaration,
source: FirSourceElement, source: FirSourceElement,
reporter: DiagnosticReporter, reporter: DiagnosticReporter,
context: CheckerContext context: CheckerContext
@@ -107,7 +107,7 @@ object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() {
} }
private fun checkFunction(declaration: FirFunction, reporter: DiagnosticReporter, context: CheckerContext) { private fun checkFunction(declaration: FirFunction, reporter: DiagnosticReporter, context: CheckerContext) {
val functionVisibility = (declaration as FirStatusOwner).effectiveVisibility val functionVisibility = (declaration as FirMemberDeclaration).effectiveVisibility
if (functionVisibility == EffectiveVisibility.Local) return if (functionVisibility == EffectiveVisibility.Local) return
if (declaration !is FirConstructor) { if (declaration !is FirConstructor) {
@@ -197,14 +197,14 @@ object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() {
private fun ConeKotlinType.findVisibilityExposure( private fun ConeKotlinType.findVisibilityExposure(
context: CheckerContext, context: CheckerContext,
base: EffectiveVisibility base: EffectiveVisibility
): FirStatusOwner? { ): FirMemberDeclaration? {
val type = this as? ConeClassLikeType ?: return null val type = this as? ConeClassLikeType ?: return null
val fir = type.fullyExpandedType(context.session).lookupTag.toSymbol(context.session)?.let { firSymbol -> val fir = type.fullyExpandedType(context.session).lookupTag.toSymbol(context.session)?.let { firSymbol ->
firSymbol.ensureResolved(FirResolvePhase.DECLARATIONS, context.session) firSymbol.ensureResolved(FirResolvePhase.DECLARATIONS, context.session)
firSymbol.fir firSymbol.fir
} ?: return null } ?: return null
if (fir is FirStatusOwner) { if (fir is FirMemberDeclaration) {
val effectiveVisibility = fir.effectiveVisibility val effectiveVisibility = fir.effectiveVisibility
when (effectiveVisibility.relation(base, context.session.typeContext)) { when (effectiveVisibility.relation(base, context.session.typeContext)) {
EffectiveVisibility.Permissiveness.LESS, EffectiveVisibility.Permissiveness.LESS,
@@ -12,11 +12,11 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
object FirInfixFunctionDeclarationChecker : FirBasicDeclarationChecker() { object FirInfixFunctionDeclarationChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if ((declaration as? FirStatusOwner)?.status?.isInfix != true) return if ((declaration as? FirMemberDeclaration)?.status?.isInfix != true) return
if (declaration is FirSimpleFunction) { if (declaration is FirSimpleFunction) {
if (declaration.valueParameters.size != 1 || !hasExtensionOrDispatchReceiver(declaration, context)) { if (declaration.valueParameters.size != 1 || !hasExtensionOrDispatchReceiver(declaration, context)) {
reporter.reportOn(declaration.source, FirErrors.INAPPLICABLE_INFIX_MODIFIER, context) reporter.reportOn(declaration.source, FirErrors.INAPPLICABLE_INFIX_MODIFIER, context)
@@ -288,7 +288,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
private fun FirBasedSymbol<*>.isDefinedInInlineFunction(): Boolean { private fun FirBasedSymbol<*>.isDefinedInInlineFunction(): Boolean {
return when (val fir = this.fir) { return when (val fir = this.fir) {
is FirAnonymousFunction -> true is FirAnonymousFunction -> true
is FirStatusOwner -> fir.isLocalMember is FirMemberDeclaration -> fir.isLocalMember
is FirAnonymousObject -> true is FirAnonymousObject -> true
is FirRegularClass -> fir.classId.isLocal is FirRegularClass -> fir.classId.isLocal
else -> error("Unknown callable declaration type: ${fir.render()}") else -> error("Unknown callable declaration type: ${fir.render()}")
@@ -92,8 +92,8 @@ object FirOverrideChecker : FirClassChecker() {
overriddenSymbols: List<FirCallableSymbol<*>>, overriddenSymbols: List<FirCallableSymbol<*>>,
): FirCallableDeclaration? { ): FirCallableDeclaration? {
for (overridden in overriddenSymbols) { for (overridden in overriddenSymbols) {
if (overridden.fir !is FirStatusOwner) continue if (overridden.fir !is FirMemberDeclaration) continue
val modality = (overridden.fir as FirStatusOwner).status.modality val modality = (overridden.fir as FirMemberDeclaration).status.modality
val isEffectivelyFinal = modality == null || modality == Modality.FINAL val isEffectivelyFinal = modality == null || modality == Modality.FINAL
if (isEffectivelyFinal) { if (isEffectivelyFinal) {
return overridden.fir return overridden.fir
@@ -104,7 +104,7 @@ object FirOverrideChecker : FirClassChecker() {
private fun FirProperty.checkMutability( private fun FirProperty.checkMutability(
overriddenSymbols: List<FirCallableSymbol<*>>, overriddenSymbols: List<FirCallableSymbol<*>>,
): FirStatusOwner? { ): FirMemberDeclaration? {
if (isVar) return null if (isVar) return null
return overriddenSymbols.find { (it.fir as? FirProperty)?.isVar == true }?.fir?.safeAs() return overriddenSymbols.find { (it.fir as? FirProperty)?.isVar == true }?.fir?.safeAs()
} }
@@ -115,8 +115,8 @@ object FirOverrideChecker : FirClassChecker() {
context: CheckerContext context: CheckerContext
) { ) {
val visibilities = overriddenSymbols.mapNotNull { val visibilities = overriddenSymbols.mapNotNull {
if (it.fir !is FirStatusOwner) return@mapNotNull null if (it.fir !is FirMemberDeclaration) return@mapNotNull null
it to (it.fir as FirStatusOwner).visibility it to (it.fir as FirMemberDeclaration).visibility
}.sortedBy { pair -> }.sortedBy { pair ->
// Regard `null` compare as Int.MIN so that we can report CANNOT_CHANGE_... first deterministically // Regard `null` compare as Int.MIN so that we can report CANNOT_CHANGE_... first deterministically
Visibilities.compare(visibility, pair.second) ?: Int.MIN_VALUE Visibilities.compare(visibility, pair.second) ?: Int.MIN_VALUE
@@ -139,7 +139,7 @@ object FirOverrideChecker : FirClassChecker() {
overriddenSymbols: List<FirCallableSymbol<*>>, overriddenSymbols: List<FirCallableSymbol<*>>,
typeCheckerContext: AbstractTypeCheckerContext, typeCheckerContext: AbstractTypeCheckerContext,
context: CheckerContext, context: CheckerContext,
): FirStatusOwner? { ): FirMemberDeclaration? {
val overridingReturnType = returnTypeRef.coneType val overridingReturnType = returnTypeRef.coneType
// Don't report *_ON_OVERRIDE diagnostics according to an error return type. That should be reported separately. // Don't report *_ON_OVERRIDE diagnostics according to an error return type. That should be reported separately.
@@ -234,13 +234,13 @@ object FirOverrideChecker : FirClassChecker() {
} }
@Suppress("UNUSED_PARAMETER") // TODO: delete me after implementing body @Suppress("UNUSED_PARAMETER") // TODO: delete me after implementing body
private fun DiagnosticReporter.reportNothingToOverride(declaration: FirStatusOwner, context: CheckerContext) { private fun DiagnosticReporter.reportNothingToOverride(declaration: FirMemberDeclaration, context: CheckerContext) {
// TODO: not ready yet, e.g., Collections // TODO: not ready yet, e.g., Collections
// reportOn(declaration.source, FirErrors.NOTHING_TO_OVERRIDE, declaration, context) // reportOn(declaration.source, FirErrors.NOTHING_TO_OVERRIDE, declaration, context)
} }
private fun DiagnosticReporter.reportOverridingFinalMember( private fun DiagnosticReporter.reportOverridingFinalMember(
overriding: FirStatusOwner, overriding: FirMemberDeclaration,
overridden: FirCallableDeclaration, overridden: FirCallableDeclaration,
context: CheckerContext context: CheckerContext
) { ) {
@@ -250,15 +250,15 @@ object FirOverrideChecker : FirClassChecker() {
} }
private fun DiagnosticReporter.reportVarOverriddenByVal( private fun DiagnosticReporter.reportVarOverriddenByVal(
overriding: FirStatusOwner, overriding: FirMemberDeclaration,
overridden: FirStatusOwner, overridden: FirMemberDeclaration,
context: CheckerContext context: CheckerContext
) { ) {
reportOn(overriding.source, FirErrors.VAR_OVERRIDDEN_BY_VAL, overriding, overridden, context) reportOn(overriding.source, FirErrors.VAR_OVERRIDDEN_BY_VAL, overriding, overridden, context)
} }
private fun DiagnosticReporter.reportCannotWeakenAccessPrivilege( private fun DiagnosticReporter.reportCannotWeakenAccessPrivilege(
overriding: FirStatusOwner, overriding: FirMemberDeclaration,
overridden: FirCallableDeclaration, overridden: FirCallableDeclaration,
context: CheckerContext context: CheckerContext
) { ) {
@@ -274,7 +274,7 @@ object FirOverrideChecker : FirClassChecker() {
} }
private fun DiagnosticReporter.reportCannotChangeAccessPrivilege( private fun DiagnosticReporter.reportCannotChangeAccessPrivilege(
overriding: FirStatusOwner, overriding: FirMemberDeclaration,
overridden: FirCallableDeclaration, overridden: FirCallableDeclaration,
context: CheckerContext context: CheckerContext
) { ) {
@@ -290,24 +290,24 @@ object FirOverrideChecker : FirClassChecker() {
} }
private fun DiagnosticReporter.reportReturnTypeMismatchOnFunction( private fun DiagnosticReporter.reportReturnTypeMismatchOnFunction(
overriding: FirStatusOwner, overriding: FirMemberDeclaration,
overridden: FirStatusOwner, overridden: FirMemberDeclaration,
context: CheckerContext context: CheckerContext
) { ) {
reportOn(overriding.source, FirErrors.RETURN_TYPE_MISMATCH_ON_OVERRIDE, overriding, overridden, context) reportOn(overriding.source, FirErrors.RETURN_TYPE_MISMATCH_ON_OVERRIDE, overriding, overridden, context)
} }
private fun DiagnosticReporter.reportTypeMismatchOnProperty( private fun DiagnosticReporter.reportTypeMismatchOnProperty(
overriding: FirStatusOwner, overriding: FirMemberDeclaration,
overridden: FirStatusOwner, overridden: FirMemberDeclaration,
context: CheckerContext context: CheckerContext
) { ) {
reportOn(overriding.source, FirErrors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE, overriding, overridden, context) reportOn(overriding.source, FirErrors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE, overriding, overridden, context)
} }
private fun DiagnosticReporter.reportTypeMismatchOnVariable( private fun DiagnosticReporter.reportTypeMismatchOnVariable(
overriding: FirStatusOwner, overriding: FirMemberDeclaration,
overridden: FirStatusOwner, overridden: FirMemberDeclaration,
context: CheckerContext context: CheckerContext
) { ) {
reportOn(overriding.source, FirErrors.VAR_TYPE_MISMATCH_ON_OVERRIDE, overriding, overridden, context) reportOn(overriding.source, FirErrors.VAR_TYPE_MISMATCH_ON_OVERRIDE, overriding, overridden, context)
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnsupportedDynamicType import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnsupportedDynamicType
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
@@ -35,7 +35,7 @@ object FirTypeParameterBoundsChecker : FirTypeParameterChecker() {
checkFinalUpperBounds(declaration, containingDeclaration, context, reporter) checkFinalUpperBounds(declaration, containingDeclaration, context, reporter)
checkExtensionFunctionTypeBound(declaration, context, reporter) checkExtensionFunctionTypeBound(declaration, context, reporter)
if (containingDeclaration.safeAs<FirStatusOwner>()?.isInlineOnly() != true) { if (containingDeclaration.safeAs<FirMemberDeclaration>()?.isInlineOnly() != true) {
checkOnlyOneTypeParameterBound(declaration, context, reporter) checkOnlyOneTypeParameterBound(declaration, context, reporter)
} }
@@ -18,14 +18,14 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.modalityModifier
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
object RedundantModalityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirDeclaration, KtDeclaration>() { object RedundantModalityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirDeclaration, KtDeclaration>() {
override fun isApplicable(element: FirDeclaration, source: FirSourceElement): Boolean = override fun isApplicable(element: FirDeclaration, source: FirSourceElement): Boolean =
source.kind !is FirFakeSourceElementKind && element is FirStatusOwner source.kind !is FirFakeSourceElementKind && element is FirMemberDeclaration
override fun checkLightTree( override fun checkLightTree(
element: FirDeclaration, element: FirDeclaration,
@@ -33,7 +33,7 @@ object RedundantModalityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirD
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
require(element is FirStatusOwner) require(element is FirMemberDeclaration)
val modality = element.modality ?: return val modality = element.modality ?: return
if ( if (
modality == Modality.FINAL modality == Modality.FINAL
@@ -35,14 +35,14 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
if (element is FirConstructor && source.kind is FirFakeSourceElementKind) return if (element is FirConstructor && source.kind is FirFakeSourceElementKind) return
if (source is FirFakeSourceElement) return if (source is FirFakeSourceElement) return
if ( if (
element !is FirStatusOwner element !is FirMemberDeclaration
&& !(element is FirPropertyAccessor && element.visibility == context.containingPropertyVisibility) && !(element is FirPropertyAccessor && element.visibility == context.containingPropertyVisibility)
) return ) return
val visibilityModifier = source.treeStructure.visibilityModifier(source.lighterASTNode) val visibilityModifier = source.treeStructure.visibilityModifier(source.lighterASTNode)
val explicitVisibility = (visibilityModifier?.tokenType as? KtModifierKeywordToken)?.toVisibilityOrNull() val explicitVisibility = (visibilityModifier?.tokenType as? KtModifierKeywordToken)?.toVisibilityOrNull()
val implicitVisibility = element.implicitVisibility(context) val implicitVisibility = element.implicitVisibility(context)
val containingMemberDeclaration = context.findClosest<FirStatusOwner>() val containingMemberDeclaration = context.findClosest<FirMemberDeclaration>()
require(containingMemberDeclaration is FirDeclaration?) require(containingMemberDeclaration is FirDeclaration?)
val redundantVisibility = when { val redundantVisibility = when {
@@ -108,7 +108,7 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
} }
private fun FirFunction.visibility(): Visibility? { private fun FirFunction.visibility(): Visibility? {
(symbol.fir as? FirStatusOwner)?.visibility?.let { (symbol.fir as? FirMemberDeclaration)?.visibility?.let {
return it return it
} }
@@ -59,7 +59,7 @@ object FirDiagnosticRenderers {
val NAME = Renderer { element: FirElement -> val NAME = Renderer { element: FirElement ->
when (element) { when (element) {
is FirStatusOwner -> DECLARATION_NAME.render(element) is FirMemberDeclaration -> DECLARATION_NAME.render(element)
is FirCallableDeclaration -> element.symbol.callableId.callableName.asString() is FirCallableDeclaration -> element.symbol.callableId.callableName.asString()
else -> "???" else -> "???"
} }
@@ -69,7 +69,7 @@ object FirDiagnosticRenderers {
visibility.externalDisplayName visibility.externalDisplayName
} }
val DECLARATION_NAME = Renderer { declaration: FirStatusOwner -> val DECLARATION_NAME = Renderer { declaration: FirMemberDeclaration ->
val name = when (declaration) { val name = when (declaration) {
is FirProperty -> declaration.name is FirProperty -> declaration.name
is FirSimpleFunction -> declaration.name is FirSimpleFunction -> declaration.name
@@ -914,15 +914,15 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
} }
} }
private fun FlowContent.generate(statusOwner: FirStatusOwner) { private fun FlowContent.generate(memberDeclaration: FirMemberDeclaration) {
when (statusOwner) { when (memberDeclaration) {
is FirEnumEntry -> generate(statusOwner) is FirEnumEntry -> generate(memberDeclaration)
is FirRegularClass -> generate(statusOwner) is FirRegularClass -> generate(memberDeclaration)
is FirSimpleFunction -> generate(statusOwner) is FirSimpleFunction -> generate(memberDeclaration)
is FirProperty -> if (statusOwner.isLocal) generate(statusOwner as FirVariable) else generate(statusOwner) is FirProperty -> if (memberDeclaration.isLocal) generate(memberDeclaration as FirVariable) else generate(memberDeclaration)
is FirConstructor -> generate(statusOwner) is FirConstructor -> generate(memberDeclaration)
is FirTypeAlias -> generate(statusOwner) is FirTypeAlias -> generate(memberDeclaration)
else -> unsupported(statusOwner) else -> unsupported(memberDeclaration)
} }
} }
@@ -1772,7 +1772,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
private fun FlowContent.generate(declaration: FirDeclaration) { private fun FlowContent.generate(declaration: FirDeclaration) {
when (declaration) { when (declaration) {
is FirAnonymousInitializer -> generate(declaration) is FirAnonymousInitializer -> generate(declaration)
is FirStatusOwner -> generate(declaration as FirStatusOwner) is FirMemberDeclaration -> generate(declaration as FirMemberDeclaration)
else -> unsupported(declaration) else -> unsupported(declaration)
} }
} }
@@ -8,11 +8,11 @@ package org.jetbrains.kotlin.fir.session
import org.jetbrains.kotlin.fir.FirModuleVisibilityChecker import org.jetbrains.kotlin.fir.FirModuleVisibilityChecker
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.moduleData
class FirJvmModuleVisibilityChecker(private val session: FirSession) : FirModuleVisibilityChecker { class FirJvmModuleVisibilityChecker(private val session: FirSession) : FirModuleVisibilityChecker {
override fun <T> isInFriendModule(declaration: T): Boolean where T : FirStatusOwner, T : FirDeclaration { override fun <T> isInFriendModule(declaration: T): Boolean where T : FirMemberDeclaration, T : FirDeclaration {
val useSiteModuleData = session.moduleData val useSiteModuleData = session.moduleData
val declarationModuleData = declaration.moduleData val declarationModuleData = declaration.moduleData
return useSiteModuleData == declarationModuleData || declarationModuleData in useSiteModuleData.friendDependencies return useSiteModuleData == declarationModuleData || declarationModuleData in useSiteModuleData.friendDependencies
@@ -199,7 +199,7 @@ fun deserializeClassToSymbol(
override fun compare(a: FirDeclaration, b: FirDeclaration): Int { override fun compare(a: FirDeclaration, b: FirDeclaration): Int {
// Reorder members based on their type and name only. // Reorder members based on their type and name only.
// See FE 1.0's [DeserializedMemberScope#addMembers]. // See FE 1.0's [DeserializedMemberScope#addMembers].
if (a is FirStatusOwner && b is FirStatusOwner) { if (a is FirMemberDeclaration && b is FirMemberDeclaration) {
return FirMemberDeclarationComparator.TypeAndNameComparator.compare(a, b) return FirMemberDeclarationComparator.TypeAndNameComparator.compare(a, b)
} }
return 0 return 0
@@ -683,7 +683,7 @@ class FirElementSerializer private constructor(
} }
is ConeTypeParameterType -> { is ConeTypeParameterType -> {
val typeParameter = type.lookupTag.typeParameterSymbol.fir val typeParameter = type.lookupTag.typeParameterSymbol.fir
if (typeParameter in (containingDeclaration as? FirStatusOwner)?.typeParameters ?: emptyList()) { if (typeParameter in (containingDeclaration as? FirMemberDeclaration)?.typeParameters ?: emptyList()) {
builder.typeParameterName = getSimpleNameIndex(typeParameter.name) builder.typeParameterName = getSimpleNameIndex(typeParameter.name)
} else { } else {
builder.typeParameter = getTypeParameterId(typeParameter) builder.typeParameter = getTypeParameterId(typeParameter)
@@ -929,7 +929,7 @@ class FirElementSerializer private constructor(
} }
private fun normalizeVisibility(declaration: FirStatusOwner): Visibility { private fun normalizeVisibility(declaration: FirMemberDeclaration): Visibility {
return declaration.visibility.normalize() return declaration.visibility.normalize()
} }
@@ -33,7 +33,7 @@ open class FirJvmMangleComputer(
private val session: FirSession private val session: FirSession
) : FirVisitor<Unit, Boolean>(), KotlinMangleComputer<FirDeclaration> { ) : FirVisitor<Unit, Boolean>(), KotlinMangleComputer<FirDeclaration> {
private val typeParameterContainer = ArrayList<FirStatusOwner>(4) private val typeParameterContainer = ArrayList<FirMemberDeclaration>(4)
private var isRealExpect = false private var isRealExpect = false
@@ -113,9 +113,9 @@ open class FirJvmMangleComputer(
private fun FirFunction.mangleFunction(isCtor: Boolean, isStatic: Boolean, container: FirDeclaration) { private fun FirFunction.mangleFunction(isCtor: Boolean, isStatic: Boolean, container: FirDeclaration) {
isRealExpect = isRealExpect || (this as? FirStatusOwner)?.isExpect == true isRealExpect = isRealExpect || (this as? FirMemberDeclaration)?.isExpect == true
if (container is FirStatusOwner) { if (container is FirMemberDeclaration) {
typeParameterContainer.add(container) typeParameterContainer.add(container)
} }
visitParent() visitParent()
@@ -166,7 +166,7 @@ open class FirJvmMangleComputer(
} }
} }
private fun FirTypeParameter.effectiveParent(): FirStatusOwner { private fun FirTypeParameter.effectiveParent(): FirMemberDeclaration {
for (parent in typeParameterContainer) { for (parent in typeParameterContainer) {
if (this in parent.typeParameters) { if (this in parent.typeParameters) {
return parent return parent
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrConversionScope
import org.jetbrains.kotlin.fir.backend.FirMetadataSource import org.jetbrains.kotlin.fir.backend.FirMetadataSource
import org.jetbrains.kotlin.fir.backend.convertWithOffsets import org.jetbrains.kotlin.fir.backend.convertWithOffsets
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
@@ -180,7 +180,7 @@ internal class AdapterGenerator(
): IrSimpleFunction { ): IrSimpleFunction {
val returnType = type.arguments.last().typeOrNull!! val returnType = type.arguments.last().typeOrNull!!
val parameterTypes = type.arguments.dropLast(1).map { it.typeOrNull!! } val parameterTypes = type.arguments.dropLast(1).map { it.typeOrNull!! }
val firMemberAdaptee = firAdaptee as FirStatusOwner val firMemberAdaptee = firAdaptee as FirMemberDeclaration
return irFactory.createFunction( return irFactory.createFunction(
startOffset, endOffset, startOffset, endOffset,
IrDeclarationOrigin.ADAPTER_FOR_CALLABLE_REFERENCE, IrDeclarationOrigin.ADAPTER_FOR_CALLABLE_REFERENCE,
@@ -300,7 +300,7 @@ internal class AdapterGenerator(
boundDispatchReceiver != null -> irCall.dispatchReceiver = receiverValue boundDispatchReceiver != null -> irCall.dispatchReceiver = receiverValue
boundExtensionReceiver != null -> irCall.extensionReceiver = receiverValue boundExtensionReceiver != null -> irCall.extensionReceiver = receiverValue
} }
} else if (callableReferenceAccess.explicitReceiver is FirResolvedQualifier && ((firAdaptee as? FirStatusOwner)?.isStatic != true)) { } else if (callableReferenceAccess.explicitReceiver is FirResolvedQualifier && ((firAdaptee as? FirMemberDeclaration)?.isStatic != true)) {
// Unbound callable reference 'A::foo' // Unbound callable reference 'A::foo'
val adaptedReceiverParameter = adapterFunction.valueParameters[0] val adaptedReceiverParameter = adapterFunction.valueParameters[0]
val adaptedReceiverValue = IrGetValueImpl( val adaptedReceiverValue = IrGetValueImpl(
@@ -8,8 +8,7 @@ package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.toIrType import org.jetbrains.kotlin.fir.backend.toIrType
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.symbols.Fir2IrBindableSymbol import org.jetbrains.kotlin.fir.symbols.Fir2IrBindableSymbol
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
@@ -21,7 +20,7 @@ import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import kotlin.properties.ReadWriteProperty import kotlin.properties.ReadWriteProperty
interface AbstractFir2IrLazyDeclaration<F, D : IrDeclaration> : interface AbstractFir2IrLazyDeclaration<F, D : IrDeclaration> :
IrDeclaration, IrDeclarationParent, Fir2IrComponents where F : FirStatusOwner, F : FirAnnotationContainer { IrDeclaration, IrDeclarationParent, Fir2IrComponents where F : FirMemberDeclaration, F : FirAnnotationContainer {
val fir: F val fir: F
override val symbol: Fir2IrBindableSymbol<*, D> override val symbol: Fir2IrBindableSymbol<*, D>
@@ -598,7 +598,7 @@ class FirCallResolver(
createResolvedReferenceWithoutCandidateForLocalVariables && createResolvedReferenceWithoutCandidateForLocalVariables &&
explicitReceiver?.typeRef?.coneTypeSafe<ConeIntegerLiteralType>() == null && explicitReceiver?.typeRef?.coneTypeSafe<ConeIntegerLiteralType>() == null &&
coneSymbol is FirVariableSymbol && coneSymbol is FirVariableSymbol &&
(coneSymbol !is FirPropertySymbol || (coneSymbol.fir as FirStatusOwner).typeParameters.isEmpty()) (coneSymbol !is FirPropertySymbol || (coneSymbol.fir as FirMemberDeclaration).typeParameters.isEmpty())
) { ) {
return buildResolvedNamedReference { return buildResolvedNamedReference {
this.source = source this.source = source
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
interface FirModuleVisibilityChecker : FirSessionComponent { interface FirModuleVisibilityChecker : FirSessionComponent {
fun <T> isInFriendModule(declaration: T): Boolean where T : FirStatusOwner, T : FirDeclaration fun <T> isInFriendModule(declaration: T): Boolean where T : FirMemberDeclaration, T : FirDeclaration
} }
abstract class FirVisibilityChecker : FirSessionComponent { abstract class FirVisibilityChecker : FirSessionComponent {
@@ -44,12 +44,12 @@ abstract class FirVisibilityChecker : FirSessionComponent {
} }
fun isVisible( fun isVisible(
declaration: FirStatusOwner, declaration: FirMemberDeclaration,
candidate: Candidate candidate: Candidate
): Boolean { ): Boolean {
if (declaration is FirCallableDeclaration && (declaration.isIntersectionOverride || declaration.isSubstitutionOverride)) { if (declaration is FirCallableDeclaration && (declaration.isIntersectionOverride || declaration.isSubstitutionOverride)) {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
return isVisible(declaration.originalIfFakeOverride() as FirStatusOwner, candidate) return isVisible(declaration.originalIfFakeOverride() as FirMemberDeclaration, candidate)
} }
val callInfo = candidate.callInfo val callInfo = candidate.callInfo
@@ -61,7 +61,7 @@ abstract class FirVisibilityChecker : FirSessionComponent {
} }
fun isVisible( fun isVisible(
declaration: FirStatusOwner, declaration: FirMemberDeclaration,
session: FirSession, session: FirSession,
useSiteFile: FirFile, useSiteFile: FirFile,
containingDeclarations: List<FirDeclaration>, containingDeclarations: List<FirDeclaration>,
@@ -408,6 +408,6 @@ private fun FirVariable.canBeMutableReference(candidate: Candidate): Boolean {
if (this is FirField) return true if (this is FirField) return true
val original = this.unwrapFakeOverrides() val original = this.unwrapFakeOverrides()
return original.source?.kind == FirFakeSourceElementKind.PropertyFromParameter || return original.source?.kind == FirFakeSourceElementKind.PropertyFromParameter ||
(original.setter is FirStatusOwner && (original.setter is FirMemberDeclaration &&
candidate.callInfo.session.visibilityChecker.isVisible(original.setter!!, candidate)) candidate.callInfo.session.visibilityChecker.isVisible(original.setter!!, candidate))
} }
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.inference.ConeTypeParameterBasedTypeVariable import org.jetbrains.kotlin.fir.resolve.inference.ConeTypeParameterBasedTypeVariable
@@ -102,7 +102,7 @@ class ConeOverloadConflictResolver(
} }
if (discriminateAbstracts) { if (discriminateAbstracts) {
val filtered = candidates.filterTo(mutableSetOf()) { (it.symbol.fir as? FirStatusOwner)?.modality != Modality.ABSTRACT } val filtered = candidates.filterTo(mutableSetOf()) { (it.symbol.fir as? FirMemberDeclaration)?.modality != Modality.ABSTRACT }
when (filtered.size) { when (filtered.size) {
1 -> return filtered 1 -> return filtered
0, candidates.size -> { 0, candidates.size -> {
@@ -103,7 +103,7 @@ object CheckDispatchReceiver : ResolutionStage() {
override suspend fun check(candidate: Candidate, callInfo: CallInfo, sink: CheckerSink, context: ResolutionContext) { override suspend fun check(candidate: Candidate, callInfo: CallInfo, sink: CheckerSink, context: ResolutionContext) {
val explicitReceiverExpression = callInfo.explicitReceiver val explicitReceiverExpression = callInfo.explicitReceiver
if (explicitReceiverExpression.isSuperCall()) { if (explicitReceiverExpression.isSuperCall()) {
val status = candidate.symbol.fir as? FirStatusOwner val status = candidate.symbol.fir as? FirMemberDeclaration
if (status?.modality == Modality.ABSTRACT) { if (status?.modality == Modality.ABSTRACT) {
sink.reportDiagnostic(ResolvedWithLowPriority) sink.reportDiagnostic(ResolvedWithLowPriority)
} }
@@ -199,7 +199,7 @@ internal object CheckVisibility : CheckerStage() {
val visibilityChecker = callInfo.session.visibilityChecker val visibilityChecker = callInfo.session.visibilityChecker
val symbol = candidate.symbol val symbol = candidate.symbol
val declaration = symbol.fir val declaration = symbol.fir
if (declaration is FirStatusOwner) { if (declaration is FirMemberDeclaration) {
if (!checkVisibility(declaration, sink, candidate, visibilityChecker)) { if (!checkVisibility(declaration, sink, candidate, visibilityChecker)) {
return return
} }
@@ -218,7 +218,7 @@ internal object CheckVisibility : CheckerStage() {
} }
} }
private suspend fun <T : FirStatusOwner> checkVisibility( private suspend fun <T : FirMemberDeclaration> checkVisibility(
declaration: T, declaration: T,
sink: CheckerSink, sink: CheckerSink,
candidate: Candidate, candidate: Candidate,
@@ -88,7 +88,7 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(
} }
} }
protected fun FirStatusOwner.addTypeParametersScope() { protected fun FirMemberDeclaration.addTypeParametersScope() {
if (typeParameters.isNotEmpty()) { if (typeParameters.isNotEmpty()) {
scopes.add(FirMemberTypeParameterScope(this)) scopes.add(FirMemberTypeParameterScope(this))
} }
@@ -174,7 +174,7 @@ open class FirApplySupertypesTransformer(
} }
private fun FirClassLikeDeclaration.typeParametersScope(): FirScope? { private fun FirClassLikeDeclaration.typeParametersScope(): FirScope? {
if (this !is FirStatusOwner || typeParameters.isEmpty()) return null if (this !is FirMemberDeclaration || typeParameters.isEmpty()) return null
return FirMemberTypeParameterScope(this) return FirMemberTypeParameterScope(this)
} }
@@ -223,7 +223,7 @@ class BodyResolveContext(
} }
@PrivateForInline @PrivateForInline
inline fun <T> withTypeParametersOf(declaration: FirStatusOwner, l: () -> T): T { inline fun <T> withTypeParametersOf(declaration: FirMemberDeclaration, l: () -> T): T {
if (declaration.typeParameters.isEmpty()) return l() if (declaration.typeParameters.isEmpty()) return l()
val scope = FirMemberTypeParameterScope(declaration) val scope = FirMemberTypeParameterScope(declaration)
return withTowerDataCleanup { return withTowerDataCleanup {
@@ -232,7 +232,7 @@ class BodyResolveContext(
} }
} }
private fun FirStatusOwner.typeParameterScope(): FirMemberTypeParameterScope? { private fun FirMemberDeclaration.typeParameterScope(): FirMemberTypeParameterScope? {
if (typeParameters.isEmpty()) return null if (typeParameters.isEmpty()) return null
return FirMemberTypeParameterScope(this) return FirMemberTypeParameterScope(this)
} }
@@ -50,7 +50,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
private val statusResolver: FirStatusResolver = FirStatusResolver(session, scopeSession) private val statusResolver: FirStatusResolver = FirStatusResolver(session, scopeSession)
private fun FirDeclaration.visibilityForApproximation(): Visibility { private fun FirDeclaration.visibilityForApproximation(): Visibility {
if (this !is FirStatusOwner) return Visibilities.Local if (this !is FirMemberDeclaration) return Visibilities.Local
val container = context.containers.getOrNull(context.containers.size - 2) val container = context.containers.getOrNull(context.containers.size - 2)
val containerVisibility = val containerVisibility =
if (container == null) Visibilities.Public if (container == null) Visibilities.Public
@@ -93,13 +93,13 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor
} }
} }
protected fun createTypeParameterScope(declaration: FirStatusOwner): FirMemberTypeParameterScope? { protected fun createTypeParameterScope(declaration: FirMemberDeclaration): FirMemberTypeParameterScope? {
if (declaration.typeParameters.isEmpty()) return null if (declaration.typeParameters.isEmpty()) return null
doTransformTypeParameters(declaration) doTransformTypeParameters(declaration)
return FirMemberTypeParameterScope(declaration) return FirMemberTypeParameterScope(declaration)
} }
private fun doTransformTypeParameters(declaration: FirStatusOwner) { private fun doTransformTypeParameters(declaration: FirMemberDeclaration) {
for (typeParameter in declaration.typeParameters) { for (typeParameter in declaration.typeParameters) {
(typeParameter as? FirTypeParameter)?.let { transformer.replaceDeclarationResolvePhaseIfNeeded(it, FirResolvePhase.STATUS) } (typeParameter as? FirTypeParameter)?.let { transformer.replaceDeclarationResolvePhaseIfNeeded(it, FirResolvePhase.STATUS) }
typeParameter.transformChildren(transformer, ResolutionMode.ContextIndependent) typeParameter.transformChildren(transformer, ResolutionMode.ContextIndependent)
@@ -30,7 +30,7 @@ class FirGlobalExtensionStatusProcessor(
val declarations = provider.getSymbolsWithOwnersByPredicate(extension.predicate) val declarations = provider.getSymbolsWithOwnersByPredicate(extension.predicate)
for ((declaration, owners) in declarations) { for ((declaration, owners) in declarations) {
// TODO: maybe replace with visitor? // TODO: maybe replace with visitor?
if (declaration is FirStatusOwner) { if (declaration is FirMemberDeclaration) {
val newStatus = extension.transformStatus(declaration, owners, declaration.status) val newStatus = extension.transformStatus(declaration, owners, declaration.status)
declaration.transformStatus(ReplaceStatus, newStatus) declaration.transformStatus(ReplaceStatus, newStatus)
} }
@@ -49,7 +49,7 @@ class FirTransformerBasedExtensionStatusProcessor(
private val extensions = session.extensionService.statusTransformerExtensions private val extensions = session.extensionService.statusTransformerExtensions
private val predicateBasedProvider = session.predicateBasedProvider private val predicateBasedProvider = session.predicateBasedProvider
private fun FirStatusOwner.updateStatus() { private fun FirMemberDeclaration.updateStatus() {
if (extensions.isEmpty()) return if (extensions.isEmpty()) return
val owners = predicateBasedProvider.getOwnersOfDeclaration(this as FirAnnotatedDeclaration) val owners = predicateBasedProvider.getOwnersOfDeclaration(this as FirAnnotatedDeclaration)
requireNotNull(owners) requireNotNull(owners)
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType
import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.moduleData
@@ -32,7 +32,7 @@ enum class FirImportingScopeFilter {
if (this == ALL) return true if (this == ALL) return true
// TODO: also check DeprecationLevel.HIDDEN and required Kotlin version // TODO: also check DeprecationLevel.HIDDEN and required Kotlin version
val fir = symbol.fir val fir = symbol.fir
if (fir !is FirStatusOwner) return false if (fir !is FirMemberDeclaration) return false
val isVisible = when (fir.status.visibility) { val isVisible = when (fir.status.visibility) {
// When importing from the same module, status may be unknown because the status resolver depends on super types // When importing from the same module, status may be unknown because the status resolver depends on super types
// to determine visibility for functions, so it may not have finished yet. Since we only care about classes, // to determine visibility for functions, so it may not have finished yet. Since we only care about classes,
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.fir.scopes.impl package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.scopes.FirTypeParameterScope import org.jetbrains.kotlin.fir.scopes.FirTypeParameterScope
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirMemberTypeParameterScope(callableMember: FirStatusOwner) : FirTypeParameterScope() { class FirMemberTypeParameterScope(callableMember: FirMemberDeclaration) : FirTypeParameterScope() {
override val typeParameters: Map<Name, List<FirTypeParameter>> = override val typeParameters: Map<Name, List<FirTypeParameter>> =
callableMember.typeParameters.filterIsInstance<FirTypeParameter>().groupBy { it.name } callableMember.typeParameters.filterIsInstance<FirTypeParameter>().groupBy { it.name }
} }
@@ -99,7 +99,7 @@ class FirTypeIntersectionScope private constructor(
val maxByVisibility = findMemberWithMaxVisibility(allMembersWithScope) val maxByVisibility = findMemberWithMaxVisibility(allMembersWithScope)
val extractBothWaysWithPrivate = extractBothWaysOverridable(maxByVisibility, allMembersWithScope) val extractBothWaysWithPrivate = extractBothWaysOverridable(maxByVisibility, allMembersWithScope)
val extractedOverrides = extractBothWaysWithPrivate.filterNotTo(mutableListOf()) { val extractedOverrides = extractBothWaysWithPrivate.filterNotTo(mutableListOf()) {
Visibilities.isPrivate((it.member.fir as FirStatusOwner).visibility) Visibilities.isPrivate((it.member.fir as FirMemberDeclaration).visibility)
}.takeIf { it.isNotEmpty() } ?: extractBothWaysWithPrivate }.takeIf { it.isNotEmpty() } ?: extractBothWaysWithPrivate
val baseMembersForIntersection = extractedOverrides.calcBaseMembersForIntersectionOverride() val baseMembersForIntersection = extractedOverrides.calcBaseMembersForIntersectionOverride()
if (baseMembersForIntersection.size > 1) { if (baseMembersForIntersection.size > 1) {
@@ -190,7 +190,7 @@ class FirTypeIntersectionScope private constructor(
var hasAbstract = false var hasAbstract = false
for ((member) in extractedOverridden) { for ((member) in extractedOverridden) {
when ((member.fir as FirStatusOwner).modality) { when ((member.fir as FirMemberDeclaration).modality) {
Modality.FINAL -> return Modality.FINAL Modality.FINAL -> return Modality.FINAL
Modality.SEALED -> { Modality.SEALED -> {
// Members should not be sealed. But, that will be reported as WRONG_MODIFIER_TARGET, and here we shouldn't raise an // Members should not be sealed. But, that will be reported as WRONG_MODIFIER_TARGET, and here we shouldn't raise an
@@ -221,7 +221,7 @@ class FirTypeIntersectionScope private constructor(
val realOverridden = extractedOverridden.flatMap { realOverridden(it.member, it.baseScope, processDirectOverridden) } val realOverridden = extractedOverridden.flatMap { realOverridden(it.member, it.baseScope, processDirectOverridden) }
val filteredOverridden = filterOutOverridden(realOverridden, processDirectOverridden) val filteredOverridden = filterOutOverridden(realOverridden, processDirectOverridden)
return filteredOverridden.minOf { (it.member.fir as FirStatusOwner).modality ?: Modality.ABSTRACT } return filteredOverridden.minOf { (it.member.fir as FirMemberDeclaration).modality ?: Modality.ABSTRACT }
} }
private fun <D : FirCallableSymbol<*>> realOverridden( private fun <D : FirCallableSymbol<*>> realOverridden(
@@ -299,7 +299,7 @@ class FirTypeIntersectionScope private constructor(
): Visibility { ): Visibility {
var maxVisibility: Visibility = Visibilities.Private var maxVisibility: Visibility = Visibilities.Private
for ((override) in extractedOverrides) { for ((override) in extractedOverrides) {
val visibility = (override.fir as FirStatusOwner).visibility val visibility = (override.fir as FirMemberDeclaration).visibility
// TODO: There is more complex logic at org.jetbrains.kotlin.resolve.OverridingUtil.resolveUnknownVisibilityForMember // TODO: There is more complex logic at org.jetbrains.kotlin.resolve.OverridingUtil.resolveUnknownVisibilityForMember
// TODO: and org.jetbrains.kotlin.resolve.OverridingUtil.findMaxVisibility // TODO: and org.jetbrains.kotlin.resolve.OverridingUtil.findMaxVisibility
val compare = Visibilities.compare(visibility, maxVisibility) ?: return Visibilities.DEFAULT_VISIBILITY val compare = Visibilities.compare(visibility, maxVisibility) ?: return Visibilities.DEFAULT_VISIBILITY
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
sealed class FirCallableMemberDeclaration : FirCallableDeclaration(), FirStatusOwner { sealed class FirCallableMemberDeclaration : FirCallableDeclaration(), FirMemberDeclaration {
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract override val moduleData: FirModuleData abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase abstract override val resolvePhase: FirResolvePhase
@@ -14,18 +14,18 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
sealed interface FirStatusOwner : FirTypeParameterRefsOwner { sealed interface FirMemberDeclaration : FirTypeParameterRefsOwner {
override val source: FirSourceElement? override val source: FirSourceElement?
override val typeParameters: List<FirTypeParameterRef> override val typeParameters: List<FirTypeParameterRef>
val status: FirDeclarationStatus val status: FirDeclarationStatus
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitStatusOwner(this, data) override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitMemberDeclaration(this, data)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E = override fun <E: FirElement, D> transform(transformer: FirTransformer<D>, data: D): E =
transformer.transformStatusOwner(this, data) as E transformer.transformMemberDeclaration(this, data) as E
override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirStatusOwner override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirMemberDeclaration
fun <D> transformStatus(transformer: FirTransformer<D>, data: D): FirStatusOwner fun <D> transformStatus(transformer: FirTransformer<D>, data: D): FirMemberDeclaration
} }
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
abstract class FirRegularClass : FirClass(), FirStatusOwner, FirControlFlowGraphOwner { abstract class FirRegularClass : FirClass(), FirMemberDeclaration, FirControlFlowGraphOwner {
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract override val moduleData: FirModuleData abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase abstract override val resolvePhase: FirResolvePhase
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
abstract class FirTypeAlias : FirClassLikeDeclaration(), FirStatusOwner, FirTypeParametersOwner { abstract class FirTypeAlias : FirClassLikeDeclaration(), FirMemberDeclaration, FirTypeParametersOwner {
abstract override val source: FirSourceElement? abstract override val source: FirSourceElement?
abstract override val moduleData: FirModuleData abstract override val moduleData: FirModuleData
abstract override val resolvePhase: FirResolvePhase abstract override val resolvePhase: FirResolvePhase
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
@@ -223,8 +223,8 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformElement(typeParametersOwner, data) return transformElement(typeParametersOwner, data)
} }
open fun transformStatusOwner(statusOwner: FirStatusOwner, data: D): FirStatusOwner { open fun transformMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: D): FirMemberDeclaration {
return transformElement(statusOwner, data) return transformElement(memberDeclaration, data)
} }
open fun transformCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): FirCallableMemberDeclaration { open fun transformCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): FirCallableMemberDeclaration {
@@ -735,8 +735,8 @@ abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {
return transformTypeParametersOwner(typeParametersOwner, data) return transformTypeParametersOwner(typeParametersOwner, data)
} }
final override fun visitStatusOwner(statusOwner: FirStatusOwner, data: D): FirStatusOwner { final override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: D): FirMemberDeclaration {
return transformStatusOwner(statusOwner, data) return transformMemberDeclaration(memberDeclaration, data)
} }
final override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): FirCallableMemberDeclaration { final override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): FirCallableMemberDeclaration {
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
@@ -182,7 +182,7 @@ abstract class FirVisitor<out R, in D> {
open fun visitTypeParametersOwner(typeParametersOwner: FirTypeParametersOwner, data: D): R = visitElement(typeParametersOwner, data) open fun visitTypeParametersOwner(typeParametersOwner: FirTypeParametersOwner, data: D): R = visitElement(typeParametersOwner, data)
open fun visitStatusOwner(statusOwner: FirStatusOwner, data: D): R = visitElement(statusOwner, data) open fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: D): R = visitElement(memberDeclaration, data)
open fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): R = visitElement(callableMemberDeclaration, data) open fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: D): R = visitElement(callableMemberDeclaration, data)
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRef
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner import org.jetbrains.kotlin.fir.declarations.FirTypeParametersOwner
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
@@ -222,8 +222,8 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitElement(typeParametersOwner) visitElement(typeParametersOwner)
} }
open fun visitStatusOwner(statusOwner: FirStatusOwner) { open fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration) {
visitElement(statusOwner) visitElement(memberDeclaration)
} }
open fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration) { open fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration) {
@@ -734,8 +734,8 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitTypeParametersOwner(typeParametersOwner) visitTypeParametersOwner(typeParametersOwner)
} }
final override fun visitStatusOwner(statusOwner: FirStatusOwner, data: Nothing?) { final override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration, data: Nothing?) {
visitStatusOwner(statusOwner) visitMemberDeclaration(memberDeclaration)
} }
final override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: Nothing?) { final override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration, data: Nothing?) {
@@ -217,8 +217,8 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) { override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) {
callableDeclaration.annotations.renderAnnotations() callableDeclaration.annotations.renderAnnotations()
if (callableDeclaration is FirStatusOwner) { if (callableDeclaration is FirMemberDeclaration) {
visitStatusOwner(callableDeclaration) visitMemberDeclaration(callableDeclaration)
} else { } else {
visitTypedDeclaration(callableDeclaration) visitTypedDeclaration(callableDeclaration)
} }
@@ -273,7 +273,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
return itself + "[${effectiveVisibility.name}]" return itself + "[${effectiveVisibility.name}]"
} }
private fun FirStatusOwner.modalityAsString(): String { private fun FirMemberDeclaration.modalityAsString(): String {
return modality?.name?.toLowerCaseAsciiOnly() ?: run { return modality?.name?.toLowerCaseAsciiOnly() ?: run {
if (this is FirCallableMemberDeclaration && this.isOverride) { if (this is FirCallableMemberDeclaration && this.isOverride) {
"open?" "open?"
@@ -303,86 +303,86 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
typeParameterRef.symbol.fir.accept(this) typeParameterRef.symbol.fir.accept(this)
} }
override fun visitStatusOwner(statusOwner: FirStatusOwner) { override fun visitMemberDeclaration(memberDeclaration: FirMemberDeclaration) {
if (statusOwner !is FirProperty || !statusOwner.isLocal) { if (memberDeclaration !is FirProperty || !memberDeclaration.isLocal) {
// we can't access session.effectiveVisibilityResolver from here! // we can't access session.effectiveVisibilityResolver from here!
// print(memberDeclaration.visibility.asString(memberDeclaration.getEffectiveVisibility(...)) + " ") // print(memberDeclaration.visibility.asString(memberDeclaration.getEffectiveVisibility(...)) + " ")
print(statusOwner.visibility.asString() + " ") print(memberDeclaration.visibility.asString() + " ")
print(statusOwner.modalityAsString() + " ") print(memberDeclaration.modalityAsString() + " ")
} }
if (statusOwner.isExpect) { if (memberDeclaration.isExpect) {
print("expect ") print("expect ")
} }
if (statusOwner.isActual) { if (memberDeclaration.isActual) {
print("actual ") print("actual ")
} }
if (statusOwner.isExternal) { if (memberDeclaration.isExternal) {
print("external ") print("external ")
} }
if (statusOwner.isOverride) { if (memberDeclaration.isOverride) {
print("override ") print("override ")
} }
if (statusOwner.isStatic) { if (memberDeclaration.isStatic) {
print("static ") print("static ")
} }
if (statusOwner.isInner) { if (memberDeclaration.isInner) {
print("inner ") print("inner ")
} }
// `companion/data/fun` modifiers are only valid for FirRegularClass, but we render them to make sure they are not // `companion/data/fun` modifiers are only valid for FirRegularClass, but we render them to make sure they are not
// incorrectly loaded for other declarations during deserialization. // incorrectly loaded for other declarations during deserialization.
if (statusOwner.status.isCompanion) { if (memberDeclaration.status.isCompanion) {
print("companion ") print("companion ")
} }
if (statusOwner.status.isData) { if (memberDeclaration.status.isData) {
print("data ") print("data ")
} }
// All Java interfaces are considered `fun` (functional interfaces) for resolution purposes // All Java interfaces are considered `fun` (functional interfaces) for resolution purposes
// (see JavaSymbolProvider.createFirJavaClass). Don't render `fun` for Java interfaces; it's not a modifier in Java. // (see JavaSymbolProvider.createFirJavaClass). Don't render `fun` for Java interfaces; it's not a modifier in Java.
val isJavaInterface = val isJavaInterface =
statusOwner is FirRegularClass && statusOwner.classKind == ClassKind.INTERFACE && statusOwner.isJava memberDeclaration is FirRegularClass && memberDeclaration.classKind == ClassKind.INTERFACE && memberDeclaration.isJava
if (statusOwner.status.isFun && !isJavaInterface) { if (memberDeclaration.status.isFun && !isJavaInterface) {
print("fun ") print("fun ")
} }
if (statusOwner.isInline) { if (memberDeclaration.isInline) {
print("inline ") print("inline ")
} }
if (statusOwner.isOperator) { if (memberDeclaration.isOperator) {
print("operator ") print("operator ")
} }
if (statusOwner.isInfix) { if (memberDeclaration.isInfix) {
print("infix ") print("infix ")
} }
if (statusOwner.isTailRec) { if (memberDeclaration.isTailRec) {
print("tailrec ") print("tailrec ")
} }
if (statusOwner.isSuspend) { if (memberDeclaration.isSuspend) {
print("suspend ") print("suspend ")
} }
if (statusOwner.isConst) { if (memberDeclaration.isConst) {
print("const ") print("const ")
} }
if (statusOwner.isLateInit) { if (memberDeclaration.isLateInit) {
print("lateinit ") print("lateinit ")
} }
visitDeclaration(statusOwner as FirDeclaration) visitDeclaration(memberDeclaration as FirDeclaration)
when (statusOwner) { when (memberDeclaration) {
is FirClassLikeDeclaration -> { is FirClassLikeDeclaration -> {
if (statusOwner is FirRegularClass) { if (memberDeclaration is FirRegularClass) {
print(" " + statusOwner.name) print(" " + memberDeclaration.name)
} }
if (statusOwner is FirTypeAlias) { if (memberDeclaration is FirTypeAlias) {
print(" " + statusOwner.name) print(" " + memberDeclaration.name)
} }
statusOwner.typeParameters.renderTypeParameters() memberDeclaration.typeParameters.renderTypeParameters()
} }
is FirCallableDeclaration -> { is FirCallableDeclaration -> {
// Name is handled by visitCallableDeclaration // Name is handled by visitCallableDeclaration
if (statusOwner.typeParameters.isNotEmpty()) { if (memberDeclaration.typeParameters.isNotEmpty()) {
print(" ") print(" ")
statusOwner.typeParameters.renderTypeParameters() memberDeclaration.typeParameters.renderTypeParameters()
} }
} }
} }
@@ -471,7 +471,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
override fun visitRegularClass(regularClass: FirRegularClass) { override fun visitRegularClass(regularClass: FirRegularClass) {
regularClass.annotations.renderAnnotations() regularClass.annotations.renderAnnotations()
visitStatusOwner(regularClass) visitMemberDeclaration(regularClass)
renderSupertypes(regularClass) renderSupertypes(regularClass)
regularClass.declarations.renderDeclarations() regularClass.declarations.renderDeclarations()
} }
@@ -648,7 +648,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
override fun visitTypeAlias(typeAlias: FirTypeAlias) { override fun visitTypeAlias(typeAlias: FirTypeAlias) {
typeAlias.annotations.renderAnnotations() typeAlias.annotations.renderAnnotations()
visitStatusOwner(typeAlias) visitMemberDeclaration(typeAlias)
print(" = ") print(" = ")
typeAlias.expandedTypeRef.accept(this) typeAlias.expandedTypeRef.accept(this)
println() println()
@@ -11,10 +11,10 @@ import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.types.FirTypeRefComparator import org.jetbrains.kotlin.fir.types.FirTypeRefComparator
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
object FirMemberDeclarationComparator : Comparator<FirStatusOwner> { object FirMemberDeclarationComparator : Comparator<FirMemberDeclaration> {
// Comparing different kinds of callable members by assigning distinct priorities to those members. // Comparing different kinds of callable members by assigning distinct priorities to those members.
object TypeAndNameComparator : Comparator<FirStatusOwner> { object TypeAndNameComparator : Comparator<FirMemberDeclaration> {
private val FirStatusOwner.priority: Int private val FirMemberDeclaration.priority: Int
get() = when (this) { get() = when (this) {
is FirEnumEntry -> 7 is FirEnumEntry -> 7
is FirConstructor -> 6 is FirConstructor -> 6
@@ -27,7 +27,7 @@ object FirMemberDeclarationComparator : Comparator<FirStatusOwner> {
is FirValueParameter -> 0 is FirValueParameter -> 0
} }
private val FirStatusOwner.name: Name private val FirMemberDeclaration.name: Name
get() = when (this) { get() = when (this) {
is FirCallableMemberDeclaration -> is FirCallableMemberDeclaration ->
this.symbol.callableId.callableName this.symbol.callableId.callableName
@@ -37,7 +37,7 @@ object FirMemberDeclarationComparator : Comparator<FirStatusOwner> {
this.name this.name
} }
override fun compare(a: FirStatusOwner, b: FirStatusOwner): Int { override fun compare(a: FirMemberDeclaration, b: FirMemberDeclaration): Int {
val priorityDiff = a.priority - b.priority val priorityDiff = a.priority - b.priority
if (priorityDiff != 0) { if (priorityDiff != 0) {
return priorityDiff return priorityDiff
@@ -54,7 +54,7 @@ object FirMemberDeclarationComparator : Comparator<FirStatusOwner> {
} }
} }
override fun compare(a: FirStatusOwner, b: FirStatusOwner): Int { override fun compare(a: FirMemberDeclaration, b: FirMemberDeclaration): Int {
if (a is FirCallableMemberDeclaration && b is FirCallableMemberDeclaration) { if (a is FirCallableMemberDeclaration && b is FirCallableMemberDeclaration) {
return FirCallableMemberDeclarationComparator.compare(a, b) return FirCallableMemberDeclarationComparator.compare(a, b)
} }
@@ -10,40 +10,40 @@ import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
inline val FirStatusOwner.modality: Modality? get() = status.modality inline val FirMemberDeclaration.modality: Modality? get() = status.modality
inline val FirStatusOwner.isAbstract: Boolean get() = status.modality == Modality.ABSTRACT inline val FirMemberDeclaration.isAbstract: Boolean get() = status.modality == Modality.ABSTRACT
inline val FirStatusOwner.isOpen: Boolean get() = status.modality == Modality.OPEN inline val FirMemberDeclaration.isOpen: Boolean get() = status.modality == Modality.OPEN
inline val FirStatusOwner.isFinal: Boolean inline val FirMemberDeclaration.isFinal: Boolean
get() { get() {
// member with unspecified modality is final // member with unspecified modality is final
val modality = status.modality ?: return true val modality = status.modality ?: return true
return modality == Modality.FINAL return modality == Modality.FINAL
} }
inline val FirStatusOwner.visibility: Visibility get() = status.visibility inline val FirMemberDeclaration.visibility: Visibility get() = status.visibility
inline val FirStatusOwner.effectiveVisibility: EffectiveVisibility inline val FirMemberDeclaration.effectiveVisibility: EffectiveVisibility
get() = (status as? FirResolvedDeclarationStatus)?.effectiveVisibility get() = (status as? FirResolvedDeclarationStatus)?.effectiveVisibility
?: error("Effective visibility for ${render(FirRenderer.RenderMode.NoBodies)} must be resolved") ?: error("Effective visibility for ${render(FirRenderer.RenderMode.NoBodies)} must be resolved")
inline val FirStatusOwner.allowsToHaveFakeOverride: Boolean inline val FirMemberDeclaration.allowsToHaveFakeOverride: Boolean
get() = !Visibilities.isPrivate(visibility) && visibility != Visibilities.InvisibleFake get() = !Visibilities.isPrivate(visibility) && visibility != Visibilities.InvisibleFake
inline val FirStatusOwner.isActual: Boolean get() = status.isActual inline val FirMemberDeclaration.isActual: Boolean get() = status.isActual
inline val FirStatusOwner.isExpect: Boolean get() = status.isExpect inline val FirMemberDeclaration.isExpect: Boolean get() = status.isExpect
inline val FirStatusOwner.isInner: Boolean get() = status.isInner inline val FirMemberDeclaration.isInner: Boolean get() = status.isInner
inline val FirStatusOwner.isStatic: Boolean get() = status.isStatic inline val FirMemberDeclaration.isStatic: Boolean get() = status.isStatic
inline val FirStatusOwner.isOverride: Boolean get() = status.isOverride inline val FirMemberDeclaration.isOverride: Boolean get() = status.isOverride
inline val FirStatusOwner.isOperator: Boolean get() = status.isOperator inline val FirMemberDeclaration.isOperator: Boolean get() = status.isOperator
inline val FirStatusOwner.isInfix: Boolean get() = status.isInfix inline val FirMemberDeclaration.isInfix: Boolean get() = status.isInfix
inline val FirStatusOwner.isInline: Boolean get() = status.isInline inline val FirMemberDeclaration.isInline: Boolean get() = status.isInline
inline val FirStatusOwner.isTailRec: Boolean get() = status.isTailRec inline val FirMemberDeclaration.isTailRec: Boolean get() = status.isTailRec
inline val FirStatusOwner.isExternal: Boolean get() = status.isExternal inline val FirMemberDeclaration.isExternal: Boolean get() = status.isExternal
inline val FirStatusOwner.isSuspend: Boolean get() = status.isSuspend inline val FirMemberDeclaration.isSuspend: Boolean get() = status.isSuspend
inline val FirStatusOwner.isConst: Boolean get() = status.isConst inline val FirMemberDeclaration.isConst: Boolean get() = status.isConst
inline val FirStatusOwner.isLateInit: Boolean get() = status.isLateInit inline val FirMemberDeclaration.isLateInit: Boolean get() = status.isLateInit
inline val FirStatusOwner.isFromSealedClass: Boolean get() = status.isFromSealedClass inline val FirMemberDeclaration.isFromSealedClass: Boolean get() = status.isFromSealedClass
inline val FirStatusOwner.isFromEnumClass: Boolean get() = status.isFromEnumClass inline val FirMemberDeclaration.isFromEnumClass: Boolean get() = status.isFromEnumClass
inline val FirStatusOwner.isFun: Boolean get() = status.isFun inline val FirMemberDeclaration.isFun: Boolean get() = status.isFun
inline val FirClassLikeDeclaration.isLocal: Boolean get() = symbol.classId.isLocal inline val FirClassLikeDeclaration.isLocal: Boolean get() = symbol.classId.isLocal
@@ -35,7 +35,7 @@ var <T> T.danglingTypeConstraints: List<DanglingTypeConstraint>?
// ----------------------------------- Utils ----------------------------------- // ----------------------------------- Utils -----------------------------------
val FirStatusOwner.containerSource: SourceElement? val FirMemberDeclaration.containerSource: SourceElement?
get() = when (this) { get() = when (this) {
is FirCallableMemberDeclaration -> containerSource is FirCallableMemberDeclaration -> containerSource
is FirRegularClass -> sourceElement is FirRegularClass -> sourceElement
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.symbols.impl
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.CallableId
@@ -18,7 +18,7 @@ abstract class FirCallableSymbol<D : FirCallableDeclaration> : FirBasedSymbol<D>
override fun toString(): String = "${this::class.simpleName} $callableId" override fun toString(): String = "${this::class.simpleName} $callableId"
} }
val FirCallableSymbol<*>.isStatic: Boolean get() = (fir as? FirStatusOwner)?.status?.isStatic == true val FirCallableSymbol<*>.isStatic: Boolean get() = (fir as? FirMemberDeclaration)?.status?.isStatic == true
val FirCallableSymbol<*>.isExtension: Boolean val FirCallableSymbol<*>.isExtension: Boolean
get() = when (fir) { get() = when (fir) {
@@ -35,8 +35,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val typeParameter = element("TypeParameter", Declaration, typeParameterRef, annotatedDeclaration) val typeParameter = element("TypeParameter", Declaration, typeParameterRef, annotatedDeclaration)
val typeParameterRefsOwner = sealedElement("TypeParameterRefsOwner", Declaration) val typeParameterRefsOwner = sealedElement("TypeParameterRefsOwner", Declaration)
val typeParametersOwner = sealedElement("TypeParametersOwner", Declaration, typeParameterRefsOwner) val typeParametersOwner = sealedElement("TypeParametersOwner", Declaration, typeParameterRefsOwner)
val statusOwner = sealedElement("StatusOwner", Declaration, typeParameterRefsOwner) val memberDeclaration = sealedElement("MemberDeclaration", Declaration, typeParameterRefsOwner)
val callableMemberDeclaration = sealedElement("CallableMemberDeclaration", Declaration, callableDeclaration, statusOwner) val callableMemberDeclaration = sealedElement("CallableMemberDeclaration", Declaration, callableDeclaration, memberDeclaration)
val variable = sealedElement("Variable", Declaration, callableMemberDeclaration, statement) val variable = sealedElement("Variable", Declaration, callableMemberDeclaration, statement)
val valueParameter = element("ValueParameter", Declaration, variable, controlFlowGraphOwner) val valueParameter = element("ValueParameter", Declaration, variable, controlFlowGraphOwner)
@@ -46,8 +46,8 @@ object FirTreeBuilder : AbstractFirTreeBuilder() {
val classLikeDeclaration = sealedElement("ClassLikeDeclaration", Declaration, annotatedDeclaration, statement) val classLikeDeclaration = sealedElement("ClassLikeDeclaration", Declaration, annotatedDeclaration, statement)
val klass = sealedElement("Class", Declaration, classLikeDeclaration, statement, typeParameterRefsOwner) val klass = sealedElement("Class", Declaration, classLikeDeclaration, statement, typeParameterRefsOwner)
val regularClass = element("RegularClass", Declaration, klass, statusOwner, controlFlowGraphOwner) val regularClass = element("RegularClass", Declaration, klass, memberDeclaration, controlFlowGraphOwner)
val typeAlias = element("TypeAlias", Declaration, classLikeDeclaration, statusOwner, typeParametersOwner) val typeAlias = element("TypeAlias", Declaration, classLikeDeclaration, memberDeclaration, typeParametersOwner)
val function = sealedElement("Function", Declaration, callableMemberDeclaration, targetElement, controlFlowGraphOwner, statement) val function = sealedElement("Function", Declaration, callableMemberDeclaration, targetElement, controlFlowGraphOwner, statement)
@@ -104,7 +104,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+typeParameters +typeParameters
} }
statusOwner.configure { memberDeclaration.configure {
+status.withTransform() +status.withTransform()
} }
@@ -184,7 +184,7 @@ private object FirToKtConversionCreator {
KtClassLikeSymbol::class.createType(), KtClassLikeSymbol::class.createType(),
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirRegularClass") importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirRegularClass")
), ),
FirStatusOwner::class to HLFunctionCallConversion( FirMemberDeclaration::class to HLFunctionCallConversion(
"firSymbolBuilder.buildSymbol({0} as FirDeclaration)", "firSymbolBuilder.buildSymbol({0} as FirDeclaration)",
KtSymbol::class.createType(), KtSymbol::class.createType(),
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration") importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration")
@@ -198,7 +198,7 @@ internal val KtType.nullabilityType: NullabilityType
} ?: NullabilityType.Unknown } ?: NullabilityType.Unknown
internal fun FirStatusOwner.computeSimpleModality(): Set<String> { internal fun FirMemberDeclaration.computeSimpleModality(): Set<String> {
require(this !is FirConstructor) require(this !is FirConstructor)
val modifier = when (modality) { val modifier = when (modality) {
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue
import org.jetbrains.kotlin.fir.visibilityChecker import org.jetbrains.kotlin.fir.visibilityChecker
@@ -55,7 +55,7 @@ internal class KtFirVisibilityChecker(
?.let { ExpressionReceiverValue(it) } ?.let { ExpressionReceiverValue(it) }
candidateSymbol.firRef.withFir { candidateFirSymbol -> candidateSymbol.firRef.withFir { candidateFirSymbol ->
require(candidateFirSymbol is FirStatusOwner) { require(candidateFirSymbol is FirMemberDeclaration) {
"$candidateFirSymbol must be a FirStatusOwner and FirSymbolOwner; it were ${candidateFirSymbol::class} instead" "$candidateFirSymbol must be a FirStatusOwner and FirSymbolOwner; it were ${candidateFirSymbol::class} instead"
} }
@@ -110,7 +110,7 @@ internal class FirIdeRenderer private constructor(
renderModifier(RendererModifier.MODALITY in options.modifiers, modality.name.toLowerCaseAsciiOnly()) renderModifier(RendererModifier.MODALITY in options.modifiers, modality.name.toLowerCaseAsciiOnly())
} }
private fun FirStatusOwner.implicitModalityWithoutExtensions(containingDeclaration: FirDeclaration?): Modality { private fun FirMemberDeclaration.implicitModalityWithoutExtensions(containingDeclaration: FirDeclaration?): Modality {
if (this is FirRegularClass) { if (this is FirRegularClass) {
return if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL return if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL
} }
@@ -149,13 +149,13 @@ internal class FirIdeRenderer private constructor(
} }
} }
private fun StringBuilder.renderMemberModifiers(declaration: FirStatusOwner) { private fun StringBuilder.renderMemberModifiers(declaration: FirMemberDeclaration) {
renderModifier(declaration.isExternal, "external") renderModifier(declaration.isExternal, "external")
renderModifier(RendererModifier.EXPECT in options.modifiers && declaration.isExpect, "expect") renderModifier(RendererModifier.EXPECT in options.modifiers && declaration.isExpect, "expect")
renderModifier(RendererModifier.ACTUAL in options.modifiers && declaration.isActual, "actual") renderModifier(RendererModifier.ACTUAL in options.modifiers && declaration.isActual, "actual")
} }
private fun StringBuilder.renderAdditionalModifiers(firMember: FirStatusOwner) { private fun StringBuilder.renderAdditionalModifiers(firMember: FirMemberDeclaration) {
val isOperator = val isOperator =
firMember.isOperator//TODO make similar to functionDescriptor.overriddenDescriptors.none { it.isOperator } firMember.isOperator//TODO make similar to functionDescriptor.overriddenDescriptors.none { it.isOperator }
val isInfix = val isInfix =
@@ -168,7 +168,7 @@ internal class FirIdeRenderer private constructor(
renderModifier(RendererModifier.OPERATOR in options.modifiers && isOperator, "operator") renderModifier(RendererModifier.OPERATOR in options.modifiers && isOperator, "operator")
} }
private fun StringBuilder.renderSuspendModifier(functionDescriptor: FirStatusOwner) { private fun StringBuilder.renderSuspendModifier(functionDescriptor: FirMemberDeclaration) {
renderModifier(functionDescriptor.isSuspend, "suspend") renderModifier(functionDescriptor.isSuspend, "suspend")
} }
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.psi.KtDeclaration
internal fun <F> KtFirSymbol<F>.getModality( internal fun <F> KtFirSymbol<F>.getModality(
phase: FirResolvePhase = FirResolvePhase.STATUS, phase: FirResolvePhase = FirResolvePhase.STATUS,
defaultModality: Modality? = null defaultModality: Modality? = null
): Modality where F : FirDeclaration, F : FirStatusOwner { ): Modality where F : FirDeclaration, F : FirMemberDeclaration {
return firRef.withFir(phase) { fir -> return firRef.withFir(phase) { fir ->
fir.modality fir.modality
?: defaultModality ?: defaultModality
@@ -44,7 +44,7 @@ private fun FirDeclaration.invalidModalityError(): Nothing {
internal fun <F> KtFirSymbol<F>.getVisibility( internal fun <F> KtFirSymbol<F>.getVisibility(
phase: FirResolvePhase = FirResolvePhase.STATUS phase: FirResolvePhase = FirResolvePhase.STATUS
): Visibility where F : FirStatusOwner, F : FirDeclaration = ): Visibility where F : FirMemberDeclaration, F : FirDeclaration =
firRef.withFir(phase) { fir -> fir.visibility } firRef.withFir(phase) { fir -> fir.visibility }
internal fun KtFirSymbol<FirCallableDeclaration>.getCallableIdIfNonLocal(): CallableId? = internal fun KtFirSymbol<FirCallableDeclaration>.getCallableIdIfNonLocal(): CallableId? =