[FIR] Remove generic parameter from FirDeclaration

This commit is contained in:
Dmitriy Novozhilov
2021-06-26 12:30:37 +03:00
parent 511e564b20
commit f400477c70
360 changed files with 1774 additions and 1743 deletions
@@ -27,7 +27,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
renderer.visitStatusOwner(javaClass) renderer.visitStatusOwner(javaClass)
renderer.renderSupertypes(javaClass) renderer.renderSupertypes(javaClass)
renderer.renderInBraces { renderer.renderInBraces {
val renderedDeclarations = mutableListOf<FirDeclaration<*>>() val renderedDeclarations = mutableListOf<FirDeclaration>()
fun renderAndCache(symbol: FirCallableSymbol<*>) { fun renderAndCache(symbol: FirCallableSymbol<*>) {
val enhanced = symbol.fir val enhanced = symbol.fir
@@ -42,7 +42,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
if (declaration in renderedDeclarations) continue if (declaration in renderedDeclarations) continue
val scopeToUse = val scopeToUse =
if (declaration is FirCallableMemberDeclaration<*> && declaration.status.isStatic) if (declaration is FirCallableMemberDeclaration && declaration.status.isStatic)
staticScope staticScope
else else
memberScope memberScope
@@ -51,16 +51,16 @@ fun main(args: Array<String>) {
val declarationPackage = "$basePackage.checkers.declaration" val declarationPackage = "$basePackage.checkers.declaration"
generateCheckersComponents(generationPath, declarationPackage, "FirDeclarationChecker") { generateCheckersComponents(generationPath, declarationPackage, "FirDeclarationChecker") {
alias<FirDeclaration<*>>("BasicDeclarationChecker") alias<FirDeclaration>("BasicDeclarationChecker")
alias<FirFunction<*>>("FunctionChecker") alias<FirFunction>("FunctionChecker")
alias<FirSimpleFunction>("SimpleFunctionChecker") alias<FirSimpleFunction>("SimpleFunctionChecker")
alias<FirProperty>("PropertyChecker") alias<FirProperty>("PropertyChecker")
alias<FirClass<*>>("ClassChecker") alias<FirClass>("ClassChecker")
alias<FirRegularClass>("RegularClassChecker") alias<FirRegularClass>("RegularClassChecker")
alias<FirConstructor>("ConstructorChecker") alias<FirConstructor>("ConstructorChecker")
alias<FirFile>("FileChecker") alias<FirFile>("FileChecker")
alias<FirTypeParameter>("FirTypeParameterChecker") alias<FirTypeParameter>("FirTypeParameterChecker")
alias<FirAnnotatedDeclaration<*>>("FirAnnotatedDeclarationChecker") alias<FirAnnotatedDeclaration>("FirAnnotatedDeclarationChecker")
alias<FirTypeAlias>("TypeAliasChecker") alias<FirTypeAlias>("TypeAliasChecker")
additional( additional(
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.fir.checkers.generator.diagnostics package org.jetbrains.kotlin.fir.checkers.generator.diagnostics
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiTypeElement
import com.intellij.psi.impl.source.tree.LeafPsiElement import com.intellij.psi.impl.source.tree.LeafPsiElement
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -120,7 +119,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val NOT_A_SUPERTYPE by error<PsiElement>() val NOT_A_SUPERTYPE by error<PsiElement>()
val SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE by error<PsiElement>() val SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE by error<PsiElement>()
val QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE by error<KtTypeReference> { val QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE by error<KtTypeReference> {
parameter<FirClass<*>>("otherSuperType") parameter<FirClass>("otherSuperType")
} }
val SUPERTYPE_INITIALIZED_IN_INTERFACE by error<KtTypeReference>() val SUPERTYPE_INITIALIZED_IN_INTERFACE by error<KtTypeReference>()
val INTERFACE_WITH_SUPERCLASS by error<KtTypeReference>() val INTERFACE_WITH_SUPERCLASS by error<KtTypeReference>()
@@ -370,7 +369,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val NON_VARARG_SPREAD by error<LeafPsiElement>() val NON_VARARG_SPREAD by error<LeafPsiElement>()
val ARGUMENT_PASSED_TWICE by error<KtValueArgument>(PositioningStrategy.NAME_OF_NAMED_ARGUMENT) val ARGUMENT_PASSED_TWICE by error<KtValueArgument>(PositioningStrategy.NAME_OF_NAMED_ARGUMENT)
val TOO_MANY_ARGUMENTS by error<PsiElement> { val TOO_MANY_ARGUMENTS by error<PsiElement> {
parameter<FirCallableDeclaration<*>>("function") parameter<FirCallableDeclaration>("function")
} }
val NO_VALUE_FOR_PARAMETER by error<KtElement>(PositioningStrategy.VALUE_ARGUMENTS) { val NO_VALUE_FOR_PARAMETER by error<KtElement>(PositioningStrategy.VALUE_ARGUMENTS) {
parameter<FirValueParameter>("violatedParameter") parameter<FirValueParameter>("violatedParameter")
@@ -482,7 +481,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER by error<KtSimpleNameExpression> { val NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER by error<KtSimpleNameExpression> {
parameter<Name>("typeParameterName") parameter<Name>("typeParameterName")
parameter<FirDeclaration<*>>("typeParametersOwner") parameter<FirDeclaration>("typeParametersOwner")
} }
val BOUND_ON_TYPE_ALIAS_PARAMETER_NOT_ALLOWED by error<KtTypeReference>() val BOUND_ON_TYPE_ALIAS_PARAMETER_NOT_ALLOWED by error<KtTypeReference>()
@@ -540,7 +539,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val REFLECTION by object : DiagnosticGroup("Reflection") { val REFLECTION by object : DiagnosticGroup("Reflection") {
val EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED by error<KtExpression>(PositioningStrategy.REFERENCE_BY_QUALIFIED) { val EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED by error<KtExpression>(PositioningStrategy.REFERENCE_BY_QUALIFIED) {
parameter<FirCallableDeclaration<*>>("referencedDeclaration") parameter<FirCallableDeclaration>("referencedDeclaration")
} }
val CALLABLE_REFERENCE_LHS_NOT_A_CLASS by error<KtExpression>() val CALLABLE_REFERENCE_LHS_NOT_A_CLASS by error<KtExpression>()
val CALLABLE_REFERENCE_TO_ANNOTATION_CONSTRUCTOR by error<KtExpression>(PositioningStrategy.REFERENCE_BY_QUALIFIED) val CALLABLE_REFERENCE_TO_ANNOTATION_CONSTRUCTOR by error<KtExpression>(PositioningStrategy.REFERENCE_BY_QUALIFIED)
@@ -559,51 +558,51 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val CANNOT_WEAKEN_ACCESS_PRIVILEGE by error<KtModifierListOwner>(PositioningStrategy.VISIBILITY_MODIFIER) { val CANNOT_WEAKEN_ACCESS_PRIVILEGE by error<KtModifierListOwner>(PositioningStrategy.VISIBILITY_MODIFIER) {
parameter<Visibility>("overridingVisibility") parameter<Visibility>("overridingVisibility")
parameter<FirCallableDeclaration<*>>("overridden") parameter<FirCallableDeclaration>("overridden")
parameter<Name>("containingClassName") parameter<Name>("containingClassName")
} }
val CANNOT_CHANGE_ACCESS_PRIVILEGE by error<KtModifierListOwner>(PositioningStrategy.VISIBILITY_MODIFIER) { val CANNOT_CHANGE_ACCESS_PRIVILEGE by error<KtModifierListOwner>(PositioningStrategy.VISIBILITY_MODIFIER) {
parameter<Visibility>("overridingVisibility") parameter<Visibility>("overridingVisibility")
parameter<FirCallableDeclaration<*>>("overridden") parameter<FirCallableDeclaration>("overridden")
parameter<Name>("containingClassName") parameter<Name>("containingClassName")
} }
val OVERRIDING_FINAL_MEMBER by error<KtNamedDeclaration>(PositioningStrategy.OVERRIDE_MODIFIER) { val OVERRIDING_FINAL_MEMBER by error<KtNamedDeclaration>(PositioningStrategy.OVERRIDE_MODIFIER) {
parameter<FirCallableDeclaration<*>>("overriddenDeclaration") parameter<FirCallableDeclaration>("overriddenDeclaration")
parameter<Name>("containingClassName") parameter<Name>("containingClassName")
} }
val ABSTRACT_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) { val ABSTRACT_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
parameter<FirClass<*>>("classOrObject") parameter<FirClass>("classOrObject")
parameter<FirCallableDeclaration<*>>("missingDeclaration") parameter<FirCallableDeclaration>("missingDeclaration")
} }
val ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) { val ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
parameter<FirClass<*>>("classOrObject") parameter<FirClass>("classOrObject")
parameter<FirCallableDeclaration<*>>("missingDeclaration") parameter<FirCallableDeclaration>("missingDeclaration")
} }
val INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) { val INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
parameter<FirClass<*>>("classOrObject") parameter<FirClass>("classOrObject")
parameter<FirCallableDeclaration<*>>("invisibleDeclaration") parameter<FirCallableDeclaration>("invisibleDeclaration")
} }
val INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_WARNING by warning<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) { val INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_WARNING by warning<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
parameter<FirClass<*>>("classOrObject") parameter<FirClass>("classOrObject")
parameter<FirCallableDeclaration<*>>("invisibleDeclaration") parameter<FirCallableDeclaration>("invisibleDeclaration")
} }
val MANY_IMPL_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) { val MANY_IMPL_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
parameter<FirClass<*>>("classOrObject") parameter<FirClass>("classOrObject")
parameter<FirCallableDeclaration<*>>("missingDeclaration") parameter<FirCallableDeclaration>("missingDeclaration")
} }
val MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) { val MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
parameter<FirClass<*>>("classOrObject") parameter<FirClass>("classOrObject")
parameter<FirCallableDeclaration<*>>("missingDeclaration") parameter<FirCallableDeclaration>("missingDeclaration")
} }
val OVERRIDING_FINAL_MEMBER_BY_DELEGATION by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) { val OVERRIDING_FINAL_MEMBER_BY_DELEGATION by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
parameter<FirCallableDeclaration<*>>("delegatedDeclaration") parameter<FirCallableDeclaration>("delegatedDeclaration")
parameter<FirCallableDeclaration<*>>("overriddenDeclaration") parameter<FirCallableDeclaration>("overriddenDeclaration")
} }
val DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE by warning<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) { val DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE by warning<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
parameter<FirCallableDeclaration<*>>("delegatedDeclaration") parameter<FirCallableDeclaration>("delegatedDeclaration")
parameter<FirCallableDeclaration<*>>("overriddenDeclaration") parameter<FirCallableDeclaration>("overriddenDeclaration")
} }
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) {
@@ -653,7 +652,7 @@ 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<FirStatusOwner>("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<FirStatusOwner>("function")
@@ -697,7 +696,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<FirStatusOwner>("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)
@@ -17,14 +17,14 @@ import org.jetbrains.kotlin.fir.declarations.utils.isExternal
import org.jetbrains.kotlin.lexer.KtTokens 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 FirStatusOwner) 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
// WRONG_MODIFIER_TARGET on external constructor is intentionally NOT covered in this checker. // WRONG_MODIFIER_TARGET on external constructor is intentionally NOT covered in this checker.
if (declaration !is FirFunction<*>) { if (declaration !is FirFunction) {
val target = when (declaration) { val target = when (declaration) {
is FirProperty -> "property" is FirProperty -> "property"
is FirRegularClass -> "class" is FirRegularClass -> "class"
@@ -22,14 +22,14 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
typealias FirBasicDeclarationChecker = FirDeclarationChecker<FirDeclaration<*>> typealias FirBasicDeclarationChecker = FirDeclarationChecker<FirDeclaration>
typealias FirFunctionChecker = FirDeclarationChecker<FirFunction<*>> typealias FirFunctionChecker = FirDeclarationChecker<FirFunction>
typealias FirSimpleFunctionChecker = FirDeclarationChecker<FirSimpleFunction> typealias FirSimpleFunctionChecker = FirDeclarationChecker<FirSimpleFunction>
typealias FirPropertyChecker = FirDeclarationChecker<FirProperty> typealias FirPropertyChecker = FirDeclarationChecker<FirProperty>
typealias FirClassChecker = FirDeclarationChecker<FirClass<*>> typealias FirClassChecker = FirDeclarationChecker<FirClass>
typealias FirRegularClassChecker = FirDeclarationChecker<FirRegularClass> typealias FirRegularClassChecker = FirDeclarationChecker<FirRegularClass>
typealias FirConstructorChecker = FirDeclarationChecker<FirConstructor> typealias FirConstructorChecker = FirDeclarationChecker<FirConstructor>
typealias FirFileChecker = FirDeclarationChecker<FirFile> typealias FirFileChecker = FirDeclarationChecker<FirFile>
typealias FirTypeParameterChecker = FirDeclarationChecker<FirTypeParameter> typealias FirTypeParameterChecker = FirDeclarationChecker<FirTypeParameter>
typealias FirAnnotatedDeclarationChecker = FirDeclarationChecker<FirAnnotatedDeclaration<*>> typealias FirAnnotatedDeclarationChecker = FirDeclarationChecker<FirAnnotatedDeclaration>
typealias FirTypeAliasChecker = FirDeclarationChecker<FirTypeAlias> typealias FirTypeAliasChecker = FirDeclarationChecker<FirTypeAlias>
@@ -131,7 +131,7 @@ object FirErrors {
val RECURSION_IN_SUPERTYPES by error0<PsiElement>() val RECURSION_IN_SUPERTYPES by error0<PsiElement>()
val NOT_A_SUPERTYPE by error0<PsiElement>() val NOT_A_SUPERTYPE by error0<PsiElement>()
val SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE by error0<PsiElement>() val SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE by error0<PsiElement>()
val QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE by error1<KtTypeReference, FirClass<*>>() val QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE by error1<KtTypeReference, FirClass>()
val SUPERTYPE_INITIALIZED_IN_INTERFACE by error0<KtTypeReference>() val SUPERTYPE_INITIALIZED_IN_INTERFACE by error0<KtTypeReference>()
val INTERFACE_WITH_SUPERCLASS by error0<KtTypeReference>() val INTERFACE_WITH_SUPERCLASS by error0<KtTypeReference>()
val FINAL_SUPERTYPE by error0<KtTypeReference>() val FINAL_SUPERTYPE by error0<KtTypeReference>()
@@ -269,7 +269,7 @@ object FirErrors {
val NAMED_ARGUMENTS_NOT_ALLOWED by error1<KtValueArgument, ForbiddenNamedArgumentsTarget>(SourceElementPositioningStrategies.NAME_OF_NAMED_ARGUMENT) val NAMED_ARGUMENTS_NOT_ALLOWED by error1<KtValueArgument, ForbiddenNamedArgumentsTarget>(SourceElementPositioningStrategies.NAME_OF_NAMED_ARGUMENT)
val NON_VARARG_SPREAD by error0<LeafPsiElement>() val NON_VARARG_SPREAD by error0<LeafPsiElement>()
val ARGUMENT_PASSED_TWICE by error0<KtValueArgument>(SourceElementPositioningStrategies.NAME_OF_NAMED_ARGUMENT) val ARGUMENT_PASSED_TWICE by error0<KtValueArgument>(SourceElementPositioningStrategies.NAME_OF_NAMED_ARGUMENT)
val TOO_MANY_ARGUMENTS by error1<PsiElement, FirCallableDeclaration<*>>() val TOO_MANY_ARGUMENTS by error1<PsiElement, FirCallableDeclaration>()
val NO_VALUE_FOR_PARAMETER by error1<KtElement, FirValueParameter>(SourceElementPositioningStrategies.VALUE_ARGUMENTS) val NO_VALUE_FOR_PARAMETER by error1<KtElement, FirValueParameter>(SourceElementPositioningStrategies.VALUE_ARGUMENTS)
val NAMED_PARAMETER_NOT_FOUND by error1<KtValueArgument, String>(SourceElementPositioningStrategies.NAME_OF_NAMED_ARGUMENT) val NAMED_PARAMETER_NOT_FOUND by error1<KtValueArgument, String>(SourceElementPositioningStrategies.NAME_OF_NAMED_ARGUMENT)
val ASSIGNMENT_TYPE_MISMATCH by error2<KtExpression, ConeKotlinType, ConeKotlinType>() val ASSIGNMENT_TYPE_MISMATCH by error2<KtExpression, ConeKotlinType, ConeKotlinType>()
@@ -313,7 +313,7 @@ object FirErrors {
val ONLY_ONE_CLASS_BOUND_ALLOWED by error0<KtTypeReference>() val ONLY_ONE_CLASS_BOUND_ALLOWED by error0<KtTypeReference>()
val REPEATED_BOUND by error0<KtTypeReference>() val REPEATED_BOUND by error0<KtTypeReference>()
val CONFLICTING_UPPER_BOUNDS by error1<KtNamedDeclaration, FirTypeParameterSymbol>() val CONFLICTING_UPPER_BOUNDS by error1<KtNamedDeclaration, FirTypeParameterSymbol>()
val NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER by error2<KtSimpleNameExpression, Name, FirDeclaration<*>>() val NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER by error2<KtSimpleNameExpression, Name, FirDeclaration>()
val BOUND_ON_TYPE_ALIAS_PARAMETER_NOT_ALLOWED by error0<KtTypeReference>() val BOUND_ON_TYPE_ALIAS_PARAMETER_NOT_ALLOWED by error0<KtTypeReference>()
val REIFIED_TYPE_PARAMETER_NO_INLINE by error0<KtTypeParameter>(SourceElementPositioningStrategies.REIFIED_MODIFIER) val REIFIED_TYPE_PARAMETER_NO_INLINE by error0<KtTypeParameter>(SourceElementPositioningStrategies.REIFIED_MODIFIER)
val TYPE_PARAMETERS_NOT_ALLOWED by error0<KtDeclaration>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST) val TYPE_PARAMETERS_NOT_ALLOWED by error0<KtDeclaration>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST)
@@ -330,7 +330,7 @@ object FirErrors {
val SMARTCAST_IMPOSSIBLE by error3<KtExpression, ConeKotlinType, FirExpression, String>() val SMARTCAST_IMPOSSIBLE by error3<KtExpression, ConeKotlinType, FirExpression, String>()
// Reflection // Reflection
val EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED by error1<KtExpression, FirCallableDeclaration<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED by error1<KtExpression, FirCallableDeclaration>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
val CALLABLE_REFERENCE_LHS_NOT_A_CLASS by error0<KtExpression>() val CALLABLE_REFERENCE_LHS_NOT_A_CLASS by error0<KtExpression>()
val CALLABLE_REFERENCE_TO_ANNOTATION_CONSTRUCTOR by error0<KtExpression>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val CALLABLE_REFERENCE_TO_ANNOTATION_CONSTRUCTOR by error0<KtExpression>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
val CLASS_LITERAL_LHS_NOT_A_CLASS by error0<KtExpression>() val CLASS_LITERAL_LHS_NOT_A_CLASS by error0<KtExpression>()
@@ -339,17 +339,17 @@ object FirErrors {
// overrides // overrides
val NOTHING_TO_OVERRIDE by error1<KtModifierListOwner, FirStatusOwner>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER) val NOTHING_TO_OVERRIDE by error1<KtModifierListOwner, FirStatusOwner>(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)
val ABSTRACT_MEMBER_NOT_IMPLEMENTED by error2<KtClassOrObject, FirClass<*>, FirCallableDeclaration<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) val ABSTRACT_MEMBER_NOT_IMPLEMENTED by error2<KtClassOrObject, FirClass, FirCallableDeclaration>(SourceElementPositioningStrategies.DECLARATION_NAME)
val ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED by error2<KtClassOrObject, FirClass<*>, FirCallableDeclaration<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) val ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED by error2<KtClassOrObject, FirClass, FirCallableDeclaration>(SourceElementPositioningStrategies.DECLARATION_NAME)
val INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER by error2<KtClassOrObject, FirClass<*>, FirCallableDeclaration<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) val INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER by error2<KtClassOrObject, FirClass, FirCallableDeclaration>(SourceElementPositioningStrategies.DECLARATION_NAME)
val INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_WARNING by warning2<KtClassOrObject, FirClass<*>, FirCallableDeclaration<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) val INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_WARNING by warning2<KtClassOrObject, FirClass, FirCallableDeclaration>(SourceElementPositioningStrategies.DECLARATION_NAME)
val MANY_IMPL_MEMBER_NOT_IMPLEMENTED by error2<KtClassOrObject, FirClass<*>, FirCallableDeclaration<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) val MANY_IMPL_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 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, FirStatusOwner, FirStatusOwner>(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, FirStatusOwner, FirStatusOwner>(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, FirStatusOwner, FirStatusOwner>(SourceElementPositioningStrategies.DECLARATION_RETURN_TYPE)
@@ -369,7 +369,7 @@ 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, FirStatusOwner, FirClass>(SourceElementPositioningStrategies.MODALITY_MODIFIER)
val ABSTRACT_FUNCTION_WITH_BODY by error1<KtFunction, FirStatusOwner>(SourceElementPositioningStrategies.MODALITY_MODIFIER) val ABSTRACT_FUNCTION_WITH_BODY by error1<KtFunction, FirStatusOwner>(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, FirStatusOwner>(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, FirStatusOwner>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
@@ -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, FirStatusOwner, 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>()
@@ -74,7 +74,7 @@ class LocalPropertyAndCapturedWriteCollector private constructor() : ControlFlow
// `false` if it is declared in a lambda or a local function (inside the currently visited function). // `false` if it is declared in a lambda or a local function (inside the currently visited function).
private val symbols: MutableMap<FirPropertySymbol, Boolean> = mutableMapOf() private val symbols: MutableMap<FirPropertySymbol, Boolean> = mutableMapOf()
private val lambdaOrLocalFunctionStack: MutableList<FirFunction<*>> = mutableListOf() private val lambdaOrLocalFunctionStack: MutableList<FirFunction> = mutableListOf()
private val capturedWrites: MutableSet<FirVariableAssignment> = mutableSetOf() private val capturedWrites: MutableSet<FirVariableAssignment> = mutableSetOf()
override fun visitNode(node: CFGNode<*>) {} override fun visitNode(node: CFGNode<*>) {}
@@ -266,7 +266,7 @@ class DeclaredVariableCollector {
val declaredVariablesPerElement: SetMultimap<FirStatement, FirPropertySymbol> = setMultimapOf() val declaredVariablesPerElement: SetMultimap<FirStatement, FirPropertySymbol> = setMultimapOf()
fun enterCapturingStatement(statement: FirStatement): Set<FirPropertySymbol> { fun enterCapturingStatement(statement: FirStatement): Set<FirPropertySymbol> {
assert(statement is FirLoop || statement is FirClass<*> || statement is FirFunction<*>) assert(statement is FirLoop || statement is FirClass || statement is FirFunction)
if (statement !in declaredVariablesPerElement) { if (statement !in declaredVariablesPerElement) {
statement.accept(visitor, null) statement.accept(visitor, null)
} }
@@ -274,7 +274,7 @@ class DeclaredVariableCollector {
} }
fun exitCapturingStatement(statement: FirStatement) { fun exitCapturingStatement(statement: FirStatement) {
assert(statement is FirLoop || statement is FirClass<*> || statement is FirFunction<*>) assert(statement is FirLoop || statement is FirClass || statement is FirFunction)
declaredVariablesPerElement.removeKey(statement) declaredVariablesPerElement.removeKey(statement)
} }
@@ -45,7 +45,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() {
override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter, context: CheckerContext) { override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter, context: CheckerContext) {
val session = context.session val session = context.session
val function = (graph.declaration as? FirFunction<*>) ?: return val function = (graph.declaration as? FirFunction) ?: return
if (function !is FirContractDescriptionOwner) return if (function !is FirContractDescriptionOwner) return
if (function.contractDescription.coneEffects?.any { it is ConeCallsEffectDeclaration } != true) return if (function.contractDescription.coneEffects?.any { it is ConeCallsEffectDeclaration } != true) return
@@ -153,7 +153,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() {
} }
} }
private class CapturedLambdaFinder(val rootFunction: FirFunction<*>) : ControlFlowGraphVisitor<Unit, IllegalScopeContext>() { private class CapturedLambdaFinder(val rootFunction: FirFunction) : ControlFlowGraphVisitor<Unit, IllegalScopeContext>() {
override fun visitNode(node: CFGNode<*>, data: IllegalScopeContext) {} override fun visitNode(node: CFGNode<*>, data: IllegalScopeContext) {}
@@ -303,7 +303,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() {
return this?.coneTypeSafe<ConeKotlinType>()?.isBuiltinFunctionalType(session) == true return this?.coneTypeSafe<ConeKotlinType>()?.isBuiltinFunctionalType(session) == true
} }
private val FirFunction<*>.contractDescription: FirContractDescription? private val FirFunction.contractDescription: FirContractDescription?
get() = (this as? FirContractDescriptionOwner)?.contractDescription get() = (this as? FirContractDescriptionOwner)?.contractDescription
private fun FirContractDescription?.getParameterCallsEffectDeclaration(index: Int): ConeCallsEffectDeclaration? { private fun FirContractDescription?.getParameterCallsEffectDeclaration(index: Int): ConeCallsEffectDeclaration? {
@@ -327,7 +327,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() {
return getParameterCallsEffectDeclaration(index)?.kind return getParameterCallsEffectDeclaration(index)?.kind
} }
private fun FirFunction<*>.isInPlaceLambda(): Boolean { private fun FirFunction.isInPlaceLambda(): Boolean {
return this is FirAnonymousFunction && this.isLambda && this.invocationKind != null return this is FirAnonymousFunction && this.isLambda && this.invocationKind != null
} }
@@ -25,17 +25,17 @@ class FirControlFlowAnalyzer(
// Currently declaration in analyzeXXX is not used, but it may be useful in future // Currently declaration in analyzeXXX is not used, but it may be useful in future
@Suppress("UNUSED_PARAMETER") @Suppress("UNUSED_PARAMETER")
fun analyzeClassInitializer(klass: FirClass<*>, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) { fun analyzeClassInitializer(klass: FirClass, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) {
if (graph.owner != null) return if (graph.owner != null) return
cfaCheckers.forEach { it.analyze(graph, reporter, context) } cfaCheckers.forEach { it.analyze(graph, reporter, context) }
} }
@Suppress("UNUSED_PARAMETER") @Suppress("UNUSED_PARAMETER")
fun analyzeFunction(function: FirFunction<*>, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) { fun analyzeFunction(function: FirFunction, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) {
if (graph.owner != null) return if (graph.owner != null) return
cfaCheckers.forEach { it.analyze(graph, reporter, context) } cfaCheckers.forEach { it.analyze(graph, reporter, context) }
if (context.containingDeclarations.any { it is FirProperty || it is FirFunction<*> }) return if (context.containingDeclarations.any { it is FirProperty || it is FirFunction }) return
runAssignmentCfaCheckers(graph, reporter, context) runAssignmentCfaCheckers(graph, reporter, context)
} }
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.utils.addIfNotNull
object FirReturnsImpliesAnalyzer : FirControlFlowChecker() { object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter, context: CheckerContext) { override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter, context: CheckerContext) {
val function = graph.declaration as? FirFunction<*> ?: return val function = graph.declaration as? FirFunction ?: return
val graphRef = function.controlFlowGraphReference as FirControlFlowGraphReferenceImpl val graphRef = function.controlFlowGraphReference as FirControlFlowGraphReferenceImpl
val dataFlowInfo = graphRef.dataFlowInfo val dataFlowInfo = graphRef.dataFlowInfo
if (function !is FirContractDescriptionOwner || dataFlowInfo == null) return if (function !is FirContractDescriptionOwner || dataFlowInfo == null) return
@@ -72,7 +72,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
private fun isWrongConditionOnNode( private fun isWrongConditionOnNode(
node: CFGNode<*>, node: CFGNode<*>,
effectDeclaration: ConeConditionalEffectDeclaration, effectDeclaration: ConeConditionalEffectDeclaration,
function: FirFunction<*>, function: FirFunction,
logicSystem: LogicSystem<PersistentFlow>, logicSystem: LogicSystem<PersistentFlow>,
dataFlowInfo: DataFlowInfo, dataFlowInfo: DataFlowInfo,
context: CheckerContext context: CheckerContext
@@ -150,7 +150,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
} }
private fun ConeBooleanExpression.buildTypeStatements( private fun ConeBooleanExpression.buildTypeStatements(
function: FirFunction<*>, function: FirFunction,
logicSystem: LogicSystem<*>, logicSystem: LogicSystem<*>,
variableStorage: VariableStorage, variableStorage: VariableStorage,
flow: Flow, flow: Flow,
@@ -216,7 +216,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
private val CheckerContext.containingProperty: FirProperty? private val CheckerContext.containingProperty: FirProperty?
get() = (containingDeclarations.asReversed().firstOrNull { it is FirProperty } as? FirProperty) get() = (containingDeclarations.asReversed().firstOrNull { it is FirProperty } as? FirProperty)
private fun FirFunction<*>.getParameterType(symbol: FirBasedSymbol<*>, context: CheckerContext): ConeKotlinType? { private fun FirFunction.getParameterType(symbol: FirBasedSymbol<*>, context: CheckerContext): ConeKotlinType? {
val typeRef = if (this.symbol == symbol) { val typeRef = if (this.symbol == symbol) {
if (symbol is FirPropertyAccessorSymbol) { if (symbol is FirPropertyAccessorSymbol) {
context.containingProperty?.receiverTypeRef context.containingProperty?.receiverTypeRef
@@ -229,7 +229,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
return typeRef?.coneType return typeRef?.coneType
} }
private fun FirFunction<*>.getParameterSymbol(index: Int, context: CheckerContext): FirBasedSymbol<*> { private fun FirFunction.getParameterSymbol(index: Int, context: CheckerContext): FirBasedSymbol<*> {
return if (index == -1) { return if (index == -1) {
if (symbol !is FirPropertyAccessorSymbol) { if (symbol !is FirPropertyAccessorSymbol) {
symbol symbol
@@ -337,7 +337,7 @@ internal object ConeTypeCompatibilityChecker {
private fun MutableMap<FirTypeParameterRef, BoundTypeArguments>.collect( private fun MutableMap<FirTypeParameterRef, BoundTypeArguments>.collect(
ctx: ConeInferenceContext, ctx: ConeInferenceContext,
typeParameterOwner: FirClassLikeDeclaration<*>, typeParameterOwner: FirClassLikeDeclaration,
parameter: FirTypeParameterRef, parameter: FirTypeParameterRef,
boundTypeArgument: BoundTypeArgument, boundTypeArgument: BoundTypeArgument,
compatibilityUpperBound: Compatibility, compatibilityUpperBound: Compatibility,
@@ -365,28 +365,28 @@ internal object ConeTypeCompatibilityChecker {
} }
} }
private fun FirClassLikeDeclaration<*>.getSuperTypes(): List<ConeClassLikeType> { private fun FirClassLikeDeclaration.getSuperTypes(): List<ConeClassLikeType> {
return when (this) { return when (this) {
is FirTypeAlias -> listOfNotNull(expandedTypeRef.coneTypeSafe()) is FirTypeAlias -> listOfNotNull(expandedTypeRef.coneTypeSafe())
is FirClass<*> -> superTypeRefs.mapNotNull { it.coneTypeSafe() } is FirClass -> superTypeRefs.mapNotNull { it.coneTypeSafe() }
else -> emptyList() else -> emptyList()
} }
} }
private fun ConeClassLikeType.getClassLikeElement(ctx: ConeInferenceContext): FirClassLikeDeclaration<*>? = private fun ConeClassLikeType.getClassLikeElement(ctx: ConeInferenceContext): FirClassLikeDeclaration? =
ctx.symbolProvider.getSymbolByLookupTag(lookupTag)?.fir ctx.symbolProvider.getSymbolByLookupTag(lookupTag)?.fir
private fun FirClassLikeDeclaration<*>.getTypeParameter(index: Int): FirTypeParameterRef? { private fun FirClassLikeDeclaration.getTypeParameter(index: Int): FirTypeParameterRef? {
return when (this) { return when (this) {
is FirTypeAlias -> typeParameters[index] is FirTypeAlias -> typeParameters[index]
is FirClass<*> -> typeParameters[index] is FirClass -> typeParameters[index]
else -> return null else -> return null
} }
} }
/** A class declaration and the arguments bound to the declared type parameters. */ /** A class declaration and the arguments bound to the declared type parameters. */
private data class TypeArgumentMapping( private data class TypeArgumentMapping(
val typeParameterOwner: FirClassLikeDeclaration<*>, val typeParameterOwner: FirClassLikeDeclaration,
val mapping: Map<FirTypeParameterRef, BoundTypeArgument> val mapping: Map<FirTypeParameterRef, BoundTypeArgument>
) )
@@ -408,11 +408,11 @@ internal object ConeTypeCompatibilityChecker {
ctx: ConeInferenceContext ctx: ConeInferenceContext
): FirClassWithSuperClasses? = when (val klass = ctx.symbolProvider.getSymbolByLookupTag(this)?.fir) { ): FirClassWithSuperClasses? = when (val klass = ctx.symbolProvider.getSymbolByLookupTag(this)?.fir) {
is FirTypeAlias -> klass.fullyExpandedClass(ctx.session)?.let { FirClassWithSuperClasses(it, ctx) } is FirTypeAlias -> klass.fullyExpandedClass(ctx.session)?.let { FirClassWithSuperClasses(it, ctx) }
is FirClass<*> -> FirClassWithSuperClasses(klass, ctx) is FirClass -> FirClassWithSuperClasses(klass, ctx)
else -> null else -> null
} }
private data class FirClassWithSuperClasses(val firClass: FirClass<*>, val ctx: ConeInferenceContext) { private data class FirClassWithSuperClasses(val firClass: FirClass, val ctx: ConeInferenceContext) {
val isInterface: Boolean get() = firClass.isInterface val isInterface: Boolean get() = firClass.isInterface
val superClasses: Set<FirClassWithSuperClasses> by lazy { val superClasses: Set<FirClassWithSuperClasses> by lazy {
@@ -454,7 +454,7 @@ internal object ConeTypeCompatibilityChecker {
(firClass is FirRegularClass && (firClass.isData || firClass.isInline)) (firClass is FirRegularClass && (firClass.isData || firClass.isInline))
} }
private val FirClass<*>.isFinal: Boolean private val FirClass.isFinal: Boolean
get() { get() {
return when (this) { return when (this) {
is FirAnonymousObject -> true is FirAnonymousObject -> true
@@ -60,11 +60,11 @@ fun FirRegularClass.getAllowedAnnotationTargets(): Set<KotlinTarget> {
} }
} }
fun FirAnnotatedDeclaration<*>.getRetentionAnnotation(): FirAnnotationCall? { fun FirAnnotatedDeclaration.getRetentionAnnotation(): FirAnnotationCall? {
return getAnnotationByFqName(StandardNames.FqNames.retention) return getAnnotationByFqName(StandardNames.FqNames.retention)
} }
fun FirAnnotatedDeclaration<*>.getTargetAnnotation(): FirAnnotationCall? { fun FirAnnotatedDeclaration.getTargetAnnotation(): FirAnnotationCall? {
return getAnnotationByFqName(StandardNames.FqNames.target) return getAnnotationByFqName(StandardNames.FqNames.target)
} }
@@ -189,7 +189,7 @@ internal fun checkConstantArguments(
return null return null
} }
private fun FirTypedDeclaration<*>?.getReferencedClass(session: FirSession): FirDeclaration<*>? = private fun FirTypedDeclaration?.getReferencedClass(session: FirSession): FirDeclaration? =
this?.returnTypeRef this?.returnTypeRef
?.coneTypeSafe<ConeLookupTagBasedType>() ?.coneTypeSafe<ConeLookupTagBasedType>()
?.lookupTag ?.lookupTag
@@ -219,7 +219,7 @@ private val NO_NAME_PROVIDED = Name.special("<no name provided>")
// explicitly. // explicitly.
// - see tests with `fun () {}`. // - see tests with `fun () {}`.
// you can't redeclare something that has no name. // you can't redeclare something that has no name.
private fun FirDeclaration<*>.isCollectable() = when (this) { private fun FirDeclaration.isCollectable() = when (this) {
is FirSimpleFunction -> source?.kind !is FirFakeSourceElementKind && name != NO_NAME_PROVIDED is FirSimpleFunction -> source?.kind !is FirFakeSourceElementKind && name != NO_NAME_PROVIDED
is FirRegularClass -> name != NO_NAME_PROVIDED is FirRegularClass -> name != NO_NAME_PROVIDED
else -> true else -> true
@@ -231,10 +231,10 @@ private fun FirDeclaration<*>.isCollectable() = when (this) {
open class FirDeclarationInspector( open class FirDeclarationInspector(
protected val presenter: FirDeclarationPresenter = FirDefaultDeclarationPresenter() protected val presenter: FirDeclarationPresenter = FirDefaultDeclarationPresenter()
) { ) {
val otherDeclarations = mutableMapOf<String, MutableList<FirDeclaration<*>>>() val otherDeclarations = mutableMapOf<String, MutableList<FirDeclaration>>()
val functionDeclarations = mutableMapOf<String, MutableList<FirSimpleFunction>>() val functionDeclarations = mutableMapOf<String, MutableList<FirSimpleFunction>>()
fun collect(declaration: FirDeclaration<*>) { fun collect(declaration: FirDeclaration) {
when { when {
!declaration.isCollectable() -> {} !declaration.isCollectable() -> {}
declaration is FirSimpleFunction -> collectFunction(presenter.represent(declaration), declaration) declaration is FirSimpleFunction -> collectFunction(presenter.represent(declaration), declaration)
@@ -244,7 +244,7 @@ open class FirDeclarationInspector(
} }
} }
protected open fun collectNonFunctionDeclaration(key: String, declaration: FirDeclaration<*>): MutableList<FirDeclaration<*>> = protected open fun collectNonFunctionDeclaration(key: String, declaration: FirDeclaration): MutableList<FirDeclaration> =
otherDeclarations.getOrPut(key) { otherDeclarations.getOrPut(key) {
mutableListOf() mutableListOf()
}.also { }.also {
@@ -258,7 +258,7 @@ open class FirDeclarationInspector(
it.add(declaration) it.add(declaration)
} }
fun contains(declaration: FirDeclaration<*>) = when (declaration) { fun contains(declaration: FirDeclaration) = when (declaration) {
is FirSimpleFunction -> presenter.represent(declaration) in functionDeclarations is FirSimpleFunction -> presenter.represent(declaration) in functionDeclarations
is FirRegularClass -> presenter.represent(declaration) in otherDeclarations is FirRegularClass -> presenter.represent(declaration) in otherDeclarations
is FirTypeAlias -> presenter.represent(declaration) in otherDeclarations is FirTypeAlias -> presenter.represent(declaration) in otherDeclarations
@@ -50,21 +50,21 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
private val INLINE_ONLY_ANNOTATION_CLASS_ID = ClassId.topLevel(FqName("kotlin.internal.InlineOnly")) private val INLINE_ONLY_ANNOTATION_CLASS_ID = ClassId.topLevel(FqName("kotlin.internal.InlineOnly"))
fun FirClass<*>.unsubstitutedScope(context: CheckerContext) = fun FirClass.unsubstitutedScope(context: CheckerContext) =
this.unsubstitutedScope(context.sessionHolder.session, context.sessionHolder.scopeSession, withForcedTypeCalculator = false) this.unsubstitutedScope(context.sessionHolder.session, context.sessionHolder.scopeSession, withForcedTypeCalculator = false)
/** /**
* Returns true if this is a supertype of other. * Returns true if this is a supertype of other.
*/ */
fun FirClass<*>.isSupertypeOf(other: FirClass<*>, session: FirSession): Boolean { fun FirClass.isSupertypeOf(other: FirClass, session: FirSession): Boolean {
/** /**
* Hides additional parameters. * Hides additional parameters.
*/ */
fun FirClass<*>.isSupertypeOf(other: FirClass<*>, exclude: MutableSet<FirClass<*>>): Boolean { fun FirClass.isSupertypeOf(other: FirClass, exclude: MutableSet<FirClass>): Boolean {
for (it in other.superTypeRefs) { for (it in other.superTypeRefs) {
val candidate = it.firClassLike(session) val candidate = it.firClassLike(session)
?.followAllAlias(session) ?.followAllAlias(session)
?.safeAs<FirClass<*>>() ?.safeAs<FirClass>()
?: continue ?: continue
if (candidate in exclude) { if (candidate in exclude) {
@@ -92,7 +92,7 @@ fun FirClass<*>.isSupertypeOf(other: FirClass<*>, session: FirSession): Boolean
* Returns the FirClass associated with this * Returns the FirClass associated with this
* or null of something goes wrong. * or null of something goes wrong.
*/ */
fun ConeClassLikeType.toClass(session: FirSession): FirClass<*>? { fun ConeClassLikeType.toClass(session: FirSession): FirClass? {
return lookupTag.toSymbol(session).safeAs<FirClassSymbol<*>>()?.fir return lookupTag.toSymbol(session).safeAs<FirClassSymbol<*>>()?.fir
} }
@@ -135,8 +135,8 @@ inline fun <reified T : Any> FirQualifiedAccessExpression.getDeclaration(): T? {
* Returns the ClassLikeDeclaration where the Fir object has been defined * Returns the ClassLikeDeclaration where the Fir object has been defined
* or null if no proper declaration has been found. * or null if no proper declaration has been found.
*/ */
fun FirDeclaration<*>.getContainingClass(context: CheckerContext): FirClassLikeDeclaration<*>? = fun FirDeclaration.getContainingClass(context: CheckerContext): FirClassLikeDeclaration? =
this.safeAs<FirCallableMemberDeclaration<*>>()?.containingClass()?.toSymbol(context.session)?.fir this.safeAs<FirCallableMemberDeclaration>()?.containingClass()?.toSymbol(context.session)?.fir
fun FirClassLikeSymbol<*>.outerClass(context: CheckerContext): FirClassLikeSymbol<*>? { fun FirClassLikeSymbol<*>.outerClass(context: CheckerContext): FirClassLikeSymbol<*>? {
if (this !is FirClassSymbol<*>) return null if (this !is FirClassSymbol<*>) return null
@@ -144,8 +144,8 @@ fun FirClassLikeSymbol<*>.outerClass(context: CheckerContext): FirClassLikeSymbo
return context.session.symbolProvider.getClassLikeSymbolByFqName(outerClassId) return context.session.symbolProvider.getClassLikeSymbolByFqName(outerClassId)
} }
fun FirClass<*>.outerClass(context: CheckerContext): FirClass<*>? { fun FirClass.outerClass(context: CheckerContext): FirClass? {
return symbol.outerClass(context)?.fir as? FirClass<*> return symbol.outerClass(context)?.fir as? FirClass
} }
/** /**
@@ -153,8 +153,8 @@ fun FirClass<*>.outerClass(context: CheckerContext): FirClass<*>? {
* sequence of FirTypeAlias'es points to starting * sequence of FirTypeAlias'es points to starting
* with `this`. Or null if something goes wrong. * with `this`. Or null if something goes wrong.
*/ */
fun FirClassLikeDeclaration<*>.followAllAlias(session: FirSession): FirClassLikeDeclaration<*>? { fun FirClassLikeDeclaration.followAllAlias(session: FirSession): FirClassLikeDeclaration? {
var it: FirClassLikeDeclaration<*>? = this var it: FirClassLikeDeclaration? = this
while (it is FirTypeAlias) { while (it is FirTypeAlias) {
it = it.expandedTypeRef.firClassLike(session) it = it.expandedTypeRef.firClassLike(session)
@@ -168,13 +168,13 @@ fun FirClassLikeDeclaration<*>.followAllAlias(session: FirSession): FirClassLike
* item like FirRegularClass or FirAnonymousObject * item like FirRegularClass or FirAnonymousObject
* or null if no such item could be found. * or null if no such item could be found.
*/ */
fun CheckerContext.findClosestClassOrObject(): FirClass<*>? { fun CheckerContext.findClosestClassOrObject(): FirClass? {
for (it in containingDeclarations.asReversed()) { for (it in containingDeclarations.asReversed()) {
if ( if (
it is FirRegularClass || it is FirRegularClass ||
it is FirAnonymousObject it is FirAnonymousObject
) { ) {
return it as FirClass<*> return it as FirClass
} }
} }
@@ -185,7 +185,7 @@ fun CheckerContext.findClosestClassOrObject(): FirClass<*>? {
* Returns the list of functions that overridden by given * Returns the list of functions that overridden by given
*/ */
fun FirSimpleFunction.overriddenFunctions( fun FirSimpleFunction.overriddenFunctions(
containingClass: FirClass<*>, containingClass: FirClass,
context: CheckerContext context: CheckerContext
): List<FirFunctionSymbol<*>> { ): List<FirFunctionSymbol<*>> {
val firTypeScope = containingClass.unsubstitutedScope( val firTypeScope = containingClass.unsubstitutedScope(
@@ -225,7 +225,7 @@ fun KtModifierKeywordToken.toVisibilityOrNull(): Visibility? {
/** /**
* Returns the modality of the class * Returns the modality of the class
*/ */
fun FirClass<*>.modality(): Modality? { fun FirClass.modality(): Modality? {
return when (this) { return when (this) {
is FirRegularClass -> modality is FirRegularClass -> modality
else -> Modality.FINAL else -> Modality.FINAL
@@ -258,14 +258,14 @@ fun FirStatusOwner.implicitModality(context: CheckerContext): Modality {
&& klass.classKind == ClassKind.INTERFACE && klass.classKind == ClassKind.INTERFACE
&& tree.visibilityModifier(source.lighterASTNode)?.tokenType != KtTokens.PRIVATE_KEYWORD && tree.visibilityModifier(source.lighterASTNode)?.tokenType != KtTokens.PRIVATE_KEYWORD
) { ) {
require(this is FirDeclaration<*>) require(this is FirDeclaration)
return if (this.hasBody()) Modality.OPEN else Modality.ABSTRACT return if (this.hasBody()) Modality.OPEN else Modality.ABSTRACT
} }
return Modality.FINAL return Modality.FINAL
} }
private fun FirDeclaration<*>.hasBody(): Boolean = when (this) { private fun FirDeclaration.hasBody(): Boolean = when (this) {
is FirSimpleFunction -> this.body != null && this.body !is FirEmptyExpressionBlock is FirSimpleFunction -> this.body != null && this.body !is FirEmptyExpressionBlock
is FirProperty -> this.setter?.body !is FirEmptyExpressionBlock? || this.getter?.body !is FirEmptyExpressionBlock? is FirProperty -> this.setter?.body !is FirEmptyExpressionBlock? || this.getter?.body !is FirEmptyExpressionBlock?
else -> false else -> false
@@ -275,12 +275,12 @@ private fun FirDeclaration<*>.hasBody(): Boolean = when (this) {
* Finds any non-interface supertype and returns it * Finds any non-interface supertype and returns it
* or null if couldn't find any. * or null if couldn't find any.
*/ */
fun FirClass<*>.findNonInterfaceSupertype(context: CheckerContext): FirTypeRef? { fun FirClass.findNonInterfaceSupertype(context: CheckerContext): FirTypeRef? {
for (superTypeRef in superTypeRefs) { for (superTypeRef in superTypeRefs) {
val lookupTag = superTypeRef.coneType.safeAs<ConeClassLikeType>()?.lookupTag ?: continue val lookupTag = superTypeRef.coneType.safeAs<ConeClassLikeType>()?.lookupTag ?: continue
val fir = lookupTag.toSymbol(context.session) val fir = lookupTag.toSymbol(context.session)
?.fir.safeAs<FirClass<*>>() ?.fir.safeAs<FirClass>()
?: continue ?: continue
if (fir.classKind != ClassKind.INTERFACE) { if (fir.classKind != ClassKind.INTERFACE) {
@@ -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 FirStatusOwner.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)
@@ -418,7 +418,7 @@ private fun isSubtypeOfForFunctionalTypeReturningUnit(
return false return false
} }
fun FirCallableMemberDeclaration<*>.isVisibleInClass(parentClass: FirClass<*>): Boolean { fun FirCallableMemberDeclaration.isVisibleInClass(parentClass: FirClass): Boolean {
val classPackage = parentClass.symbol.classId.packageFqName val classPackage = parentClass.symbol.classId.packageFqName
if (visibility == Visibilities.Private || if (visibility == Visibilities.Private ||
!visibility.visibleFromPackage(classPackage, symbol.callableId.packageName) !visibility.visibleFromPackage(classPackage, symbol.callableId.packageName)
@@ -435,7 +435,7 @@ fun FirCallableMemberDeclaration<*>.isVisibleInClass(parentClass: FirClass<*>):
* *
* @param parentClass the contextual class for this query. * @param parentClass the contextual class for this query.
*/ */
fun FirCallableMemberDeclaration<*>.getImplementationStatus(sessionHolder: SessionHolder, parentClass: FirClass<*>): ImplementationStatus { fun FirCallableMemberDeclaration.getImplementationStatus(sessionHolder: SessionHolder, parentClass: FirClass): ImplementationStatus {
val containingClass = getContainingClass(sessionHolder) val containingClass = getContainingClass(sessionHolder)
val symbol = this.symbol val symbol = this.symbol
if (symbol is FirIntersectionCallableSymbol) { if (symbol is FirIntersectionCallableSymbol) {
@@ -510,8 +510,8 @@ private val FirSimpleFunction.matchesDataClassSyntheticMemberSignatures: Boolean
(this.name == HASHCODE_NAME && matchesHashCodeSignature) || (this.name == HASHCODE_NAME && matchesHashCodeSignature) ||
(this.name == OperatorNameConventions.TO_STRING && matchesToStringSignature) (this.name == OperatorNameConventions.TO_STRING && matchesToStringSignature)
private fun FirDeclaration<*>.getContainingClass(sessionHolder: SessionHolder): FirClassLikeDeclaration<*>? = private fun FirDeclaration.getContainingClass(sessionHolder: SessionHolder): FirClassLikeDeclaration? =
this.safeAs<FirCallableMemberDeclaration<*>>()?.containingClass()?.toSymbol(sessionHolder.session)?.fir this.safeAs<FirCallableMemberDeclaration>()?.containingClass()?.toSymbol(sessionHolder.session)?.fir
// NB: we intentionally do not check return types // NB: we intentionally do not check return types
private val FirSimpleFunction.matchesEqualsSignature: Boolean private val FirSimpleFunction.matchesEqualsSignature: Boolean
@@ -40,7 +40,7 @@ private data class FirSinceKotlinValue(
val wasExperimentalMarkerClasses: List<FirRegularClassSymbol> val wasExperimentalMarkerClasses: List<FirRegularClassSymbol>
) )
fun FirAnnotatedDeclaration<*>.checkSinceKotlinVersionAccessibility(context: CheckerContext): FirSinceKotlinAccessibility { fun FirAnnotatedDeclaration.checkSinceKotlinVersionAccessibility(context: CheckerContext): FirSinceKotlinAccessibility {
val value = getOwnSinceKotlinVersion(context.session) val value = getOwnSinceKotlinVersion(context.session)
val version = value?.apiVersion val version = value?.apiVersion
val languageVersionSettings = context.session.languageVersionSettings val languageVersionSettings = context.session.languageVersionSettings
@@ -59,11 +59,11 @@ fun FirAnnotatedDeclaration<*>.checkSinceKotlinVersionAccessibility(context: Che
return FirSinceKotlinAccessibility.NotAccessible(version) return FirSinceKotlinAccessibility.NotAccessible(version)
} }
private fun FirAnnotatedDeclaration<*>.getOwnSinceKotlinVersion(session: FirSession): FirSinceKotlinValue? { private fun FirAnnotatedDeclaration.getOwnSinceKotlinVersion(session: FirSession): FirSinceKotlinValue? {
var result: FirSinceKotlinValue? = null var result: FirSinceKotlinValue? = null
// TODO: use-site targeted annotations // TODO: use-site targeted annotations
fun FirAnnotatedDeclaration<*>.consider() { fun FirAnnotatedDeclaration.consider() {
val sinceKotlinSingleArgument = getAnnotationByFqName(SINCE_KOTLIN_FQ_NAME)?.arguments?.singleOrNull() val sinceKotlinSingleArgument = getAnnotationByFqName(SINCE_KOTLIN_FQ_NAME)?.arguments?.singleOrNull()
val apiVersion = ((sinceKotlinSingleArgument as? FirConstExpression<*>)?.value as? String)?.let(ApiVersion.Companion::parse) val apiVersion = ((sinceKotlinSingleArgument as? FirConstExpression<*>)?.value as? String)?.let(ApiVersion.Companion::parse)
if (apiVersion != null) { if (apiVersion != null) {
@@ -90,7 +90,7 @@ private fun FirAnnotatedDeclaration<*>.getOwnSinceKotlinVersion(session: FirSess
return result return result
} }
private fun FirAnnotatedDeclaration<*>.loadWasExperimentalMarkerClasses(): List<FirRegularClassSymbol> { private fun FirAnnotatedDeclaration.loadWasExperimentalMarkerClasses(): List<FirRegularClassSymbol> {
val wasExperimental = getAnnotationByFqName(OptInNames.WAS_EXPERIMENTAL_FQ_NAME) ?: return emptyList() val wasExperimental = getAnnotationByFqName(OptInNames.WAS_EXPERIMENTAL_FQ_NAME) ?: return emptyList()
val annotationClasses = wasExperimental.findArgumentByName(OptInNames.WAS_EXPERIMENTAL_ANNOTATION_CLASS) ?: return emptyList() val annotationClasses = wasExperimental.findArgumentByName(OptInNames.WAS_EXPERIMENTAL_ANNOTATION_CLASS) ?: return emptyList()
return annotationClasses.extractClassesFromArgument() return annotationClasses.extractClassesFromArgument()
@@ -23,7 +23,7 @@ abstract class CheckerContext {
// Context // Context
abstract val implicitReceiverStack: ImplicitReceiverStack abstract val implicitReceiverStack: ImplicitReceiverStack
abstract val containingDeclarations: List<FirDeclaration<*>> abstract val containingDeclarations: List<FirDeclaration>
abstract val qualifiedAccessOrAnnotationCalls: List<FirStatement> abstract val qualifiedAccessOrAnnotationCalls: List<FirStatement>
abstract val getClassCalls: List<FirGetClassCall> abstract val getClassCalls: List<FirGetClassCall>
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.name.Name
class PersistentCheckerContext private constructor( class PersistentCheckerContext private constructor(
override val implicitReceiverStack: PersistentImplicitReceiverStack, override val implicitReceiverStack: PersistentImplicitReceiverStack,
override val containingDeclarations: PersistentList<FirDeclaration<*>>, override val containingDeclarations: PersistentList<FirDeclaration>,
override val qualifiedAccessOrAnnotationCalls: PersistentList<FirStatement>, override val qualifiedAccessOrAnnotationCalls: PersistentList<FirStatement>,
override val getClassCalls: PersistentList<FirGetClassCall>, override val getClassCalls: PersistentList<FirGetClassCall>,
override val sessionHolder: SessionHolder, override val sessionHolder: SessionHolder,
@@ -58,7 +58,7 @@ class PersistentCheckerContext private constructor(
) )
} }
fun addDeclaration(declaration: FirDeclaration<*>): PersistentCheckerContext { fun addDeclaration(declaration: FirDeclaration): PersistentCheckerContext {
return PersistentCheckerContext( return PersistentCheckerContext(
implicitReceiverStack, implicitReceiverStack,
containingDeclarations.add(declaration), containingDeclarations.add(declaration),
@@ -34,7 +34,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
private val deprecatedSinceKotlinClassId = FqName("kotlin.DeprecatedSinceKotlin") private val deprecatedSinceKotlinClassId = FqName("kotlin.DeprecatedSinceKotlin")
override fun check( override fun check(
declaration: FirAnnotatedDeclaration<*>, declaration: FirAnnotatedDeclaration,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
@@ -60,7 +60,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
} }
private fun checkAnnotationTarget( private fun checkAnnotationTarget(
declaration: FirAnnotatedDeclaration<*>, declaration: FirAnnotatedDeclaration,
annotation: FirAnnotationCall, annotation: FirAnnotationCall,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
@@ -112,7 +112,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
} }
private fun checkAnnotationUseSiteTarget( private fun checkAnnotationUseSiteTarget(
annotated: FirAnnotatedDeclaration<*>, annotated: FirAnnotatedDeclaration,
annotation: FirAnnotationCall, annotation: FirAnnotationCall,
target: AnnotationUseSiteTarget, target: AnnotationUseSiteTarget,
context: CheckerContext, context: CheckerContext,
@@ -201,7 +201,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
} }
} }
private fun getActualTargetList(annotated: FirDeclaration<*>): AnnotationTargetList { private fun getActualTargetList(annotated: FirDeclaration): AnnotationTargetList {
return when (annotated) { return when (annotated) {
is FirRegularClass -> { is FirRegularClass -> {
AnnotationTargetList( AnnotationTargetList(
@@ -44,7 +44,7 @@ object FirAnnotationClassDeclarationChecker : FirRegularClassChecker() {
} }
} }
private fun checkAnnotationClassMember(member: FirDeclaration<*>, context: CheckerContext, reporter: DiagnosticReporter) { private fun checkAnnotationClassMember(member: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
when { when {
member is FirConstructor && member.isPrimary -> { member is FirConstructor && member.isPrimary -> {
for (parameter in member.valueParameters) { for (parameter in member.valueParameters) {
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.types.checker.TypeCheckingProcedure import org.jetbrains.kotlin.types.checker.TypeCheckingProcedure
object FirClassVarianceChecker : FirClassChecker() { object FirClassVarianceChecker : FirClassChecker() {
override fun check(declaration: FirClass<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
checkTypeParameters(declaration.typeParameters, Variance.OUT_VARIANCE, context, reporter) checkTypeParameters(declaration.typeParameters, Variance.OUT_VARIANCE, context, reporter)
for (superTypeRef in declaration.superTypeRefs) { for (superTypeRef in declaration.superTypeRefs) {
@@ -39,14 +39,14 @@ object FirClassVarianceChecker : FirClassChecker() {
checkTypeParameters(member.typeParameters, Variance.IN_VARIANCE, context, reporter) checkTypeParameters(member.typeParameters, Variance.IN_VARIANCE, context, reporter)
} }
if (member is FirCallableDeclaration<*>) { if (member is FirCallableDeclaration) {
checkCallableDeclaration(member, context, reporter) checkCallableDeclaration(member, context, reporter)
} }
} }
} }
private fun checkCallableDeclaration( private fun checkCallableDeclaration(
member: FirCallableDeclaration<*>, member: FirCallableDeclaration,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
@@ -134,7 +134,7 @@ object FirClassVarianceChecker : FirClassChecker() {
if (type is ConeClassLikeType) { if (type is ConeClassLikeType) {
val fullyExpandedType = type.fullyExpandedType(context.session) val fullyExpandedType = type.fullyExpandedType(context.session)
val declFir = fullyExpandedType.lookupTag.toSymbol(context.session)?.fir val declFir = fullyExpandedType.lookupTag.toSymbol(context.session)?.fir
if (declFir is FirClass<*>) { if (declFir is FirClass) {
for ((index, typeArgument) in fullyExpandedType.typeArguments.withIndex()) { for ((index, typeArgument) in fullyExpandedType.typeArguments.withIndex()) {
val paramVariance = (declFir.typeParameters.getOrNull(index) as? FirTypeParameter)?.variance ?: continue val paramVariance = (declFir.typeParameters.getOrNull(index) as? FirTypeParameter)?.variance ?: continue
@@ -28,9 +28,9 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
private class DeclarationInspector : FirDeclarationInspector() { private class DeclarationInspector : FirDeclarationInspector() {
val declarationConflictingSymbols: HashMap<FirDeclaration<*>, SmartSet<FirBasedSymbol<*>>> = hashMapOf() val declarationConflictingSymbols: HashMap<FirDeclaration, SmartSet<FirBasedSymbol<*>>> = hashMapOf()
override fun collectNonFunctionDeclaration(key: String, declaration: FirDeclaration<*>): MutableList<FirDeclaration<*>> = override fun collectNonFunctionDeclaration(key: String, declaration: FirDeclaration): MutableList<FirDeclaration> =
super.collectNonFunctionDeclaration(key, declaration).also { super.collectNonFunctionDeclaration(key, declaration).also {
collectLocalConflicts(declaration, it) collectLocalConflicts(declaration, it)
} }
@@ -40,7 +40,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
collectLocalConflicts(declaration, it) collectLocalConflicts(declaration, it)
} }
private fun collectLocalConflicts(declaration: FirDeclaration<*>, conflicting: List<FirDeclaration<*>>) { private fun collectLocalConflicts(declaration: FirDeclaration, conflicting: List<FirDeclaration>) {
val localConflicts = SmartSet.create<FirBasedSymbol<*>>() val localConflicts = SmartSet.create<FirBasedSymbol<*>>()
for (otherDeclaration in conflicting) { for (otherDeclaration in conflicting) {
if (otherDeclaration != declaration && !isExpectAndActual(declaration, otherDeclaration)) { if (otherDeclaration != declaration && !isExpectAndActual(declaration, otherDeclaration)) {
@@ -51,7 +51,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
declarationConflictingSymbols[declaration] = localConflicts declarationConflictingSymbols[declaration] = localConflicts
} }
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 FirStatusOwner) return false
if (declaration2 !is FirStatusOwner) return false if (declaration2 !is FirStatusOwner) return false
return (declaration1.status.isExpect && declaration2.status.isActual) || return (declaration1.status.isExpect && declaration2.status.isActual) ||
@@ -59,7 +59,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
} }
private fun areCompatibleMainFunctions( private fun areCompatibleMainFunctions(
declaration1: FirDeclaration<*>, file1: FirFile, declaration2: FirDeclaration<*>, file2: FirFile? declaration1: FirDeclaration, file1: FirFile, declaration2: FirDeclaration, file2: FirFile?
): Boolean { ): Boolean {
// TODO: proper main function detector // TODO: proper main function detector
if (declaration1 !is FirSimpleFunction || declaration2 !is FirSimpleFunction) return false if (declaration1 !is FirSimpleFunction || declaration2 !is FirSimpleFunction) return false
@@ -68,7 +68,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
} }
private fun collectExternalConflict( private fun collectExternalConflict(
declaration: FirDeclaration<*>, declaration: FirDeclaration,
declarationPresentation: String, declarationPresentation: String,
containingFile: FirFile, containingFile: FirFile,
conflictingSymbol: FirBasedSymbol<*>, conflictingSymbol: FirBasedSymbol<*>,
@@ -97,7 +97,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
} }
fun collectWithExternalConflicts( fun collectWithExternalConflicts(
declaration: FirDeclaration<*>, declaration: FirDeclaration,
containingFile: FirFile, containingFile: FirFile,
session: FirSession, session: FirSession,
packageMemberScope: FirPackageMemberScope packageMemberScope: FirPackageMemberScope
@@ -127,7 +127,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
} }
} }
} }
is FirVariable<*> -> { is FirVariable -> {
declarationName = declaration.name declarationName = declaration.name
if (!declarationName.isSpecial) { if (!declarationName.isSpecial) {
packageMemberScope.processPropertiesByName(declarationName) { packageMemberScope.processPropertiesByName(declarationName) {
@@ -200,7 +200,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
} }
} }
override fun check(declaration: FirDeclaration<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
val inspector = DeclarationInspector() val inspector = DeclarationInspector()
when (declaration) { when (declaration) {
@@ -238,7 +238,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
} }
} }
private fun FirDeclarationPresenter.represent(declaration: FirDeclaration<*>): String? = private fun FirDeclarationPresenter.represent(declaration: FirDeclaration): String? =
when (declaration) { when (declaration) {
is FirSimpleFunction -> represent(declaration) is FirSimpleFunction -> represent(declaration)
is FirRegularClass -> represent(declaration) is FirRegularClass -> represent(declaration)
@@ -267,7 +267,7 @@ class FirNameConflictsTracker : FirNameConflictsTrackerComponent() {
} }
} }
private fun FirDeclaration<*>.onConstructors(action: (ctor: FirConstructor) -> Unit) { private fun FirDeclaration.onConstructors(action: (ctor: FirConstructor) -> Unit) {
class ClassConstructorVisitor : FirVisitorVoid() { class ClassConstructorVisitor : FirVisitorVoid() {
override fun visitElement(element: FirElement) {} override fun visitElement(element: FirElement) {}
@@ -14,14 +14,16 @@ import org.jetbrains.kotlin.fir.analysis.checkers.getModifierList
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter 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.* import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
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.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
object FirConstructorAllowedChecker : FirConstructorChecker() { object FirConstructorAllowedChecker : FirConstructorChecker() {
override fun check(declaration: FirConstructor, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirConstructor, context: CheckerContext, reporter: DiagnosticReporter) {
val containingClass = context.containingDeclarations.lastOrNull() as? FirClass<*> ?: return val containingClass = context.containingDeclarations.lastOrNull() as? FirClass ?: return
val source = declaration.source val source = declaration.source
val elementType = source?.elementType val elementType = source?.elementType
if (elementType != KtNodeTypes.PRIMARY_CONSTRUCTOR && elementType != KtNodeTypes.SECONDARY_CONSTRUCTOR) { if (elementType != KtNodeTypes.PRIMARY_CONSTRUCTOR && elementType != KtNodeTypes.SECONDARY_CONSTRUCTOR) {
@@ -18,7 +18,7 @@ object FirContractChecker : FirFunctionChecker() {
// TODO: The message should vary. Migrate this to [ConeEffectExtractor] when creating fine-grained errors. // TODO: The message should vary. Migrate this to [ConeEffectExtractor] when creating fine-grained errors.
private const val UNEXPECTED_CONSTRUCTION = "unexpected construction in contract description" private const val UNEXPECTED_CONSTRUCTION = "unexpected construction in contract description"
override fun check(declaration: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration !is FirContractDescriptionOwner || if (declaration !is FirContractDescriptionOwner ||
declaration.contractDescription !is FirResolvedContractDescription declaration.contractDescription !is FirResolvedContractDescription
) { ) {
@@ -17,7 +17,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 FirStatusOwner) return
if (declaration is FirConstructor || declaration is FirTypeAlias) return if (declaration is FirConstructor || declaration is FirTypeAlias) return
@@ -9,6 +9,6 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
abstract class FirDeclarationChecker<in D : FirDeclaration<*>> { abstract class FirDeclarationChecker<in D : FirDeclaration> {
abstract fun check(declaration: D, context: CheckerContext, reporter: DiagnosticReporter) abstract fun check(declaration: D, context: CheckerContext, reporter: DiagnosticReporter)
} }
@@ -184,7 +184,7 @@ private val FirProperty.hasAccessorImplementation: Boolean
get() = (getter !is FirDefaultPropertyAccessor && getter?.hasBody == true) || get() = (getter !is FirDefaultPropertyAccessor && getter?.hasBody == true) ||
(setter !is FirDefaultPropertyAccessor && setter?.hasBody == true) (setter !is FirDefaultPropertyAccessor && setter?.hasBody == true)
internal val FirClass<*>.canHaveOpenMembers: Boolean get() = modality() != Modality.FINAL || classKind == ClassKind.ENUM_CLASS internal val FirClass.canHaveOpenMembers: Boolean get() = modality() != Modality.FINAL || classKind == ClassKind.ENUM_CLASS
internal fun FirRegularClass.isInlineOrValueClass(): Boolean { internal fun FirRegularClass.isInlineOrValueClass(): Boolean {
if (this.classKind != ClassKind.CLASS) return false if (this.classKind != ClassKind.CLASS) return false
@@ -192,14 +192,14 @@ internal fun FirRegularClass.isInlineOrValueClass(): Boolean {
return isInline || hasModifier(KtTokens.VALUE_KEYWORD) return isInline || hasModifier(KtTokens.VALUE_KEYWORD)
} }
internal val FirDeclaration<*>.isEnumEntryInitializer: Boolean internal val FirDeclaration.isEnumEntryInitializer: Boolean
get() { get() {
if (this !is FirConstructor || !this.isPrimary) return false if (this !is FirConstructor || !this.isPrimary) return false
return (containingClassAttr as? ConeClassLookupTagWithFixedSymbol)?.symbol?.fir?.classKind == ClassKind.ENUM_ENTRY return (containingClassAttr as? ConeClassLookupTagWithFixedSymbol)?.symbol?.fir?.classKind == ClassKind.ENUM_ENTRY
} }
// contract: returns(true) implies (this is FirMemberDeclaration<*>) // contract: returns(true) implies (this is FirMemberDeclaration<*>)
internal val FirDeclaration<*>.isLocalMember: Boolean internal val FirDeclaration.isLocalMember: Boolean
get() = when (this) { get() = when (this) {
is FirProperty -> this.isLocal is FirProperty -> this.isLocal
is FirRegularClass -> this.isLocal is FirRegularClass -> this.isLocal
@@ -207,7 +207,7 @@ internal val FirDeclaration<*>.isLocalMember: Boolean
else -> false else -> false
} }
internal val FirCallableMemberDeclaration<*>.isExtensionMember: Boolean internal val FirCallableMemberDeclaration.isExtensionMember: Boolean
get() { get() {
return receiverTypeRef != null && dispatchReceiverType != null return receiverTypeRef != null && dispatchReceiverType != null
} }
@@ -66,7 +66,7 @@ object FirDestructuringDeclarationChecker : FirPropertyChecker() {
val originalDestructuringDeclarationOrInitializerSource = originalDestructuringDeclarationOrInitializer.source ?: return val originalDestructuringDeclarationOrInitializerSource = originalDestructuringDeclarationOrInitializer.source ?: return
val originalDestructuringDeclarationType = val originalDestructuringDeclarationType =
when (originalDestructuringDeclarationOrInitializer) { when (originalDestructuringDeclarationOrInitializer) {
is FirVariable<*> -> originalDestructuringDeclarationOrInitializer.returnTypeRef.coneTypeSafe<ConeKotlinType>() is FirVariable -> originalDestructuringDeclarationOrInitializer.returnTypeRef.coneTypeSafe<ConeKotlinType>()
is FirExpression -> originalDestructuringDeclarationOrInitializer.typeRef.coneTypeSafe<ConeKotlinType>() is FirExpression -> originalDestructuringDeclarationOrInitializer.typeRef.coneTypeSafe<ConeKotlinType>()
else -> null else -> null
} ?: return } ?: return
@@ -109,7 +109,7 @@ object FirDestructuringDeclarationChecker : FirPropertyChecker() {
reference: FirErrorNamedReference, reference: FirErrorNamedReference,
property: FirProperty, property: FirProperty,
componentCall: FirComponentCall, componentCall: FirComponentCall,
destructuringDeclaration: FirVariable<*>, destructuringDeclaration: FirVariable,
reporter: DiagnosticReporter, reporter: DiagnosticReporter,
context: CheckerContext context: CheckerContext
) { ) {
@@ -181,6 +181,6 @@ object FirDestructuringDeclarationChecker : FirPropertyChecker() {
else -> this else -> this
} }
private val FirQualifiedAccessExpression.resolvedVariable: FirVariable<*>? private val FirQualifiedAccessExpression.resolvedVariable: FirVariable?
get() = ((calleeReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirVariableSymbol)?.fir as? FirVariable<*> get() = ((calleeReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirVariableSymbol)?.fir as? FirVariable
} }
@@ -25,12 +25,12 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
// TODO: check why coneTypeSafe is necessary at some points inside // TODO: check why coneTypeSafe is necessary at some points inside
object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() { object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
when (declaration) { when (declaration) {
is FirAnonymousFunction -> return is FirAnonymousFunction -> return
is FirTypeAlias -> checkTypeAlias(declaration, reporter, context) is FirTypeAlias -> checkTypeAlias(declaration, reporter, context)
is FirProperty -> checkProperty(declaration, reporter, context) is FirProperty -> checkProperty(declaration, reporter, context)
is FirFunction<*> -> checkFunction(declaration, reporter, context) is FirFunction -> checkFunction(declaration, reporter, context)
is FirRegularClass -> checkClass(declaration, reporter, context) is FirRegularClass -> checkClass(declaration, reporter, context)
} }
} }
@@ -106,7 +106,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 FirStatusOwner).effectiveVisibility
if (functionVisibility == EffectiveVisibility.Local) return if (functionVisibility == EffectiveVisibility.Local) return
@@ -141,7 +141,7 @@ object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() {
} }
} }
} }
checkMemberReceiver(declaration.receiverTypeRef, declaration as? FirCallableMemberDeclaration<*>, reporter, context) checkMemberReceiver(declaration.receiverTypeRef, declaration as? FirCallableMemberDeclaration, reporter, context)
} }
private fun checkProperty(declaration: FirProperty, reporter: DiagnosticReporter, context: CheckerContext) { private fun checkProperty(declaration: FirProperty, reporter: DiagnosticReporter, context: CheckerContext) {
@@ -172,7 +172,7 @@ object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() {
private fun checkMemberReceiver( private fun checkMemberReceiver(
typeRef: FirTypeRef?, typeRef: FirTypeRef?,
memberDeclaration: FirCallableMemberDeclaration<*>?, memberDeclaration: FirCallableMemberDeclaration?,
reporter: DiagnosticReporter, reporter: DiagnosticReporter,
context: CheckerContext context: CheckerContext
) { ) {
@@ -20,7 +20,7 @@ object FirFunctionNameChecker : FirSimpleFunctionChecker() {
val source = declaration.source val source = declaration.source
if (source == null || source.kind is FirFakeSourceElementKind) return if (source == null || source.kind is FirFakeSourceElementKind) return
val containingDeclaration = context.containingDeclarations.lastOrNull() val containingDeclaration = context.containingDeclarations.lastOrNull()
val isNonLocal = containingDeclaration is FirFile || containingDeclaration is FirClass<*> val isNonLocal = containingDeclaration is FirFile || containingDeclaration is FirClass
if (declaration.name == SpecialNames.NO_NAME_PROVIDED && isNonLocal) { if (declaration.name == SpecialNames.NO_NAME_PROVIDED && isNonLocal) {
reporter.reportOn(source, FirErrors.FUNCTION_DECLARATION_WITH_NO_NAME, context) reporter.reportOn(source, FirErrors.FUNCTION_DECLARATION_WITH_NO_NAME, context)
} }
@@ -11,7 +11,10 @@ import org.jetbrains.kotlin.fir.FirRealSourceElementKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.isInline import org.jetbrains.kotlin.fir.analysis.checkers.isInline
import org.jetbrains.kotlin.fir.analysis.checkers.valOrVarKeyword import org.jetbrains.kotlin.fir.analysis.checkers.valOrVarKeyword
import org.jetbrains.kotlin.fir.analysis.diagnostics.* import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOnWithSuppression
import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
@@ -28,14 +31,14 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.AbstractTypeChecker
object FirFunctionParameterChecker : FirFunctionChecker() { object FirFunctionParameterChecker : FirFunctionChecker() {
override fun check(declaration: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) {
checkVarargParameters(declaration, context, reporter) checkVarargParameters(declaration, context, reporter)
checkParameterTypes(declaration, context, reporter) checkParameterTypes(declaration, context, reporter)
checkUninitializedParameter(declaration, context, reporter) checkUninitializedParameter(declaration, context, reporter)
checkValOrVarParameter(declaration, context, reporter) checkValOrVarParameter(declaration, context, reporter)
} }
private fun checkParameterTypes(function: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) { private fun checkParameterTypes(function: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) {
for (valueParameter in function.valueParameters) { for (valueParameter in function.valueParameters) {
val returnTypeRef = valueParameter.returnTypeRef val returnTypeRef = valueParameter.returnTypeRef
if (returnTypeRef !is FirErrorTypeRef) continue if (returnTypeRef !is FirErrorTypeRef) continue
@@ -53,7 +56,7 @@ object FirFunctionParameterChecker : FirFunctionChecker() {
} }
} }
private fun checkVarargParameters(function: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) { private fun checkVarargParameters(function: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) {
val varargParameters = function.valueParameters.filter { it.isVararg } val varargParameters = function.valueParameters.filter { it.isVararg }
if (varargParameters.size > 1) { if (varargParameters.size > 1) {
for (parameter in varargParameters) { for (parameter in varargParameters) {
@@ -79,7 +82,7 @@ object FirFunctionParameterChecker : FirFunctionChecker() {
} }
} }
private fun checkUninitializedParameter(function: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) { private fun checkUninitializedParameter(function: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) {
for ((index, parameter) in function.valueParameters.withIndex()) { for ((index, parameter) in function.valueParameters.withIndex()) {
// Alas, CheckerContext.qualifiedAccesses stack is not available at this point. // Alas, CheckerContext.qualifiedAccesses stack is not available at this point.
// Thus, manually visit default value expression and report the diagnostic on qualified accesses of interest. // Thus, manually visit default value expression and report the diagnostic on qualified accesses of interest.
@@ -108,7 +111,7 @@ object FirFunctionParameterChecker : FirFunctionChecker() {
} }
} }
private fun checkValOrVarParameter(function: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) { private fun checkValOrVarParameter(function: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) {
if (function is FirConstructor && function.isPrimary) { if (function is FirConstructor && function.isPrimary) {
// `val/var` is valid for primary constructors, but not for secondary constructors // `val/var` is valid for primary constructors, but not for secondary constructors
return return
@@ -9,10 +9,13 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter 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.* import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner
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? FirStatusOwner)?.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)) {
@@ -28,6 +31,6 @@ object FirInfixFunctionDeclarationChecker : FirBasicDeclarationChecker() {
context: CheckerContext context: CheckerContext
): Boolean { ): Boolean {
if (function.receiverTypeRef != null) return true if (function.receiverTypeRef != null) return true
return context.containingDeclarations.lastOrNull() is FirClass<*> return context.containingDeclarations.lastOrNull() is FirClass
} }
} }
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
object FirInlineDeclarationChecker : FirFunctionChecker() { object FirInlineDeclarationChecker : FirFunctionChecker() {
override fun check(declaration: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) {
if (!declaration.isInline) return if (!declaration.isInline) return
// local inline functions are prohibited // local inline functions are prohibited
if (declaration.isLocalMember) return if (declaration.isLocalMember) return
@@ -47,7 +47,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
} }
private fun checkInlineFunctionBody( private fun checkInlineFunctionBody(
function: FirFunction<*>, function: FirFunction,
effectiveVisibility: EffectiveVisibility, effectiveVisibility: EffectiveVisibility,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
@@ -70,7 +70,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
} }
private class Visitor( private class Visitor(
val inlineFunction: FirFunction<*>, val inlineFunction: FirFunction,
val inlineFunEffectiveVisibility: EffectiveVisibility, val inlineFunEffectiveVisibility: EffectiveVisibility,
val inlinableParameters: List<FirValueParameter>, val inlinableParameters: List<FirValueParameter>,
val session: FirSession, val session: FirSession,
@@ -175,7 +175,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
) { ) {
val source = qualifiedAccess.source ?: return val source = qualifiedAccess.source ?: return
if (targetSymbol == null) return if (targetSymbol == null) return
val targetFir = targetSymbol.fir as? FirCallableMemberDeclaration<*> val targetFir = targetSymbol.fir as? FirCallableMemberDeclaration
if (targetSymbol.fir in inlinableParameters) { if (targetSymbol.fir in inlinableParameters) {
if (!qualifiedAccess.partOfCall(context)) { if (!qualifiedAccess.partOfCall(context)) {
@@ -199,7 +199,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
private fun checkVisibilityAndAccess( private fun checkVisibilityAndAccess(
accessExpression: FirQualifiedAccess, accessExpression: FirQualifiedAccess,
calledDeclaration: FirCallableMemberDeclaration<*>?, calledDeclaration: FirCallableMemberDeclaration?,
source: FirSourceElement, source: FirSourceElement,
context: CheckerContext context: CheckerContext
) { ) {
@@ -248,7 +248,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
} }
private fun checkPrivateClassMemberAccess( private fun checkPrivateClassMemberAccess(
calledDeclaration: FirCallableMemberDeclaration<*>, calledDeclaration: FirCallableMemberDeclaration,
source: FirSourceElement, source: FirSourceElement,
context: CheckerContext context: CheckerContext
) { ) {
@@ -266,7 +266,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
} }
private fun checkSuperCalls( private fun checkSuperCalls(
calledDeclaration: FirCallableMemberDeclaration<*>, calledDeclaration: FirCallableMemberDeclaration,
callExpression: FirQualifiedAccess, callExpression: FirQualifiedAccess,
context: CheckerContext context: CheckerContext
) { ) {
@@ -305,7 +305,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
} }
} }
private fun FirCallableMemberDeclaration<*>.isInsidePrivateClass(): Boolean { private fun FirCallableMemberDeclaration.isInsidePrivateClass(): Boolean {
val containingClass = this.containingClass()?.toSymbol(session)?.fir ?: return false val containingClass = this.containingClass()?.toSymbol(session)?.fir ?: return false
val containingClassVisibility = when (containingClass) { val containingClassVisibility = when (containingClass) {
@@ -10,7 +10,9 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter 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.* import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeTypeParameterInQualifiedAccess import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeTypeParameterInQualifiedAccess
import org.jetbrains.kotlin.fir.resolve.inference.inferenceComponents import org.jetbrains.kotlin.fir.resolve.inference.inferenceComponents
import org.jetbrains.kotlin.fir.resolve.inference.isKClassType import org.jetbrains.kotlin.fir.resolve.inference.isKClassType
@@ -21,7 +23,7 @@ import org.jetbrains.kotlin.fir.types.*
object FirKClassWithIncorrectTypeArgumentChecker : FirFileChecker() { object FirKClassWithIncorrectTypeArgumentChecker : FirFileChecker() {
override fun check(declaration: FirFile, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirFile, context: CheckerContext, reporter: DiagnosticReporter) {
for (topLevelDeclaration in declaration.declarations) { for (topLevelDeclaration in declaration.declarations) {
if (topLevelDeclaration is FirCallableMemberDeclaration<*>) { if (topLevelDeclaration is FirCallableMemberDeclaration) {
checkTopLevelDeclaration(topLevelDeclaration, context, reporter) checkTopLevelDeclaration(topLevelDeclaration, context, reporter)
} }
} }
@@ -31,7 +33,7 @@ object FirKClassWithIncorrectTypeArgumentChecker : FirFileChecker() {
// bad: fun <T> test1() = T::class // bad: fun <T> test1() = T::class
// okay: fun <T: Any> test2() = T::class // okay: fun <T: Any> test2() = T::class
private fun checkTopLevelDeclaration( private fun checkTopLevelDeclaration(
declaration: FirCallableMemberDeclaration<*>, declaration: FirCallableMemberDeclaration,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
@@ -107,7 +107,7 @@ object FirModifierChecker : FirBasicDeclarationChecker() {
secondModifier: FirModifier<*>, secondModifier: FirModifier<*>,
reporter: DiagnosticReporter, reporter: DiagnosticReporter,
reportedNodes: MutableSet<FirModifier<*>>, reportedNodes: MutableSet<FirModifier<*>>,
owner: FirDeclaration<*>?, owner: FirDeclaration?,
context: CheckerContext context: CheckerContext
) { ) {
val firstToken = firstModifier.token val firstToken = firstModifier.token
@@ -126,7 +126,7 @@ object FirModifierChecker : FirBasicDeclarationChecker() {
reporter.reportDeprecatedModifierPair(secondModifier, secondToken, firstToken, context) reporter.reportDeprecatedModifierPair(secondModifier, secondToken, firstToken, context)
} }
CompatibilityType.INCOMPATIBLE, CompatibilityType.COMPATIBLE_FOR_CLASSES -> { CompatibilityType.INCOMPATIBLE, CompatibilityType.COMPATIBLE_FOR_CLASSES -> {
if (compatibilityType == CompatibilityType.COMPATIBLE_FOR_CLASSES && owner is FirClass<*>) { if (compatibilityType == CompatibilityType.COMPATIBLE_FOR_CLASSES && owner is FirClass) {
return return
} }
if (reportedNodes.add(firstModifier)) reporter.reportIncompatibleModifiers(firstModifier, firstToken, secondToken, context) if (reportedNodes.add(firstModifier)) reporter.reportIncompatibleModifiers(firstModifier, firstToken, secondToken, context)
@@ -137,7 +137,7 @@ object FirModifierChecker : FirBasicDeclarationChecker() {
private fun checkModifiers( private fun checkModifiers(
list: FirModifierList, list: FirModifierList,
owner: FirDeclaration<*>, owner: FirDeclaration,
reporter: DiagnosticReporter, reporter: DiagnosticReporter,
context: CheckerContext context: CheckerContext
) { ) {
@@ -156,17 +156,17 @@ object FirModifierChecker : FirBasicDeclarationChecker() {
} }
} }
private fun isDeclarationMappedToSourceCorrectly(declaration: FirDeclaration<*>, source: FirSourceElement): Boolean = private fun isDeclarationMappedToSourceCorrectly(declaration: FirDeclaration, source: FirSourceElement): Boolean =
when (source.elementType) { when (source.elementType) {
KtNodeTypes.CLASS -> declaration is FirClass<*> KtNodeTypes.CLASS -> declaration is FirClass
KtNodeTypes.OBJECT_DECLARATION -> declaration is FirClass<*> KtNodeTypes.OBJECT_DECLARATION -> declaration is FirClass
KtNodeTypes.PROPERTY -> declaration is FirProperty KtNodeTypes.PROPERTY -> declaration is FirProperty
KtNodeTypes.VALUE_PARAMETER -> declaration is FirValueParameter KtNodeTypes.VALUE_PARAMETER -> declaration is FirValueParameter
// TODO more FIR-PSI relations possibly have to be added // TODO more FIR-PSI relations possibly have to be added
else -> true else -> true
} }
override fun check(declaration: FirDeclaration<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration is FirFile) return if (declaration is FirFile) return
val source = declaration.source ?: return val source = declaration.source ?: return
@@ -10,7 +10,8 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NESTED_CLASS_NOT_ALLOWED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NESTED_CLASS_NOT_ALLOWED
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
import org.jetbrains.kotlin.fir.declarations.utils.isInner import org.jetbrains.kotlin.fir.declarations.utils.isInner
import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.declarations.utils.isLocal
@@ -29,7 +30,7 @@ object FirNestedClassChecker : FirRegularClassChecker() {
reporter.reportOn(declaration.source, NESTED_CLASS_NOT_ALLOWED, declaration.description, context) reporter.reportOn(declaration.source, NESTED_CLASS_NOT_ALLOWED, declaration.description, context)
} }
} }
is FirClass<*> -> { is FirClass -> {
// Since 1.3, enum entries can contain inner classes only. // Since 1.3, enum entries can contain inner classes only.
// Companion objects are reported with code WRONG_MODIFIER_CONTAINING_DECLARATION instead // Companion objects are reported with code WRONG_MODIFIER_CONTAINING_DECLARATION instead
if (containingDeclaration.classKind == ClassKind.ENUM_ENTRY && !declaration.isInner && !declaration.isCompanion) { if (containingDeclaration.classKind == ClassKind.ENUM_ENTRY && !declaration.isInner && !declaration.isCompanion) {
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.util.ImplementationStatus
object FirNotImplementedOverrideChecker : FirClassChecker() { object FirNotImplementedOverrideChecker : FirClassChecker() {
override fun check(declaration: FirClass<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
val source = declaration.source ?: return val source = declaration.source ?: return
val sourceKind = source.kind val sourceKind = source.kind
if (sourceKind is FirFakeSourceElementKind && sourceKind != FirFakeSourceElementKind.EnumInitializer) return if (sourceKind is FirFakeSourceElementKind && sourceKind != FirFakeSourceElementKind.EnumInitializer) return
@@ -53,7 +53,7 @@ object FirNotImplementedOverrideChecker : FirClassChecker() {
val invisibleSymbols = mutableListOf<FirCallableSymbol<*>>() val invisibleSymbols = mutableListOf<FirCallableSymbol<*>>()
fun collectSymbol(symbol: FirCallableSymbol<*>) { fun collectSymbol(symbol: FirCallableSymbol<*>) {
val fir = symbol.fir as? FirCallableMemberDeclaration<*> ?: return val fir = symbol.fir as? FirCallableMemberDeclaration ?: return
when (fir.getImplementationStatus(context.sessionHolder, declaration)) { when (fir.getImplementationStatus(context.sessionHolder, declaration)) {
ImplementationStatus.AMBIGUOUSLY_INHERITED -> notImplementedIntersectionSymbols.add(symbol) ImplementationStatus.AMBIGUOUSLY_INHERITED -> notImplementedIntersectionSymbols.add(symbol)
ImplementationStatus.NOT_IMPLEMENTED -> when { ImplementationStatus.NOT_IMPLEMENTED -> when {
@@ -144,6 +144,6 @@ object FirNotImplementedOverrideChecker : FirClassChecker() {
} }
} }
private fun FirCallableDeclaration<*>.isFromInterfaceOrEnum(context: CheckerContext): Boolean = private fun FirCallableDeclaration.isFromInterfaceOrEnum(context: CheckerContext): Boolean =
(getContainingClass(context) as? FirRegularClass)?.let { it.isInterface || it.isEnumClass } == true (getContainingClass(context) as? FirRegularClass)?.let { it.isInterface || it.isEnumClass } == true
} }
@@ -21,10 +21,10 @@ import org.jetbrains.kotlin.fir.declarations.utils.isOpen
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
object FirOpenMemberChecker : FirClassChecker() { object FirOpenMemberChecker : FirClassChecker() {
override fun check(declaration: FirClass<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration.canHaveOpenMembers) return if (declaration.canHaveOpenMembers) return
for (memberDeclaration in declaration.declarations) { for (memberDeclaration in declaration.declarations) {
if (memberDeclaration !is FirCallableMemberDeclaration<*> || if (memberDeclaration !is FirCallableMemberDeclaration ||
// Marking a constructor `open` is an error covered by diagnostic code WRONG_MODIFIER_TARGET // Marking a constructor `open` is an error covered by diagnostic code WRONG_MODIFIER_TARGET
memberDeclaration is FirConstructor memberDeclaration is FirConstructor
) continue ) continue
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.types.AbstractTypeCheckerContext
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
object FirOverrideChecker : FirClassChecker() { object FirOverrideChecker : FirClassChecker() {
override fun check(declaration: FirClass<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
val typeCheckerContext = context.session.typeContext.newBaseTypeCheckerContext( val typeCheckerContext = context.session.typeContext.newBaseTypeCheckerContext(
errorTypesEqualToAnything = false, errorTypesEqualToAnything = false,
stubTypesEqualToAnything = false stubTypesEqualToAnything = false
@@ -44,12 +44,12 @@ object FirOverrideChecker : FirClassChecker() {
for (it in declaration.declarations) { for (it in declaration.declarations) {
if (it is FirSimpleFunction || it is FirProperty) { if (it is FirSimpleFunction || it is FirProperty) {
checkMember(it as FirCallableMemberDeclaration<*>, reporter, typeCheckerContext, firTypeScope, context) checkMember(it as FirCallableMemberDeclaration, reporter, typeCheckerContext, firTypeScope, context)
} }
} }
} }
private fun FirTypeScope.retrieveDirectOverriddenOf(member: FirCallableMemberDeclaration<*>): List<FirCallableSymbol<*>> { private fun FirTypeScope.retrieveDirectOverriddenOf(member: FirCallableMemberDeclaration): List<FirCallableSymbol<*>> {
return when (member) { return when (member) {
is FirSimpleFunction -> { is FirSimpleFunction -> {
processFunctionsByName(member.name) {} processFunctionsByName(member.name) {}
@@ -64,8 +64,8 @@ object FirOverrideChecker : FirClassChecker() {
} }
private fun ConeKotlinType.substituteAllTypeParameters( private fun ConeKotlinType.substituteAllTypeParameters(
overrideDeclaration: FirCallableMemberDeclaration<*>, overrideDeclaration: FirCallableMemberDeclaration,
baseDeclaration: FirCallableDeclaration<*>, baseDeclaration: FirCallableDeclaration,
context: CheckerContext context: CheckerContext
): ConeKotlinType { ): ConeKotlinType {
if (overrideDeclaration.typeParameters.isEmpty()) { if (overrideDeclaration.typeParameters.isEmpty()) {
@@ -90,7 +90,7 @@ object FirOverrideChecker : FirClassChecker() {
private fun checkModality( private fun checkModality(
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 FirStatusOwner) continue
val modality = (overridden.fir as FirStatusOwner).status.modality val modality = (overridden.fir as FirStatusOwner).status.modality
@@ -109,7 +109,7 @@ object FirOverrideChecker : FirClassChecker() {
return overriddenSymbols.find { (it.fir as? FirProperty)?.isVar == true }?.fir?.safeAs() return overriddenSymbols.find { (it.fir as? FirProperty)?.isVar == true }?.fir?.safeAs()
} }
private fun FirCallableMemberDeclaration<*>.checkVisibility( private fun FirCallableMemberDeclaration.checkVisibility(
reporter: DiagnosticReporter, reporter: DiagnosticReporter,
overriddenSymbols: List<FirCallableSymbol<*>>, overriddenSymbols: List<FirCallableSymbol<*>>,
context: CheckerContext context: CheckerContext
@@ -135,7 +135,7 @@ object FirOverrideChecker : FirClassChecker() {
} }
// See [OverrideResolver#isReturnTypeOkForOverride] // See [OverrideResolver#isReturnTypeOkForOverride]
private fun FirCallableMemberDeclaration<*>.checkReturnType( private fun FirCallableMemberDeclaration.checkReturnType(
overriddenSymbols: List<FirCallableSymbol<*>>, overriddenSymbols: List<FirCallableSymbol<*>>,
typeCheckerContext: AbstractTypeCheckerContext, typeCheckerContext: AbstractTypeCheckerContext,
context: CheckerContext, context: CheckerContext,
@@ -169,7 +169,7 @@ object FirOverrideChecker : FirClassChecker() {
} }
private fun checkMember( private fun checkMember(
member: FirCallableMemberDeclaration<*>, member: FirCallableMemberDeclaration,
reporter: DiagnosticReporter, reporter: DiagnosticReporter,
typeCheckerContext: AbstractTypeCheckerContext, typeCheckerContext: AbstractTypeCheckerContext,
firTypeScope: FirTypeScope, firTypeScope: FirTypeScope,
@@ -241,7 +241,7 @@ object FirOverrideChecker : FirClassChecker() {
private fun DiagnosticReporter.reportOverridingFinalMember( private fun DiagnosticReporter.reportOverridingFinalMember(
overriding: FirStatusOwner, overriding: FirStatusOwner,
overridden: FirCallableDeclaration<*>, overridden: FirCallableDeclaration,
context: CheckerContext context: CheckerContext
) { ) {
overridden.containingClass()?.let { containingClass -> overridden.containingClass()?.let { containingClass ->
@@ -259,7 +259,7 @@ object FirOverrideChecker : FirClassChecker() {
private fun DiagnosticReporter.reportCannotWeakenAccessPrivilege( private fun DiagnosticReporter.reportCannotWeakenAccessPrivilege(
overriding: FirStatusOwner, overriding: FirStatusOwner,
overridden: FirCallableDeclaration<*>, overridden: FirCallableDeclaration,
context: CheckerContext context: CheckerContext
) { ) {
val containingClass = overridden.containingClass() ?: return val containingClass = overridden.containingClass() ?: return
@@ -275,7 +275,7 @@ object FirOverrideChecker : FirClassChecker() {
private fun DiagnosticReporter.reportCannotChangeAccessPrivilege( private fun DiagnosticReporter.reportCannotChangeAccessPrivilege(
overriding: FirStatusOwner, overriding: FirStatusOwner,
overridden: FirCallableDeclaration<*>, overridden: FirCallableDeclaration,
context: CheckerContext context: CheckerContext
) { ) {
val containingClass = overridden.containingClass() ?: return val containingClass = overridden.containingClass() ?: return
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
object FirProjectionRelationChecker : FirBasicDeclarationChecker() { object FirProjectionRelationChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration is FirPropertyAccessor) { if (declaration is FirPropertyAccessor) {
return return
} }
@@ -32,7 +32,7 @@ object FirProjectionRelationChecker : FirBasicDeclarationChecker() {
} }
when (declaration) { when (declaration) {
is FirClass<*> -> { is FirClass -> {
for (it in declaration.superTypeRefs) { for (it in declaration.superTypeRefs) {
checkTypeRef(it, context, reporter) checkTypeRef(it, context, reporter)
} }
@@ -10,7 +10,8 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter 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.* import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.utils.classId import org.jetbrains.kotlin.fir.declarations.utils.classId
import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.fir.resolve.symbolProvider
import org.jetbrains.kotlin.fir.types.classId import org.jetbrains.kotlin.fir.types.classId
@@ -18,7 +19,7 @@ import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
object FirSealedSupertypeChecker : FirClassChecker() { object FirSealedSupertypeChecker : FirClassChecker() {
override fun check(declaration: FirClass<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
// only the file declaration is present // only the file declaration is present
if (declaration.classId.isLocal) { if (declaration.classId.isLocal) {
checkLocalDeclaration(declaration, context, reporter) checkLocalDeclaration(declaration, context, reporter)
@@ -27,7 +28,7 @@ object FirSealedSupertypeChecker : FirClassChecker() {
} }
} }
private fun checkGlobalDeclaration(declaration: FirClass<*>, context: CheckerContext, reporter: DiagnosticReporter) { private fun checkGlobalDeclaration(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
for (it in declaration.superTypeRefs) { for (it in declaration.superTypeRefs) {
val classId = it.coneType.classId ?: continue val classId = it.coneType.classId ?: continue
@@ -46,7 +47,7 @@ object FirSealedSupertypeChecker : FirClassChecker() {
} }
} }
private fun checkLocalDeclaration(declaration: FirClass<*>, context: CheckerContext, reporter: DiagnosticReporter) { private fun checkLocalDeclaration(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
for (it in declaration.superTypeRefs) { for (it in declaration.superTypeRefs) {
val classId = it.coneType.classId ?: continue val classId = it.coneType.classId ?: continue
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
object FirSupertypesChecker : FirClassChecker() { object FirSupertypesChecker : FirClassChecker() {
override fun check(declaration: FirClass<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
val isInterface = declaration.classKind == ClassKind.INTERFACE val isInterface = declaration.classKind == ClassKind.INTERFACE
var nullableSupertypeReported = false var nullableSupertypeReported = false
var extensionFunctionSupertypeReported = false var extensionFunctionSupertypeReported = false
@@ -159,7 +159,7 @@ object FirSupertypesChecker : FirClassChecker() {
} }
private fun checkDelegationNotToInterface( private fun checkDelegationNotToInterface(
declaration: FirClass<*>, declaration: FirClass,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
import org.jetbrains.kotlin.fir.types.ConeClassErrorType import org.jetbrains.kotlin.fir.types.ConeClassErrorType
object FirThrowableSubclassChecker : FirClassChecker() { object FirThrowableSubclassChecker : FirClassChecker() {
override fun check(declaration: FirClass<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
if (!declaration.hasThrowableSupertype(context)) if (!declaration.hasThrowableSupertype(context))
return return
@@ -35,12 +35,12 @@ object FirThrowableSubclassChecker : FirClassChecker() {
} }
} }
private fun FirClass<*>.hasThrowableSupertype(context: CheckerContext) = private fun FirClass.hasThrowableSupertype(context: CheckerContext) =
superConeTypes.any { it !is ConeClassErrorType && it.isSubtypeOfThrowable(context.session) } superConeTypes.any { it !is ConeClassErrorType && it.isSubtypeOfThrowable(context.session) }
private fun FirClass<*>.hasGenericOuterDeclaration(context: CheckerContext) = private fun FirClass.hasGenericOuterDeclaration(context: CheckerContext) =
classId.isLocal && context.containingDeclarations.anyIsGeneric() classId.isLocal && context.containingDeclarations.anyIsGeneric()
private fun Collection<FirDeclaration<*>>.anyIsGeneric() = private fun Collection<FirDeclaration>.anyIsGeneric() =
any { it is FirTypeParameterRefsOwner && it.typeParameters.isNotEmpty() } any { it is FirTypeParameterRefsOwner && it.typeParameters.isNotEmpty() }
} }
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.getDanglingTypeConstraintsOrE
object FirTypeConstraintsChecker : FirBasicDeclarationChecker() { object FirTypeConstraintsChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration !is FirTypeParameterRefsOwner) return if (declaration !is FirTypeParameterRefsOwner) return
//basically we transfer errors, which were discovered in ast parsers //basically we transfer errors, which were discovered in ast parsers
@@ -48,7 +48,7 @@ object FirTypeParameterBoundsChecker : FirTypeParameterChecker() {
private fun checkFinalUpperBounds( private fun checkFinalUpperBounds(
declaration: FirTypeParameter, declaration: FirTypeParameter,
containingDeclaration: FirDeclaration<*>, containingDeclaration: FirDeclaration,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
@@ -72,7 +72,7 @@ object FirTypeParameterBoundsChecker : FirTypeParameterChecker() {
private fun checkTypeAliasBound( private fun checkTypeAliasBound(
declaration: FirTypeParameter, declaration: FirTypeParameter,
containingDeclaration: FirDeclaration<*>, containingDeclaration: FirDeclaration,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
) { ) {
@@ -12,8 +12,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
object FirUpperBoundViolatedDeclarationChecker : FirBasicDeclarationChecker() { object FirUpperBoundViolatedDeclarationChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration is FirClass<*>) { if (declaration is FirClass) {
for (typeParameter in declaration.typeParameters) { for (typeParameter in declaration.typeParameters) {
if (typeParameter is FirTypeParameter) { if (typeParameter is FirTypeParameter) {
for (bound in typeParameter.bounds) { for (bound in typeParameter.bounds) {
@@ -27,7 +27,7 @@ object FirUpperBoundViolatedDeclarationChecker : FirBasicDeclarationChecker() {
} }
} else if (declaration is FirTypeAlias) { } else if (declaration is FirTypeAlias) {
checkUpperBoundViolated(declaration.expandedTypeRef, context, reporter, isIgnoreTypeParameters = true) checkUpperBoundViolated(declaration.expandedTypeRef, context, reporter, isIgnoreTypeParameters = true)
} else if (declaration is FirCallableDeclaration<*>) { } else if (declaration is FirCallableDeclaration) {
if (declaration.returnTypeRef.source?.kind !is FirFakeSourceElementKind) { if (declaration.returnTypeRef.source?.kind !is FirFakeSourceElementKind) {
checkUpperBoundViolated( checkUpperBoundViolated(
declaration.returnTypeRef, context, reporter, declaration.returnTypeRef, context, reporter,
@@ -33,7 +33,7 @@ object FirAbstractSuperCallChecker : FirQualifiedAccessExpressionChecker() {
if (closestClass.classKind == ClassKind.CLASS) { if (closestClass.classKind == ClassKind.CLASS) {
// handles all the FirSimpleFunction/FirProperty/etc. // handles all the FirSimpleFunction/FirProperty/etc.
val item = expression.getDeclaration<FirCallableMemberDeclaration<*>>() val item = expression.getDeclaration<FirCallableMemberDeclaration>()
?: return ?: return
val declaration = item.getContainingClass(context).safeAs<FirRegularClass>() val declaration = item.getContainingClass(context).safeAs<FirRegularClass>()
@@ -13,7 +13,10 @@ import org.jetbrains.kotlin.fir.analysis.checkers.declaration.isLocalMember
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter 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.* import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
import org.jetbrains.kotlin.fir.expressions.FirGetClassCall import org.jetbrains.kotlin.fir.expressions.FirGetClassCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
@@ -46,7 +49,7 @@ object FirCallableReferenceChecker : FirQualifiedAccessExpressionChecker() {
if (referredDeclaration is FirConstructor && referredDeclaration.getContainingClass(context.session)?.classKind == ClassKind.ANNOTATION_CLASS) { if (referredDeclaration is FirConstructor && referredDeclaration.getContainingClass(context.session)?.classKind == ClassKind.ANNOTATION_CLASS) {
reporter.reportOn(source, FirErrors.CALLABLE_REFERENCE_TO_ANNOTATION_CONSTRUCTOR, context) reporter.reportOn(source, FirErrors.CALLABLE_REFERENCE_TO_ANNOTATION_CONSTRUCTOR, context)
} }
if ((referredDeclaration as? FirCallableMemberDeclaration<*>)?.isExtensionMember == true && if ((referredDeclaration as? FirCallableMemberDeclaration)?.isExtensionMember == true &&
!referredDeclaration.isLocalMember !referredDeclaration.isLocalMember
) { ) {
reporter.reportOn(source, FirErrors.EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED, referredDeclaration, context) reporter.reportOn(source, FirErrors.EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED, referredDeclaration, context)
@@ -22,7 +22,7 @@ object FirExpressionAnnotationChecker : FirBasicExpressionChecker() {
override fun check(expression: FirStatement, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(expression: FirStatement, context: CheckerContext, reporter: DiagnosticReporter) {
// Declarations are checked separately // Declarations are checked separately
// See KT-33658 about annotations on non-expression statements // See KT-33658 about annotations on non-expression statements
if (expression is FirDeclaration<*> || if (expression is FirDeclaration ||
expression !is FirExpression || expression !is FirExpression ||
expression is FirBlock && expression.source?.kind == FirFakeSourceElementKind.DesugaredForLoop expression is FirBlock && expression.source?.kind == FirFakeSourceElementKind.DesugaredForLoop
) return ) return
@@ -38,10 +38,10 @@ object FirNotASupertypeChecker : FirQualifiedAccessExpressionChecker() {
* item like FirRegularClass or FirAnonymousObject * item like FirRegularClass or FirAnonymousObject
* or null if no such item could be found. * or null if no such item could be found.
*/ */
private fun CheckerContext.findClosestClass(label: String?): FirClass<*>? { private fun CheckerContext.findClosestClass(label: String?): FirClass? {
for (it in containingDeclarations.reversed()) { for (it in containingDeclarations.reversed()) {
if (it is FirRegularClass || it is FirAnonymousObject) { if (it is FirRegularClass || it is FirAnonymousObject) {
val firClass = it as FirClass<*> val firClass = it as FirClass
val className = firClass.symbol.classId.shortClassName val className = firClass.symbol.classId.shortClassName
if (label == null || (!className.isSpecial && className.identifier == label)) { if (label == null || (!className.isSpecial && className.identifier == label)) {
return firClass return firClass
@@ -27,7 +27,7 @@ object FirQualifiedSupertypeExtendedByOtherSupertypeChecker : FirQualifiedAccess
val explicitType = superReference.superTypeRef val explicitType = superReference.superTypeRef
.firClassLike(context.session) .firClassLike(context.session)
?.followAllAlias(context.session).safeAs<FirClass<*>>() ?.followAllAlias(context.session).safeAs<FirClass>()
?: return ?: return
val surroundingType = context.findClosestClassOrObject() val surroundingType = context.findClosestClassOrObject()
@@ -37,11 +37,11 @@ object FirQualifiedSupertypeExtendedByOtherSupertypeChecker : FirQualifiedAccess
// have `explicitType` as their supertype or // have `explicitType` as their supertype or
// equal to it // equal to it
var count = 0 var count = 0
var candidate: FirClass<*>? = null var candidate: FirClass? = null
for (it in surroundingType.superTypeRefs) { for (it in surroundingType.superTypeRefs) {
val that = it.firClassLike(context.session) val that = it.firClassLike(context.session)
?.followAllAlias(context.session).safeAs<FirClass<*>>() ?.followAllAlias(context.session).safeAs<FirClass>()
?: continue ?: continue
val isSupertype = explicitType.isSupertypeOf(that, context.session) val isSupertype = explicitType.isSupertypeOf(that, context.session)
@@ -112,17 +112,17 @@ object FirReservedUnderscoreExpressionChecker : FirBasicExpressionChecker() {
} }
object FirReservedUnderscoreDeclarationChecker : FirBasicDeclarationChecker() { object FirReservedUnderscoreDeclarationChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration<*>, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if ( if (
declaration is FirClass<*> || declaration is FirClass ||
declaration is FirFunction<*> || declaration is FirFunction ||
declaration is FirTypeParameter || declaration is FirTypeParameter ||
declaration is FirProperty || declaration is FirProperty ||
declaration is FirTypeAlias declaration is FirTypeAlias
) { ) {
reportIfUnderscore(declaration, context, reporter) reportIfUnderscore(declaration, context, reporter)
if (declaration is FirFunction<*>) { if (declaration is FirFunction) {
for (parameter in declaration.valueParameters) { for (parameter in declaration.valueParameters) {
reportIfUnderscore( reportIfUnderscore(
parameter, parameter,
@@ -141,7 +141,7 @@ object FirReservedUnderscoreDeclarationChecker : FirBasicDeclarationChecker() {
} }
private fun reportIfUnderscore( private fun reportIfUnderscore(
declaration: FirDeclaration<*>, declaration: FirDeclaration,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter, reporter: DiagnosticReporter,
isSingleUnderscoreAllowed: Boolean = false isSingleUnderscoreAllowed: Boolean = false
@@ -160,7 +160,7 @@ private fun reportIfUnderscore(
val returnOrReceiverTypeRef = when (declaration) { val returnOrReceiverTypeRef = when (declaration) {
is FirValueParameter -> declaration.returnTypeRef.source is FirValueParameter -> declaration.returnTypeRef.source
is FirFunction<*> -> declaration.receiverTypeRef?.source is FirFunction -> declaration.receiverTypeRef?.source
else -> null else -> null
} }
@@ -27,7 +27,7 @@ object FirReturnAllowedChecker : FirReturnExpressionChecker() {
} }
val containingDeclaration = context.containingDeclarations.last() val containingDeclaration = context.containingDeclarations.last()
if (containingDeclaration is FirFunction<*> && containingDeclaration.body is FirSingleExpressionBlock) { if (containingDeclaration is FirFunction && containingDeclaration.body is FirSingleExpressionBlock) {
reporter.reportOn(source, FirErrors.RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, context) reporter.reportOn(source, FirErrors.RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY, context)
} }
} }
@@ -36,8 +36,8 @@ object FirReturnAllowedChecker : FirReturnExpressionChecker() {
for (containingDeclaration in context.containingDeclarations.asReversed()) { for (containingDeclaration in context.containingDeclarations.asReversed()) {
when (containingDeclaration) { when (containingDeclaration) {
// return from member of local class or anonymous object // return from member of local class or anonymous object
is FirClass<*> -> return false is FirClass -> return false
is FirFunction<*> -> { is FirFunction -> {
when { when {
containingDeclaration.symbol == targetSymbol -> return true containingDeclaration.symbol == targetSymbol -> return true
containingDeclaration is FirAnonymousFunction -> { containingDeclaration is FirAnonymousFunction -> {
@@ -19,7 +19,7 @@ object FirSuperNotAvailableChecker : FirQualifiedAccessExpressionChecker() {
if (expression.calleeReference.safeAs<FirSuperReference>()?.hadExplicitTypeInSource() != true) return if (expression.calleeReference.safeAs<FirSuperReference>()?.hadExplicitTypeInSource() != true) return
val isInsideClass = context.containingDeclarations.any { val isInsideClass = context.containingDeclarations.any {
it is FirClass<*> it is FirClass
} }
if (!isInsideClass) { if (!isInsideClass) {
@@ -44,7 +44,7 @@ object FirSuperclassNotAccessibleFromInterfaceChecker : FirQualifiedAccessExpres
* Returns the ClassLikeDeclaration where the function has been defined * Returns the ClassLikeDeclaration where the function has been defined
* or null if no proper declaration has been found. * or null if no proper declaration has been found.
*/ */
private fun getClassLikeDeclaration(functionCall: FirQualifiedAccessExpression, context: CheckerContext): FirClassLikeDeclaration<*>? { private fun getClassLikeDeclaration(functionCall: FirQualifiedAccessExpression, context: CheckerContext): FirClassLikeDeclaration? {
return functionCall.calleeReference.safeAs<FirResolvedNamedReference>()?.resolvedSymbol?.fir?.getContainingClass(context) return functionCall.calleeReference.safeAs<FirResolvedNamedReference>()?.resolvedSymbol?.fir?.getContainingClass(context)
} }
} }
@@ -22,13 +22,13 @@ import org.jetbrains.kotlin.fir.declarations.FirStatusOwner
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 FirStatusOwner
override fun checkLightTree( override fun checkLightTree(
element: FirDeclaration<*>, element: FirDeclaration,
source: FirSourceElement, source: FirSourceElement,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
@@ -37,7 +37,7 @@ object RedundantModalityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirD
val modality = element.modality ?: return val modality = element.modality ?: return
if ( if (
modality == Modality.FINAL modality == Modality.FINAL
&& (context.containingDeclarations.last() as? FirClass<*>)?.classKind == ClassKind.INTERFACE && (context.containingDeclarations.last() as? FirClass)?.classKind == ClassKind.INTERFACE
) return ) return
if (source.treeStructure.modalityModifier(source.lighterASTNode) == null) return if (source.treeStructure.modalityModifier(source.lighterASTNode) == null) return
@@ -24,10 +24,10 @@ import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirDeclaration<*>, KtDeclaration>() { object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirDeclaration, KtDeclaration>() {
override fun checkLightTree( override fun checkLightTree(
element: FirDeclaration<*>, element: FirDeclaration,
source: FirSourceElement, source: FirSourceElement,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
@@ -43,7 +43,7 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
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<FirStatusOwner>()
require(containingMemberDeclaration is FirDeclaration<*>?) require(containingMemberDeclaration is FirDeclaration?)
val redundantVisibility = when { val redundantVisibility = when {
explicitVisibility == implicitVisibility -> implicitVisibility explicitVisibility == implicitVisibility -> implicitVisibility
@@ -62,7 +62,7 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
reporter.reportOn(source, FirErrors.REDUNDANT_VISIBILITY_MODIFIER, context) reporter.reportOn(source, FirErrors.REDUNDANT_VISIBILITY_MODIFIER, context)
} }
private fun FirDeclaration<*>.implicitVisibility(context: CheckerContext): Visibility { private fun FirDeclaration.implicitVisibility(context: CheckerContext): Visibility {
return when { return when {
this is FirPropertyAccessor && isSetter && status.isOverride -> this.visibility this is FirPropertyAccessor && isSetter && status.isOverride -> this.visibility
@@ -83,7 +83,7 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
} }
this is FirSimpleFunction this is FirSimpleFunction
&& context.containingDeclarations.last() is FirClass<*> && context.containingDeclarations.last() is FirClass
&& this.isOverride -> findFunctionVisibility(this, context) && this.isOverride -> findFunctionVisibility(this, context)
else -> Visibilities.DEFAULT_VISIBILITY else -> Visibilities.DEFAULT_VISIBILITY
@@ -107,7 +107,7 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
return visibility return visibility
} }
private fun FirFunction<*>.visibility(): Visibility? { private fun FirFunction.visibility(): Visibility? {
(symbol.fir as? FirStatusOwner)?.visibility?.let { (symbol.fir as? FirStatusOwner)?.visibility?.let {
return it return it
} }
@@ -48,7 +48,7 @@ interface FirSyntaxChecker<in D : FirElement, P : PsiElement> {
fun checkLightTree(element: D, source: FirSourceElement, context: CheckerContext, reporter: DiagnosticReporter) fun checkLightTree(element: D, source: FirSourceElement, context: CheckerContext, reporter: DiagnosticReporter)
} }
abstract class FirDeclarationSyntaxChecker<in D : FirDeclaration<*>, P : PsiElement> : abstract class FirDeclarationSyntaxChecker<in D : FirDeclaration, P : PsiElement> :
FirDeclarationChecker<D>(), FirDeclarationChecker<D>(),
FirSyntaxChecker<D, P> { FirSyntaxChecker<D, P> {
final override fun check(declaration: D, context: CheckerContext, reporter: DiagnosticReporter) { final override fun check(declaration: D, context: CheckerContext, reporter: DiagnosticReporter) {
@@ -24,7 +24,7 @@ abstract class AbstractDiagnosticCollector(
override val scopeSession: ScopeSession = ScopeSession(), override val scopeSession: ScopeSession = ScopeSession(),
protected val createComponents: (DiagnosticReporter) -> List<AbstractDiagnosticCollectorComponent>, protected val createComponents: (DiagnosticReporter) -> List<AbstractDiagnosticCollectorComponent>,
) : SessionHolder { ) : SessionHolder {
fun collectDiagnostics(firDeclaration: FirDeclaration<*>, reporter: DiagnosticReporter) { fun collectDiagnostics(firDeclaration: FirDeclaration, reporter: DiagnosticReporter) {
val components = createComponents(reporter) val components = createComponents(reporter)
val visitor = createVisitor(components) val visitor = createVisitor(components)
firDeclaration.accept(visitor, null) firDeclaration.accept(visitor, null)
@@ -24,8 +24,8 @@ abstract class AbstractDiagnosticCollectorVisitor(
@set:PrivateForInline var context: PersistentCheckerContext, @set:PrivateForInline var context: PersistentCheckerContext,
) : FirDefaultVisitor<Unit, Nothing?>() { ) : FirDefaultVisitor<Unit, Nothing?>() {
protected open fun shouldVisitDeclaration(declaration: FirDeclaration<*>) = true protected open fun shouldVisitDeclaration(declaration: FirDeclaration) = true
protected open fun onDeclarationExit(declaration: FirDeclaration<*>) {} protected open fun onDeclarationExit(declaration: FirDeclaration) {}
protected open fun visitNestedElements(element: FirElement) { protected open fun visitNestedElements(element: FirElement) {
element.acceptChildren(this, null) element.acceptChildren(this, null)
@@ -64,7 +64,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
visitJump(continueExpression) visitJump(continueExpression)
} }
private fun visitClassAndChildren(klass: FirClass<*>, type: ConeKotlinType) { private fun visitClassAndChildren(klass: FirClass, type: ConeKotlinType) {
val typeRef = buildResolvedTypeRef { val typeRef = buildResolvedTypeRef {
this.type = type this.type = type
} }
@@ -204,7 +204,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
} }
protected inline fun visitWithDeclaration( protected inline fun visitWithDeclaration(
declaration: FirDeclaration<*>, declaration: FirDeclaration,
block: () -> Unit = { visitNestedElements(declaration) } block: () -> Unit = { visitNestedElements(declaration) }
) { ) {
if (shouldVisitDeclaration(declaration)) { if (shouldVisitDeclaration(declaration)) {
@@ -216,7 +216,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
} }
} }
private fun visitWithDeclarationAndReceiver(declaration: FirDeclaration<*>, labelName: Name?, receiverTypeRef: FirTypeRef?) { private fun visitWithDeclarationAndReceiver(declaration: FirDeclaration, labelName: Name?, receiverTypeRef: FirTypeRef?) {
visitWithDeclaration(declaration) { visitWithDeclaration(declaration) {
withLabelAndReceiverType( withLabelAndReceiverType(
labelName, labelName,
@@ -265,7 +265,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
@OptIn(PrivateForInline::class) @OptIn(PrivateForInline::class)
inline fun <R> withDeclaration(declaration: FirDeclaration<*>, block: () -> R): R { inline fun <R> withDeclaration(declaration: FirDeclaration, block: () -> R): R {
val existingContext = context val existingContext = context
context = context.addDeclaration(declaration) context = context.addDeclaration(declaration)
try { try {
@@ -279,7 +279,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
@OptIn(PrivateForInline::class) @OptIn(PrivateForInline::class)
inline fun <R> withLabelAndReceiverType( inline fun <R> withLabelAndReceiverType(
labelName: Name?, labelName: Name?,
owner: FirDeclaration<*>, owner: FirDeclaration,
type: ConeKotlinType?, type: ConeKotlinType?,
block: () -> R block: () -> R
): R { ): R {
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.analysis.cfa.FirControlFlowAnalyzer
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
import org.jetbrains.kotlin.fir.analysis.checkersComponent import org.jetbrains.kotlin.fir.analysis.checkersComponent
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollector
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
@@ -33,8 +32,8 @@ class ControlFlowAnalysisDiagnosticComponent(
visitClass(anonymousObject, anonymousObject.controlFlowGraphReference, data) visitClass(anonymousObject, anonymousObject.controlFlowGraphReference, data)
} }
private fun <F : FirClass<F>> visitClass( private fun visitClass(
klass: FirClass<F>, klass: FirClass,
controlFlowGraphReference: FirControlFlowGraphReference?, controlFlowGraphReference: FirControlFlowGraphReference?,
data: CheckerContext data: CheckerContext
) { ) {
@@ -50,7 +49,7 @@ class ControlFlowAnalysisDiagnosticComponent(
// ------------------------------- Function ------------------------------- // ------------------------------- Function -------------------------------
override fun <F : FirFunction<F>> visitFunction(function: FirFunction<F>, data: CheckerContext) { override fun visitFunction(function: FirFunction, data: CheckerContext) {
val graph = function.controlFlowGraphReference?.controlFlowGraph ?: return val graph = function.controlFlowGraphReference?.controlFlowGraph ?: return
controlFlowAnalyzer.analyzeFunction(function, graph, data, reporter) controlFlowAnalyzer.analyzeFunction(function, graph, data, reporter)
@@ -29,7 +29,7 @@ class DeclarationCheckersDiagnosticComponent(
checkers.allPropertyCheckers.check(property, data, reporter) checkers.allPropertyCheckers.check(property, data, reporter)
} }
override fun <F : FirClass<F>> visitClass(klass: FirClass<F>, data: CheckerContext) { override fun visitClass(klass: FirClass, data: CheckerContext) {
checkers.allClassCheckers.check(klass, data, reporter) checkers.allClassCheckers.check(klass, data, reporter)
} }
@@ -77,7 +77,7 @@ class DeclarationCheckersDiagnosticComponent(
checkers.allBasicDeclarationCheckers.check(anonymousInitializer, data, reporter) checkers.allBasicDeclarationCheckers.check(anonymousInitializer, data, reporter)
} }
private fun <D : FirDeclaration<*>> Collection<FirDeclarationChecker<D>>.check( private fun <D : FirDeclaration> Collection<FirDeclarationChecker<D>>.check(
declaration: D, declaration: D,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter reporter: DiagnosticReporter
@@ -60,7 +60,7 @@ object FirDiagnosticRenderers {
val NAME = Renderer { element: FirElement -> val NAME = Renderer { element: FirElement ->
when (element) { when (element) {
is FirStatusOwner -> DECLARATION_NAME.render(element) is FirStatusOwner -> DECLARATION_NAME.render(element)
is FirCallableDeclaration<*> -> element.symbol.callableId.callableName.asString() is FirCallableDeclaration -> element.symbol.callableId.callableName.asString()
else -> "???" else -> "???"
} }
} }
@@ -83,7 +83,7 @@ object FirDiagnosticRenderers {
name.asString() name.asString()
} }
val RENDER_CLASS_OR_OBJECT = Renderer { firClass: FirClass<*> -> val RENDER_CLASS_OR_OBJECT = Renderer { firClass: FirClass ->
val name = firClass.classId.relativeClassName.asString() val name = firClass.classId.relativeClassName.asString()
val classOrObject = if (firClass is FirRegularClass) "Class" else "Object" val classOrObject = if (firClass is FirRegularClass) "Class" else "Object"
"$classOrObject $name" "$classOrObject $name"
@@ -378,12 +378,12 @@ class MultiModuleHtmlFirDump(private val outputRoot: File) {
visitElement(regularClass) visitElement(regularClass)
} }
fun indexDeclaration(declaration: FirDeclaration<*>) { fun indexDeclaration(declaration: FirDeclaration) {
symbols[declaration.symbol] = location symbols[declaration.symbol] = location
symbolIds[declaration.symbol] = symbolCounter++ symbolIds[declaration.symbol] = symbolCounter++
} }
override fun <F : FirVariable<F>> visitVariable(variable: FirVariable<F>) { override fun visitVariable(variable: FirVariable) {
indexDeclaration(variable) indexDeclaration(variable)
visitElement(variable) visitElement(variable)
} }
@@ -919,7 +919,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
is FirEnumEntry -> generate(statusOwner) is FirEnumEntry -> generate(statusOwner)
is FirRegularClass -> generate(statusOwner) is FirRegularClass -> generate(statusOwner)
is FirSimpleFunction -> generate(statusOwner) is FirSimpleFunction -> generate(statusOwner)
is FirProperty -> if (statusOwner.isLocal) generate(statusOwner as FirVariable<*>) else generate(statusOwner) is FirProperty -> if (statusOwner.isLocal) generate(statusOwner as FirVariable) else generate(statusOwner)
is FirConstructor -> generate(statusOwner) is FirConstructor -> generate(statusOwner)
is FirTypeAlias -> generate(statusOwner) is FirTypeAlias -> generate(statusOwner)
else -> unsupported(statusOwner) else -> unsupported(statusOwner)
@@ -962,7 +962,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
+"> " +"> "
} }
private fun FlowContent.generateReceiver(declaration: FirCallableDeclaration<*>) { private fun FlowContent.generateReceiver(declaration: FirCallableDeclaration) {
generateReceiver(declaration.receiverTypeRef) generateReceiver(declaration.receiverTypeRef)
} }
@@ -1047,7 +1047,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
is FirWhenExpression -> generate(statement, isStatement = true) is FirWhenExpression -> generate(statement, isStatement = true)
is FirTryExpression -> generate(statement, isStatement = true) is FirTryExpression -> generate(statement, isStatement = true)
is FirExpression -> iline { generate(statement) } is FirExpression -> iline { generate(statement) }
is FirVariable<*> -> iline { generate(statement) } is FirVariable -> iline { generate(statement) }
is FirVariableAssignment -> iline { generate(statement) } is FirVariableAssignment -> iline { generate(statement) }
else -> unsupported(statement) else -> unsupported(statement)
} }
@@ -1072,7 +1072,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
} }
} }
private fun FlowContent.generate(variable: FirVariable<*>) { private fun FlowContent.generate(variable: FirVariable) {
if (variable.isVal) { if (variable.isVal) {
keyword("val ") keyword("val ")
} else { } else {
@@ -1112,7 +1112,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
} }
} }
private fun FlowContent.describeVerbose(symbol: FirCallableSymbol<*>, fir: FirFunction<*>) { private fun FlowContent.describeVerbose(symbol: FirCallableSymbol<*>, fir: FirFunction) {
describeTypeParameters(fir) describeTypeParameters(fir)
fir.receiverTypeRef?.let { fir.receiverTypeRef?.let {
@@ -1131,7 +1131,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
generate(fir.returnTypeRef) generate(fir.returnTypeRef)
} }
private fun FlowContent.describeVerbose(symbol: FirCallableSymbol<*>, fir: FirVariable<*>) { private fun FlowContent.describeVerbose(symbol: FirCallableSymbol<*>, fir: FirVariable) {
if (fir is FirTypeParametersOwner) describeTypeParameters(fir) if (fir is FirTypeParametersOwner) describeTypeParameters(fir)
fir.receiverTypeRef?.let { fir.receiverTypeRef?.let {
@@ -1684,7 +1684,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
} }
} }
private fun FlowContent.generateDeclarations(declarations: List<FirDeclaration<*>>) { private fun FlowContent.generateDeclarations(declarations: List<FirDeclaration>) {
if (declarations.isNotEmpty()) { if (declarations.isNotEmpty()) {
+" {" +" {"
br br
@@ -1769,7 +1769,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 FirStatusOwner -> generate(declaration as FirStatusOwner)
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.FirStatusOwner
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 : FirStatusOwner, 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
@@ -11,7 +11,10 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClass import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClass
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.containingClass
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.utils.isFinal import org.jetbrains.kotlin.fir.declarations.utils.isFinal
import org.jetbrains.kotlin.fir.dispatchReceiverTypeOrNull import org.jetbrains.kotlin.fir.dispatchReceiverTypeOrNull
import org.jetbrains.kotlin.fir.originalOrSelf import org.jetbrains.kotlin.fir.originalOrSelf
@@ -50,7 +53,7 @@ object FirJvmOverridesBackwardCompatibilityHelper : FirOverridesBackwardCompatib
visitedSymbols: MutableSet<FirCallableSymbol<*>>, visitedSymbols: MutableSet<FirCallableSymbol<*>>,
context: CheckerContext context: CheckerContext
): Boolean { ): Boolean {
val fir = symbol.fir as? FirCallableMemberDeclaration<*> ?: return false val fir = symbol.fir as? FirCallableMemberDeclaration ?: return false
if (fir.isFinal) return false if (fir.isFinal) return false
if (symbol in visitedSymbols) return true if (symbol in visitedSymbols) return true
@@ -24,7 +24,10 @@ import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvide
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider.Companion.CLONEABLE_CLASS_ID import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider.Companion.CLONEABLE_CLASS_ID
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.ConeAttributes import org.jetbrains.kotlin.fir.types.ConeAttributes
import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeClassLikeType
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
@@ -192,8 +195,8 @@ fun deserializeClassToSymbol(
addCloneForArrayIfNeeded(classId, context.dispatchReceiver) addCloneForArrayIfNeeded(classId, context.dispatchReceiver)
addSerializableIfNeeded(classId) addSerializableIfNeeded(classId)
declarations.sortWith(object : Comparator<FirDeclaration<*>> { declarations.sortWith(object : Comparator<FirDeclaration> {
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 FirStatusOwner && b is FirStatusOwner) {
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.fir.serialization package org.jetbrains.kotlin.fir.serialization
import org.jetbrains.kotlin.contracts.description.* import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.fir.contracts.FirContractDescription import org.jetbrains.kotlin.fir.contracts.FirContractDescription
import org.jetbrains.kotlin.fir.contracts.description.* import org.jetbrains.kotlin.fir.contracts.description.*
import org.jetbrains.kotlin.fir.contracts.effects import org.jetbrains.kotlin.fir.contracts.effects
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.metadata.deserialization.Flags
class FirContractSerializer { class FirContractSerializer {
fun serializeContractOfFunctionIfAny( fun serializeContractOfFunctionIfAny(
function: FirFunction<*>, function: FirFunction,
proto: ProtoBuf.Function.Builder, proto: ProtoBuf.Function.Builder,
parentSerializer: FirElementSerializer parentSerializer: FirElementSerializer
) { ) {
@@ -15,13 +15,13 @@ interface FirElementAwareStringTable : StringTable {
fun getQualifiedClassNameIndex(classId: ClassId): Int = fun getQualifiedClassNameIndex(classId: ClassId): Int =
getQualifiedClassNameIndex(classId.asString(), classId.isLocal) getQualifiedClassNameIndex(classId.asString(), classId.isLocal)
fun getFqNameIndex(classLikeDeclaration: FirClassLikeDeclaration<*>): Int { fun getFqNameIndex(classLikeDeclaration: FirClassLikeDeclaration): Int {
val classId = classLikeDeclaration.symbol.classId.takeIf { !it.isLocal } val classId = classLikeDeclaration.symbol.classId.takeIf { !it.isLocal }
?: getLocalClassIdReplacement(classLikeDeclaration as FirClass<*>) ?: getLocalClassIdReplacement(classLikeDeclaration as FirClass)
?: throw IllegalStateException("Cannot get FQ name of local class: ${classLikeDeclaration.render()}") ?: throw IllegalStateException("Cannot get FQ name of local class: ${classLikeDeclaration.render()}")
return getQualifiedClassNameIndex(classId) return getQualifiedClassNameIndex(classId)
} }
fun getLocalClassIdReplacement(firClass: FirClass<*>): ClassId? = null fun getLocalClassIdReplacement(firClass: FirClass): ClassId? = null
} }
@@ -60,7 +60,7 @@ import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
class FirElementSerializer private constructor( class FirElementSerializer private constructor(
private val session: FirSession, private val session: FirSession,
private val scopeSession: ScopeSession, private val scopeSession: ScopeSession,
private val containingDeclaration: FirDeclaration<*>?, private val containingDeclaration: FirDeclaration?,
private val typeParameters: Interner<FirTypeParameter>, private val typeParameters: Interner<FirTypeParameter>,
private val extension: FirSerializerExtension, private val extension: FirSerializerExtension,
private val typeTable: MutableTypeTable, private val typeTable: MutableTypeTable,
@@ -96,7 +96,7 @@ class FirElementSerializer private constructor(
return builder return builder
} }
fun classProto(klass: FirClass<*>): ProtoBuf.Class.Builder { fun classProto(klass: FirClass): ProtoBuf.Class.Builder {
val builder = ProtoBuf.Class.newBuilder() val builder = ProtoBuf.Class.newBuilder()
val regularClass = klass as? FirRegularClass val regularClass = klass as? FirRegularClass
@@ -156,7 +156,7 @@ class FirElementSerializer private constructor(
} }
} }
val nestedClassifiers = klass.declarations.filterIsInstance<FirClassLikeDeclaration<*>>() val nestedClassifiers = klass.declarations.filterIsInstance<FirClassLikeDeclaration>()
for (nestedClassifier in nestedClassifiers) { for (nestedClassifier in nestedClassifiers) {
if (nestedClassifier is FirTypeAlias) { if (nestedClassifier is FirTypeAlias) {
typeAliasProto(nestedClassifier)?.let { builder.addTypeAlias(it) } typeAliasProto(nestedClassifier)?.let { builder.addTypeAlias(it) }
@@ -218,13 +218,13 @@ class FirElementSerializer private constructor(
} }
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
private fun FirClass<*>.declarations(): List<FirCallableMemberDeclaration<*>> = buildList { private fun FirClass.declarations(): List<FirCallableMemberDeclaration> = buildList {
val memberScope = val memberScope =
defaultType().scope(session, scopeSession, FakeOverrideTypeCalculator.DoNothing) defaultType().scope(session, scopeSession, FakeOverrideTypeCalculator.DoNothing)
?: error("Null scope for $this") ?: error("Null scope for $this")
fun addDeclarationIfNeeded(symbol: FirCallableSymbol<*>) { fun addDeclarationIfNeeded(symbol: FirCallableSymbol<*>) {
val declaration = symbol.fir as? FirCallableMemberDeclaration<*> ?: return val declaration = symbol.fir as? FirCallableMemberDeclaration ?: return
if (declaration.isIntersectionOverride) { if (declaration.isIntersectionOverride) {
// This part is a kind of hack for case like // This part is a kind of hack for case like
// //
@@ -259,7 +259,7 @@ class FirElementSerializer private constructor(
memberScope.processAllProperties(::addDeclarationIfNeeded) memberScope.processAllProperties(::addDeclarationIfNeeded)
for (declaration in declarations) { for (declaration in declarations) {
if (declaration is FirCallableMemberDeclaration<*> && declaration.isStatic) { if (declaration is FirCallableMemberDeclaration && declaration.isStatic) {
add(declaration) add(declaration)
} }
} }
@@ -375,7 +375,7 @@ class FirElementSerializer private constructor(
return builder return builder
} }
fun functionProto(function: FirFunction<*>): ProtoBuf.Function.Builder? { fun functionProto(function: FirFunction): ProtoBuf.Function.Builder? {
if (!extension.shouldSerializeFunction(function)) return null if (!extension.shouldSerializeFunction(function)) return null
val builder = ProtoBuf.Function.newBuilder() val builder = ProtoBuf.Function.newBuilder()
@@ -822,7 +822,7 @@ class FirElementSerializer private constructor(
) )
} }
private fun createChildSerializer(declaration: FirDeclaration<*>): FirElementSerializer = private fun createChildSerializer(declaration: FirDeclaration): FirElementSerializer =
FirElementSerializer( FirElementSerializer(
session, scopeSession, declaration, Interner(typeParameters), extension, session, scopeSession, declaration, Interner(typeParameters), extension,
typeTable, versionRequirementTable, serializeTypeTableToFunction = false, typeTable, versionRequirementTable, serializeTypeTableToFunction = false,
@@ -834,18 +834,18 @@ class FirElementSerializer private constructor(
private fun useTypeTable(): Boolean = extension.shouldUseTypeTable() private fun useTypeTable(): Boolean = extension.shouldUseTypeTable()
private fun FirDeclaration<*>.hasInlineClassTypesInSignature(): Boolean { private fun FirDeclaration.hasInlineClassTypesInSignature(): Boolean {
// TODO // TODO
return false return false
} }
private fun FirCallableDeclaration<*>.isSuspendOrHasSuspendTypesInSignature(): Boolean { private fun FirCallableDeclaration.isSuspendOrHasSuspendTypesInSignature(): Boolean {
// TODO (types in signature) // TODO (types in signature)
return this is FirCallableMemberDeclaration<*> && this.isSuspend return this is FirCallableMemberDeclaration && this.isSuspend
} }
private fun writeVersionRequirementForInlineClasses( private fun writeVersionRequirementForInlineClasses(
klass: FirClass<*>, klass: FirClass,
builder: ProtoBuf.Class.Builder, builder: ProtoBuf.Class.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable
) { ) {
@@ -937,7 +937,7 @@ class FirElementSerializer private constructor(
return declaration.visibility.normalize() return declaration.visibility.normalize()
} }
private fun getClassifierId(declaration: FirClassLikeDeclaration<*>): Int = private fun getClassifierId(declaration: FirClassLikeDeclaration): Int =
stringTable.getFqNameIndex(declaration) stringTable.getFqNameIndex(declaration)
private fun getClassifierId(classId: ClassId): Int = private fun getClassifierId(classId: ClassId): Int =
@@ -982,7 +982,7 @@ class FirElementSerializer private constructor(
fun create( fun create(
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
klass: FirClass<*>, klass: FirClass,
extension: FirSerializerExtension, extension: FirSerializerExtension,
parentSerializer: FirElementSerializer?, parentSerializer: FirElementSerializer?,
typeApproximator: AbstractTypeApproximator, typeApproximator: AbstractTypeApproximator,
@@ -28,14 +28,14 @@ abstract class FirSerializerExtension {
open fun shouldSerializeTypeAlias(typeAlias: FirTypeAlias): Boolean = true open fun shouldSerializeTypeAlias(typeAlias: FirTypeAlias): Boolean = true
open fun shouldUseTypeTable(): Boolean = false open fun shouldUseTypeTable(): Boolean = false
open fun shouldUseNormalizedVisibility(): Boolean = false open fun shouldUseNormalizedVisibility(): Boolean = false
open fun shouldSerializeFunction(function: FirFunction<*>): Boolean = false open fun shouldSerializeFunction(function: FirFunction): Boolean = false
open fun shouldSerializeProperty(property: FirProperty): Boolean = false open fun shouldSerializeProperty(property: FirProperty): Boolean = false
open fun serializePackage(packageFqName: FqName, proto: ProtoBuf.Package.Builder) { open fun serializePackage(packageFqName: FqName, proto: ProtoBuf.Package.Builder) {
} }
open fun serializeClass( open fun serializeClass(
klass: FirClass<*>, klass: FirClass,
proto: ProtoBuf.Class.Builder, proto: ProtoBuf.Class.Builder,
versionRequirementTable: MutableVersionRequirementTable, versionRequirementTable: MutableVersionRequirementTable,
childSerializer: FirElementSerializer childSerializer: FirElementSerializer
@@ -50,7 +50,7 @@ abstract class FirSerializerExtension {
} }
open fun serializeFunction( open fun serializeFunction(
function: FirFunction<*>, function: FirFunction,
proto: ProtoBuf.Function.Builder, proto: ProtoBuf.Function.Builder,
versionRequirementTable: MutableVersionRequirementTable?, versionRequirementTable: MutableVersionRequirementTable?,
childSerializer: FirElementSerializer childSerializer: FirElementSerializer
@@ -91,7 +91,7 @@ abstract class FirSerializerExtension {
get() = null get() = null
interface ClassMembersProducer { interface ClassMembersProducer {
fun getCallableMembers(klass: FirClass<*>): Collection<FirCallableMemberDeclaration<*>> fun getCallableMembers(klass: FirClass): Collection<FirCallableMemberDeclaration>
} }
} }
@@ -21,7 +21,7 @@ class FirJvmElementAwareStringTable(
private val components: Fir2IrComponents, private val components: Fir2IrComponents,
nameResolver: JvmNameResolver? = null nameResolver: JvmNameResolver? = null
) : JvmStringTable(nameResolver), FirElementAwareStringTable { ) : JvmStringTable(nameResolver), FirElementAwareStringTable {
override fun getLocalClassIdReplacement(firClass: FirClass<*>): ClassId = override fun getLocalClassIdReplacement(firClass: FirClass): ClassId =
components.classifierStorage.getCachedIrClass(firClass)?.getLocalClassIdReplacement() components.classifierStorage.getCachedIrClass(firClass)?.getLocalClassIdReplacement()
?: throw AssertionError("not a local class: ${firClass.symbol.classId}") ?: throw AssertionError("not a local class: ${firClass.symbol.classId}")
@@ -12,28 +12,28 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.signaturer.FirMangler import org.jetbrains.kotlin.fir.signaturer.FirMangler
@NoMutableState @NoMutableState
class FirJvmKotlinMangler(private val session: FirSession) : AbstractKotlinMangler<FirDeclaration<*>>(), FirMangler { class FirJvmKotlinMangler(private val session: FirSession) : AbstractKotlinMangler<FirDeclaration>(), FirMangler {
override val FirDeclaration<*>.mangleString: String override val FirDeclaration.mangleString: String
get() = getMangleComputer(MangleMode.FULL).computeMangle(this) get() = getMangleComputer(MangleMode.FULL).computeMangle(this)
override val FirDeclaration<*>.signatureString: String override val FirDeclaration.signatureString: String
get() = getMangleComputer(MangleMode.SIGNATURE).computeMangle(this) get() = getMangleComputer(MangleMode.SIGNATURE).computeMangle(this)
override val FirDeclaration<*>.fqnString: String override val FirDeclaration.fqnString: String
get() = getMangleComputer(MangleMode.FQNAME).computeMangle(this) get() = getMangleComputer(MangleMode.FQNAME).computeMangle(this)
override fun FirDeclaration<*>.isExported(): Boolean = true override fun FirDeclaration.isExported(): Boolean = true
override fun getExportChecker(): KotlinExportChecker<FirDeclaration<*>> { override fun getExportChecker(): KotlinExportChecker<FirDeclaration> {
return object : KotlinExportChecker<FirDeclaration<*>> { return object : KotlinExportChecker<FirDeclaration> {
override fun check(declaration: FirDeclaration<*>, type: SpecialDeclarationType): Boolean = true override fun check(declaration: FirDeclaration, type: SpecialDeclarationType): Boolean = true
override fun FirDeclaration<*>.isPlatformSpecificExported(): Boolean = true override fun FirDeclaration.isPlatformSpecificExported(): Boolean = true
} }
} }
override fun getMangleComputer(mode: MangleMode): KotlinMangleComputer<FirDeclaration<*>> { override fun getMangleComputer(mode: MangleMode): KotlinMangleComputer<FirDeclaration> {
return FirJvmMangleComputer(StringBuilder(256), mode, session) return FirJvmMangleComputer(StringBuilder(256), mode, session)
} }
} }
@@ -31,20 +31,20 @@ open class FirJvmMangleComputer(
private val builder: StringBuilder, private val builder: StringBuilder,
private val mode: MangleMode, private val mode: MangleMode,
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<FirStatusOwner>(4)
private var isRealExpect = false private var isRealExpect = false
open fun FirFunction<*>.platformSpecificFunctionName(): String? = null open fun FirFunction.platformSpecificFunctionName(): String? = null
open fun FirFunction<*>.platformSpecificSuffix(): String? = open fun FirFunction.platformSpecificSuffix(): String? =
if (this is FirSimpleFunction && name.asString() == "main") if (this is FirSimpleFunction && name.asString() == "main")
this@FirJvmMangleComputer.session.firProvider.getFirCallableContainerFile(symbol)?.name this@FirJvmMangleComputer.session.firProvider.getFirCallableContainerFile(symbol)?.name
else null else null
open fun FirFunction<*>.specialValueParamPrefix(param: FirValueParameter): String = "" open fun FirFunction.specialValueParamPrefix(param: FirValueParameter): String = ""
private fun addReturnType(): Boolean = false private fun addReturnType(): Boolean = false
@@ -81,10 +81,10 @@ open class FirJvmMangleComputer(
} }
} }
private fun FirDeclaration<*>.visitParent() { private fun FirDeclaration.visitParent() {
val (parentPackageFqName, parentClassId) = when (this) { val (parentPackageFqName, parentClassId) = when (this) {
is FirCallableMemberDeclaration<*> -> this.containingClass()?.classId?.let { it.packageFqName to it } ?: return is FirCallableMemberDeclaration -> this.containingClass()?.classId?.let { it.packageFqName to it } ?: return
is FirClassLikeDeclaration<*> -> this.symbol.classId.let { it.packageFqName to it.outerClassId } is FirClassLikeDeclaration -> this.symbol.classId.let { it.packageFqName to it.outerClassId }
else -> return else -> return
} }
if (parentClassId != null && !parentClassId.isLocal) { if (parentClassId != null && !parentClassId.isLocal) {
@@ -100,7 +100,7 @@ open class FirJvmMangleComputer(
} }
} }
private fun FirDeclaration<*>.mangleSimpleDeclaration(name: String) { private fun FirDeclaration.mangleSimpleDeclaration(name: String) {
val l = builder.length val l = builder.length
visitParent() visitParent()
@@ -111,7 +111,7 @@ open class FirJvmMangleComputer(
builder.appendName(name) builder.appendName(name)
} }
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? FirStatusOwner)?.isExpect == true
@@ -138,7 +138,7 @@ open class FirJvmMangleComputer(
mangleSignature(isCtor, isStatic) mangleSignature(isCtor, isStatic)
} }
private fun FirFunction<*>.mangleSignature(isCtor: Boolean, isStatic: Boolean) { private fun FirFunction.mangleSignature(isCtor: Boolean, isStatic: Boolean) {
if (!mode.signature) { if (!mode.signature) {
return return
} }
@@ -171,7 +171,7 @@ open class FirJvmMangleComputer(
if (this in parent.typeParameters) { if (this in parent.typeParameters) {
return parent return parent
} }
if (parent is FirCallableDeclaration<*>) { if (parent is FirCallableDeclaration) {
val overriddenFir = parent.originalForSubstitutionOverride val overriddenFir = parent.originalForSubstitutionOverride
if (overriddenFir is FirTypeParametersOwner && this in overriddenFir.typeParameters) { if (overriddenFir is FirTypeParametersOwner && this in overriddenFir.typeParameters) {
return parent return parent
@@ -317,7 +317,7 @@ open class FirJvmMangleComputer(
override fun visitConstructor(constructor: FirConstructor, data: Boolean) = override fun visitConstructor(constructor: FirConstructor, data: Boolean) =
constructor.mangleFunction(isCtor = true, isStatic = false, constructor) constructor.mangleFunction(isCtor = true, isStatic = false, constructor)
override fun computeMangle(declaration: FirDeclaration<*>): String { override fun computeMangle(declaration: FirDeclaration): String {
declaration.accept(this, true) declaration.accept(this, true)
return builder.toString() return builder.toString()
} }
@@ -59,7 +59,7 @@ class FirJvmSerializerExtension(
private val jvmDefaultMode = state.jvmDefaultMode private val jvmDefaultMode = state.jvmDefaultMode
override fun shouldUseTypeTable(): Boolean = useTypeTable override fun shouldUseTypeTable(): Boolean = useTypeTable
override fun shouldSerializeFunction(function: FirFunction<*>): Boolean { override fun shouldSerializeFunction(function: FirFunction): Boolean {
return classBuilderMode != ClassBuilderMode.ABI || return classBuilderMode != ClassBuilderMode.ABI ||
function !is FirSimpleFunction || function.visibility != Visibilities.Private function !is FirSimpleFunction || function.visibility != Visibilities.Private
} }
@@ -77,7 +77,7 @@ class FirJvmSerializerExtension(
} }
override fun serializeClass( override fun serializeClass(
klass: FirClass<*>, klass: FirClass,
proto: ProtoBuf.Class.Builder, proto: ProtoBuf.Class.Builder,
versionRequirementTable: MutableVersionRequirementTable, versionRequirementTable: MutableVersionRequirementTable,
childSerializer: FirElementSerializer childSerializer: FirElementSerializer
@@ -103,7 +103,7 @@ class FirJvmSerializerExtension(
// Interfaces which have @JvmDefault members somewhere in the hierarchy need the compiler 1.2.40+ // Interfaces which have @JvmDefault members somewhere in the hierarchy need the compiler 1.2.40+
// so that the generated bridges in subclasses would call the super members correctly // so that the generated bridges in subclasses would call the super members correctly
private fun writeVersionRequirementForJvmDefaultIfNeeded( private fun writeVersionRequirementForJvmDefaultIfNeeded(
klass: FirClass<*>, klass: FirClass,
builder: ProtoBuf.Class.Builder, builder: ProtoBuf.Class.Builder,
versionRequirementTable: MutableVersionRequirementTable versionRequirementTable: MutableVersionRequirementTable
) { ) {
@@ -182,7 +182,7 @@ class FirJvmSerializerExtension(
} }
override fun serializeFunction( override fun serializeFunction(
function: FirFunction<*>, function: FirFunction,
proto: ProtoBuf.Function.Builder, proto: ProtoBuf.Function.Builder,
versionRequirementTable: MutableVersionRequirementTable?, versionRequirementTable: MutableVersionRequirementTable?,
childSerializer: FirElementSerializer childSerializer: FirElementSerializer
@@ -208,7 +208,7 @@ class FirJvmSerializerExtension(
} }
} }
private fun FirFunction<*>.needsInlineParameterNullCheckRequirement(): Boolean = private fun FirFunction.needsInlineParameterNullCheckRequirement(): Boolean =
this is FirSimpleFunction && isInline && !isSuspend && !isParamAssertionsDisabled && this is FirSimpleFunction && isInline && !isSuspend && !isParamAssertionsDisabled &&
!Visibilities.isPrivate(visibility) && !Visibilities.isPrivate(visibility) &&
(valueParameters.any { it.returnTypeRef.coneType.isBuiltinFunctionalType(session) } || (valueParameters.any { it.returnTypeRef.coneType.isBuiltinFunctionalType(session) } ||
@@ -284,7 +284,7 @@ class FirJvmSerializerExtension(
bindings.get(slice, key) ?: globalBindings.get(slice, key) bindings.get(slice, key) ?: globalBindings.get(slice, key)
private inner class SignatureSerializer { private inner class SignatureSerializer {
fun methodSignature(function: FirFunction<*>?, method: Method): JvmProtoBuf.JvmMethodSignature? { fun methodSignature(function: FirFunction?, method: Method): JvmProtoBuf.JvmMethodSignature? {
val builder = JvmProtoBuf.JvmMethodSignature.newBuilder() val builder = JvmProtoBuf.JvmMethodSignature.newBuilder()
if (function == null || (function as? FirSimpleFunction)?.name?.asString() != method.name) { if (function == null || (function as? FirSimpleFunction)?.name?.asString() != method.name) {
builder.name = stringTable.getStringIndex(method.name) builder.name = stringTable.getStringIndex(method.name)
@@ -297,7 +297,7 @@ class FirJvmSerializerExtension(
// We don't write those signatures which can be trivially reconstructed from already serialized data // We don't write those signatures which can be trivially reconstructed from already serialized data
// TODO: make JvmStringTable implement NameResolver and use JvmProtoBufUtil#getJvmMethodSignature instead // TODO: make JvmStringTable implement NameResolver and use JvmProtoBufUtil#getJvmMethodSignature instead
private fun requiresSignature(function: FirFunction<*>, desc: String): Boolean { private fun requiresSignature(function: FirFunction, desc: String): Boolean {
val sb = StringBuilder() val sb = StringBuilder()
sb.append("(") sb.append("(")
val receiverTypeRef = function.receiverTypeRef val receiverTypeRef = function.receiverTypeRef
@@ -375,9 +375,9 @@ class FirJvmSerializerExtension(
} }
companion object { companion object {
val METHOD_FOR_FIR_FUNCTION = JvmSerializationBindings.SerializationMappingSlice.create<FirFunction<*>, Method>() val METHOD_FOR_FIR_FUNCTION = JvmSerializationBindings.SerializationMappingSlice.create<FirFunction, Method>()
val FIELD_FOR_PROPERTY = JvmSerializationBindings.SerializationMappingSlice.create<FirProperty, Pair<Type, String>>() val FIELD_FOR_PROPERTY = JvmSerializationBindings.SerializationMappingSlice.create<FirProperty, Pair<Type, String>>()
val SYNTHETIC_METHOD_FOR_FIR_VARIABLE = JvmSerializationBindings.SerializationMappingSlice.create<FirVariable<*>, Method>() val SYNTHETIC_METHOD_FOR_FIR_VARIABLE = JvmSerializationBindings.SerializationMappingSlice.create<FirVariable, Method>()
} }
} }
@@ -75,7 +75,7 @@ class FirMetadataSerializer(
} }
} }
private fun FirFunction<*>.copyToFreeAnonymousFunction(): FirAnonymousFunction { private fun FirFunction.copyToFreeAnonymousFunction(): FirAnonymousFunction {
val function = this val function = this
return buildAnonymousFunction { return buildAnonymousFunction {
val typeParameterSet = function.typeParameters.filterIsInstanceTo(mutableSetOf<FirTypeParameter>()) val typeParameterSet = function.typeParameters.filterIsInstanceTo(mutableSetOf<FirTypeParameter>())
@@ -30,10 +30,12 @@ import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertySymbol import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertySymbol
import org.jetbrains.kotlin.fir.resolve.calls.originalConstructorIfTypeAlias import org.jetbrains.kotlin.fir.resolve.calls.originalConstructorIfTypeAlias
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.AccessorSymbol import org.jetbrains.kotlin.fir.symbols.AccessorSymbol
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
@@ -293,7 +295,7 @@ internal tailrec fun FirCallableSymbol<*>.unwrapCallRepresentative(root: FirCall
} }
internal fun FirSimpleFunction.generateOverriddenFunctionSymbols( internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(
containingClass: FirClass<*>, containingClass: FirClass,
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
declarationStorage: Fir2IrDeclarationStorage, declarationStorage: Fir2IrDeclarationStorage,
@@ -321,7 +323,7 @@ internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(
fun FirTypeScope.processOverriddenFunctionsFromSuperClasses( fun FirTypeScope.processOverriddenFunctionsFromSuperClasses(
functionSymbol: FirNamedFunctionSymbol, functionSymbol: FirNamedFunctionSymbol,
containingClass: FirClass<*>, containingClass: FirClass,
processor: (FirNamedFunctionSymbol) -> ProcessorAction processor: (FirNamedFunctionSymbol) -> ProcessorAction
): ProcessorAction = processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { overridden, baseScope -> ): ProcessorAction = processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { overridden, baseScope ->
val unwrapped = val unwrapped =
@@ -337,7 +339,7 @@ fun FirTypeScope.processOverriddenFunctionsFromSuperClasses(
fun FirTypeScope.processOverriddenPropertiesFromSuperClasses( fun FirTypeScope.processOverriddenPropertiesFromSuperClasses(
propertySymbol: FirPropertySymbol, propertySymbol: FirPropertySymbol,
containingClass: FirClass<*>, containingClass: FirClass,
processor: (FirPropertySymbol) -> ProcessorAction processor: (FirPropertySymbol) -> ProcessorAction
): ProcessorAction = processDirectOverriddenPropertiesWithBaseScope(propertySymbol) { overridden, baseScope -> ): ProcessorAction = processDirectOverriddenPropertiesWithBaseScope(propertySymbol) { overridden, baseScope ->
if (overridden.containingClass() == containingClass.symbol.toLookupTag()) { if (overridden.containingClass() == containingClass.symbol.toLookupTag()) {
@@ -347,7 +349,7 @@ fun FirTypeScope.processOverriddenPropertiesFromSuperClasses(
} }
} }
private fun FirClass<*>.getSuperTypesAsIrClasses( private fun FirClass.getSuperTypesAsIrClasses(
declarationStorage: Fir2IrDeclarationStorage declarationStorage: Fir2IrDeclarationStorage
): Set<IrClass>? { ): Set<IrClass>? {
val irClass = val irClass =
@@ -357,7 +359,7 @@ private fun FirClass<*>.getSuperTypesAsIrClasses(
} }
internal fun FirProperty.generateOverriddenPropertySymbols( internal fun FirProperty.generateOverriddenPropertySymbols(
containingClass: FirClass<*>, containingClass: FirClass,
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
declarationStorage: Fir2IrDeclarationStorage, declarationStorage: Fir2IrDeclarationStorage,
@@ -384,7 +386,7 @@ internal fun FirProperty.generateOverriddenPropertySymbols(
} }
internal fun FirProperty.generateOverriddenAccessorSymbols( internal fun FirProperty.generateOverriddenAccessorSymbols(
containingClass: FirClass<*>, containingClass: FirClass,
isGetter: Boolean, isGetter: Boolean,
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
@@ -463,7 +465,7 @@ internal fun IrDeclarationParent.declareThisReceiverParameter(
this.parent = this@declareThisReceiverParameter this.parent = this@declareThisReceiverParameter
} }
fun FirClass<*>.irOrigin(firProvider: FirProvider): IrDeclarationOrigin = when { fun FirClass.irOrigin(firProvider: FirProvider): IrDeclarationOrigin = when {
firProvider.getFirClassifierContainerFileIfAny(symbol) != null -> IrDeclarationOrigin.DEFINED firProvider.getFirClassifierContainerFileIfAny(symbol) != null -> IrDeclarationOrigin.DEFINED
isJava -> IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB isJava -> IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
else -> IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB else -> IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
@@ -16,7 +16,10 @@ import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass
import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.fir.resolve.symbolProvider
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.* import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
import org.jetbrains.kotlin.fir.symbols.Fir2IrEnumEntrySymbol
import org.jetbrains.kotlin.fir.symbols.Fir2IrTypeAliasSymbol
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
@@ -118,14 +121,14 @@ class Fir2IrClassifierStorage(
} }
} }
private fun IrClass.declareTypeParameters(klass: FirClass<*>) { private fun IrClass.declareTypeParameters(klass: FirClass) {
if (klass is FirRegularClass) { if (klass is FirRegularClass) {
preCacheTypeParameters(klass) preCacheTypeParameters(klass)
setTypeParameters(klass) setTypeParameters(klass)
} }
} }
private fun IrClass.declareSupertypes(klass: FirClass<*>) { private fun IrClass.declareSupertypes(klass: FirClass) {
superTypes = klass.superTypeRefs.map { superTypeRef -> superTypeRef.toIrType() } superTypes = klass.superTypeRefs.map { superTypeRef -> superTypeRef.toIrType() }
} }
@@ -133,13 +136,13 @@ class Fir2IrClassifierStorage(
inlineClassRepresentation = computeInlineClassRepresentation(klass) inlineClassRepresentation = computeInlineClassRepresentation(klass)
} }
private fun IrClass.declareSupertypesAndTypeParameters(klass: FirClass<*>): IrClass { private fun IrClass.declareSupertypesAndTypeParameters(klass: FirClass): IrClass {
declareTypeParameters(klass) declareTypeParameters(klass)
declareSupertypes(klass) declareSupertypes(klass)
return this return this
} }
fun getCachedIrClass(klass: FirClass<*>): IrClass? { fun getCachedIrClass(klass: FirClass): IrClass? {
return if (klass is FirAnonymousObject || klass is FirRegularClass && klass.visibility == Visibilities.Local) { return if (klass is FirAnonymousObject || klass is FirRegularClass && klass.visibility == Visibilities.Local) {
localStorage.getLocalClass(klass) localStorage.getLocalClass(klass)
} else { } else {
@@ -148,12 +151,12 @@ class Fir2IrClassifierStorage(
} }
internal fun getCachedLocalClass(lookupTag: ConeClassLikeLookupTag): IrClass? { internal fun getCachedLocalClass(lookupTag: ConeClassLikeLookupTag): IrClass? {
return localStorage.getLocalClass(lookupTag.toSymbol(session)!!.fir as FirClass<*>) return localStorage.getLocalClass(lookupTag.toSymbol(session)!!.fir as FirClass)
} }
private fun FirRegularClass.enumClassModality(): Modality { private fun FirRegularClass.enumClassModality(): Modality {
return when { return when {
declarations.any { it is FirCallableMemberDeclaration<*> && it.modality == Modality.ABSTRACT } -> { declarations.any { it is FirCallableMemberDeclaration && it.modality == Modality.ABSTRACT } -> {
Modality.ABSTRACT Modality.ABSTRACT
} }
declarations.any { it is FirEnumEntry && it.initializer != null } -> { declarations.any { it is FirEnumEntry && it.initializer != null } -> {
@@ -165,7 +168,7 @@ class Fir2IrClassifierStorage(
} }
} }
private fun createIrClass(klass: FirClass<*>, parent: IrDeclarationParent? = null): IrClass { private fun createIrClass(klass: FirClass, parent: IrDeclarationParent? = null): IrClass {
// NB: klass can be either FirRegularClass or FirAnonymousObject // NB: klass can be either FirRegularClass or FirAnonymousObject
if (klass is FirAnonymousObject) { if (klass is FirAnonymousObject) {
return createIrAnonymousObject(klass, irParent = parent) return createIrAnonymousObject(klass, irParent = parent)
@@ -5,7 +5,10 @@
package org.jetbrains.kotlin.fir.backend package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.util.parentClassOrNull import org.jetbrains.kotlin.ir.util.parentClassOrNull
@@ -13,7 +16,7 @@ import org.jetbrains.kotlin.ir.util.parentClassOrNull
class Fir2IrConversionScope { class Fir2IrConversionScope {
private val parentStack = mutableListOf<IrDeclarationParent>() private val parentStack = mutableListOf<IrDeclarationParent>()
private val containingFirClassStack = mutableListOf<FirClass<*>>() private val containingFirClassStack = mutableListOf<FirClass>()
fun <T : IrDeclarationParent?> withParent(parent: T, f: T.() -> Unit): T { fun <T : IrDeclarationParent?> withParent(parent: T, f: T.() -> Unit): T {
if (parent == null) return parent if (parent == null) return parent
@@ -25,7 +28,7 @@ class Fir2IrConversionScope {
fun containingFileIfAny(): IrFile? = parentStack.getOrNull(0) as? IrFile fun containingFileIfAny(): IrFile? = parentStack.getOrNull(0) as? IrFile
fun withContainingFirClass(containingFirClass: FirClass<*>, f: () -> Unit) { fun withContainingFirClass(containingFirClass: FirClass, f: () -> Unit) {
containingFirClassStack += containingFirClass containingFirClassStack += containingFirClass
f() f()
containingFirClassStack.removeAt(containingFirClassStack.size - 1) containingFirClassStack.removeAt(containingFirClassStack.size - 1)
@@ -48,7 +51,7 @@ class Fir2IrConversionScope {
return declaration return declaration
} }
fun containerFirClass(): FirClass<*>? = containingFirClassStack.lastOrNull() fun containerFirClass(): FirClass? = containingFirClassStack.lastOrNull()
private val functionStack = mutableListOf<IrFunction>() private val functionStack = mutableListOf<IrFunction>()
@@ -164,7 +164,7 @@ class Fir2IrConverter(
return irClass return irClass
} }
private fun delegatedMembers(irClass: IrClass): List<FirDeclaration<*>> { private fun delegatedMembers(irClass: IrClass): List<FirDeclaration> {
return irClass.declarations.filter { return irClass.declarations.filter {
it.origin == IrDeclarationOrigin.DELEGATED_MEMBER it.origin == IrDeclarationOrigin.DELEGATED_MEMBER
}.mapNotNull { }.mapNotNull {
@@ -175,7 +175,7 @@ class Fir2IrConverter(
// Sort declarations so that all non-synthetic declarations are before synthetic ones. // Sort declarations so that all non-synthetic declarations are before synthetic ones.
// This is needed because converting synthetic fields for implementation delegation needs to know // This is needed because converting synthetic fields for implementation delegation needs to know
// existing declarations in the class to avoid adding redundant delegated members. // existing declarations in the class to avoid adding redundant delegated members.
private fun syntheticPropertiesLast(declarations: List<FirDeclaration<*>>): Iterable<FirDeclaration<*>> { private fun syntheticPropertiesLast(declarations: List<FirDeclaration>): Iterable<FirDeclaration> {
return declarations.sortedBy { it !is FirField && it.isSynthetic } return declarations.sortedBy { it !is FirField && it.isSynthetic }
} }
@@ -199,8 +199,8 @@ class Fir2IrConverter(
} }
private fun processMemberDeclaration( private fun processMemberDeclaration(
declaration: FirDeclaration<*>, declaration: FirDeclaration,
containingClass: FirClass<*>?, containingClass: FirClass?,
parent: IrDeclarationParent parent: IrDeclarationParent
): IrDeclaration? { ): IrDeclaration? {
val isLocal = containingClass != null && val isLocal = containingClass != null &&
@@ -70,7 +70,7 @@ class Fir2IrDeclarationStorage(
private val fileCache = ConcurrentHashMap<FirFile, IrFile>() private val fileCache = ConcurrentHashMap<FirFile, IrFile>()
private val functionCache = ConcurrentHashMap<FirFunction<*>, IrSimpleFunction>() private val functionCache = ConcurrentHashMap<FirFunction, IrSimpleFunction>()
private val constructorCache = ConcurrentHashMap<FirConstructor, IrConstructor>() private val constructorCache = ConcurrentHashMap<FirConstructor, IrConstructor>()
@@ -93,12 +93,12 @@ class Fir2IrDeclarationStorage(
// so remember that in class B there's a fake override $2 for real $1. // so remember that in class B there's a fake override $2 for real $1.
// //
// Thus we may obtain it by fakeOverridesInClass[ir(B)][fir(A::foo)] -> fir(B::foo) // Thus we may obtain it by fakeOverridesInClass[ir(B)][fir(A::foo)] -> fir(B::foo)
private val fakeOverridesInClass = mutableMapOf<IrClass, MutableMap<FirCallableDeclaration<*>, FirCallableDeclaration<*>>>() private val fakeOverridesInClass = mutableMapOf<IrClass, MutableMap<FirCallableDeclaration, FirCallableDeclaration>>()
// For pure fields (from Java) only // For pure fields (from Java) only
private val fieldToPropertyCache = ConcurrentHashMap<Pair<FirField, IrDeclarationParent>, IrProperty>() private val fieldToPropertyCache = ConcurrentHashMap<Pair<FirField, IrDeclarationParent>, IrProperty>()
private val delegatedReverseCache = ConcurrentHashMap<IrDeclaration, FirDeclaration<*>>() private val delegatedReverseCache = ConcurrentHashMap<IrDeclaration, FirDeclaration>()
private val fieldCache = ConcurrentHashMap<FirField, IrField>() private val fieldCache = ConcurrentHashMap<FirField, IrField>()
@@ -106,7 +106,7 @@ class Fir2IrDeclarationStorage(
private val delegatedMemberGenerator = DelegatedMemberGenerator(components) private val delegatedMemberGenerator = DelegatedMemberGenerator(components)
private fun areCompatible(firFunction: FirFunction<*>, irFunction: IrFunction): Boolean { private fun areCompatible(firFunction: FirFunction, irFunction: IrFunction): Boolean {
if (firFunction is FirSimpleFunction && irFunction is IrSimpleFunction) { if (firFunction is FirSimpleFunction && irFunction is IrSimpleFunction) {
if (irFunction.name != firFunction.name) return false if (irFunction.name != firFunction.name) return false
} }
@@ -253,7 +253,7 @@ class Fir2IrDeclarationStorage(
} }
} }
internal fun findIrParent(callableDeclaration: FirCallableDeclaration<*>): IrDeclarationParent? { internal fun findIrParent(callableDeclaration: FirCallableDeclaration): IrDeclarationParent? {
val firBasedSymbol = callableDeclaration.symbol val firBasedSymbol = callableDeclaration.symbol
val callableId = firBasedSymbol.callableId val callableId = firBasedSymbol.callableId
return findIrParent(callableId.packageName, callableDeclaration.containingClass(), firBasedSymbol) return findIrParent(callableId.packageName, callableDeclaration.containingClass(), firBasedSymbol)
@@ -295,7 +295,7 @@ class Fir2IrDeclarationStorage(
} }
private fun <T : IrFunction> T.declareParameters( private fun <T : IrFunction> T.declareParameters(
function: FirFunction<*>?, function: FirFunction?,
containingClass: IrClass?, containingClass: IrClass?,
isStatic: Boolean, isStatic: Boolean,
// Can be not-null only for property accessors // Can be not-null only for property accessors
@@ -368,7 +368,7 @@ class Fir2IrDeclarationStorage(
} }
private fun <T : IrFunction> T.bindAndDeclareParameters( private fun <T : IrFunction> T.bindAndDeclareParameters(
function: FirFunction<*>?, function: FirFunction?,
irParent: IrDeclarationParent?, irParent: IrDeclarationParent?,
thisReceiverOwner: IrClass? = irParent as? IrClass, thisReceiverOwner: IrClass? = irParent as? IrClass,
isStatic: Boolean, isStatic: Boolean,
@@ -379,14 +379,14 @@ class Fir2IrDeclarationStorage(
return this return this
} }
fun <T : IrFunction> T.putParametersInScope(function: FirFunction<*>): T { fun <T : IrFunction> T.putParametersInScope(function: FirFunction): T {
for ((firParameter, irParameter) in function.valueParameters.zip(valueParameters)) { for ((firParameter, irParameter) in function.valueParameters.zip(valueParameters)) {
localStorage.putParameter(firParameter, irParameter) localStorage.putParameter(firParameter, irParameter)
} }
return this return this
} }
fun getCachedIrFunction(function: FirFunction<*>): IrSimpleFunction? = fun getCachedIrFunction(function: FirFunction): IrSimpleFunction? =
if (function is FirSimpleFunction) getCachedIrFunction(function) if (function is FirSimpleFunction) getCachedIrFunction(function)
else localStorage.getLocalFunction(function) else localStorage.getLocalFunction(function)
@@ -412,7 +412,7 @@ class Fir2IrDeclarationStorage(
delegatedReverseCache[irFunction] = function delegatedReverseCache[irFunction] = function
} }
fun originalDeclarationForDelegated(irDeclaration: IrDeclaration): FirDeclaration<*>? = delegatedReverseCache[irDeclaration] fun originalDeclarationForDelegated(irDeclaration: IrDeclaration): FirDeclaration? = delegatedReverseCache[irDeclaration]
internal fun declareIrSimpleFunction( internal fun declareIrSimpleFunction(
signature: IdSignature?, signature: IdSignature?,
@@ -435,7 +435,7 @@ class Fir2IrDeclarationStorage(
} }
fun createIrFunction( fun createIrFunction(
function: FirFunction<*>, function: FirFunction,
irParent: IrDeclarationParent?, irParent: IrDeclarationParent?,
thisReceiverOwner: IrClass? = irParent as? IrClass, thisReceiverOwner: IrClass? = irParent as? IrClass,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED, origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
@@ -867,16 +867,16 @@ class Fir2IrDeclarationStorage(
internal fun saveFakeOverrideInClass( internal fun saveFakeOverrideInClass(
irClass: IrClass, irClass: IrClass,
originalDeclaration: FirCallableDeclaration<*>, originalDeclaration: FirCallableDeclaration,
fakeOverride: FirCallableDeclaration<*> fakeOverride: FirCallableDeclaration
) { ) {
fakeOverridesInClass.getOrPut(irClass, ::mutableMapOf)[originalDeclaration] = fakeOverride fakeOverridesInClass.getOrPut(irClass, ::mutableMapOf)[originalDeclaration] = fakeOverride
} }
fun getFakeOverrideInClass( fun getFakeOverrideInClass(
irClass: IrClass, irClass: IrClass,
callableDeclaration: FirCallableDeclaration<*> callableDeclaration: FirCallableDeclaration
): FirCallableDeclaration<*>? { ): FirCallableDeclaration? {
if (irClass is Fir2IrLazyClass) { if (irClass is Fir2IrLazyClass) {
irClass.getFakeOverridesByName(callableDeclaration.symbol.callableId.callableName) irClass.getFakeOverridesByName(callableDeclaration.symbol.callableId.callableName)
} }
@@ -885,7 +885,7 @@ class Fir2IrDeclarationStorage(
fun getCachedIrField(field: FirField): IrField? = fieldCache[field] fun getCachedIrField(field: FirField): IrField? = fieldCache[field]
fun createIrFieldAndDelegatedMembers(field: FirField, owner: FirClass<*>, irClass: IrClass): IrField { fun createIrFieldAndDelegatedMembers(field: FirField, owner: FirClass, irClass: IrClass): IrField {
val irField = createIrField(field, origin = IrDeclarationOrigin.DELEGATE) val irField = createIrField(field, origin = IrDeclarationOrigin.DELEGATE)
irField.setAndModifyParent(irClass) irField.setAndModifyParent(irClass)
delegatedMemberGenerator.generate(irField, field, owner, irClass) delegatedMemberGenerator.generate(irField, field, owner, irClass)
@@ -968,7 +968,7 @@ class Fir2IrDeclarationStorage(
) )
fun createIrVariable( fun createIrVariable(
variable: FirVariable<*>, variable: FirVariable,
irParent: IrDeclarationParent, irParent: IrDeclarationParent,
givenOrigin: IrDeclarationOrigin? = null givenOrigin: IrDeclarationOrigin? = null
): IrVariable = convertCatching(variable) { ): IrVariable = convertCatching(variable) {
@@ -1145,7 +1145,7 @@ class Fir2IrDeclarationStorage(
private inline fun < private inline fun <
reified FS : FirCallableSymbol<*>, reified FS : FirCallableSymbol<*>,
reified F : FirCallableDeclaration<*>, reified F : FirCallableDeclaration,
I : IrSymbolOwner, I : IrSymbolOwner,
> getIrCallableSymbol( > getIrCallableSymbol(
firSymbol: FS, firSymbol: FS,
@@ -1235,7 +1235,7 @@ class Fir2IrDeclarationStorage(
} }
} }
private fun getIrVariableSymbol(firVariable: FirVariable<*>): IrVariableSymbol { private fun getIrVariableSymbol(firVariable: FirVariable): IrVariableSymbol {
return localStorage.getVariable(firVariable)?.symbol return localStorage.getVariable(firVariable)?.symbol
?: run { ?: run {
throw IllegalArgumentException("Cannot find variable ${firVariable.render()} in local storage") throw IllegalArgumentException("Cannot find variable ${firVariable.render()} in local storage")
@@ -1267,8 +1267,8 @@ class Fir2IrDeclarationStorage(
} }
private fun IrMutableAnnotationContainer.convertAnnotationsFromLibrary(firAnnotationContainer: FirAnnotationContainer) { private fun IrMutableAnnotationContainer.convertAnnotationsFromLibrary(firAnnotationContainer: FirAnnotationContainer) {
if ((firAnnotationContainer as? FirDeclaration<*>)?.isFromLibrary == true || if ((firAnnotationContainer as? FirDeclaration)?.isFromLibrary == true ||
(firAnnotationContainer is FirCallableMemberDeclaration<*> && firAnnotationContainer.isSubstitutionOrIntersectionOverride) (firAnnotationContainer is FirCallableMemberDeclaration && firAnnotationContainer.isSubstitutionOrIntersectionOverride)
) { ) {
annotationGenerator.generate(this, firAnnotationContainer) annotationGenerator.generate(this, firAnnotationContainer)
} }
@@ -6,8 +6,6 @@
package org.jetbrains.kotlin.fir.backend package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
@@ -28,7 +26,6 @@ import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.classId import org.jetbrains.kotlin.ir.util.classId
import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.AbstractTypeChecker
import org.jetbrains.kotlin.types.SmartcastStability
class Fir2IrImplicitCastInserter( class Fir2IrImplicitCastInserter(
private val components: Fir2IrComponents private val components: Fir2IrComponents
@@ -295,7 +292,7 @@ class Fir2IrImplicitCastInserter(
): IrExpression { ): IrExpression {
val referencedDeclaration = val referencedDeclaration =
((calleeReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirCallableSymbol<*>)?.unwrapCallRepresentative() ((calleeReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirCallableSymbol<*>)?.unwrapCallRepresentative()
?.fir as? FirCallableMemberDeclaration<*> ?.fir as? FirCallableMemberDeclaration
val dispatchReceiverType = val dispatchReceiverType =
referencedDeclaration?.dispatchReceiverType as? ConeClassLikeType referencedDeclaration?.dispatchReceiverType as? ConeClassLikeType
@@ -7,13 +7,12 @@ package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.name.ClassId
class Fir2IrLocalStorage { class Fir2IrLocalStorage {
private val cacheStack = mutableListOf<Fir2IrScopeCache>() private val cacheStack = mutableListOf<Fir2IrScopeCache>()
private val localClassCache = mutableMapOf<FirClass<*>, IrClass>() private val localClassCache = mutableMapOf<FirClass, IrClass>()
fun enterCallable() { fun enterCallable() {
cacheStack += Fir2IrScopeCache() cacheStack += Fir2IrScopeCache()
@@ -32,14 +31,14 @@ class Fir2IrLocalStorage {
return null return null
} }
fun getVariable(variable: FirVariable<*>): IrVariable? = fun getVariable(variable: FirVariable): IrVariable? =
last { getVariable(variable) } last { getVariable(variable) }
fun getLocalClass(localClass: FirClass<*>): IrClass? { fun getLocalClass(localClass: FirClass): IrClass? {
return localClassCache[localClass] return localClassCache[localClass]
} }
fun getLocalFunction(localFunction: FirFunction<*>): IrSimpleFunction? = fun getLocalFunction(localFunction: FirFunction): IrSimpleFunction? =
last { getLocalFunction(localFunction) } last { getLocalFunction(localFunction) }
fun getDelegatedProperty(property: FirProperty): IrLocalDelegatedProperty? = fun getDelegatedProperty(property: FirProperty): IrLocalDelegatedProperty? =
@@ -56,15 +55,15 @@ class Fir2IrLocalStorage {
cacheStack.last().putParameter(firParameter, irParameter) cacheStack.last().putParameter(firParameter, irParameter)
} }
fun putVariable(firVariable: FirVariable<*>, irVariable: IrVariable) { fun putVariable(firVariable: FirVariable, irVariable: IrVariable) {
cacheStack.last().putVariable(firVariable, irVariable) cacheStack.last().putVariable(firVariable, irVariable)
} }
fun putLocalClass(firClass: FirClass<*>, irClass: IrClass) { fun putLocalClass(firClass: FirClass, irClass: IrClass) {
localClassCache[firClass] = irClass localClassCache[firClass] = irClass
} }
fun putLocalFunction(firFunction: FirFunction<*>, irFunction: IrSimpleFunction) { fun putLocalFunction(firFunction: FirFunction, irFunction: IrSimpleFunction) {
cacheStack.last().putLocalFunction(firFunction, irFunction) cacheStack.last().putLocalFunction(firFunction, irFunction)
} }
@@ -16,9 +16,9 @@ import org.jetbrains.kotlin.ir.declarations.IrVariable
class Fir2IrScopeCache { class Fir2IrScopeCache {
private val parameterCache = mutableMapOf<FirValueParameter, IrValueParameter>() private val parameterCache = mutableMapOf<FirValueParameter, IrValueParameter>()
private val variableCache = mutableMapOf<FirVariable<*>, IrVariable>() private val variableCache = mutableMapOf<FirVariable, IrVariable>()
private val localFunctionCache = mutableMapOf<FirFunction<*>, IrSimpleFunction>() private val localFunctionCache = mutableMapOf<FirFunction, IrSimpleFunction>()
private val delegatedPropertyCache = mutableMapOf<FirProperty, IrLocalDelegatedProperty>() private val delegatedPropertyCache = mutableMapOf<FirProperty, IrLocalDelegatedProperty>()
@@ -28,15 +28,15 @@ class Fir2IrScopeCache {
parameterCache[firParameter] = irParameter parameterCache[firParameter] = irParameter
} }
fun getVariable(variable: FirVariable<*>): IrVariable? = variableCache[variable] fun getVariable(variable: FirVariable): IrVariable? = variableCache[variable]
fun putVariable(firVariable: FirVariable<*>, irVariable: IrVariable) { fun putVariable(firVariable: FirVariable, irVariable: IrVariable) {
variableCache[firVariable] = irVariable variableCache[firVariable] = irVariable
} }
fun getLocalFunction(localFunction: FirFunction<*>): IrSimpleFunction? = localFunctionCache[localFunction] fun getLocalFunction(localFunction: FirFunction): IrSimpleFunction? = localFunctionCache[localFunction]
fun putLocalFunction(localFunction: FirFunction<*>, irFunction: IrSimpleFunction) { fun putLocalFunction(localFunction: FirFunction, irFunction: IrSimpleFunction) {
require(localFunction !is FirSimpleFunction || localFunction.visibility == Visibilities.Local) require(localFunction !is FirSimpleFunction || localFunction.visibility == Visibilities.Local)
localFunctionCache[localFunction] = irFunction localFunctionCache[localFunction] = irFunction
} }
@@ -11,6 +11,6 @@ import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignature
interface Fir2IrSignatureComposer { interface Fir2IrSignatureComposer {
fun composeSignature(declaration: FirDeclaration<*>, containingClass: ConeClassLikeLookupTag? = null): IdSignature? fun composeSignature(declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag? = null): IdSignature?
fun composeAccessorSignature(property: FirProperty, isSetter: Boolean, containingClass: ConeClassLikeLookupTag? = null): IdSignature? fun composeAccessorSignature(property: FirProperty, isSetter: Boolean, containingClass: ConeClassLikeLookupTag? = null): IdSignature?
} }
@@ -90,7 +90,7 @@ class Fir2IrVisitor(
} }
} }
private fun FirDeclaration<*>.toIrDeclaration(): IrDeclaration = private fun FirDeclaration.toIrDeclaration(): IrDeclaration =
accept(this@Fir2IrVisitor, null) as IrDeclaration accept(this@Fir2IrVisitor, null) as IrDeclaration
// ================================================================================== // ==================================================================================
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
sealed class FirMetadataSource : MetadataSource { sealed class FirMetadataSource : MetadataSource {
abstract val fir: FirDeclaration<*> abstract val fir: FirDeclaration
val declarationSiteSession: FirSession val declarationSiteSession: FirSession
get() = fir.moduleData.session get() = fir.moduleData.session
@@ -28,9 +28,9 @@ sealed class FirMetadataSource : MetadataSource {
class File(override val fir: FirFile) : FirMetadataSource(), MetadataSource.File class File(override val fir: FirFile) : FirMetadataSource(), MetadataSource.File
class Class(override val fir: FirClass<*>) : FirMetadataSource(), MetadataSource.Class class Class(override val fir: FirClass) : FirMetadataSource(), MetadataSource.Class
class Function(override val fir: FirFunction<*>) : FirMetadataSource(), MetadataSource.Function class Function(override val fir: FirFunction) : FirMetadataSource(), MetadataSource.Function
class Property(override val fir: FirProperty) : FirMetadataSource(), MetadataSource.Property { class Property(override val fir: FirProperty) : FirMetadataSource(), MetadataSource.Property {
override val isConst: Boolean get() = fir.isConst override val isConst: Boolean get() = fir.isConst
@@ -11,7 +11,9 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.Fir2IrConversionScope 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.* import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirStatusOwner
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.*
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
@@ -170,7 +172,7 @@ internal class AdapterGenerator(
callableReferenceAccess: FirCallableReferenceAccess, callableReferenceAccess: FirCallableReferenceAccess,
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
firAdaptee: FirFunction<*>, firAdaptee: FirFunction,
adaptee: IrFunction, adaptee: IrFunction,
type: IrSimpleType, type: IrSimpleType,
boundDispatchReceiver: IrExpression?, boundDispatchReceiver: IrExpression?,
@@ -260,7 +262,7 @@ internal class AdapterGenerator(
private fun createAdapteeCallForCallableReference( private fun createAdapteeCallForCallableReference(
callableReferenceAccess: FirCallableReferenceAccess, callableReferenceAccess: FirCallableReferenceAccess,
firAdaptee: FirFunction<*>, firAdaptee: FirFunction,
adapteeSymbol: IrFunctionSymbol, adapteeSymbol: IrFunctionSymbol,
adapterFunction: IrFunction, adapterFunction: IrFunction,
boundDispatchReceiver: IrExpression?, boundDispatchReceiver: IrExpression?,
@@ -39,7 +39,9 @@ import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.isFunctionTypeOrSubtype
import org.jetbrains.kotlin.ir.util.isInterface
import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.psi2ir.generators.hasNoSideEffects import org.jetbrains.kotlin.psi2ir.generators.hasNoSideEffects
import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.AbstractTypeChecker
@@ -388,7 +390,7 @@ class CallAndReferenceGenerator(
this.declarationStorage.getIrConstructorSymbol(it) this.declarationStorage.getIrConstructorSymbol(it)
} ?: run { } ?: run {
// Fallback for FirReferencePlaceholderForResolvedAnnotations from jar // Fallback for FirReferencePlaceholderForResolvedAnnotations from jar
val fir = coneType.lookupTag.toSymbol(session)?.fir as? FirClass<*> val fir = coneType.lookupTag.toSymbol(session)?.fir as? FirClass
var constructorSymbol: FirConstructorSymbol? = null var constructorSymbol: FirConstructorSymbol? = null
fir?.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)?.processDeclaredConstructors { fir?.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)?.processDeclaredConstructors {
if (it.fir.isPrimary && constructorSymbol == null) { if (it.fir.isPrimary && constructorSymbol == null) {
@@ -463,7 +465,7 @@ class CallAndReferenceGenerator(
} }
} }
private fun FirFunctionCall.buildSubstitutorByCalledFunction(function: FirFunction<*>?): ConeSubstitutor? { private fun FirFunctionCall.buildSubstitutorByCalledFunction(function: FirFunction?): ConeSubstitutor? {
if (function == null) return null if (function == null) return null
val map = mutableMapOf<FirTypeParameterSymbol, ConeKotlinType>() val map = mutableMapOf<FirTypeParameterSymbol, ConeKotlinType>()
for ((index, typeParameter) in function.typeParameters.withIndex()) { for ((index, typeParameter) in function.typeParameters.withIndex()) {
@@ -45,7 +45,7 @@ internal class ClassMemberGenerator(
private fun <T : IrDeclaration> applyParentFromStackTo(declaration: T): T = conversionScope.applyParentFromStackTo(declaration) private fun <T : IrDeclaration> applyParentFromStackTo(declaration: T): T = conversionScope.applyParentFromStackTo(declaration)
fun convertClassContent(irClass: IrClass, klass: FirClass<*>) { fun convertClassContent(irClass: IrClass, klass: FirClass) {
declarationStorage.enterScope(irClass) declarationStorage.enterScope(irClass)
conversionScope.withClass(irClass) { conversionScope.withClass(irClass) {
val primaryConstructor = klass.primaryConstructor val primaryConstructor = klass.primaryConstructor
@@ -82,7 +82,7 @@ internal class ClassMemberGenerator(
declarationStorage.leaveScope(irClass) declarationStorage.leaveScope(irClass)
} }
fun <T : IrFunction> convertFunctionContent(irFunction: T, firFunction: FirFunction<*>?, containingClass: FirClass<*>?): T { fun <T : IrFunction> convertFunctionContent(irFunction: T, firFunction: FirFunction?, containingClass: FirClass?): T {
conversionScope.withParent(irFunction) { conversionScope.withParent(irFunction) {
if (firFunction != null) { if (firFunction != null) {
if (irFunction !is IrConstructor || !irFunction.isPrimary) { if (irFunction !is IrConstructor || !irFunction.isPrimary) {
@@ -155,7 +155,7 @@ internal class ClassMemberGenerator(
return irFunction return irFunction
} }
fun convertPropertyContent(irProperty: IrProperty, property: FirProperty, containingClass: FirClass<*>?): IrProperty { fun convertPropertyContent(irProperty: IrProperty, property: FirProperty, containingClass: FirClass?): IrProperty {
val initializer = property.initializer val initializer = property.initializer
val delegate = property.delegate val delegate = property.delegate
val propertyType = property.returnTypeRef.toIrType() val propertyType = property.returnTypeRef.toIrType()
@@ -229,7 +229,7 @@ internal class ClassMemberGenerator(
propertyType: IrType, propertyType: IrType,
isDefault: Boolean, isDefault: Boolean,
isGetter: Boolean, isGetter: Boolean,
containingClass: FirClass<*>? containingClass: FirClass?
) { ) {
conversionScope.withFunction(this) { conversionScope.withFunction(this) {
applyParentFromStackTo(this) applyParentFromStackTo(this)
@@ -62,10 +62,10 @@ import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING
@OptIn(ObsoleteDescriptorBasedAPI::class) @OptIn(ObsoleteDescriptorBasedAPI::class)
class DataClassMembersGenerator(val components: Fir2IrComponents) { class DataClassMembersGenerator(val components: Fir2IrComponents) {
fun generateInlineClassMembers(klass: FirClass<*>, irClass: IrClass): List<FirDeclaration<*>> = fun generateInlineClassMembers(klass: FirClass, irClass: IrClass): List<FirDeclaration> =
MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER).generate(klass) MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER).generate(klass)
fun generateDataClassMembers(klass: FirClass<*>, irClass: IrClass): List<FirDeclaration<*>> = fun generateDataClassMembers(klass: FirClass, irClass: IrClass): List<FirDeclaration> =
MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER).generate(klass) MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER).generate(klass)
fun generateDataClassComponentBody(irFunction: IrFunction, lookupTag: ConeClassLikeLookupTag) = fun generateDataClassComponentBody(irFunction: IrFunction, lookupTag: ConeClassLikeLookupTag) =
@@ -179,14 +179,14 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
(this.name == HASHCODE_NAME && matchesHashCodeSignature) || (this.name == HASHCODE_NAME && matchesHashCodeSignature) ||
(this.name == TO_STRING && matchesToStringSignature) (this.name == TO_STRING && matchesToStringSignature)
fun generate(klass: FirClass<*>): List<FirDeclaration<*>> { fun generate(klass: FirClass): List<FirDeclaration> {
val propertyParametersCount = irClass.primaryConstructor?.explicitParameters?.size ?: 0 val propertyParametersCount = irClass.primaryConstructor?.explicitParameters?.size ?: 0
val properties = irClass.properties.filter { it.backingField != null }.take(propertyParametersCount).toList() val properties = irClass.properties.filter { it.backingField != null }.take(propertyParametersCount).toList()
if (properties.isEmpty()) { if (properties.isEmpty()) {
return emptyList() return emptyList()
} }
val result = mutableListOf<FirDeclaration<*>>() val result = mutableListOf<FirDeclaration>()
val contributedFunctionsInThisType = klass.declarations.mapNotNull { val contributedFunctionsInThisType = klass.declarations.mapNotNull {
if (it is FirSimpleFunction && it.matchesDataClassSyntheticMemberSignatures) { if (it is FirSimpleFunction && it.matchesDataClassSyntheticMemberSignatures) {
@@ -5,19 +5,26 @@
package org.jetbrains.kotlin.fir.backend.generators package org.jetbrains.kotlin.fir.backend.generators
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.generateOverriddenAccessorSymbols
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.backend.generateOverriddenFunctionSymbols
import org.jetbrains.kotlin.fir.backend.generateOverriddenPropertySymbols
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.isJavaDefault
import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.scopes.impl.unwrapDelegateTarget import org.jetbrains.kotlin.fir.scopes.impl.unwrapDelegateTarget
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrBlockBody import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.isNothing
import org.jetbrains.kotlin.ir.types.isUnit
/** /**
* A generator for delegated members from implementation by delegation. * A generator for delegated members from implementation by delegation.
@@ -31,7 +38,7 @@ internal class DelegatedMemberGenerator(
) : Fir2IrComponents by components { ) : Fir2IrComponents by components {
// Generate delegated members for [subClass]. The synthetic field [irField] has the super interface type. // Generate delegated members for [subClass]. The synthetic field [irField] has the super interface type.
fun generate(irField: IrField, firField: FirField, firSubClass: FirClass<*>, subClass: IrClass) { fun generate(irField: IrField, firField: FirField, firSubClass: FirClass, subClass: IrClass) {
val subClassLookupTag = firSubClass.symbol.toLookupTag() val subClassLookupTag = firSubClass.symbol.toLookupTag()
val subClassScope = firSubClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true) val subClassScope = firSubClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)
@@ -79,7 +86,7 @@ internal class DelegatedMemberGenerator(
private fun generateDelegatedFunction( private fun generateDelegatedFunction(
subClass: IrClass, subClass: IrClass,
firSubClass: FirClass<*>, firSubClass: FirClass,
irField: IrField, irField: IrField,
superFunction: IrSimpleFunction, superFunction: IrSimpleFunction,
delegateOverride: FirSimpleFunction delegateOverride: FirSimpleFunction
@@ -151,7 +158,7 @@ internal class DelegatedMemberGenerator(
private fun generateDelegatedProperty( private fun generateDelegatedProperty(
subClass: IrClass, subClass: IrClass,
firSubClass: FirClass<*>, firSubClass: FirClass,
irField: IrField, irField: IrField,
superProperty: IrProperty, superProperty: IrProperty,
firDelegateProperty: FirProperty firDelegateProperty: FirProperty
@@ -7,7 +7,10 @@ package org.jetbrains.kotlin.fir.backend.generators
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.Fir2IrConversionScope
import org.jetbrains.kotlin.fir.backend.Fir2IrDeclarationStorage
import org.jetbrains.kotlin.fir.backend.unwrapSubstitutionAndIntersectionOverrides
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.allowsToHaveFakeOverride import org.jetbrains.kotlin.fir.declarations.utils.allowsToHaveFakeOverride
import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.isExpect
@@ -15,9 +18,12 @@ import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenProperties
import org.jetbrains.kotlin.fir.scopes.impl.FirFakeOverrideGenerator import org.jetbrains.kotlin.fir.scopes.impl.FirFakeOverrideGenerator
import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
@@ -49,7 +55,7 @@ class FakeOverrideGenerator(
return conversionScope.withProperty(this, firProperty = null, f) return conversionScope.withProperty(this, firProperty = null, f)
} }
private fun FirCallableMemberDeclaration<*>.allowsToHaveFakeOverrideIn(klass: FirClass<*>): Boolean { private fun FirCallableMemberDeclaration.allowsToHaveFakeOverrideIn(klass: FirClass): Boolean {
if (!allowsToHaveFakeOverride) return false if (!allowsToHaveFakeOverride) return false
if (this.visibility != JavaDescriptorVisibilities.PACKAGE_VISIBILITY) return true if (this.visibility != JavaDescriptorVisibilities.PACKAGE_VISIBILITY) return true
return this.symbol.callableId.packageName == klass.symbol.classId.packageFqName return this.symbol.callableId.packageName == klass.symbol.classId.packageFqName
@@ -63,18 +69,18 @@ class FakeOverrideGenerator(
} }
} }
fun IrClass.addFakeOverrides(klass: FirClass<*>, declarations: Collection<FirDeclaration<*>>) { fun IrClass.addFakeOverrides(klass: FirClass, declarations: Collection<FirDeclaration>) {
this.declarations += getFakeOverrides( this.declarations += getFakeOverrides(
klass, klass,
declarations declarations
) )
} }
fun IrClass.getFakeOverrides(klass: FirClass<*>, realDeclarations: Collection<FirDeclaration<*>>): List<IrDeclaration> { fun IrClass.getFakeOverrides(klass: FirClass, realDeclarations: Collection<FirDeclaration>): List<IrDeclaration> {
val result = mutableListOf<IrDeclaration>() val result = mutableListOf<IrDeclaration>()
val useSiteMemberScope = klass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true) val useSiteMemberScope = klass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)
val superTypesCallableNames = useSiteMemberScope.getCallableNames() val superTypesCallableNames = useSiteMemberScope.getCallableNames()
val realDeclarationSymbols = realDeclarations.mapTo(mutableSetOf(), FirDeclaration<*>::symbol) val realDeclarationSymbols = realDeclarations.mapTo(mutableSetOf(), FirDeclaration::symbol)
for (name in superTypesCallableNames) { for (name in superTypesCallableNames) {
generateFakeOverridesForName(this, useSiteMemberScope, name, klass, result, realDeclarationSymbols) generateFakeOverridesForName(this, useSiteMemberScope, name, klass, result, realDeclarationSymbols)
@@ -86,7 +92,7 @@ class FakeOverrideGenerator(
fun generateFakeOverridesForName( fun generateFakeOverridesForName(
irClass: IrClass, irClass: IrClass,
name: Name, name: Name,
firClass: FirClass<*> firClass: FirClass
): List<IrDeclaration> = buildList { ): List<IrDeclaration> = buildList {
val useSiteMemberScope = firClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true) val useSiteMemberScope = firClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)
generateFakeOverridesForName( generateFakeOverridesForName(
@@ -100,7 +106,7 @@ class FakeOverrideGenerator(
irClass: IrClass, irClass: IrClass,
useSiteMemberScope: FirTypeScope, useSiteMemberScope: FirTypeScope,
name: Name, name: Name,
firClass: FirClass<*>, firClass: FirClass,
result: MutableList<IrDeclaration>, result: MutableList<IrDeclaration>,
realDeclarationSymbols: Set<FirBasedSymbol<*>> realDeclarationSymbols: Set<FirBasedSymbol<*>>
) { ) {
@@ -156,7 +162,7 @@ class FakeOverrideGenerator(
} }
internal fun calcBaseSymbolsForFakeOverrideFunction( internal fun calcBaseSymbolsForFakeOverrideFunction(
klass: FirClass<*>, klass: FirClass,
fakeOverride: IrSimpleFunction, fakeOverride: IrSimpleFunction,
originalSymbol: FirNamedFunctionSymbol, originalSymbol: FirNamedFunctionSymbol,
) { ) {
@@ -174,8 +180,8 @@ class FakeOverrideGenerator(
private fun FirCallableSymbol<*>.shouldHaveComputedBaseSymbolsForClass(classLookupTag: ConeClassLikeLookupTag): Boolean = private fun FirCallableSymbol<*>.shouldHaveComputedBaseSymbolsForClass(classLookupTag: ConeClassLikeLookupTag): Boolean =
fir.origin.fromSupertypes && dispatchReceiverClassOrNull() == classLookupTag fir.origin.fromSupertypes && dispatchReceiverClassOrNull() == classLookupTag
private inline fun <reified D : FirCallableMemberDeclaration<D>, reified S : FirCallableSymbol<D>, reified I : IrDeclaration> createFakeOverriddenIfNeeded( private inline fun <reified D : FirCallableMemberDeclaration, reified S : FirCallableSymbol<D>, reified I : IrDeclaration> createFakeOverriddenIfNeeded(
klass: FirClass<*>, klass: FirClass,
irClass: IrClass, irClass: IrClass,
isLocal: Boolean, isLocal: Boolean,
originalSymbol: FirCallableSymbol<*>, originalSymbol: FirCallableSymbol<*>,
@@ -312,7 +318,7 @@ class FakeOverrideGenerator(
irProducer: (F) -> S irProducer: (F) -> S
): List<S> { ): List<S> {
val overriddenContainingClass = val overriddenContainingClass =
overridden.containingClass()?.toSymbol(session)?.fir as? FirClass<*> ?: return emptyList() overridden.containingClass()?.toSymbol(session)?.fir as? FirClass ?: return emptyList()
val overriddenContainingIrClass = val overriddenContainingIrClass =
declarationStorage.classifierStorage.getIrClassSymbol(overriddenContainingClass.symbol).owner as? IrClass declarationStorage.classifierStorage.getIrClassSymbol(overriddenContainingClass.symbol).owner as? IrClass
@@ -10,7 +10,8 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.hasAnnotation
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
@@ -28,7 +29,7 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME
import kotlin.properties.ReadWriteProperty import kotlin.properties.ReadWriteProperty
abstract class AbstractFir2IrLazyFunction<F : FirCallableMemberDeclaration<*>>( abstract class AbstractFir2IrLazyFunction<F : FirCallableMemberDeclaration>(
components: Fir2IrComponents, components: Fir2IrComponents,
override val startOffset: Int, override val startOffset: Int,
override val endOffset: Int, override val endOffset: Int,
@@ -86,7 +87,7 @@ abstract class AbstractFir2IrLazyFunction<F : FirCallableMemberDeclaration<*>>(
protected fun shouldHaveDispatchReceiver( protected fun shouldHaveDispatchReceiver(
containingClass: IrClass, containingClass: IrClass,
staticOwner: FirCallableMemberDeclaration<*> staticOwner: FirCallableMemberDeclaration
): Boolean { ): Boolean {
return !staticOwner.isStatic && return !staticOwner.isStatic &&
(!containingClass.isObject || containingClass.isCompanion || !staticOwner.hasAnnotation(JVM_STATIC_CLASS_ID)) (!containingClass.isObject || containingClass.isCompanion || !staticOwner.hasAnnotation(JVM_STATIC_CLASS_ID))
@@ -9,7 +9,10 @@ import org.jetbrains.kotlin.fir.backend.ConversionTypeContext
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.generateOverriddenAccessorSymbols import org.jetbrains.kotlin.fir.backend.generateOverriddenAccessorSymbols
import org.jetbrains.kotlin.fir.backend.toIrType import org.jetbrains.kotlin.fir.backend.toIrType
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.utils.isInline import org.jetbrains.kotlin.fir.declarations.utils.isInline
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
@@ -35,12 +38,12 @@ class Fir2IrLazyPropertyAccessor(
firParentClass: FirRegularClass, firParentClass: FirRegularClass,
symbol: Fir2IrSimpleFunctionSymbol, symbol: Fir2IrSimpleFunctionSymbol,
isFakeOverride: Boolean isFakeOverride: Boolean
) : AbstractFir2IrLazyFunction<FirCallableMemberDeclaration<*>>(components, startOffset, endOffset, origin, symbol, isFakeOverride) { ) : AbstractFir2IrLazyFunction<FirCallableMemberDeclaration>(components, startOffset, endOffset, origin, symbol, isFakeOverride) {
init { init {
symbol.bind(this) symbol.bind(this)
} }
override val fir: FirCallableMemberDeclaration<*> override val fir: FirCallableMemberDeclaration
get() = firAccessor ?: firParentProperty get() = firAccessor ?: firParentProperty
// TODO: investigate why some deserialized properties are inline // TODO: investigate why some deserialized properties are inline
@@ -5,11 +5,18 @@
package org.jetbrains.kotlin.fir.lazy package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.backend.generateOverriddenFunctionSymbols
import org.jetbrains.kotlin.fir.backend.toIrType
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.initialSignatureAttr import org.jetbrains.kotlin.fir.initialSignatureAttr
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
@@ -79,7 +86,7 @@ class Fir2IrLazySimpleFunction(
} }
override val initialSignatureFunction: IrFunction? by lazy { override val initialSignatureFunction: IrFunction? by lazy {
(fir.initialSignatureAttr as? FirFunction<*>)?.symbol?.let { declarationStorage.getIrFunctionSymbol(it).owner } (fir.initialSignatureAttr as? FirFunction)?.symbol?.let { declarationStorage.getIrFunctionSymbol(it).owner }
} }
override val containerSource: DeserializedContainerSource? override val containerSource: DeserializedContainerSource?
@@ -59,10 +59,10 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu
} }
} }
override fun composeSignature(declaration: FirDeclaration<*>, containingClass: ConeClassLikeLookupTag?): IdSignature? { override fun composeSignature(declaration: FirDeclaration, containingClass: ConeClassLikeLookupTag?): IdSignature? {
if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null
if (declaration is FirRegularClass && declaration.classId.isLocal) return null if (declaration is FirRegularClass && declaration.classId.isLocal) return null
if (declaration is FirCallableMemberDeclaration<*>) { if (declaration is FirCallableMemberDeclaration) {
if (declaration.visibility == Visibilities.Local) return null if (declaration.visibility == Visibilities.Local) return null
if (declaration.dispatchReceiverClassOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true) return null if (declaration.dispatchReceiverClassOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true) return null
} }
@@ -87,7 +87,7 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu
classId.packageFqName.asString(), classId.relativeClassName.asString(), builder.hashId, builder.mask classId.packageFqName.asString(), classId.relativeClassName.asString(), builder.hashId, builder.mask
) )
} }
is FirCallableMemberDeclaration<*> -> { is FirCallableMemberDeclaration -> {
if (declaration.visibility == Visibilities.Private) return null if (declaration.visibility == Visibilities.Private) return null
val containingClassId = containingClass?.classId val containingClassId = containingClass?.classId
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.fir.signaturer
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.ir.util.KotlinMangler import org.jetbrains.kotlin.ir.util.KotlinMangler
interface FirMangler : KotlinMangler<FirDeclaration<*>> { interface FirMangler : KotlinMangler<FirDeclaration> {
override val manglerName: String override val manglerName: String
get() = "Fir" get() = "Fir"
} }
@@ -22,7 +22,7 @@ object FirJavaVisibilityChecker : FirVisibilityChecker() {
declarationVisibility: Visibility, declarationVisibility: Visibility,
symbol: FirBasedSymbol<*>, symbol: FirBasedSymbol<*>,
useSiteFile: FirFile, useSiteFile: FirFile,
containingDeclarations: List<FirDeclaration<*>>, containingDeclarations: List<FirDeclaration>,
dispatchReceiver: ReceiverValue?, dispatchReceiver: ReceiverValue?,
session: FirSession session: FirSession
): Boolean { ): Boolean {
@@ -7,24 +7,28 @@ package org.jetbrains.kotlin.fir.java
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.utils.classId import org.jetbrains.kotlin.fir.declarations.utils.classId
import org.jetbrains.kotlin.fir.declarations.utils.isJava import org.jetbrains.kotlin.fir.declarations.utils.isJava
import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
import org.jetbrains.kotlin.fir.java.scopes.* import org.jetbrains.kotlin.fir.java.scopes.*
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.fir.scopes.scopeForSupertype
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.utils.DFS
class JavaScopeProvider( class JavaScopeProvider(
val symbolProvider: JavaSymbolProvider val symbolProvider: JavaSymbolProvider
) : FirScopeProvider() { ) : FirScopeProvider() {
override fun getUseSiteMemberScope( override fun getUseSiteMemberScope(
klass: FirClass<*>, klass: FirClass,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirTypeScope { ): FirTypeScope {
@@ -106,7 +110,7 @@ class JavaScopeProvider(
} }
override fun getStaticMemberScopeForCallables( override fun getStaticMemberScopeForCallables(
klass: FirClass<*>, klass: FirClass,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope? { ): FirScope? {
@@ -115,7 +119,7 @@ class JavaScopeProvider(
} }
private fun getStaticMemberScopeForCallables( private fun getStaticMemberScopeForCallables(
klass: FirClass<*>, klass: FirClass,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
visitedClasses: MutableSet<FirRegularClass> visitedClasses: MutableSet<FirRegularClass>
@@ -190,7 +194,7 @@ class JavaScopeProvider(
return result return result
} }
override fun getNestedClassifierScope(klass: FirClass<*>, useSiteSession: FirSession, scopeSession: ScopeSession): FirScope? { override fun getNestedClassifierScope(klass: FirClass, useSiteSession: FirSession, scopeSession: ScopeSession): FirScope? {
return lazyNestedClassifierScope( return lazyNestedClassifierScope(
klass.classId, klass.classId,
(klass as FirJavaClass).existingNestedClassifierNames, (klass as FirJavaClass).existingNestedClassifierNames,

Some files were not shown because too many files have changed in this diff Show More