[FIR] Remove generic parameter from FirDeclaration
This commit is contained in:
+2
-2
@@ -27,7 +27,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
|
||||
renderer.visitStatusOwner(javaClass)
|
||||
renderer.renderSupertypes(javaClass)
|
||||
renderer.renderInBraces {
|
||||
val renderedDeclarations = mutableListOf<FirDeclaration<*>>()
|
||||
val renderedDeclarations = mutableListOf<FirDeclaration>()
|
||||
|
||||
fun renderAndCache(symbol: FirCallableSymbol<*>) {
|
||||
val enhanced = symbol.fir
|
||||
@@ -42,7 +42,7 @@ fun renderJavaClass(renderer: FirRenderer, javaClass: FirJavaClass, session: Fir
|
||||
if (declaration in renderedDeclarations) continue
|
||||
|
||||
val scopeToUse =
|
||||
if (declaration is FirCallableMemberDeclaration<*> && declaration.status.isStatic)
|
||||
if (declaration is FirCallableMemberDeclaration && declaration.status.isStatic)
|
||||
staticScope
|
||||
else
|
||||
memberScope
|
||||
|
||||
+1
-1
@@ -20,4 +20,4 @@ fun foo(target: FirTarget<FirFunction<*>>, property: FirProperty) {
|
||||
}
|
||||
0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -51,16 +51,16 @@ fun main(args: Array<String>) {
|
||||
|
||||
val declarationPackage = "$basePackage.checkers.declaration"
|
||||
generateCheckersComponents(generationPath, declarationPackage, "FirDeclarationChecker") {
|
||||
alias<FirDeclaration<*>>("BasicDeclarationChecker")
|
||||
alias<FirFunction<*>>("FunctionChecker")
|
||||
alias<FirDeclaration>("BasicDeclarationChecker")
|
||||
alias<FirFunction>("FunctionChecker")
|
||||
alias<FirSimpleFunction>("SimpleFunctionChecker")
|
||||
alias<FirProperty>("PropertyChecker")
|
||||
alias<FirClass<*>>("ClassChecker")
|
||||
alias<FirClass>("ClassChecker")
|
||||
alias<FirRegularClass>("RegularClassChecker")
|
||||
alias<FirConstructor>("ConstructorChecker")
|
||||
alias<FirFile>("FileChecker")
|
||||
alias<FirTypeParameter>("FirTypeParameterChecker")
|
||||
alias<FirAnnotatedDeclaration<*>>("FirAnnotatedDeclarationChecker")
|
||||
alias<FirAnnotatedDeclaration>("FirAnnotatedDeclarationChecker")
|
||||
alias<FirTypeAlias>("TypeAliasChecker")
|
||||
|
||||
additional(
|
||||
|
||||
+25
-26
@@ -6,7 +6,6 @@
|
||||
package org.jetbrains.kotlin.fir.checkers.generator.diagnostics
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiTypeElement
|
||||
import com.intellij.psi.impl.source.tree.LeafPsiElement
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
@@ -120,7 +119,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
||||
val NOT_A_SUPERTYPE by error<PsiElement>()
|
||||
val SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE by error<PsiElement>()
|
||||
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 INTERFACE_WITH_SUPERCLASS by error<KtTypeReference>()
|
||||
@@ -370,7 +369,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
||||
val NON_VARARG_SPREAD by error<LeafPsiElement>()
|
||||
val ARGUMENT_PASSED_TWICE by error<KtValueArgument>(PositioningStrategy.NAME_OF_NAMED_ARGUMENT)
|
||||
val TOO_MANY_ARGUMENTS by error<PsiElement> {
|
||||
parameter<FirCallableDeclaration<*>>("function")
|
||||
parameter<FirCallableDeclaration>("function")
|
||||
}
|
||||
val NO_VALUE_FOR_PARAMETER by error<KtElement>(PositioningStrategy.VALUE_ARGUMENTS) {
|
||||
parameter<FirValueParameter>("violatedParameter")
|
||||
@@ -482,7 +481,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
||||
|
||||
val NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER by error<KtSimpleNameExpression> {
|
||||
parameter<Name>("typeParameterName")
|
||||
parameter<FirDeclaration<*>>("typeParametersOwner")
|
||||
parameter<FirDeclaration>("typeParametersOwner")
|
||||
}
|
||||
|
||||
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 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_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) {
|
||||
parameter<Visibility>("overridingVisibility")
|
||||
parameter<FirCallableDeclaration<*>>("overridden")
|
||||
parameter<FirCallableDeclaration>("overridden")
|
||||
parameter<Name>("containingClassName")
|
||||
}
|
||||
val CANNOT_CHANGE_ACCESS_PRIVILEGE by error<KtModifierListOwner>(PositioningStrategy.VISIBILITY_MODIFIER) {
|
||||
parameter<Visibility>("overridingVisibility")
|
||||
parameter<FirCallableDeclaration<*>>("overridden")
|
||||
parameter<FirCallableDeclaration>("overridden")
|
||||
parameter<Name>("containingClassName")
|
||||
}
|
||||
|
||||
val OVERRIDING_FINAL_MEMBER by error<KtNamedDeclaration>(PositioningStrategy.OVERRIDE_MODIFIER) {
|
||||
parameter<FirCallableDeclaration<*>>("overriddenDeclaration")
|
||||
parameter<FirCallableDeclaration>("overriddenDeclaration")
|
||||
parameter<Name>("containingClassName")
|
||||
}
|
||||
|
||||
val ABSTRACT_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
|
||||
parameter<FirClass<*>>("classOrObject")
|
||||
parameter<FirCallableDeclaration<*>>("missingDeclaration")
|
||||
parameter<FirClass>("classOrObject")
|
||||
parameter<FirCallableDeclaration>("missingDeclaration")
|
||||
}
|
||||
val ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
|
||||
parameter<FirClass<*>>("classOrObject")
|
||||
parameter<FirCallableDeclaration<*>>("missingDeclaration")
|
||||
parameter<FirClass>("classOrObject")
|
||||
parameter<FirCallableDeclaration>("missingDeclaration")
|
||||
}
|
||||
val INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
|
||||
parameter<FirClass<*>>("classOrObject")
|
||||
parameter<FirCallableDeclaration<*>>("invisibleDeclaration")
|
||||
parameter<FirClass>("classOrObject")
|
||||
parameter<FirCallableDeclaration>("invisibleDeclaration")
|
||||
}
|
||||
val INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_WARNING by warning<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
|
||||
parameter<FirClass<*>>("classOrObject")
|
||||
parameter<FirCallableDeclaration<*>>("invisibleDeclaration")
|
||||
parameter<FirClass>("classOrObject")
|
||||
parameter<FirCallableDeclaration>("invisibleDeclaration")
|
||||
}
|
||||
val MANY_IMPL_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
|
||||
parameter<FirClass<*>>("classOrObject")
|
||||
parameter<FirCallableDeclaration<*>>("missingDeclaration")
|
||||
parameter<FirClass>("classOrObject")
|
||||
parameter<FirCallableDeclaration>("missingDeclaration")
|
||||
}
|
||||
val MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
|
||||
parameter<FirClass<*>>("classOrObject")
|
||||
parameter<FirCallableDeclaration<*>>("missingDeclaration")
|
||||
parameter<FirClass>("classOrObject")
|
||||
parameter<FirCallableDeclaration>("missingDeclaration")
|
||||
}
|
||||
val OVERRIDING_FINAL_MEMBER_BY_DELEGATION by error<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
|
||||
parameter<FirCallableDeclaration<*>>("delegatedDeclaration")
|
||||
parameter<FirCallableDeclaration<*>>("overriddenDeclaration")
|
||||
parameter<FirCallableDeclaration>("delegatedDeclaration")
|
||||
parameter<FirCallableDeclaration>("overriddenDeclaration")
|
||||
}
|
||||
val DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE by warning<KtClassOrObject>(PositioningStrategy.DECLARATION_NAME) {
|
||||
parameter<FirCallableDeclaration<*>>("delegatedDeclaration")
|
||||
parameter<FirCallableDeclaration<*>>("overriddenDeclaration")
|
||||
parameter<FirCallableDeclaration>("delegatedDeclaration")
|
||||
parameter<FirCallableDeclaration>("overriddenDeclaration")
|
||||
}
|
||||
|
||||
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 ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error<KtFunction>(PositioningStrategy.MODALITY_MODIFIER) {
|
||||
parameter<FirStatusOwner>("function")
|
||||
parameter<FirClass<*>>("containingClass")
|
||||
parameter<FirClass>("containingClass")
|
||||
}
|
||||
val ABSTRACT_FUNCTION_WITH_BODY by error<KtFunction>(PositioningStrategy.MODALITY_MODIFIER) {
|
||||
parameter<FirStatusOwner>("function")
|
||||
@@ -697,7 +696,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
||||
val PROPERTIES_AND_ACCESSORS by object : DiagnosticGroup("Properties & accessors") {
|
||||
val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error<KtModifierListOwner>(PositioningStrategy.MODALITY_MODIFIER) {
|
||||
parameter<FirStatusOwner>("property")
|
||||
parameter<FirClass<*>>("containingClass")
|
||||
parameter<FirClass>("containingClass")
|
||||
}
|
||||
val PRIVATE_PROPERTY_IN_INTERFACE by error<KtProperty>(PositioningStrategy.VISIBILITY_MODIFIER)
|
||||
|
||||
|
||||
+2
-2
@@ -17,14 +17,14 @@ import org.jetbrains.kotlin.fir.declarations.utils.isExternal
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
|
||||
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.isExternal) return
|
||||
val source = declaration.source ?: return
|
||||
if (source.kind is FirFakeSourceElementKind) return
|
||||
|
||||
// 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) {
|
||||
is FirProperty -> "property"
|
||||
is FirRegularClass -> "class"
|
||||
|
||||
+4
-4
@@ -22,14 +22,14 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
|
||||
typealias FirBasicDeclarationChecker = FirDeclarationChecker<FirDeclaration<*>>
|
||||
typealias FirFunctionChecker = FirDeclarationChecker<FirFunction<*>>
|
||||
typealias FirBasicDeclarationChecker = FirDeclarationChecker<FirDeclaration>
|
||||
typealias FirFunctionChecker = FirDeclarationChecker<FirFunction>
|
||||
typealias FirSimpleFunctionChecker = FirDeclarationChecker<FirSimpleFunction>
|
||||
typealias FirPropertyChecker = FirDeclarationChecker<FirProperty>
|
||||
typealias FirClassChecker = FirDeclarationChecker<FirClass<*>>
|
||||
typealias FirClassChecker = FirDeclarationChecker<FirClass>
|
||||
typealias FirRegularClassChecker = FirDeclarationChecker<FirRegularClass>
|
||||
typealias FirConstructorChecker = FirDeclarationChecker<FirConstructor>
|
||||
typealias FirFileChecker = FirDeclarationChecker<FirFile>
|
||||
typealias FirTypeParameterChecker = FirDeclarationChecker<FirTypeParameter>
|
||||
typealias FirAnnotatedDeclarationChecker = FirDeclarationChecker<FirAnnotatedDeclaration<*>>
|
||||
typealias FirAnnotatedDeclarationChecker = FirDeclarationChecker<FirAnnotatedDeclaration>
|
||||
typealias FirTypeAliasChecker = FirDeclarationChecker<FirTypeAlias>
|
||||
|
||||
+17
-17
@@ -131,7 +131,7 @@ object FirErrors {
|
||||
val RECURSION_IN_SUPERTYPES by error0<PsiElement>()
|
||||
val NOT_A_SUPERTYPE 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 INTERFACE_WITH_SUPERCLASS 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 NON_VARARG_SPREAD by error0<LeafPsiElement>()
|
||||
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 NAMED_PARAMETER_NOT_FOUND by error1<KtValueArgument, String>(SourceElementPositioningStrategies.NAME_OF_NAMED_ARGUMENT)
|
||||
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 REPEATED_BOUND by error0<KtTypeReference>()
|
||||
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 REIFIED_TYPE_PARAMETER_NO_INLINE by error0<KtTypeParameter>(SourceElementPositioningStrategies.REIFIED_MODIFIER)
|
||||
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>()
|
||||
|
||||
// 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_TO_ANNOTATION_CONSTRUCTOR by error0<KtExpression>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED)
|
||||
val CLASS_LITERAL_LHS_NOT_A_CLASS by error0<KtExpression>()
|
||||
@@ -339,17 +339,17 @@ object FirErrors {
|
||||
|
||||
// overrides
|
||||
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_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 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 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 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 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 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 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_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_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_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 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 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)
|
||||
@@ -369,7 +369,7 @@ object FirErrors {
|
||||
val LOCAL_INTERFACE_NOT_ALLOWED by error1<KtNamedDeclaration, Name>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
||||
|
||||
// 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 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)
|
||||
@@ -392,7 +392,7 @@ object FirErrors {
|
||||
val FUN_INTERFACE_WITH_SUSPEND_FUNCTION by error0<KtDeclaration>(SourceElementPositioningStrategies.FUN_INTERFACE)
|
||||
|
||||
// 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 ABSTRACT_PROPERTY_WITH_INITIALIZER 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).
|
||||
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()
|
||||
|
||||
override fun visitNode(node: CFGNode<*>) {}
|
||||
@@ -266,7 +266,7 @@ class DeclaredVariableCollector {
|
||||
val declaredVariablesPerElement: SetMultimap<FirStatement, FirPropertySymbol> = setMultimapOf()
|
||||
|
||||
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) {
|
||||
statement.accept(visitor, null)
|
||||
}
|
||||
@@ -274,7 +274,7 @@ class DeclaredVariableCollector {
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -45,7 +45,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() {
|
||||
|
||||
override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter, context: CheckerContext) {
|
||||
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.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) {}
|
||||
|
||||
@@ -303,7 +303,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() {
|
||||
return this?.coneTypeSafe<ConeKotlinType>()?.isBuiltinFunctionalType(session) == true
|
||||
}
|
||||
|
||||
private val FirFunction<*>.contractDescription: FirContractDescription?
|
||||
private val FirFunction.contractDescription: FirContractDescription?
|
||||
get() = (this as? FirContractDescriptionOwner)?.contractDescription
|
||||
|
||||
private fun FirContractDescription?.getParameterCallsEffectDeclaration(index: Int): ConeCallsEffectDeclaration? {
|
||||
@@ -327,7 +327,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() {
|
||||
return getParameterCallsEffectDeclaration(index)?.kind
|
||||
}
|
||||
|
||||
private fun FirFunction<*>.isInPlaceLambda(): Boolean {
|
||||
private fun FirFunction.isInPlaceLambda(): Boolean {
|
||||
return this is FirAnonymousFunction && this.isLambda && this.invocationKind != null
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -25,17 +25,17 @@ class FirControlFlowAnalyzer(
|
||||
|
||||
// Currently declaration in analyzeXXX is not used, but it may be useful in future
|
||||
@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
|
||||
cfaCheckers.forEach { it.analyze(graph, reporter, context) }
|
||||
}
|
||||
|
||||
@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
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
|
||||
+5
-5
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
|
||||
|
||||
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 dataFlowInfo = graphRef.dataFlowInfo
|
||||
if (function !is FirContractDescriptionOwner || dataFlowInfo == null) return
|
||||
@@ -72,7 +72,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
|
||||
private fun isWrongConditionOnNode(
|
||||
node: CFGNode<*>,
|
||||
effectDeclaration: ConeConditionalEffectDeclaration,
|
||||
function: FirFunction<*>,
|
||||
function: FirFunction,
|
||||
logicSystem: LogicSystem<PersistentFlow>,
|
||||
dataFlowInfo: DataFlowInfo,
|
||||
context: CheckerContext
|
||||
@@ -150,7 +150,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
|
||||
}
|
||||
|
||||
private fun ConeBooleanExpression.buildTypeStatements(
|
||||
function: FirFunction<*>,
|
||||
function: FirFunction,
|
||||
logicSystem: LogicSystem<*>,
|
||||
variableStorage: VariableStorage,
|
||||
flow: Flow,
|
||||
@@ -216,7 +216,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
|
||||
private val CheckerContext.containingProperty: 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) {
|
||||
if (symbol is FirPropertyAccessorSymbol) {
|
||||
context.containingProperty?.receiverTypeRef
|
||||
@@ -229,7 +229,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
|
||||
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) {
|
||||
if (symbol !is FirPropertyAccessorSymbol) {
|
||||
symbol
|
||||
|
||||
+10
-10
@@ -337,7 +337,7 @@ internal object ConeTypeCompatibilityChecker {
|
||||
|
||||
private fun MutableMap<FirTypeParameterRef, BoundTypeArguments>.collect(
|
||||
ctx: ConeInferenceContext,
|
||||
typeParameterOwner: FirClassLikeDeclaration<*>,
|
||||
typeParameterOwner: FirClassLikeDeclaration,
|
||||
parameter: FirTypeParameterRef,
|
||||
boundTypeArgument: BoundTypeArgument,
|
||||
compatibilityUpperBound: Compatibility,
|
||||
@@ -365,28 +365,28 @@ internal object ConeTypeCompatibilityChecker {
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirClassLikeDeclaration<*>.getSuperTypes(): List<ConeClassLikeType> {
|
||||
private fun FirClassLikeDeclaration.getSuperTypes(): List<ConeClassLikeType> {
|
||||
return when (this) {
|
||||
is FirTypeAlias -> listOfNotNull(expandedTypeRef.coneTypeSafe())
|
||||
is FirClass<*> -> superTypeRefs.mapNotNull { it.coneTypeSafe() }
|
||||
is FirClass -> superTypeRefs.mapNotNull { it.coneTypeSafe() }
|
||||
else -> emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
private fun ConeClassLikeType.getClassLikeElement(ctx: ConeInferenceContext): FirClassLikeDeclaration<*>? =
|
||||
private fun ConeClassLikeType.getClassLikeElement(ctx: ConeInferenceContext): FirClassLikeDeclaration? =
|
||||
ctx.symbolProvider.getSymbolByLookupTag(lookupTag)?.fir
|
||||
|
||||
private fun FirClassLikeDeclaration<*>.getTypeParameter(index: Int): FirTypeParameterRef? {
|
||||
private fun FirClassLikeDeclaration.getTypeParameter(index: Int): FirTypeParameterRef? {
|
||||
return when (this) {
|
||||
is FirTypeAlias -> typeParameters[index]
|
||||
is FirClass<*> -> typeParameters[index]
|
||||
is FirClass -> typeParameters[index]
|
||||
else -> return null
|
||||
}
|
||||
}
|
||||
|
||||
/** A class declaration and the arguments bound to the declared type parameters. */
|
||||
private data class TypeArgumentMapping(
|
||||
val typeParameterOwner: FirClassLikeDeclaration<*>,
|
||||
val typeParameterOwner: FirClassLikeDeclaration,
|
||||
val mapping: Map<FirTypeParameterRef, BoundTypeArgument>
|
||||
)
|
||||
|
||||
@@ -408,11 +408,11 @@ internal object ConeTypeCompatibilityChecker {
|
||||
ctx: ConeInferenceContext
|
||||
): FirClassWithSuperClasses? = when (val klass = ctx.symbolProvider.getSymbolByLookupTag(this)?.fir) {
|
||||
is FirTypeAlias -> klass.fullyExpandedClass(ctx.session)?.let { FirClassWithSuperClasses(it, ctx) }
|
||||
is FirClass<*> -> FirClassWithSuperClasses(klass, ctx)
|
||||
is FirClass -> FirClassWithSuperClasses(klass, ctx)
|
||||
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 superClasses: Set<FirClassWithSuperClasses> by lazy {
|
||||
@@ -454,7 +454,7 @@ internal object ConeTypeCompatibilityChecker {
|
||||
(firClass is FirRegularClass && (firClass.isData || firClass.isInline))
|
||||
}
|
||||
|
||||
private val FirClass<*>.isFinal: Boolean
|
||||
private val FirClass.isFinal: Boolean
|
||||
get() {
|
||||
return when (this) {
|
||||
is FirAnonymousObject -> true
|
||||
|
||||
+2
-2
@@ -60,11 +60,11 @@ fun FirRegularClass.getAllowedAnnotationTargets(): Set<KotlinTarget> {
|
||||
}
|
||||
}
|
||||
|
||||
fun FirAnnotatedDeclaration<*>.getRetentionAnnotation(): FirAnnotationCall? {
|
||||
fun FirAnnotatedDeclaration.getRetentionAnnotation(): FirAnnotationCall? {
|
||||
return getAnnotationByFqName(StandardNames.FqNames.retention)
|
||||
}
|
||||
|
||||
fun FirAnnotatedDeclaration<*>.getTargetAnnotation(): FirAnnotationCall? {
|
||||
fun FirAnnotatedDeclaration.getTargetAnnotation(): FirAnnotationCall? {
|
||||
return getAnnotationByFqName(StandardNames.FqNames.target)
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -189,7 +189,7 @@ internal fun checkConstantArguments(
|
||||
return null
|
||||
}
|
||||
|
||||
private fun FirTypedDeclaration<*>?.getReferencedClass(session: FirSession): FirDeclaration<*>? =
|
||||
private fun FirTypedDeclaration?.getReferencedClass(session: FirSession): FirDeclaration? =
|
||||
this?.returnTypeRef
|
||||
?.coneTypeSafe<ConeLookupTagBasedType>()
|
||||
?.lookupTag
|
||||
|
||||
+5
-5
@@ -219,7 +219,7 @@ private val NO_NAME_PROVIDED = Name.special("<no name provided>")
|
||||
// explicitly.
|
||||
// - see tests with `fun () {}`.
|
||||
// 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 FirRegularClass -> name != NO_NAME_PROVIDED
|
||||
else -> true
|
||||
@@ -231,10 +231,10 @@ private fun FirDeclaration<*>.isCollectable() = when (this) {
|
||||
open class FirDeclarationInspector(
|
||||
protected val presenter: FirDeclarationPresenter = FirDefaultDeclarationPresenter()
|
||||
) {
|
||||
val otherDeclarations = mutableMapOf<String, MutableList<FirDeclaration<*>>>()
|
||||
val otherDeclarations = mutableMapOf<String, MutableList<FirDeclaration>>()
|
||||
val functionDeclarations = mutableMapOf<String, MutableList<FirSimpleFunction>>()
|
||||
|
||||
fun collect(declaration: FirDeclaration<*>) {
|
||||
fun collect(declaration: FirDeclaration) {
|
||||
when {
|
||||
!declaration.isCollectable() -> {}
|
||||
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) {
|
||||
mutableListOf()
|
||||
}.also {
|
||||
@@ -258,7 +258,7 @@ open class FirDeclarationInspector(
|
||||
it.add(declaration)
|
||||
}
|
||||
|
||||
fun contains(declaration: FirDeclaration<*>) = when (declaration) {
|
||||
fun contains(declaration: FirDeclaration) = when (declaration) {
|
||||
is FirSimpleFunction -> presenter.represent(declaration) in functionDeclarations
|
||||
is FirRegularClass -> presenter.represent(declaration) in otherDeclarations
|
||||
is FirTypeAlias -> presenter.represent(declaration) in otherDeclarations
|
||||
|
||||
+25
-25
@@ -50,21 +50,21 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
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)
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
fun FirClass<*>.isSupertypeOf(other: FirClass<*>, exclude: MutableSet<FirClass<*>>): Boolean {
|
||||
fun FirClass.isSupertypeOf(other: FirClass, exclude: MutableSet<FirClass>): Boolean {
|
||||
for (it in other.superTypeRefs) {
|
||||
val candidate = it.firClassLike(session)
|
||||
?.followAllAlias(session)
|
||||
?.safeAs<FirClass<*>>()
|
||||
?.safeAs<FirClass>()
|
||||
?: continue
|
||||
|
||||
if (candidate in exclude) {
|
||||
@@ -92,7 +92,7 @@ fun FirClass<*>.isSupertypeOf(other: FirClass<*>, session: FirSession): Boolean
|
||||
* Returns the FirClass associated with this
|
||||
* 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
|
||||
}
|
||||
|
||||
@@ -135,8 +135,8 @@ inline fun <reified T : Any> FirQualifiedAccessExpression.getDeclaration(): T? {
|
||||
* Returns the ClassLikeDeclaration where the Fir object has been defined
|
||||
* or null if no proper declaration has been found.
|
||||
*/
|
||||
fun FirDeclaration<*>.getContainingClass(context: CheckerContext): FirClassLikeDeclaration<*>? =
|
||||
this.safeAs<FirCallableMemberDeclaration<*>>()?.containingClass()?.toSymbol(context.session)?.fir
|
||||
fun FirDeclaration.getContainingClass(context: CheckerContext): FirClassLikeDeclaration? =
|
||||
this.safeAs<FirCallableMemberDeclaration>()?.containingClass()?.toSymbol(context.session)?.fir
|
||||
|
||||
fun FirClassLikeSymbol<*>.outerClass(context: CheckerContext): FirClassLikeSymbol<*>? {
|
||||
if (this !is FirClassSymbol<*>) return null
|
||||
@@ -144,8 +144,8 @@ fun FirClassLikeSymbol<*>.outerClass(context: CheckerContext): FirClassLikeSymbo
|
||||
return context.session.symbolProvider.getClassLikeSymbolByFqName(outerClassId)
|
||||
}
|
||||
|
||||
fun FirClass<*>.outerClass(context: CheckerContext): FirClass<*>? {
|
||||
return symbol.outerClass(context)?.fir as? FirClass<*>
|
||||
fun FirClass.outerClass(context: CheckerContext): 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
|
||||
* with `this`. Or null if something goes wrong.
|
||||
*/
|
||||
fun FirClassLikeDeclaration<*>.followAllAlias(session: FirSession): FirClassLikeDeclaration<*>? {
|
||||
var it: FirClassLikeDeclaration<*>? = this
|
||||
fun FirClassLikeDeclaration.followAllAlias(session: FirSession): FirClassLikeDeclaration? {
|
||||
var it: FirClassLikeDeclaration? = this
|
||||
|
||||
while (it is FirTypeAlias) {
|
||||
it = it.expandedTypeRef.firClassLike(session)
|
||||
@@ -168,13 +168,13 @@ fun FirClassLikeDeclaration<*>.followAllAlias(session: FirSession): FirClassLike
|
||||
* item like FirRegularClass or FirAnonymousObject
|
||||
* or null if no such item could be found.
|
||||
*/
|
||||
fun CheckerContext.findClosestClassOrObject(): FirClass<*>? {
|
||||
fun CheckerContext.findClosestClassOrObject(): FirClass? {
|
||||
for (it in containingDeclarations.asReversed()) {
|
||||
if (
|
||||
it is FirRegularClass ||
|
||||
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
|
||||
*/
|
||||
fun FirSimpleFunction.overriddenFunctions(
|
||||
containingClass: FirClass<*>,
|
||||
containingClass: FirClass,
|
||||
context: CheckerContext
|
||||
): List<FirFunctionSymbol<*>> {
|
||||
val firTypeScope = containingClass.unsubstitutedScope(
|
||||
@@ -225,7 +225,7 @@ fun KtModifierKeywordToken.toVisibilityOrNull(): Visibility? {
|
||||
/**
|
||||
* Returns the modality of the class
|
||||
*/
|
||||
fun FirClass<*>.modality(): Modality? {
|
||||
fun FirClass.modality(): Modality? {
|
||||
return when (this) {
|
||||
is FirRegularClass -> modality
|
||||
else -> Modality.FINAL
|
||||
@@ -258,14 +258,14 @@ fun FirStatusOwner.implicitModality(context: CheckerContext): Modality {
|
||||
&& klass.classKind == ClassKind.INTERFACE
|
||||
&& 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 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 FirProperty -> this.setter?.body !is FirEmptyExpressionBlock? || this.getter?.body !is FirEmptyExpressionBlock?
|
||||
else -> false
|
||||
@@ -275,12 +275,12 @@ private fun FirDeclaration<*>.hasBody(): Boolean = when (this) {
|
||||
* Finds any non-interface supertype and returns it
|
||||
* or null if couldn't find any.
|
||||
*/
|
||||
fun FirClass<*>.findNonInterfaceSupertype(context: CheckerContext): FirTypeRef? {
|
||||
fun FirClass.findNonInterfaceSupertype(context: CheckerContext): FirTypeRef? {
|
||||
for (superTypeRef in superTypeRefs) {
|
||||
val lookupTag = superTypeRef.coneType.safeAs<ConeClassLikeType>()?.lookupTag ?: continue
|
||||
|
||||
val fir = lookupTag.toSymbol(context.session)
|
||||
?.fir.safeAs<FirClass<*>>()
|
||||
?.fir.safeAs<FirClass>()
|
||||
?: continue
|
||||
|
||||
if (fir.classKind != ClassKind.INTERFACE) {
|
||||
@@ -381,7 +381,7 @@ private fun lowerThanBound(context: ConeInferenceContext, argument: ConeKotlinTy
|
||||
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 {
|
||||
val subtypeFullyExpanded = subtype.fullyExpandedType(context.session)
|
||||
@@ -418,7 +418,7 @@ private fun isSubtypeOfForFunctionalTypeReturningUnit(
|
||||
return false
|
||||
}
|
||||
|
||||
fun FirCallableMemberDeclaration<*>.isVisibleInClass(parentClass: FirClass<*>): Boolean {
|
||||
fun FirCallableMemberDeclaration.isVisibleInClass(parentClass: FirClass): Boolean {
|
||||
val classPackage = parentClass.symbol.classId.packageFqName
|
||||
if (visibility == Visibilities.Private ||
|
||||
!visibility.visibleFromPackage(classPackage, symbol.callableId.packageName)
|
||||
@@ -435,7 +435,7 @@ fun FirCallableMemberDeclaration<*>.isVisibleInClass(parentClass: FirClass<*>):
|
||||
*
|
||||
* @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 symbol = this.symbol
|
||||
if (symbol is FirIntersectionCallableSymbol) {
|
||||
@@ -510,8 +510,8 @@ private val FirSimpleFunction.matchesDataClassSyntheticMemberSignatures: Boolean
|
||||
(this.name == HASHCODE_NAME && matchesHashCodeSignature) ||
|
||||
(this.name == OperatorNameConventions.TO_STRING && matchesToStringSignature)
|
||||
|
||||
private fun FirDeclaration<*>.getContainingClass(sessionHolder: SessionHolder): FirClassLikeDeclaration<*>? =
|
||||
this.safeAs<FirCallableMemberDeclaration<*>>()?.containingClass()?.toSymbol(sessionHolder.session)?.fir
|
||||
private fun FirDeclaration.getContainingClass(sessionHolder: SessionHolder): FirClassLikeDeclaration? =
|
||||
this.safeAs<FirCallableMemberDeclaration>()?.containingClass()?.toSymbol(sessionHolder.session)?.fir
|
||||
|
||||
// NB: we intentionally do not check return types
|
||||
private val FirSimpleFunction.matchesEqualsSignature: Boolean
|
||||
@@ -625,4 +625,4 @@ fun extractArgumentTypeRefAndSource(typeRef: FirTypeRef?, index: Int): FirTypeRe
|
||||
return null
|
||||
}
|
||||
|
||||
data class FirTypeRefSource(val typeRef: FirTypeRef?, val source: FirSourceElement?)
|
||||
data class FirTypeRefSource(val typeRef: FirTypeRef?, val source: FirSourceElement?)
|
||||
|
||||
+4
-4
@@ -40,7 +40,7 @@ private data class FirSinceKotlinValue(
|
||||
val wasExperimentalMarkerClasses: List<FirRegularClassSymbol>
|
||||
)
|
||||
|
||||
fun FirAnnotatedDeclaration<*>.checkSinceKotlinVersionAccessibility(context: CheckerContext): FirSinceKotlinAccessibility {
|
||||
fun FirAnnotatedDeclaration.checkSinceKotlinVersionAccessibility(context: CheckerContext): FirSinceKotlinAccessibility {
|
||||
val value = getOwnSinceKotlinVersion(context.session)
|
||||
val version = value?.apiVersion
|
||||
val languageVersionSettings = context.session.languageVersionSettings
|
||||
@@ -59,11 +59,11 @@ fun FirAnnotatedDeclaration<*>.checkSinceKotlinVersionAccessibility(context: Che
|
||||
return FirSinceKotlinAccessibility.NotAccessible(version)
|
||||
}
|
||||
|
||||
private fun FirAnnotatedDeclaration<*>.getOwnSinceKotlinVersion(session: FirSession): FirSinceKotlinValue? {
|
||||
private fun FirAnnotatedDeclaration.getOwnSinceKotlinVersion(session: FirSession): FirSinceKotlinValue? {
|
||||
var result: FirSinceKotlinValue? = null
|
||||
|
||||
// TODO: use-site targeted annotations
|
||||
fun FirAnnotatedDeclaration<*>.consider() {
|
||||
fun FirAnnotatedDeclaration.consider() {
|
||||
val sinceKotlinSingleArgument = getAnnotationByFqName(SINCE_KOTLIN_FQ_NAME)?.arguments?.singleOrNull()
|
||||
val apiVersion = ((sinceKotlinSingleArgument as? FirConstExpression<*>)?.value as? String)?.let(ApiVersion.Companion::parse)
|
||||
if (apiVersion != null) {
|
||||
@@ -90,7 +90,7 @@ private fun FirAnnotatedDeclaration<*>.getOwnSinceKotlinVersion(session: FirSess
|
||||
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 annotationClasses = wasExperimental.findArgumentByName(OptInNames.WAS_EXPERIMENTAL_ANNOTATION_CLASS) ?: return emptyList()
|
||||
return annotationClasses.extractClassesFromArgument()
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ abstract class CheckerContext {
|
||||
|
||||
// Context
|
||||
abstract val implicitReceiverStack: ImplicitReceiverStack
|
||||
abstract val containingDeclarations: List<FirDeclaration<*>>
|
||||
abstract val containingDeclarations: List<FirDeclaration>
|
||||
abstract val qualifiedAccessOrAnnotationCalls: List<FirStatement>
|
||||
abstract val getClassCalls: List<FirGetClassCall>
|
||||
|
||||
|
||||
+2
-2
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class PersistentCheckerContext private constructor(
|
||||
override val implicitReceiverStack: PersistentImplicitReceiverStack,
|
||||
override val containingDeclarations: PersistentList<FirDeclaration<*>>,
|
||||
override val containingDeclarations: PersistentList<FirDeclaration>,
|
||||
override val qualifiedAccessOrAnnotationCalls: PersistentList<FirStatement>,
|
||||
override val getClassCalls: PersistentList<FirGetClassCall>,
|
||||
override val sessionHolder: SessionHolder,
|
||||
@@ -58,7 +58,7 @@ class PersistentCheckerContext private constructor(
|
||||
)
|
||||
}
|
||||
|
||||
fun addDeclaration(declaration: FirDeclaration<*>): PersistentCheckerContext {
|
||||
fun addDeclaration(declaration: FirDeclaration): PersistentCheckerContext {
|
||||
return PersistentCheckerContext(
|
||||
implicitReceiverStack,
|
||||
containingDeclarations.add(declaration),
|
||||
|
||||
+4
-4
@@ -34,7 +34,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
|
||||
private val deprecatedSinceKotlinClassId = FqName("kotlin.DeprecatedSinceKotlin")
|
||||
|
||||
override fun check(
|
||||
declaration: FirAnnotatedDeclaration<*>,
|
||||
declaration: FirAnnotatedDeclaration,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter
|
||||
) {
|
||||
@@ -60,7 +60,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
|
||||
}
|
||||
|
||||
private fun checkAnnotationTarget(
|
||||
declaration: FirAnnotatedDeclaration<*>,
|
||||
declaration: FirAnnotatedDeclaration,
|
||||
annotation: FirAnnotationCall,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter
|
||||
@@ -112,7 +112,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
|
||||
}
|
||||
|
||||
private fun checkAnnotationUseSiteTarget(
|
||||
annotated: FirAnnotatedDeclaration<*>,
|
||||
annotated: FirAnnotatedDeclaration,
|
||||
annotation: FirAnnotationCall,
|
||||
target: AnnotationUseSiteTarget,
|
||||
context: CheckerContext,
|
||||
@@ -201,7 +201,7 @@ object FirAnnotationChecker : FirAnnotatedDeclarationChecker() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun getActualTargetList(annotated: FirDeclaration<*>): AnnotationTargetList {
|
||||
private fun getActualTargetList(annotated: FirDeclaration): AnnotationTargetList {
|
||||
return when (annotated) {
|
||||
is FirRegularClass -> {
|
||||
AnnotationTargetList(
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
member is FirConstructor && member.isPrimary -> {
|
||||
for (parameter in member.valueParameters) {
|
||||
|
||||
+4
-4
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.types.Variance
|
||||
import org.jetbrains.kotlin.types.checker.TypeCheckingProcedure
|
||||
|
||||
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)
|
||||
|
||||
for (superTypeRef in declaration.superTypeRefs) {
|
||||
@@ -39,14 +39,14 @@ object FirClassVarianceChecker : FirClassChecker() {
|
||||
checkTypeParameters(member.typeParameters, Variance.IN_VARIANCE, context, reporter)
|
||||
}
|
||||
|
||||
if (member is FirCallableDeclaration<*>) {
|
||||
if (member is FirCallableDeclaration) {
|
||||
checkCallableDeclaration(member, context, reporter)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkCallableDeclaration(
|
||||
member: FirCallableDeclaration<*>,
|
||||
member: FirCallableDeclaration,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter
|
||||
) {
|
||||
@@ -134,7 +134,7 @@ object FirClassVarianceChecker : FirClassChecker() {
|
||||
if (type is ConeClassLikeType) {
|
||||
val fullyExpandedType = type.fullyExpandedType(context.session)
|
||||
val declFir = fullyExpandedType.lookupTag.toSymbol(context.session)?.fir
|
||||
if (declFir is FirClass<*>) {
|
||||
if (declFir is FirClass) {
|
||||
for ((index, typeArgument) in fullyExpandedType.typeArguments.withIndex()) {
|
||||
val paramVariance = (declFir.typeParameters.getOrNull(index) as? FirTypeParameter)?.variance ?: continue
|
||||
|
||||
|
||||
+11
-11
@@ -28,9 +28,9 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
|
||||
|
||||
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 {
|
||||
collectLocalConflicts(declaration, it)
|
||||
}
|
||||
@@ -40,7 +40,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
|
||||
collectLocalConflicts(declaration, it)
|
||||
}
|
||||
|
||||
private fun collectLocalConflicts(declaration: FirDeclaration<*>, conflicting: List<FirDeclaration<*>>) {
|
||||
private fun collectLocalConflicts(declaration: FirDeclaration, conflicting: List<FirDeclaration>) {
|
||||
val localConflicts = SmartSet.create<FirBasedSymbol<*>>()
|
||||
for (otherDeclaration in conflicting) {
|
||||
if (otherDeclaration != declaration && !isExpectAndActual(declaration, otherDeclaration)) {
|
||||
@@ -51,7 +51,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
|
||||
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 (declaration2 !is FirStatusOwner) return false
|
||||
return (declaration1.status.isExpect && declaration2.status.isActual) ||
|
||||
@@ -59,7 +59,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
|
||||
}
|
||||
|
||||
private fun areCompatibleMainFunctions(
|
||||
declaration1: FirDeclaration<*>, file1: FirFile, declaration2: FirDeclaration<*>, file2: FirFile?
|
||||
declaration1: FirDeclaration, file1: FirFile, declaration2: FirDeclaration, file2: FirFile?
|
||||
): Boolean {
|
||||
// TODO: proper main function detector
|
||||
if (declaration1 !is FirSimpleFunction || declaration2 !is FirSimpleFunction) return false
|
||||
@@ -68,7 +68,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
|
||||
}
|
||||
|
||||
private fun collectExternalConflict(
|
||||
declaration: FirDeclaration<*>,
|
||||
declaration: FirDeclaration,
|
||||
declarationPresentation: String,
|
||||
containingFile: FirFile,
|
||||
conflictingSymbol: FirBasedSymbol<*>,
|
||||
@@ -97,7 +97,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
|
||||
}
|
||||
|
||||
fun collectWithExternalConflicts(
|
||||
declaration: FirDeclaration<*>,
|
||||
declaration: FirDeclaration,
|
||||
containingFile: FirFile,
|
||||
session: FirSession,
|
||||
packageMemberScope: FirPackageMemberScope
|
||||
@@ -127,7 +127,7 @@ object FirConflictsChecker : FirBasicDeclarationChecker() {
|
||||
}
|
||||
}
|
||||
}
|
||||
is FirVariable<*> -> {
|
||||
is FirVariable -> {
|
||||
declarationName = declaration.name
|
||||
if (!declarationName.isSpecial) {
|
||||
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()
|
||||
|
||||
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) {
|
||||
is FirSimpleFunction -> 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() {
|
||||
override fun visitElement(element: FirElement) {}
|
||||
|
||||
+4
-2
@@ -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.FirErrors
|
||||
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.visibility
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
|
||||
object FirConstructorAllowedChecker : FirConstructorChecker() {
|
||||
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 elementType = source?.elementType
|
||||
if (elementType != KtNodeTypes.PRIMARY_CONSTRUCTOR && elementType != KtNodeTypes.SECONDARY_CONSTRUCTOR) {
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ object FirContractChecker : FirFunctionChecker() {
|
||||
// TODO: The message should vary. Migrate this to [ConeEffectExtractor] when creating fine-grained errors.
|
||||
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 ||
|
||||
declaration.contractDescription !is FirResolvedContractDescription
|
||||
) {
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
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 FirConstructor || declaration is FirTypeAlias) return
|
||||
|
||||
|
||||
+1
-1
@@ -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.declarations.FirDeclaration
|
||||
|
||||
abstract class FirDeclarationChecker<in D : FirDeclaration<*>> {
|
||||
abstract class FirDeclarationChecker<in D : FirDeclaration> {
|
||||
abstract fun check(declaration: D, context: CheckerContext, reporter: DiagnosticReporter)
|
||||
}
|
||||
|
||||
+4
-4
@@ -184,7 +184,7 @@ private val FirProperty.hasAccessorImplementation: Boolean
|
||||
get() = (getter !is FirDefaultPropertyAccessor && getter?.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 {
|
||||
if (this.classKind != ClassKind.CLASS) return false
|
||||
@@ -192,14 +192,14 @@ internal fun FirRegularClass.isInlineOrValueClass(): Boolean {
|
||||
return isInline || hasModifier(KtTokens.VALUE_KEYWORD)
|
||||
}
|
||||
|
||||
internal val FirDeclaration<*>.isEnumEntryInitializer: Boolean
|
||||
internal val FirDeclaration.isEnumEntryInitializer: Boolean
|
||||
get() {
|
||||
if (this !is FirConstructor || !this.isPrimary) return false
|
||||
return (containingClassAttr as? ConeClassLookupTagWithFixedSymbol)?.symbol?.fir?.classKind == ClassKind.ENUM_ENTRY
|
||||
}
|
||||
|
||||
// contract: returns(true) implies (this is FirMemberDeclaration<*>)
|
||||
internal val FirDeclaration<*>.isLocalMember: Boolean
|
||||
internal val FirDeclaration.isLocalMember: Boolean
|
||||
get() = when (this) {
|
||||
is FirProperty -> this.isLocal
|
||||
is FirRegularClass -> this.isLocal
|
||||
@@ -207,7 +207,7 @@ internal val FirDeclaration<*>.isLocalMember: Boolean
|
||||
else -> false
|
||||
}
|
||||
|
||||
internal val FirCallableMemberDeclaration<*>.isExtensionMember: Boolean
|
||||
internal val FirCallableMemberDeclaration.isExtensionMember: Boolean
|
||||
get() {
|
||||
return receiverTypeRef != null && dispatchReceiverType != null
|
||||
}
|
||||
|
||||
+4
-4
@@ -66,7 +66,7 @@ object FirDestructuringDeclarationChecker : FirPropertyChecker() {
|
||||
val originalDestructuringDeclarationOrInitializerSource = originalDestructuringDeclarationOrInitializer.source ?: return
|
||||
val originalDestructuringDeclarationType =
|
||||
when (originalDestructuringDeclarationOrInitializer) {
|
||||
is FirVariable<*> -> originalDestructuringDeclarationOrInitializer.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||
is FirVariable -> originalDestructuringDeclarationOrInitializer.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||
is FirExpression -> originalDestructuringDeclarationOrInitializer.typeRef.coneTypeSafe<ConeKotlinType>()
|
||||
else -> null
|
||||
} ?: return
|
||||
@@ -109,7 +109,7 @@ object FirDestructuringDeclarationChecker : FirPropertyChecker() {
|
||||
reference: FirErrorNamedReference,
|
||||
property: FirProperty,
|
||||
componentCall: FirComponentCall,
|
||||
destructuringDeclaration: FirVariable<*>,
|
||||
destructuringDeclaration: FirVariable,
|
||||
reporter: DiagnosticReporter,
|
||||
context: CheckerContext
|
||||
) {
|
||||
@@ -181,6 +181,6 @@ object FirDestructuringDeclarationChecker : FirPropertyChecker() {
|
||||
else -> this
|
||||
}
|
||||
|
||||
private val FirQualifiedAccessExpression.resolvedVariable: FirVariable<*>?
|
||||
get() = ((calleeReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirVariableSymbol)?.fir as? FirVariable<*>
|
||||
private val FirQualifiedAccessExpression.resolvedVariable: FirVariable?
|
||||
get() = ((calleeReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirVariableSymbol)?.fir as? FirVariable
|
||||
}
|
||||
|
||||
+5
-5
@@ -25,12 +25,12 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
// TODO: check why coneTypeSafe is necessary at some points inside
|
||||
object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() {
|
||||
override fun check(declaration: FirDeclaration<*>, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
when (declaration) {
|
||||
is FirAnonymousFunction -> return
|
||||
is FirTypeAlias -> checkTypeAlias(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)
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
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) {
|
||||
@@ -172,7 +172,7 @@ object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() {
|
||||
|
||||
private fun checkMemberReceiver(
|
||||
typeRef: FirTypeRef?,
|
||||
memberDeclaration: FirCallableMemberDeclaration<*>?,
|
||||
memberDeclaration: FirCallableMemberDeclaration?,
|
||||
reporter: DiagnosticReporter,
|
||||
context: CheckerContext
|
||||
) {
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ object FirFunctionNameChecker : FirSimpleFunctionChecker() {
|
||||
val source = declaration.source
|
||||
if (source == null || source.kind is FirFakeSourceElementKind) return
|
||||
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) {
|
||||
reporter.reportOn(source, FirErrors.FUNCTION_DECLARATION_WITH_NO_NAME, context)
|
||||
}
|
||||
|
||||
+9
-6
@@ -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.isInline
|
||||
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.FirFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
@@ -28,14 +31,14 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||
|
||||
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)
|
||||
checkParameterTypes(declaration, context, reporter)
|
||||
checkUninitializedParameter(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) {
|
||||
val returnTypeRef = valueParameter.returnTypeRef
|
||||
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 }
|
||||
if (varargParameters.size > 1) {
|
||||
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()) {
|
||||
// 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.
|
||||
@@ -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) {
|
||||
// `val/var` is valid for primary constructors, but not for secondary constructors
|
||||
return
|
||||
|
||||
+6
-3
@@ -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.FirErrors
|
||||
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() {
|
||||
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 is FirSimpleFunction) {
|
||||
if (declaration.valueParameters.size != 1 || !hasExtensionOrDispatchReceiver(declaration, context)) {
|
||||
@@ -28,6 +31,6 @@ object FirInfixFunctionDeclarationChecker : FirBasicDeclarationChecker() {
|
||||
context: CheckerContext
|
||||
): Boolean {
|
||||
if (function.receiverTypeRef != null) return true
|
||||
return context.containingDeclarations.lastOrNull() is FirClass<*>
|
||||
return context.containingDeclarations.lastOrNull() is FirClass
|
||||
}
|
||||
}
|
||||
|
||||
+8
-8
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
|
||||
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
|
||||
// local inline functions are prohibited
|
||||
if (declaration.isLocalMember) return
|
||||
@@ -47,7 +47,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
|
||||
}
|
||||
|
||||
private fun checkInlineFunctionBody(
|
||||
function: FirFunction<*>,
|
||||
function: FirFunction,
|
||||
effectiveVisibility: EffectiveVisibility,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter
|
||||
@@ -70,7 +70,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
|
||||
}
|
||||
|
||||
private class Visitor(
|
||||
val inlineFunction: FirFunction<*>,
|
||||
val inlineFunction: FirFunction,
|
||||
val inlineFunEffectiveVisibility: EffectiveVisibility,
|
||||
val inlinableParameters: List<FirValueParameter>,
|
||||
val session: FirSession,
|
||||
@@ -175,7 +175,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
|
||||
) {
|
||||
val source = qualifiedAccess.source ?: return
|
||||
if (targetSymbol == null) return
|
||||
val targetFir = targetSymbol.fir as? FirCallableMemberDeclaration<*>
|
||||
val targetFir = targetSymbol.fir as? FirCallableMemberDeclaration
|
||||
|
||||
if (targetSymbol.fir in inlinableParameters) {
|
||||
if (!qualifiedAccess.partOfCall(context)) {
|
||||
@@ -199,7 +199,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
|
||||
|
||||
private fun checkVisibilityAndAccess(
|
||||
accessExpression: FirQualifiedAccess,
|
||||
calledDeclaration: FirCallableMemberDeclaration<*>?,
|
||||
calledDeclaration: FirCallableMemberDeclaration?,
|
||||
source: FirSourceElement,
|
||||
context: CheckerContext
|
||||
) {
|
||||
@@ -248,7 +248,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
|
||||
}
|
||||
|
||||
private fun checkPrivateClassMemberAccess(
|
||||
calledDeclaration: FirCallableMemberDeclaration<*>,
|
||||
calledDeclaration: FirCallableMemberDeclaration,
|
||||
source: FirSourceElement,
|
||||
context: CheckerContext
|
||||
) {
|
||||
@@ -266,7 +266,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
|
||||
}
|
||||
|
||||
private fun checkSuperCalls(
|
||||
calledDeclaration: FirCallableMemberDeclaration<*>,
|
||||
calledDeclaration: FirCallableMemberDeclaration,
|
||||
callExpression: FirQualifiedAccess,
|
||||
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 containingClassVisibility = when (containingClass) {
|
||||
|
||||
+5
-3
@@ -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.FirErrors
|
||||
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.inference.inferenceComponents
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.isKClassType
|
||||
@@ -21,7 +23,7 @@ import org.jetbrains.kotlin.fir.types.*
|
||||
object FirKClassWithIncorrectTypeArgumentChecker : FirFileChecker() {
|
||||
override fun check(declaration: FirFile, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
for (topLevelDeclaration in declaration.declarations) {
|
||||
if (topLevelDeclaration is FirCallableMemberDeclaration<*>) {
|
||||
if (topLevelDeclaration is FirCallableMemberDeclaration) {
|
||||
checkTopLevelDeclaration(topLevelDeclaration, context, reporter)
|
||||
}
|
||||
}
|
||||
@@ -31,7 +33,7 @@ object FirKClassWithIncorrectTypeArgumentChecker : FirFileChecker() {
|
||||
// bad: fun <T> test1() = T::class
|
||||
// okay: fun <T: Any> test2() = T::class
|
||||
private fun checkTopLevelDeclaration(
|
||||
declaration: FirCallableMemberDeclaration<*>,
|
||||
declaration: FirCallableMemberDeclaration,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter
|
||||
) {
|
||||
|
||||
+7
-7
@@ -107,7 +107,7 @@ object FirModifierChecker : FirBasicDeclarationChecker() {
|
||||
secondModifier: FirModifier<*>,
|
||||
reporter: DiagnosticReporter,
|
||||
reportedNodes: MutableSet<FirModifier<*>>,
|
||||
owner: FirDeclaration<*>?,
|
||||
owner: FirDeclaration?,
|
||||
context: CheckerContext
|
||||
) {
|
||||
val firstToken = firstModifier.token
|
||||
@@ -126,7 +126,7 @@ object FirModifierChecker : FirBasicDeclarationChecker() {
|
||||
reporter.reportDeprecatedModifierPair(secondModifier, secondToken, firstToken, context)
|
||||
}
|
||||
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
|
||||
}
|
||||
if (reportedNodes.add(firstModifier)) reporter.reportIncompatibleModifiers(firstModifier, firstToken, secondToken, context)
|
||||
@@ -137,7 +137,7 @@ object FirModifierChecker : FirBasicDeclarationChecker() {
|
||||
|
||||
private fun checkModifiers(
|
||||
list: FirModifierList,
|
||||
owner: FirDeclaration<*>,
|
||||
owner: FirDeclaration,
|
||||
reporter: DiagnosticReporter,
|
||||
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) {
|
||||
KtNodeTypes.CLASS -> declaration is FirClass<*>
|
||||
KtNodeTypes.OBJECT_DECLARATION -> declaration is FirClass<*>
|
||||
KtNodeTypes.CLASS -> declaration is FirClass
|
||||
KtNodeTypes.OBJECT_DECLARATION -> declaration is FirClass
|
||||
KtNodeTypes.PROPERTY -> declaration is FirProperty
|
||||
KtNodeTypes.VALUE_PARAMETER -> declaration is FirValueParameter
|
||||
// TODO more FIR-PSI relations possibly have to be added
|
||||
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
|
||||
|
||||
val source = declaration.source ?: return
|
||||
|
||||
+3
-2
@@ -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.FirErrors.NESTED_CLASS_NOT_ALLOWED
|
||||
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.isInner
|
||||
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)
|
||||
}
|
||||
}
|
||||
is FirClass<*> -> {
|
||||
is FirClass -> {
|
||||
// Since 1.3, enum entries can contain inner classes only.
|
||||
// Companion objects are reported with code WRONG_MODIFIER_CONTAINING_DECLARATION instead
|
||||
if (containingDeclaration.classKind == ClassKind.ENUM_ENTRY && !declaration.isInner && !declaration.isCompanion) {
|
||||
|
||||
+3
-3
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.util.ImplementationStatus
|
||||
|
||||
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 sourceKind = source.kind
|
||||
if (sourceKind is FirFakeSourceElementKind && sourceKind != FirFakeSourceElementKind.EnumInitializer) return
|
||||
@@ -53,7 +53,7 @@ object FirNotImplementedOverrideChecker : FirClassChecker() {
|
||||
val invisibleSymbols = mutableListOf<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)) {
|
||||
ImplementationStatus.AMBIGUOUSLY_INHERITED -> notImplementedIntersectionSymbols.add(symbol)
|
||||
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
|
||||
}
|
||||
|
||||
+2
-2
@@ -21,10 +21,10 @@ import org.jetbrains.kotlin.fir.declarations.utils.isOpen
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
|
||||
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
|
||||
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
|
||||
memberDeclaration is FirConstructor
|
||||
) continue
|
||||
|
||||
+12
-12
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.types.AbstractTypeCheckerContext
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
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(
|
||||
errorTypesEqualToAnything = false,
|
||||
stubTypesEqualToAnything = false
|
||||
@@ -44,12 +44,12 @@ object FirOverrideChecker : FirClassChecker() {
|
||||
|
||||
for (it in declaration.declarations) {
|
||||
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) {
|
||||
is FirSimpleFunction -> {
|
||||
processFunctionsByName(member.name) {}
|
||||
@@ -64,8 +64,8 @@ object FirOverrideChecker : FirClassChecker() {
|
||||
}
|
||||
|
||||
private fun ConeKotlinType.substituteAllTypeParameters(
|
||||
overrideDeclaration: FirCallableMemberDeclaration<*>,
|
||||
baseDeclaration: FirCallableDeclaration<*>,
|
||||
overrideDeclaration: FirCallableMemberDeclaration,
|
||||
baseDeclaration: FirCallableDeclaration,
|
||||
context: CheckerContext
|
||||
): ConeKotlinType {
|
||||
if (overrideDeclaration.typeParameters.isEmpty()) {
|
||||
@@ -90,7 +90,7 @@ object FirOverrideChecker : FirClassChecker() {
|
||||
|
||||
private fun checkModality(
|
||||
overriddenSymbols: List<FirCallableSymbol<*>>,
|
||||
): FirCallableDeclaration<*>? {
|
||||
): FirCallableDeclaration? {
|
||||
for (overridden in overriddenSymbols) {
|
||||
if (overridden.fir !is FirStatusOwner) continue
|
||||
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()
|
||||
}
|
||||
|
||||
private fun FirCallableMemberDeclaration<*>.checkVisibility(
|
||||
private fun FirCallableMemberDeclaration.checkVisibility(
|
||||
reporter: DiagnosticReporter,
|
||||
overriddenSymbols: List<FirCallableSymbol<*>>,
|
||||
context: CheckerContext
|
||||
@@ -135,7 +135,7 @@ object FirOverrideChecker : FirClassChecker() {
|
||||
}
|
||||
|
||||
// See [OverrideResolver#isReturnTypeOkForOverride]
|
||||
private fun FirCallableMemberDeclaration<*>.checkReturnType(
|
||||
private fun FirCallableMemberDeclaration.checkReturnType(
|
||||
overriddenSymbols: List<FirCallableSymbol<*>>,
|
||||
typeCheckerContext: AbstractTypeCheckerContext,
|
||||
context: CheckerContext,
|
||||
@@ -169,7 +169,7 @@ object FirOverrideChecker : FirClassChecker() {
|
||||
}
|
||||
|
||||
private fun checkMember(
|
||||
member: FirCallableMemberDeclaration<*>,
|
||||
member: FirCallableMemberDeclaration,
|
||||
reporter: DiagnosticReporter,
|
||||
typeCheckerContext: AbstractTypeCheckerContext,
|
||||
firTypeScope: FirTypeScope,
|
||||
@@ -241,7 +241,7 @@ object FirOverrideChecker : FirClassChecker() {
|
||||
|
||||
private fun DiagnosticReporter.reportOverridingFinalMember(
|
||||
overriding: FirStatusOwner,
|
||||
overridden: FirCallableDeclaration<*>,
|
||||
overridden: FirCallableDeclaration,
|
||||
context: CheckerContext
|
||||
) {
|
||||
overridden.containingClass()?.let { containingClass ->
|
||||
@@ -259,7 +259,7 @@ object FirOverrideChecker : FirClassChecker() {
|
||||
|
||||
private fun DiagnosticReporter.reportCannotWeakenAccessPrivilege(
|
||||
overriding: FirStatusOwner,
|
||||
overridden: FirCallableDeclaration<*>,
|
||||
overridden: FirCallableDeclaration,
|
||||
context: CheckerContext
|
||||
) {
|
||||
val containingClass = overridden.containingClass() ?: return
|
||||
@@ -275,7 +275,7 @@ object FirOverrideChecker : FirClassChecker() {
|
||||
|
||||
private fun DiagnosticReporter.reportCannotChangeAccessPrivilege(
|
||||
overriding: FirStatusOwner,
|
||||
overridden: FirCallableDeclaration<*>,
|
||||
overridden: FirCallableDeclaration,
|
||||
context: CheckerContext
|
||||
) {
|
||||
val containingClass = overridden.containingClass() ?: return
|
||||
|
||||
+2
-2
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.types.Variance
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
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) {
|
||||
return
|
||||
}
|
||||
@@ -32,7 +32,7 @@ object FirProjectionRelationChecker : FirBasicDeclarationChecker() {
|
||||
}
|
||||
|
||||
when (declaration) {
|
||||
is FirClass<*> -> {
|
||||
is FirClass -> {
|
||||
for (it in declaration.superTypeRefs) {
|
||||
checkTypeRef(it, context, reporter)
|
||||
}
|
||||
|
||||
+5
-4
@@ -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.FirErrors
|
||||
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.resolve.symbolProvider
|
||||
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
|
||||
|
||||
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
|
||||
if (declaration.classId.isLocal) {
|
||||
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) {
|
||||
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) {
|
||||
val classId = it.coneType.classId ?: continue
|
||||
|
||||
|
||||
+2
-2
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.name.StandardClassIds
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
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
|
||||
var nullableSupertypeReported = false
|
||||
var extensionFunctionSupertypeReported = false
|
||||
@@ -159,7 +159,7 @@ object FirSupertypesChecker : FirClassChecker() {
|
||||
}
|
||||
|
||||
private fun checkDelegationNotToInterface(
|
||||
declaration: FirClass<*>,
|
||||
declaration: FirClass,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter
|
||||
) {
|
||||
|
||||
+4
-4
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassErrorType
|
||||
|
||||
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))
|
||||
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) }
|
||||
|
||||
private fun FirClass<*>.hasGenericOuterDeclaration(context: CheckerContext) =
|
||||
private fun FirClass.hasGenericOuterDeclaration(context: CheckerContext) =
|
||||
classId.isLocal && context.containingDeclarations.anyIsGeneric()
|
||||
|
||||
private fun Collection<FirDeclaration<*>>.anyIsGeneric() =
|
||||
private fun Collection<FirDeclaration>.anyIsGeneric() =
|
||||
any { it is FirTypeParameterRefsOwner && it.typeParameters.isNotEmpty() }
|
||||
}
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.getDanglingTypeConstraintsOrE
|
||||
|
||||
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
|
||||
|
||||
//basically we transfer errors, which were discovered in ast parsers
|
||||
|
||||
+2
-2
@@ -48,7 +48,7 @@ object FirTypeParameterBoundsChecker : FirTypeParameterChecker() {
|
||||
|
||||
private fun checkFinalUpperBounds(
|
||||
declaration: FirTypeParameter,
|
||||
containingDeclaration: FirDeclaration<*>,
|
||||
containingDeclaration: FirDeclaration,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter
|
||||
) {
|
||||
@@ -72,7 +72,7 @@ object FirTypeParameterBoundsChecker : FirTypeParameterChecker() {
|
||||
|
||||
private fun checkTypeAliasBound(
|
||||
declaration: FirTypeParameter,
|
||||
containingDeclaration: FirDeclaration<*>,
|
||||
containingDeclaration: FirDeclaration,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter
|
||||
) {
|
||||
|
||||
+3
-3
@@ -12,8 +12,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
|
||||
object FirUpperBoundViolatedDeclarationChecker : FirBasicDeclarationChecker() {
|
||||
override fun check(declaration: FirDeclaration<*>, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
if (declaration is FirClass<*>) {
|
||||
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
if (declaration is FirClass) {
|
||||
for (typeParameter in declaration.typeParameters) {
|
||||
if (typeParameter is FirTypeParameter) {
|
||||
for (bound in typeParameter.bounds) {
|
||||
@@ -27,7 +27,7 @@ object FirUpperBoundViolatedDeclarationChecker : FirBasicDeclarationChecker() {
|
||||
}
|
||||
} else if (declaration is FirTypeAlias) {
|
||||
checkUpperBoundViolated(declaration.expandedTypeRef, context, reporter, isIgnoreTypeParameters = true)
|
||||
} else if (declaration is FirCallableDeclaration<*>) {
|
||||
} else if (declaration is FirCallableDeclaration) {
|
||||
if (declaration.returnTypeRef.source?.kind !is FirFakeSourceElementKind) {
|
||||
checkUpperBoundViolated(
|
||||
declaration.returnTypeRef, context, reporter,
|
||||
|
||||
+1
-1
@@ -33,7 +33,7 @@ object FirAbstractSuperCallChecker : FirQualifiedAccessExpressionChecker() {
|
||||
|
||||
if (closestClass.classKind == ClassKind.CLASS) {
|
||||
// handles all the FirSimpleFunction/FirProperty/etc.
|
||||
val item = expression.getDeclaration<FirCallableMemberDeclaration<*>>()
|
||||
val item = expression.getDeclaration<FirCallableMemberDeclaration>()
|
||||
?: return
|
||||
|
||||
val declaration = item.getContainingClass(context).safeAs<FirRegularClass>()
|
||||
|
||||
+5
-2
@@ -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.FirErrors
|
||||
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.FirGetClassCall
|
||||
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) {
|
||||
reporter.reportOn(source, FirErrors.CALLABLE_REFERENCE_TO_ANNOTATION_CONSTRUCTOR, context)
|
||||
}
|
||||
if ((referredDeclaration as? FirCallableMemberDeclaration<*>)?.isExtensionMember == true &&
|
||||
if ((referredDeclaration as? FirCallableMemberDeclaration)?.isExtensionMember == true &&
|
||||
!referredDeclaration.isLocalMember
|
||||
) {
|
||||
reporter.reportOn(source, FirErrors.EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED, referredDeclaration, context)
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@ object FirExpressionAnnotationChecker : FirBasicExpressionChecker() {
|
||||
override fun check(expression: FirStatement, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
// Declarations are checked separately
|
||||
// See KT-33658 about annotations on non-expression statements
|
||||
if (expression is FirDeclaration<*> ||
|
||||
if (expression is FirDeclaration ||
|
||||
expression !is FirExpression ||
|
||||
expression is FirBlock && expression.source?.kind == FirFakeSourceElementKind.DesugaredForLoop
|
||||
) return
|
||||
|
||||
+2
-2
@@ -38,10 +38,10 @@ object FirNotASupertypeChecker : FirQualifiedAccessExpressionChecker() {
|
||||
* item like FirRegularClass or FirAnonymousObject
|
||||
* 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()) {
|
||||
if (it is FirRegularClass || it is FirAnonymousObject) {
|
||||
val firClass = it as FirClass<*>
|
||||
val firClass = it as FirClass
|
||||
val className = firClass.symbol.classId.shortClassName
|
||||
if (label == null || (!className.isSpecial && className.identifier == label)) {
|
||||
return firClass
|
||||
|
||||
+3
-3
@@ -27,7 +27,7 @@ object FirQualifiedSupertypeExtendedByOtherSupertypeChecker : FirQualifiedAccess
|
||||
|
||||
val explicitType = superReference.superTypeRef
|
||||
.firClassLike(context.session)
|
||||
?.followAllAlias(context.session).safeAs<FirClass<*>>()
|
||||
?.followAllAlias(context.session).safeAs<FirClass>()
|
||||
?: return
|
||||
|
||||
val surroundingType = context.findClosestClassOrObject()
|
||||
@@ -37,11 +37,11 @@ object FirQualifiedSupertypeExtendedByOtherSupertypeChecker : FirQualifiedAccess
|
||||
// have `explicitType` as their supertype or
|
||||
// equal to it
|
||||
var count = 0
|
||||
var candidate: FirClass<*>? = null
|
||||
var candidate: FirClass? = null
|
||||
|
||||
for (it in surroundingType.superTypeRefs) {
|
||||
val that = it.firClassLike(context.session)
|
||||
?.followAllAlias(context.session).safeAs<FirClass<*>>()
|
||||
?.followAllAlias(context.session).safeAs<FirClass>()
|
||||
?: continue
|
||||
|
||||
val isSupertype = explicitType.isSupertypeOf(that, context.session)
|
||||
|
||||
+6
-6
@@ -112,17 +112,17 @@ object FirReservedUnderscoreExpressionChecker : FirBasicExpressionChecker() {
|
||||
}
|
||||
|
||||
object FirReservedUnderscoreDeclarationChecker : FirBasicDeclarationChecker() {
|
||||
override fun check(declaration: FirDeclaration<*>, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
if (
|
||||
declaration is FirClass<*> ||
|
||||
declaration is FirFunction<*> ||
|
||||
declaration is FirClass ||
|
||||
declaration is FirFunction ||
|
||||
declaration is FirTypeParameter ||
|
||||
declaration is FirProperty ||
|
||||
declaration is FirTypeAlias
|
||||
) {
|
||||
reportIfUnderscore(declaration, context, reporter)
|
||||
|
||||
if (declaration is FirFunction<*>) {
|
||||
if (declaration is FirFunction) {
|
||||
for (parameter in declaration.valueParameters) {
|
||||
reportIfUnderscore(
|
||||
parameter,
|
||||
@@ -141,7 +141,7 @@ object FirReservedUnderscoreDeclarationChecker : FirBasicDeclarationChecker() {
|
||||
}
|
||||
|
||||
private fun reportIfUnderscore(
|
||||
declaration: FirDeclaration<*>,
|
||||
declaration: FirDeclaration,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter,
|
||||
isSingleUnderscoreAllowed: Boolean = false
|
||||
@@ -160,7 +160,7 @@ private fun reportIfUnderscore(
|
||||
|
||||
val returnOrReceiverTypeRef = when (declaration) {
|
||||
is FirValueParameter -> declaration.returnTypeRef.source
|
||||
is FirFunction<*> -> declaration.receiverTypeRef?.source
|
||||
is FirFunction -> declaration.receiverTypeRef?.source
|
||||
else -> null
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -27,7 +27,7 @@ object FirReturnAllowedChecker : FirReturnExpressionChecker() {
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
@@ -36,8 +36,8 @@ object FirReturnAllowedChecker : FirReturnExpressionChecker() {
|
||||
for (containingDeclaration in context.containingDeclarations.asReversed()) {
|
||||
when (containingDeclaration) {
|
||||
// return from member of local class or anonymous object
|
||||
is FirClass<*> -> return false
|
||||
is FirFunction<*> -> {
|
||||
is FirClass -> return false
|
||||
is FirFunction -> {
|
||||
when {
|
||||
containingDeclaration.symbol == targetSymbol -> return true
|
||||
containingDeclaration is FirAnonymousFunction -> {
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ object FirSuperNotAvailableChecker : FirQualifiedAccessExpressionChecker() {
|
||||
if (expression.calleeReference.safeAs<FirSuperReference>()?.hadExplicitTypeInSource() != true) return
|
||||
|
||||
val isInsideClass = context.containingDeclarations.any {
|
||||
it is FirClass<*>
|
||||
it is FirClass
|
||||
}
|
||||
|
||||
if (!isInsideClass) {
|
||||
|
||||
+1
-1
@@ -44,7 +44,7 @@ object FirSuperclassNotAccessibleFromInterfaceChecker : FirQualifiedAccessExpres
|
||||
* Returns the ClassLikeDeclaration where the function has been defined
|
||||
* 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)
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -22,13 +22,13 @@ import org.jetbrains.kotlin.fir.declarations.FirStatusOwner
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
||||
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
|
||||
|
||||
override fun checkLightTree(
|
||||
element: FirDeclaration<*>,
|
||||
element: FirDeclaration,
|
||||
source: FirSourceElement,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter
|
||||
@@ -37,7 +37,7 @@ object RedundantModalityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirD
|
||||
val modality = element.modality ?: return
|
||||
if (
|
||||
modality == Modality.FINAL
|
||||
&& (context.containingDeclarations.last() as? FirClass<*>)?.classKind == ClassKind.INTERFACE
|
||||
&& (context.containingDeclarations.last() as? FirClass)?.classKind == ClassKind.INTERFACE
|
||||
) return
|
||||
|
||||
if (source.treeStructure.modalityModifier(source.lighterASTNode) == null) return
|
||||
|
||||
+6
-6
@@ -24,10 +24,10 @@ import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
|
||||
object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirDeclaration<*>, KtDeclaration>() {
|
||||
object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<FirDeclaration, KtDeclaration>() {
|
||||
|
||||
override fun checkLightTree(
|
||||
element: FirDeclaration<*>,
|
||||
element: FirDeclaration,
|
||||
source: FirSourceElement,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter
|
||||
@@ -43,7 +43,7 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
|
||||
val explicitVisibility = (visibilityModifier?.tokenType as? KtModifierKeywordToken)?.toVisibilityOrNull()
|
||||
val implicitVisibility = element.implicitVisibility(context)
|
||||
val containingMemberDeclaration = context.findClosest<FirStatusOwner>()
|
||||
require(containingMemberDeclaration is FirDeclaration<*>?)
|
||||
require(containingMemberDeclaration is FirDeclaration?)
|
||||
|
||||
val redundantVisibility = when {
|
||||
explicitVisibility == implicitVisibility -> implicitVisibility
|
||||
@@ -62,7 +62,7 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
|
||||
reporter.reportOn(source, FirErrors.REDUNDANT_VISIBILITY_MODIFIER, context)
|
||||
}
|
||||
|
||||
private fun FirDeclaration<*>.implicitVisibility(context: CheckerContext): Visibility {
|
||||
private fun FirDeclaration.implicitVisibility(context: CheckerContext): Visibility {
|
||||
return when {
|
||||
this is FirPropertyAccessor && isSetter && status.isOverride -> this.visibility
|
||||
|
||||
@@ -83,7 +83,7 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
|
||||
}
|
||||
|
||||
this is FirSimpleFunction
|
||||
&& context.containingDeclarations.last() is FirClass<*>
|
||||
&& context.containingDeclarations.last() is FirClass
|
||||
&& this.isOverride -> findFunctionVisibility(this, context)
|
||||
|
||||
else -> Visibilities.DEFAULT_VISIBILITY
|
||||
@@ -107,7 +107,7 @@ object RedundantVisibilityModifierSyntaxChecker : FirDeclarationSyntaxChecker<Fi
|
||||
return visibility
|
||||
}
|
||||
|
||||
private fun FirFunction<*>.visibility(): Visibility? {
|
||||
private fun FirFunction.visibility(): Visibility? {
|
||||
(symbol.fir as? FirStatusOwner)?.visibility?.let {
|
||||
return it
|
||||
}
|
||||
|
||||
+1
-1
@@ -48,7 +48,7 @@ interface FirSyntaxChecker<in D : FirElement, P : PsiElement> {
|
||||
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>(),
|
||||
FirSyntaxChecker<D, P> {
|
||||
final override fun check(declaration: D, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ abstract class AbstractDiagnosticCollector(
|
||||
override val scopeSession: ScopeSession = ScopeSession(),
|
||||
protected val createComponents: (DiagnosticReporter) -> List<AbstractDiagnosticCollectorComponent>,
|
||||
) : SessionHolder {
|
||||
fun collectDiagnostics(firDeclaration: FirDeclaration<*>, reporter: DiagnosticReporter) {
|
||||
fun collectDiagnostics(firDeclaration: FirDeclaration, reporter: DiagnosticReporter) {
|
||||
val components = createComponents(reporter)
|
||||
val visitor = createVisitor(components)
|
||||
firDeclaration.accept(visitor, null)
|
||||
|
||||
+7
-7
@@ -24,8 +24,8 @@ abstract class AbstractDiagnosticCollectorVisitor(
|
||||
@set:PrivateForInline var context: PersistentCheckerContext,
|
||||
) : FirDefaultVisitor<Unit, Nothing?>() {
|
||||
|
||||
protected open fun shouldVisitDeclaration(declaration: FirDeclaration<*>) = true
|
||||
protected open fun onDeclarationExit(declaration: FirDeclaration<*>) {}
|
||||
protected open fun shouldVisitDeclaration(declaration: FirDeclaration) = true
|
||||
protected open fun onDeclarationExit(declaration: FirDeclaration) {}
|
||||
|
||||
protected open fun visitNestedElements(element: FirElement) {
|
||||
element.acceptChildren(this, null)
|
||||
@@ -64,7 +64,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
|
||||
visitJump(continueExpression)
|
||||
}
|
||||
|
||||
private fun visitClassAndChildren(klass: FirClass<*>, type: ConeKotlinType) {
|
||||
private fun visitClassAndChildren(klass: FirClass, type: ConeKotlinType) {
|
||||
val typeRef = buildResolvedTypeRef {
|
||||
this.type = type
|
||||
}
|
||||
@@ -204,7 +204,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
|
||||
}
|
||||
|
||||
protected inline fun visitWithDeclaration(
|
||||
declaration: FirDeclaration<*>,
|
||||
declaration: FirDeclaration,
|
||||
block: () -> Unit = { visitNestedElements(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) {
|
||||
withLabelAndReceiverType(
|
||||
labelName,
|
||||
@@ -265,7 +265,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
|
||||
|
||||
|
||||
@OptIn(PrivateForInline::class)
|
||||
inline fun <R> withDeclaration(declaration: FirDeclaration<*>, block: () -> R): R {
|
||||
inline fun <R> withDeclaration(declaration: FirDeclaration, block: () -> R): R {
|
||||
val existingContext = context
|
||||
context = context.addDeclaration(declaration)
|
||||
try {
|
||||
@@ -279,7 +279,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
|
||||
@OptIn(PrivateForInline::class)
|
||||
inline fun <R> withLabelAndReceiverType(
|
||||
labelName: Name?,
|
||||
owner: FirDeclaration<*>,
|
||||
owner: FirDeclaration,
|
||||
type: ConeKotlinType?,
|
||||
block: () -> R
|
||||
): R {
|
||||
|
||||
+3
-4
@@ -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.declaration.DeclarationCheckers
|
||||
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.declarations.*
|
||||
import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference
|
||||
@@ -33,8 +32,8 @@ class ControlFlowAnalysisDiagnosticComponent(
|
||||
visitClass(anonymousObject, anonymousObject.controlFlowGraphReference, data)
|
||||
}
|
||||
|
||||
private fun <F : FirClass<F>> visitClass(
|
||||
klass: FirClass<F>,
|
||||
private fun visitClass(
|
||||
klass: FirClass,
|
||||
controlFlowGraphReference: FirControlFlowGraphReference?,
|
||||
data: CheckerContext
|
||||
) {
|
||||
@@ -50,7 +49,7 @@ class ControlFlowAnalysisDiagnosticComponent(
|
||||
|
||||
// ------------------------------- 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
|
||||
|
||||
controlFlowAnalyzer.analyzeFunction(function, graph, data, reporter)
|
||||
|
||||
+2
-2
@@ -29,7 +29,7 @@ class DeclarationCheckersDiagnosticComponent(
|
||||
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)
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ class DeclarationCheckersDiagnosticComponent(
|
||||
checkers.allBasicDeclarationCheckers.check(anonymousInitializer, data, reporter)
|
||||
}
|
||||
|
||||
private fun <D : FirDeclaration<*>> Collection<FirDeclarationChecker<D>>.check(
|
||||
private fun <D : FirDeclaration> Collection<FirDeclarationChecker<D>>.check(
|
||||
declaration: D,
|
||||
context: CheckerContext,
|
||||
reporter: DiagnosticReporter
|
||||
|
||||
+2
-2
@@ -60,7 +60,7 @@ object FirDiagnosticRenderers {
|
||||
val NAME = Renderer { element: FirElement ->
|
||||
when (element) {
|
||||
is FirStatusOwner -> DECLARATION_NAME.render(element)
|
||||
is FirCallableDeclaration<*> -> element.symbol.callableId.callableName.asString()
|
||||
is FirCallableDeclaration -> element.symbol.callableId.callableName.asString()
|
||||
else -> "???"
|
||||
}
|
||||
}
|
||||
@@ -83,7 +83,7 @@ object FirDiagnosticRenderers {
|
||||
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 classOrObject = if (firClass is FirRegularClass) "Class" else "Object"
|
||||
"$classOrObject $name"
|
||||
|
||||
@@ -378,12 +378,12 @@ class MultiModuleHtmlFirDump(private val outputRoot: File) {
|
||||
visitElement(regularClass)
|
||||
}
|
||||
|
||||
fun indexDeclaration(declaration: FirDeclaration<*>) {
|
||||
fun indexDeclaration(declaration: FirDeclaration) {
|
||||
symbols[declaration.symbol] = location
|
||||
symbolIds[declaration.symbol] = symbolCounter++
|
||||
}
|
||||
|
||||
override fun <F : FirVariable<F>> visitVariable(variable: FirVariable<F>) {
|
||||
override fun visitVariable(variable: FirVariable) {
|
||||
indexDeclaration(variable)
|
||||
visitElement(variable)
|
||||
}
|
||||
@@ -919,7 +919,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
|
||||
is FirEnumEntry -> generate(statusOwner)
|
||||
is FirRegularClass -> 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 FirTypeAlias -> generate(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)
|
||||
}
|
||||
|
||||
@@ -1047,7 +1047,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
|
||||
is FirWhenExpression -> generate(statement, isStatement = true)
|
||||
is FirTryExpression -> generate(statement, isStatement = true)
|
||||
is FirExpression -> iline { generate(statement) }
|
||||
is FirVariable<*> -> iline { generate(statement) }
|
||||
is FirVariable -> iline { generate(statement) }
|
||||
is FirVariableAssignment -> iline { generate(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) {
|
||||
keyword("val ")
|
||||
} 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)
|
||||
|
||||
fir.receiverTypeRef?.let {
|
||||
@@ -1131,7 +1131,7 @@ class HtmlFirDump internal constructor(private var linkResolver: FirLinkResolver
|
||||
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)
|
||||
|
||||
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()) {
|
||||
+" {"
|
||||
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) {
|
||||
is FirAnonymousInitializer -> generate(declaration)
|
||||
is FirStatusOwner -> generate(declaration as FirStatusOwner)
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.FirStatusOwner
|
||||
import org.jetbrains.kotlin.fir.moduleData
|
||||
|
||||
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 declarationModuleData = declaration.moduleData
|
||||
return useSiteModuleData == declarationModuleData || declarationModuleData in useSiteModuleData.friendDependencies
|
||||
|
||||
+5
-2
@@ -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.unsubstitutedScope
|
||||
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.dispatchReceiverTypeOrNull
|
||||
import org.jetbrains.kotlin.fir.originalOrSelf
|
||||
@@ -50,7 +53,7 @@ object FirJvmOverridesBackwardCompatibilityHelper : FirOverridesBackwardCompatib
|
||||
visitedSymbols: MutableSet<FirCallableSymbol<*>>,
|
||||
context: CheckerContext
|
||||
): Boolean {
|
||||
val fir = symbol.fir as? FirCallableMemberDeclaration<*> ?: return false
|
||||
val fir = symbol.fir as? FirCallableMemberDeclaration ?: return false
|
||||
if (fir.isFinal) return false
|
||||
|
||||
if (symbol in visitedSymbols) return true
|
||||
|
||||
+6
-3
@@ -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.scopes.FirScopeProvider
|
||||
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.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
@@ -192,8 +195,8 @@ fun deserializeClassToSymbol(
|
||||
addCloneForArrayIfNeeded(classId, context.dispatchReceiver)
|
||||
addSerializableIfNeeded(classId)
|
||||
|
||||
declarations.sortWith(object : Comparator<FirDeclaration<*>> {
|
||||
override fun compare(a: FirDeclaration<*>, b: FirDeclaration<*>): Int {
|
||||
declarations.sortWith(object : Comparator<FirDeclaration> {
|
||||
override fun compare(a: FirDeclaration, b: FirDeclaration): Int {
|
||||
// Reorder members based on their type and name only.
|
||||
// See FE 1.0's [DeserializedMemberScope#addMembers].
|
||||
if (a is FirStatusOwner && b is FirStatusOwner) {
|
||||
|
||||
+2
-2
@@ -5,7 +5,7 @@
|
||||
|
||||
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.description.*
|
||||
import org.jetbrains.kotlin.fir.contracts.effects
|
||||
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.metadata.deserialization.Flags
|
||||
|
||||
class FirContractSerializer {
|
||||
fun serializeContractOfFunctionIfAny(
|
||||
function: FirFunction<*>,
|
||||
function: FirFunction,
|
||||
proto: ProtoBuf.Function.Builder,
|
||||
parentSerializer: FirElementSerializer
|
||||
) {
|
||||
|
||||
+3
-3
@@ -15,13 +15,13 @@ interface FirElementAwareStringTable : StringTable {
|
||||
fun getQualifiedClassNameIndex(classId: ClassId): Int =
|
||||
getQualifiedClassNameIndex(classId.asString(), classId.isLocal)
|
||||
|
||||
fun getFqNameIndex(classLikeDeclaration: FirClassLikeDeclaration<*>): Int {
|
||||
fun getFqNameIndex(classLikeDeclaration: FirClassLikeDeclaration): Int {
|
||||
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()}")
|
||||
|
||||
return getQualifiedClassNameIndex(classId)
|
||||
}
|
||||
|
||||
fun getLocalClassIdReplacement(firClass: FirClass<*>): ClassId? = null
|
||||
fun getLocalClassIdReplacement(firClass: FirClass): ClassId? = null
|
||||
}
|
||||
|
||||
+14
-14
@@ -60,7 +60,7 @@ import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
|
||||
class FirElementSerializer private constructor(
|
||||
private val session: FirSession,
|
||||
private val scopeSession: ScopeSession,
|
||||
private val containingDeclaration: FirDeclaration<*>?,
|
||||
private val containingDeclaration: FirDeclaration?,
|
||||
private val typeParameters: Interner<FirTypeParameter>,
|
||||
private val extension: FirSerializerExtension,
|
||||
private val typeTable: MutableTypeTable,
|
||||
@@ -96,7 +96,7 @@ class FirElementSerializer private constructor(
|
||||
return builder
|
||||
}
|
||||
|
||||
fun classProto(klass: FirClass<*>): ProtoBuf.Class.Builder {
|
||||
fun classProto(klass: FirClass): ProtoBuf.Class.Builder {
|
||||
val builder = ProtoBuf.Class.newBuilder()
|
||||
|
||||
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) {
|
||||
if (nestedClassifier is FirTypeAlias) {
|
||||
typeAliasProto(nestedClassifier)?.let { builder.addTypeAlias(it) }
|
||||
@@ -218,13 +218,13 @@ class FirElementSerializer private constructor(
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
private fun FirClass<*>.declarations(): List<FirCallableMemberDeclaration<*>> = buildList {
|
||||
private fun FirClass.declarations(): List<FirCallableMemberDeclaration> = buildList {
|
||||
val memberScope =
|
||||
defaultType().scope(session, scopeSession, FakeOverrideTypeCalculator.DoNothing)
|
||||
?: error("Null scope for $this")
|
||||
|
||||
fun addDeclarationIfNeeded(symbol: FirCallableSymbol<*>) {
|
||||
val declaration = symbol.fir as? FirCallableMemberDeclaration<*> ?: return
|
||||
val declaration = symbol.fir as? FirCallableMemberDeclaration ?: return
|
||||
if (declaration.isIntersectionOverride) {
|
||||
// This part is a kind of hack for case like
|
||||
//
|
||||
@@ -259,7 +259,7 @@ class FirElementSerializer private constructor(
|
||||
memberScope.processAllProperties(::addDeclarationIfNeeded)
|
||||
|
||||
for (declaration in declarations) {
|
||||
if (declaration is FirCallableMemberDeclaration<*> && declaration.isStatic) {
|
||||
if (declaration is FirCallableMemberDeclaration && declaration.isStatic) {
|
||||
add(declaration)
|
||||
}
|
||||
}
|
||||
@@ -375,7 +375,7 @@ class FirElementSerializer private constructor(
|
||||
return builder
|
||||
}
|
||||
|
||||
fun functionProto(function: FirFunction<*>): ProtoBuf.Function.Builder? {
|
||||
fun functionProto(function: FirFunction): ProtoBuf.Function.Builder? {
|
||||
if (!extension.shouldSerializeFunction(function)) return null
|
||||
|
||||
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(
|
||||
session, scopeSession, declaration, Interner(typeParameters), extension,
|
||||
typeTable, versionRequirementTable, serializeTypeTableToFunction = false,
|
||||
@@ -834,18 +834,18 @@ class FirElementSerializer private constructor(
|
||||
|
||||
private fun useTypeTable(): Boolean = extension.shouldUseTypeTable()
|
||||
|
||||
private fun FirDeclaration<*>.hasInlineClassTypesInSignature(): Boolean {
|
||||
private fun FirDeclaration.hasInlineClassTypesInSignature(): Boolean {
|
||||
// TODO
|
||||
return false
|
||||
}
|
||||
|
||||
private fun FirCallableDeclaration<*>.isSuspendOrHasSuspendTypesInSignature(): Boolean {
|
||||
private fun FirCallableDeclaration.isSuspendOrHasSuspendTypesInSignature(): Boolean {
|
||||
// TODO (types in signature)
|
||||
return this is FirCallableMemberDeclaration<*> && this.isSuspend
|
||||
return this is FirCallableMemberDeclaration && this.isSuspend
|
||||
}
|
||||
|
||||
private fun writeVersionRequirementForInlineClasses(
|
||||
klass: FirClass<*>,
|
||||
klass: FirClass,
|
||||
builder: ProtoBuf.Class.Builder,
|
||||
versionRequirementTable: MutableVersionRequirementTable
|
||||
) {
|
||||
@@ -937,7 +937,7 @@ class FirElementSerializer private constructor(
|
||||
return declaration.visibility.normalize()
|
||||
}
|
||||
|
||||
private fun getClassifierId(declaration: FirClassLikeDeclaration<*>): Int =
|
||||
private fun getClassifierId(declaration: FirClassLikeDeclaration): Int =
|
||||
stringTable.getFqNameIndex(declaration)
|
||||
|
||||
private fun getClassifierId(classId: ClassId): Int =
|
||||
@@ -982,7 +982,7 @@ class FirElementSerializer private constructor(
|
||||
fun create(
|
||||
session: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
klass: FirClass<*>,
|
||||
klass: FirClass,
|
||||
extension: FirSerializerExtension,
|
||||
parentSerializer: FirElementSerializer?,
|
||||
typeApproximator: AbstractTypeApproximator,
|
||||
|
||||
+5
-5
@@ -28,14 +28,14 @@ abstract class FirSerializerExtension {
|
||||
open fun shouldSerializeTypeAlias(typeAlias: FirTypeAlias): Boolean = true
|
||||
open fun shouldUseTypeTable(): 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 serializePackage(packageFqName: FqName, proto: ProtoBuf.Package.Builder) {
|
||||
}
|
||||
|
||||
open fun serializeClass(
|
||||
klass: FirClass<*>,
|
||||
klass: FirClass,
|
||||
proto: ProtoBuf.Class.Builder,
|
||||
versionRequirementTable: MutableVersionRequirementTable,
|
||||
childSerializer: FirElementSerializer
|
||||
@@ -50,7 +50,7 @@ abstract class FirSerializerExtension {
|
||||
}
|
||||
|
||||
open fun serializeFunction(
|
||||
function: FirFunction<*>,
|
||||
function: FirFunction,
|
||||
proto: ProtoBuf.Function.Builder,
|
||||
versionRequirementTable: MutableVersionRequirementTable?,
|
||||
childSerializer: FirElementSerializer
|
||||
@@ -91,7 +91,7 @@ abstract class FirSerializerExtension {
|
||||
get() = null
|
||||
|
||||
interface ClassMembersProducer {
|
||||
fun getCallableMembers(klass: FirClass<*>): Collection<FirCallableMemberDeclaration<*>>
|
||||
fun getCallableMembers(klass: FirClass): Collection<FirCallableMemberDeclaration>
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -21,7 +21,7 @@ class FirJvmElementAwareStringTable(
|
||||
private val components: Fir2IrComponents,
|
||||
nameResolver: JvmNameResolver? = null
|
||||
) : JvmStringTable(nameResolver), FirElementAwareStringTable {
|
||||
override fun getLocalClassIdReplacement(firClass: FirClass<*>): ClassId =
|
||||
override fun getLocalClassIdReplacement(firClass: FirClass): ClassId =
|
||||
components.classifierStorage.getCachedIrClass(firClass)?.getLocalClassIdReplacement()
|
||||
?: throw AssertionError("not a local class: ${firClass.symbol.classId}")
|
||||
|
||||
@@ -33,4 +33,4 @@ class FirJvmElementAwareStringTable(
|
||||
ClassId(fqName.parent(), FqName.topLevel(fqName.shortName()), true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+10
-10
@@ -12,28 +12,28 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.signaturer.FirMangler
|
||||
|
||||
@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)
|
||||
|
||||
override val FirDeclaration<*>.signatureString: String
|
||||
override val FirDeclaration.signatureString: String
|
||||
get() = getMangleComputer(MangleMode.SIGNATURE).computeMangle(this)
|
||||
|
||||
override val FirDeclaration<*>.fqnString: String
|
||||
override val FirDeclaration.fqnString: String
|
||||
get() = getMangleComputer(MangleMode.FQNAME).computeMangle(this)
|
||||
|
||||
override fun FirDeclaration<*>.isExported(): Boolean = true
|
||||
override fun FirDeclaration.isExported(): Boolean = true
|
||||
|
||||
override fun getExportChecker(): KotlinExportChecker<FirDeclaration<*>> {
|
||||
return object : KotlinExportChecker<FirDeclaration<*>> {
|
||||
override fun check(declaration: FirDeclaration<*>, type: SpecialDeclarationType): Boolean = true
|
||||
override fun getExportChecker(): KotlinExportChecker<FirDeclaration> {
|
||||
return object : KotlinExportChecker<FirDeclaration> {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
+12
-12
@@ -31,20 +31,20 @@ open class FirJvmMangleComputer(
|
||||
private val builder: StringBuilder,
|
||||
private val mode: MangleMode,
|
||||
private val session: FirSession
|
||||
) : FirVisitor<Unit, Boolean>(), KotlinMangleComputer<FirDeclaration<*>> {
|
||||
) : FirVisitor<Unit, Boolean>(), KotlinMangleComputer<FirDeclaration> {
|
||||
|
||||
private val typeParameterContainer = ArrayList<FirStatusOwner>(4)
|
||||
|
||||
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")
|
||||
this@FirJvmMangleComputer.session.firProvider.getFirCallableContainerFile(symbol)?.name
|
||||
else null
|
||||
|
||||
open fun FirFunction<*>.specialValueParamPrefix(param: FirValueParameter): String = ""
|
||||
open fun FirFunction.specialValueParamPrefix(param: FirValueParameter): String = ""
|
||||
|
||||
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) {
|
||||
is FirCallableMemberDeclaration<*> -> this.containingClass()?.classId?.let { it.packageFqName to it } ?: return
|
||||
is FirClassLikeDeclaration<*> -> this.symbol.classId.let { it.packageFqName to it.outerClassId }
|
||||
is FirCallableMemberDeclaration -> this.containingClass()?.classId?.let { it.packageFqName to it } ?: return
|
||||
is FirClassLikeDeclaration -> this.symbol.classId.let { it.packageFqName to it.outerClassId }
|
||||
else -> return
|
||||
}
|
||||
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
|
||||
visitParent()
|
||||
|
||||
@@ -111,7 +111,7 @@ open class FirJvmMangleComputer(
|
||||
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
|
||||
|
||||
@@ -138,7 +138,7 @@ open class FirJvmMangleComputer(
|
||||
mangleSignature(isCtor, isStatic)
|
||||
}
|
||||
|
||||
private fun FirFunction<*>.mangleSignature(isCtor: Boolean, isStatic: Boolean) {
|
||||
private fun FirFunction.mangleSignature(isCtor: Boolean, isStatic: Boolean) {
|
||||
if (!mode.signature) {
|
||||
return
|
||||
}
|
||||
@@ -171,7 +171,7 @@ open class FirJvmMangleComputer(
|
||||
if (this in parent.typeParameters) {
|
||||
return parent
|
||||
}
|
||||
if (parent is FirCallableDeclaration<*>) {
|
||||
if (parent is FirCallableDeclaration) {
|
||||
val overriddenFir = parent.originalForSubstitutionOverride
|
||||
if (overriddenFir is FirTypeParametersOwner && this in overriddenFir.typeParameters) {
|
||||
return parent
|
||||
@@ -317,7 +317,7 @@ open class FirJvmMangleComputer(
|
||||
override fun visitConstructor(constructor: FirConstructor, data: Boolean) =
|
||||
constructor.mangleFunction(isCtor = true, isStatic = false, constructor)
|
||||
|
||||
override fun computeMangle(declaration: FirDeclaration<*>): String {
|
||||
override fun computeMangle(declaration: FirDeclaration): String {
|
||||
declaration.accept(this, true)
|
||||
return builder.toString()
|
||||
}
|
||||
|
||||
+9
-9
@@ -59,7 +59,7 @@ class FirJvmSerializerExtension(
|
||||
private val jvmDefaultMode = state.jvmDefaultMode
|
||||
|
||||
override fun shouldUseTypeTable(): Boolean = useTypeTable
|
||||
override fun shouldSerializeFunction(function: FirFunction<*>): Boolean {
|
||||
override fun shouldSerializeFunction(function: FirFunction): Boolean {
|
||||
return classBuilderMode != ClassBuilderMode.ABI ||
|
||||
function !is FirSimpleFunction || function.visibility != Visibilities.Private
|
||||
}
|
||||
@@ -77,7 +77,7 @@ class FirJvmSerializerExtension(
|
||||
}
|
||||
|
||||
override fun serializeClass(
|
||||
klass: FirClass<*>,
|
||||
klass: FirClass,
|
||||
proto: ProtoBuf.Class.Builder,
|
||||
versionRequirementTable: MutableVersionRequirementTable,
|
||||
childSerializer: FirElementSerializer
|
||||
@@ -103,7 +103,7 @@ class FirJvmSerializerExtension(
|
||||
// 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
|
||||
private fun writeVersionRequirementForJvmDefaultIfNeeded(
|
||||
klass: FirClass<*>,
|
||||
klass: FirClass,
|
||||
builder: ProtoBuf.Class.Builder,
|
||||
versionRequirementTable: MutableVersionRequirementTable
|
||||
) {
|
||||
@@ -182,7 +182,7 @@ class FirJvmSerializerExtension(
|
||||
}
|
||||
|
||||
override fun serializeFunction(
|
||||
function: FirFunction<*>,
|
||||
function: FirFunction,
|
||||
proto: ProtoBuf.Function.Builder,
|
||||
versionRequirementTable: MutableVersionRequirementTable?,
|
||||
childSerializer: FirElementSerializer
|
||||
@@ -208,7 +208,7 @@ class FirJvmSerializerExtension(
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirFunction<*>.needsInlineParameterNullCheckRequirement(): Boolean =
|
||||
private fun FirFunction.needsInlineParameterNullCheckRequirement(): Boolean =
|
||||
this is FirSimpleFunction && isInline && !isSuspend && !isParamAssertionsDisabled &&
|
||||
!Visibilities.isPrivate(visibility) &&
|
||||
(valueParameters.any { it.returnTypeRef.coneType.isBuiltinFunctionalType(session) } ||
|
||||
@@ -284,7 +284,7 @@ class FirJvmSerializerExtension(
|
||||
bindings.get(slice, key) ?: globalBindings.get(slice, key)
|
||||
|
||||
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()
|
||||
if (function == null || (function as? FirSimpleFunction)?.name?.asString() != 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
|
||||
// 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()
|
||||
sb.append("(")
|
||||
val receiverTypeRef = function.receiverTypeRef
|
||||
@@ -375,9 +375,9 @@ class FirJvmSerializerExtension(
|
||||
}
|
||||
|
||||
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 SYNTHETIC_METHOD_FOR_FIR_VARIABLE = JvmSerializationBindings.SerializationMappingSlice.create<FirVariable<*>, Method>()
|
||||
val SYNTHETIC_METHOD_FOR_FIR_VARIABLE = JvmSerializationBindings.SerializationMappingSlice.create<FirVariable, Method>()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -75,7 +75,7 @@ class FirMetadataSerializer(
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirFunction<*>.copyToFreeAnonymousFunction(): FirAnonymousFunction {
|
||||
private fun FirFunction.copyToFreeAnonymousFunction(): FirAnonymousFunction {
|
||||
val function = this
|
||||
return buildAnonymousFunction {
|
||||
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.originalConstructorIfTypeAlias
|
||||
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.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||
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.types.*
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
@@ -293,7 +295,7 @@ internal tailrec fun FirCallableSymbol<*>.unwrapCallRepresentative(root: FirCall
|
||||
}
|
||||
|
||||
internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(
|
||||
containingClass: FirClass<*>,
|
||||
containingClass: FirClass,
|
||||
session: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
declarationStorage: Fir2IrDeclarationStorage,
|
||||
@@ -321,7 +323,7 @@ internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(
|
||||
|
||||
fun FirTypeScope.processOverriddenFunctionsFromSuperClasses(
|
||||
functionSymbol: FirNamedFunctionSymbol,
|
||||
containingClass: FirClass<*>,
|
||||
containingClass: FirClass,
|
||||
processor: (FirNamedFunctionSymbol) -> ProcessorAction
|
||||
): ProcessorAction = processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { overridden, baseScope ->
|
||||
val unwrapped =
|
||||
@@ -337,7 +339,7 @@ fun FirTypeScope.processOverriddenFunctionsFromSuperClasses(
|
||||
|
||||
fun FirTypeScope.processOverriddenPropertiesFromSuperClasses(
|
||||
propertySymbol: FirPropertySymbol,
|
||||
containingClass: FirClass<*>,
|
||||
containingClass: FirClass,
|
||||
processor: (FirPropertySymbol) -> ProcessorAction
|
||||
): ProcessorAction = processDirectOverriddenPropertiesWithBaseScope(propertySymbol) { overridden, baseScope ->
|
||||
if (overridden.containingClass() == containingClass.symbol.toLookupTag()) {
|
||||
@@ -347,7 +349,7 @@ fun FirTypeScope.processOverriddenPropertiesFromSuperClasses(
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirClass<*>.getSuperTypesAsIrClasses(
|
||||
private fun FirClass.getSuperTypesAsIrClasses(
|
||||
declarationStorage: Fir2IrDeclarationStorage
|
||||
): Set<IrClass>? {
|
||||
val irClass =
|
||||
@@ -357,7 +359,7 @@ private fun FirClass<*>.getSuperTypesAsIrClasses(
|
||||
}
|
||||
|
||||
internal fun FirProperty.generateOverriddenPropertySymbols(
|
||||
containingClass: FirClass<*>,
|
||||
containingClass: FirClass,
|
||||
session: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
declarationStorage: Fir2IrDeclarationStorage,
|
||||
@@ -384,7 +386,7 @@ internal fun FirProperty.generateOverriddenPropertySymbols(
|
||||
}
|
||||
|
||||
internal fun FirProperty.generateOverriddenAccessorSymbols(
|
||||
containingClass: FirClass<*>,
|
||||
containingClass: FirClass,
|
||||
isGetter: Boolean,
|
||||
session: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
@@ -463,7 +465,7 @@ internal fun IrDeclarationParent.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
|
||||
isJava -> IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
|
||||
else -> IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
|
||||
|
||||
+11
-8
@@ -16,7 +16,10 @@ import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass
|
||||
import org.jetbrains.kotlin.fir.resolve.firProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||
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.FirClassSymbol
|
||||
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) {
|
||||
preCacheTypeParameters(klass)
|
||||
setTypeParameters(klass)
|
||||
}
|
||||
}
|
||||
|
||||
private fun IrClass.declareSupertypes(klass: FirClass<*>) {
|
||||
private fun IrClass.declareSupertypes(klass: FirClass) {
|
||||
superTypes = klass.superTypeRefs.map { superTypeRef -> superTypeRef.toIrType() }
|
||||
}
|
||||
|
||||
@@ -133,13 +136,13 @@ class Fir2IrClassifierStorage(
|
||||
inlineClassRepresentation = computeInlineClassRepresentation(klass)
|
||||
}
|
||||
|
||||
private fun IrClass.declareSupertypesAndTypeParameters(klass: FirClass<*>): IrClass {
|
||||
private fun IrClass.declareSupertypesAndTypeParameters(klass: FirClass): IrClass {
|
||||
declareTypeParameters(klass)
|
||||
declareSupertypes(klass)
|
||||
return this
|
||||
}
|
||||
|
||||
fun getCachedIrClass(klass: FirClass<*>): IrClass? {
|
||||
fun getCachedIrClass(klass: FirClass): IrClass? {
|
||||
return if (klass is FirAnonymousObject || klass is FirRegularClass && klass.visibility == Visibilities.Local) {
|
||||
localStorage.getLocalClass(klass)
|
||||
} else {
|
||||
@@ -148,12 +151,12 @@ class Fir2IrClassifierStorage(
|
||||
}
|
||||
|
||||
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 {
|
||||
return when {
|
||||
declarations.any { it is FirCallableMemberDeclaration<*> && it.modality == Modality.ABSTRACT } -> {
|
||||
declarations.any { it is FirCallableMemberDeclaration && it.modality == Modality.ABSTRACT } -> {
|
||||
Modality.ABSTRACT
|
||||
}
|
||||
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
|
||||
if (klass is FirAnonymousObject) {
|
||||
return createIrAnonymousObject(klass, irParent = parent)
|
||||
|
||||
@@ -5,7 +5,10 @@
|
||||
|
||||
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.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.util.parentClassOrNull
|
||||
@@ -13,7 +16,7 @@ import org.jetbrains.kotlin.ir.util.parentClassOrNull
|
||||
class Fir2IrConversionScope {
|
||||
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 {
|
||||
if (parent == null) return parent
|
||||
@@ -25,7 +28,7 @@ class Fir2IrConversionScope {
|
||||
|
||||
fun containingFileIfAny(): IrFile? = parentStack.getOrNull(0) as? IrFile
|
||||
|
||||
fun withContainingFirClass(containingFirClass: FirClass<*>, f: () -> Unit) {
|
||||
fun withContainingFirClass(containingFirClass: FirClass, f: () -> Unit) {
|
||||
containingFirClassStack += containingFirClass
|
||||
f()
|
||||
containingFirClassStack.removeAt(containingFirClassStack.size - 1)
|
||||
@@ -48,7 +51,7 @@ class Fir2IrConversionScope {
|
||||
return declaration
|
||||
}
|
||||
|
||||
fun containerFirClass(): FirClass<*>? = containingFirClassStack.lastOrNull()
|
||||
fun containerFirClass(): FirClass? = containingFirClassStack.lastOrNull()
|
||||
|
||||
private val functionStack = mutableListOf<IrFunction>()
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ class Fir2IrConverter(
|
||||
return irClass
|
||||
}
|
||||
|
||||
private fun delegatedMembers(irClass: IrClass): List<FirDeclaration<*>> {
|
||||
private fun delegatedMembers(irClass: IrClass): List<FirDeclaration> {
|
||||
return irClass.declarations.filter {
|
||||
it.origin == IrDeclarationOrigin.DELEGATED_MEMBER
|
||||
}.mapNotNull {
|
||||
@@ -175,7 +175,7 @@ class Fir2IrConverter(
|
||||
// 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
|
||||
// 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 }
|
||||
}
|
||||
|
||||
@@ -199,8 +199,8 @@ class Fir2IrConverter(
|
||||
}
|
||||
|
||||
private fun processMemberDeclaration(
|
||||
declaration: FirDeclaration<*>,
|
||||
containingClass: FirClass<*>?,
|
||||
declaration: FirDeclaration,
|
||||
containingClass: FirClass?,
|
||||
parent: IrDeclarationParent
|
||||
): IrDeclaration? {
|
||||
val isLocal = containingClass != null &&
|
||||
|
||||
+21
-21
@@ -70,7 +70,7 @@ class Fir2IrDeclarationStorage(
|
||||
|
||||
private val fileCache = ConcurrentHashMap<FirFile, IrFile>()
|
||||
|
||||
private val functionCache = ConcurrentHashMap<FirFunction<*>, IrSimpleFunction>()
|
||||
private val functionCache = ConcurrentHashMap<FirFunction, IrSimpleFunction>()
|
||||
|
||||
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.
|
||||
//
|
||||
// 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
|
||||
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>()
|
||||
|
||||
@@ -106,7 +106,7 @@ class Fir2IrDeclarationStorage(
|
||||
|
||||
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 (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 callableId = firBasedSymbol.callableId
|
||||
return findIrParent(callableId.packageName, callableDeclaration.containingClass(), firBasedSymbol)
|
||||
@@ -295,7 +295,7 @@ class Fir2IrDeclarationStorage(
|
||||
}
|
||||
|
||||
private fun <T : IrFunction> T.declareParameters(
|
||||
function: FirFunction<*>?,
|
||||
function: FirFunction?,
|
||||
containingClass: IrClass?,
|
||||
isStatic: Boolean,
|
||||
// Can be not-null only for property accessors
|
||||
@@ -368,7 +368,7 @@ class Fir2IrDeclarationStorage(
|
||||
}
|
||||
|
||||
private fun <T : IrFunction> T.bindAndDeclareParameters(
|
||||
function: FirFunction<*>?,
|
||||
function: FirFunction?,
|
||||
irParent: IrDeclarationParent?,
|
||||
thisReceiverOwner: IrClass? = irParent as? IrClass,
|
||||
isStatic: Boolean,
|
||||
@@ -379,14 +379,14 @@ class Fir2IrDeclarationStorage(
|
||||
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)) {
|
||||
localStorage.putParameter(firParameter, irParameter)
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
fun getCachedIrFunction(function: FirFunction<*>): IrSimpleFunction? =
|
||||
fun getCachedIrFunction(function: FirFunction): IrSimpleFunction? =
|
||||
if (function is FirSimpleFunction) getCachedIrFunction(function)
|
||||
else localStorage.getLocalFunction(function)
|
||||
|
||||
@@ -412,7 +412,7 @@ class Fir2IrDeclarationStorage(
|
||||
delegatedReverseCache[irFunction] = function
|
||||
}
|
||||
|
||||
fun originalDeclarationForDelegated(irDeclaration: IrDeclaration): FirDeclaration<*>? = delegatedReverseCache[irDeclaration]
|
||||
fun originalDeclarationForDelegated(irDeclaration: IrDeclaration): FirDeclaration? = delegatedReverseCache[irDeclaration]
|
||||
|
||||
internal fun declareIrSimpleFunction(
|
||||
signature: IdSignature?,
|
||||
@@ -435,7 +435,7 @@ class Fir2IrDeclarationStorage(
|
||||
}
|
||||
|
||||
fun createIrFunction(
|
||||
function: FirFunction<*>,
|
||||
function: FirFunction,
|
||||
irParent: IrDeclarationParent?,
|
||||
thisReceiverOwner: IrClass? = irParent as? IrClass,
|
||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
|
||||
@@ -867,16 +867,16 @@ class Fir2IrDeclarationStorage(
|
||||
|
||||
internal fun saveFakeOverrideInClass(
|
||||
irClass: IrClass,
|
||||
originalDeclaration: FirCallableDeclaration<*>,
|
||||
fakeOverride: FirCallableDeclaration<*>
|
||||
originalDeclaration: FirCallableDeclaration,
|
||||
fakeOverride: FirCallableDeclaration
|
||||
) {
|
||||
fakeOverridesInClass.getOrPut(irClass, ::mutableMapOf)[originalDeclaration] = fakeOverride
|
||||
}
|
||||
|
||||
fun getFakeOverrideInClass(
|
||||
irClass: IrClass,
|
||||
callableDeclaration: FirCallableDeclaration<*>
|
||||
): FirCallableDeclaration<*>? {
|
||||
callableDeclaration: FirCallableDeclaration
|
||||
): FirCallableDeclaration? {
|
||||
if (irClass is Fir2IrLazyClass) {
|
||||
irClass.getFakeOverridesByName(callableDeclaration.symbol.callableId.callableName)
|
||||
}
|
||||
@@ -885,7 +885,7 @@ class Fir2IrDeclarationStorage(
|
||||
|
||||
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)
|
||||
irField.setAndModifyParent(irClass)
|
||||
delegatedMemberGenerator.generate(irField, field, owner, irClass)
|
||||
@@ -968,7 +968,7 @@ class Fir2IrDeclarationStorage(
|
||||
)
|
||||
|
||||
fun createIrVariable(
|
||||
variable: FirVariable<*>,
|
||||
variable: FirVariable,
|
||||
irParent: IrDeclarationParent,
|
||||
givenOrigin: IrDeclarationOrigin? = null
|
||||
): IrVariable = convertCatching(variable) {
|
||||
@@ -1145,7 +1145,7 @@ class Fir2IrDeclarationStorage(
|
||||
|
||||
private inline fun <
|
||||
reified FS : FirCallableSymbol<*>,
|
||||
reified F : FirCallableDeclaration<*>,
|
||||
reified F : FirCallableDeclaration,
|
||||
I : IrSymbolOwner,
|
||||
> getIrCallableSymbol(
|
||||
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
|
||||
?: run {
|
||||
throw IllegalArgumentException("Cannot find variable ${firVariable.render()} in local storage")
|
||||
@@ -1267,8 +1267,8 @@ class Fir2IrDeclarationStorage(
|
||||
}
|
||||
|
||||
private fun IrMutableAnnotationContainer.convertAnnotationsFromLibrary(firAnnotationContainer: FirAnnotationContainer) {
|
||||
if ((firAnnotationContainer as? FirDeclaration<*>)?.isFromLibrary == true ||
|
||||
(firAnnotationContainer is FirCallableMemberDeclaration<*> && firAnnotationContainer.isSubstitutionOrIntersectionOverride)
|
||||
if ((firAnnotationContainer as? FirDeclaration)?.isFromLibrary == true ||
|
||||
(firAnnotationContainer is FirCallableMemberDeclaration && firAnnotationContainer.isSubstitutionOrIntersectionOverride)
|
||||
) {
|
||||
annotationGenerator.generate(this, firAnnotationContainer)
|
||||
}
|
||||
|
||||
+1
-4
@@ -6,8 +6,6 @@
|
||||
package org.jetbrains.kotlin.fir.backend
|
||||
|
||||
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.FirTypeAlias
|
||||
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.parentAsClass
|
||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||
import org.jetbrains.kotlin.types.SmartcastStability
|
||||
|
||||
class Fir2IrImplicitCastInserter(
|
||||
private val components: Fir2IrComponents
|
||||
@@ -295,7 +292,7 @@ class Fir2IrImplicitCastInserter(
|
||||
): IrExpression {
|
||||
val referencedDeclaration =
|
||||
((calleeReference as? FirResolvedNamedReference)?.resolvedSymbol as? FirCallableSymbol<*>)?.unwrapCallRepresentative()
|
||||
?.fir as? FirCallableMemberDeclaration<*>
|
||||
?.fir as? FirCallableMemberDeclaration
|
||||
|
||||
val dispatchReceiverType =
|
||||
referencedDeclaration?.dispatchReceiverType as? ConeClassLikeType
|
||||
|
||||
@@ -7,13 +7,12 @@ package org.jetbrains.kotlin.fir.backend
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
class Fir2IrLocalStorage {
|
||||
|
||||
private val cacheStack = mutableListOf<Fir2IrScopeCache>()
|
||||
|
||||
private val localClassCache = mutableMapOf<FirClass<*>, IrClass>()
|
||||
private val localClassCache = mutableMapOf<FirClass, IrClass>()
|
||||
|
||||
fun enterCallable() {
|
||||
cacheStack += Fir2IrScopeCache()
|
||||
@@ -32,14 +31,14 @@ class Fir2IrLocalStorage {
|
||||
return null
|
||||
}
|
||||
|
||||
fun getVariable(variable: FirVariable<*>): IrVariable? =
|
||||
fun getVariable(variable: FirVariable): IrVariable? =
|
||||
last { getVariable(variable) }
|
||||
|
||||
fun getLocalClass(localClass: FirClass<*>): IrClass? {
|
||||
fun getLocalClass(localClass: FirClass): IrClass? {
|
||||
return localClassCache[localClass]
|
||||
}
|
||||
|
||||
fun getLocalFunction(localFunction: FirFunction<*>): IrSimpleFunction? =
|
||||
fun getLocalFunction(localFunction: FirFunction): IrSimpleFunction? =
|
||||
last { getLocalFunction(localFunction) }
|
||||
|
||||
fun getDelegatedProperty(property: FirProperty): IrLocalDelegatedProperty? =
|
||||
@@ -56,19 +55,19 @@ class Fir2IrLocalStorage {
|
||||
cacheStack.last().putParameter(firParameter, irParameter)
|
||||
}
|
||||
|
||||
fun putVariable(firVariable: FirVariable<*>, irVariable: IrVariable) {
|
||||
fun putVariable(firVariable: FirVariable, irVariable: IrVariable) {
|
||||
cacheStack.last().putVariable(firVariable, irVariable)
|
||||
}
|
||||
|
||||
fun putLocalClass(firClass: FirClass<*>, irClass: IrClass) {
|
||||
fun putLocalClass(firClass: FirClass, irClass: IrClass) {
|
||||
localClassCache[firClass] = irClass
|
||||
}
|
||||
|
||||
fun putLocalFunction(firFunction: FirFunction<*>, irFunction: IrSimpleFunction) {
|
||||
fun putLocalFunction(firFunction: FirFunction, irFunction: IrSimpleFunction) {
|
||||
cacheStack.last().putLocalFunction(firFunction, irFunction)
|
||||
}
|
||||
|
||||
fun putDelegatedProperty(firProperty: FirProperty, irProperty: IrLocalDelegatedProperty) {
|
||||
cacheStack.last().putDelegatedProperty(firProperty, irProperty)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,9 +16,9 @@ import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||
class Fir2IrScopeCache {
|
||||
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>()
|
||||
|
||||
@@ -28,15 +28,15 @@ class Fir2IrScopeCache {
|
||||
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
|
||||
}
|
||||
|
||||
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)
|
||||
localFunctionCache[localFunction] = irFunction
|
||||
}
|
||||
|
||||
@@ -11,6 +11,6 @@ import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
|
||||
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?
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ class Fir2IrVisitor(
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirDeclaration<*>.toIrDeclaration(): IrDeclaration =
|
||||
private fun FirDeclaration.toIrDeclaration(): IrDeclaration =
|
||||
accept(this@Fir2IrVisitor, null) as IrDeclaration
|
||||
|
||||
// ==================================================================================
|
||||
|
||||
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.ir.declarations.MetadataSource
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
sealed class FirMetadataSource : MetadataSource {
|
||||
abstract val fir: FirDeclaration<*>
|
||||
abstract val fir: FirDeclaration
|
||||
|
||||
val declarationSiteSession: FirSession
|
||||
get() = fir.moduleData.session
|
||||
@@ -28,9 +28,9 @@ sealed class FirMetadataSource : MetadataSource {
|
||||
|
||||
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 {
|
||||
override val isConst: Boolean get() = fir.isConst
|
||||
|
||||
+5
-3
@@ -11,7 +11,9 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
||||
import org.jetbrains.kotlin.fir.backend.Fir2IrConversionScope
|
||||
import org.jetbrains.kotlin.fir.backend.FirMetadataSource
|
||||
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.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||
@@ -170,7 +172,7 @@ internal class AdapterGenerator(
|
||||
callableReferenceAccess: FirCallableReferenceAccess,
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
firAdaptee: FirFunction<*>,
|
||||
firAdaptee: FirFunction,
|
||||
adaptee: IrFunction,
|
||||
type: IrSimpleType,
|
||||
boundDispatchReceiver: IrExpression?,
|
||||
@@ -260,7 +262,7 @@ internal class AdapterGenerator(
|
||||
|
||||
private fun createAdapteeCallForCallableReference(
|
||||
callableReferenceAccess: FirCallableReferenceAccess,
|
||||
firAdaptee: FirFunction<*>,
|
||||
firAdaptee: FirFunction,
|
||||
adapteeSymbol: IrFunctionSymbol,
|
||||
adapterFunction: IrFunction,
|
||||
boundDispatchReceiver: IrExpression?,
|
||||
|
||||
+5
-3
@@ -39,7 +39,9 @@ import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.ir.symbols.*
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
||||
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.types.AbstractTypeChecker
|
||||
|
||||
@@ -388,7 +390,7 @@ class CallAndReferenceGenerator(
|
||||
this.declarationStorage.getIrConstructorSymbol(it)
|
||||
} ?: run {
|
||||
// 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
|
||||
fir?.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)?.processDeclaredConstructors {
|
||||
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
|
||||
val map = mutableMapOf<FirTypeParameterSymbol, ConeKotlinType>()
|
||||
for ((index, typeParameter) in function.typeParameters.withIndex()) {
|
||||
|
||||
+4
-4
@@ -45,7 +45,7 @@ internal class ClassMemberGenerator(
|
||||
|
||||
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)
|
||||
conversionScope.withClass(irClass) {
|
||||
val primaryConstructor = klass.primaryConstructor
|
||||
@@ -82,7 +82,7 @@ internal class ClassMemberGenerator(
|
||||
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) {
|
||||
if (firFunction != null) {
|
||||
if (irFunction !is IrConstructor || !irFunction.isPrimary) {
|
||||
@@ -155,7 +155,7 @@ internal class ClassMemberGenerator(
|
||||
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 delegate = property.delegate
|
||||
val propertyType = property.returnTypeRef.toIrType()
|
||||
@@ -229,7 +229,7 @@ internal class ClassMemberGenerator(
|
||||
propertyType: IrType,
|
||||
isDefault: Boolean,
|
||||
isGetter: Boolean,
|
||||
containingClass: FirClass<*>?
|
||||
containingClass: FirClass?
|
||||
) {
|
||||
conversionScope.withFunction(this) {
|
||||
applyParentFromStackTo(this)
|
||||
|
||||
+4
-4
@@ -62,10 +62,10 @@ import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING
|
||||
@OptIn(ObsoleteDescriptorBasedAPI::class)
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
fun generateDataClassComponentBody(irFunction: IrFunction, lookupTag: ConeClassLikeLookupTag) =
|
||||
@@ -179,14 +179,14 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
|
||||
(this.name == HASHCODE_NAME && matchesHashCodeSignature) ||
|
||||
(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 properties = irClass.properties.filter { it.backingField != null }.take(propertyParametersCount).toList()
|
||||
if (properties.isEmpty()) {
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
val result = mutableListOf<FirDeclaration<*>>()
|
||||
val result = mutableListOf<FirDeclaration>()
|
||||
|
||||
val contributedFunctionsInThisType = klass.declarations.mapNotNull {
|
||||
if (it is FirSimpleFunction && it.matchesDataClassSyntheticMemberSignatures) {
|
||||
|
||||
+15
-8
@@ -5,19 +5,26 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.backend.generators
|
||||
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.backend.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
||||
import org.jetbrains.kotlin.fir.backend.generateOverriddenAccessorSymbols
|
||||
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.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.expressions.IrBlockBody
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
||||
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.
|
||||
@@ -31,7 +38,7 @@ internal class DelegatedMemberGenerator(
|
||||
) : Fir2IrComponents by components {
|
||||
|
||||
// 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 subClassScope = firSubClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)
|
||||
@@ -79,7 +86,7 @@ internal class DelegatedMemberGenerator(
|
||||
|
||||
private fun generateDelegatedFunction(
|
||||
subClass: IrClass,
|
||||
firSubClass: FirClass<*>,
|
||||
firSubClass: FirClass,
|
||||
irField: IrField,
|
||||
superFunction: IrSimpleFunction,
|
||||
delegateOverride: FirSimpleFunction
|
||||
@@ -151,7 +158,7 @@ internal class DelegatedMemberGenerator(
|
||||
|
||||
private fun generateDelegatedProperty(
|
||||
subClass: IrClass,
|
||||
firSubClass: FirClass<*>,
|
||||
firSubClass: FirClass,
|
||||
irField: IrField,
|
||||
superProperty: IrProperty,
|
||||
firDelegateProperty: FirProperty
|
||||
|
||||
+18
-12
@@ -7,7 +7,10 @@ package org.jetbrains.kotlin.fir.backend.generators
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
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.utils.allowsToHaveFakeOverride
|
||||
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.resolve.defaultType
|
||||
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.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
@@ -49,7 +55,7 @@ class FakeOverrideGenerator(
|
||||
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 (this.visibility != JavaDescriptorVisibilities.PACKAGE_VISIBILITY) return true
|
||||
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(
|
||||
klass,
|
||||
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 useSiteMemberScope = klass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)
|
||||
val superTypesCallableNames = useSiteMemberScope.getCallableNames()
|
||||
val realDeclarationSymbols = realDeclarations.mapTo(mutableSetOf(), FirDeclaration<*>::symbol)
|
||||
val realDeclarationSymbols = realDeclarations.mapTo(mutableSetOf(), FirDeclaration::symbol)
|
||||
|
||||
for (name in superTypesCallableNames) {
|
||||
generateFakeOverridesForName(this, useSiteMemberScope, name, klass, result, realDeclarationSymbols)
|
||||
@@ -86,7 +92,7 @@ class FakeOverrideGenerator(
|
||||
fun generateFakeOverridesForName(
|
||||
irClass: IrClass,
|
||||
name: Name,
|
||||
firClass: FirClass<*>
|
||||
firClass: FirClass
|
||||
): List<IrDeclaration> = buildList {
|
||||
val useSiteMemberScope = firClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)
|
||||
generateFakeOverridesForName(
|
||||
@@ -100,7 +106,7 @@ class FakeOverrideGenerator(
|
||||
irClass: IrClass,
|
||||
useSiteMemberScope: FirTypeScope,
|
||||
name: Name,
|
||||
firClass: FirClass<*>,
|
||||
firClass: FirClass,
|
||||
result: MutableList<IrDeclaration>,
|
||||
realDeclarationSymbols: Set<FirBasedSymbol<*>>
|
||||
) {
|
||||
@@ -156,7 +162,7 @@ class FakeOverrideGenerator(
|
||||
}
|
||||
|
||||
internal fun calcBaseSymbolsForFakeOverrideFunction(
|
||||
klass: FirClass<*>,
|
||||
klass: FirClass,
|
||||
fakeOverride: IrSimpleFunction,
|
||||
originalSymbol: FirNamedFunctionSymbol,
|
||||
) {
|
||||
@@ -174,8 +180,8 @@ class FakeOverrideGenerator(
|
||||
private fun FirCallableSymbol<*>.shouldHaveComputedBaseSymbolsForClass(classLookupTag: ConeClassLikeLookupTag): Boolean =
|
||||
fir.origin.fromSupertypes && dispatchReceiverClassOrNull() == classLookupTag
|
||||
|
||||
private inline fun <reified D : FirCallableMemberDeclaration<D>, reified S : FirCallableSymbol<D>, reified I : IrDeclaration> createFakeOverriddenIfNeeded(
|
||||
klass: FirClass<*>,
|
||||
private inline fun <reified D : FirCallableMemberDeclaration, reified S : FirCallableSymbol<D>, reified I : IrDeclaration> createFakeOverriddenIfNeeded(
|
||||
klass: FirClass,
|
||||
irClass: IrClass,
|
||||
isLocal: Boolean,
|
||||
originalSymbol: FirCallableSymbol<*>,
|
||||
@@ -312,7 +318,7 @@ class FakeOverrideGenerator(
|
||||
irProducer: (F) -> S
|
||||
): List<S> {
|
||||
val overriddenContainingClass =
|
||||
overridden.containingClass()?.toSymbol(session)?.fir as? FirClass<*> ?: return emptyList()
|
||||
overridden.containingClass()?.toSymbol(session)?.fir as? FirClass ?: return emptyList()
|
||||
|
||||
val overriddenContainingIrClass =
|
||||
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.fir.backend.Fir2IrComponents
|
||||
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.symbols.Fir2IrSimpleFunctionSymbol
|
||||
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 kotlin.properties.ReadWriteProperty
|
||||
|
||||
abstract class AbstractFir2IrLazyFunction<F : FirCallableMemberDeclaration<*>>(
|
||||
abstract class AbstractFir2IrLazyFunction<F : FirCallableMemberDeclaration>(
|
||||
components: Fir2IrComponents,
|
||||
override val startOffset: Int,
|
||||
override val endOffset: Int,
|
||||
@@ -86,7 +87,7 @@ abstract class AbstractFir2IrLazyFunction<F : FirCallableMemberDeclaration<*>>(
|
||||
|
||||
protected fun shouldHaveDispatchReceiver(
|
||||
containingClass: IrClass,
|
||||
staticOwner: FirCallableMemberDeclaration<*>
|
||||
staticOwner: FirCallableMemberDeclaration
|
||||
): Boolean {
|
||||
return !staticOwner.isStatic &&
|
||||
(!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.generateOverriddenAccessorSymbols
|
||||
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.utils.isInline
|
||||
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
|
||||
@@ -35,12 +38,12 @@ class Fir2IrLazyPropertyAccessor(
|
||||
firParentClass: FirRegularClass,
|
||||
symbol: Fir2IrSimpleFunctionSymbol,
|
||||
isFakeOverride: Boolean
|
||||
) : AbstractFir2IrLazyFunction<FirCallableMemberDeclaration<*>>(components, startOffset, endOffset, origin, symbol, isFakeOverride) {
|
||||
) : AbstractFir2IrLazyFunction<FirCallableMemberDeclaration>(components, startOffset, endOffset, origin, symbol, isFakeOverride) {
|
||||
init {
|
||||
symbol.bind(this)
|
||||
}
|
||||
|
||||
override val fir: FirCallableMemberDeclaration<*>
|
||||
override val fir: FirCallableMemberDeclaration
|
||||
get() = firAccessor ?: firParentProperty
|
||||
|
||||
// TODO: investigate why some deserialized properties are inline
|
||||
|
||||
@@ -5,11 +5,18 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.lazy
|
||||
|
||||
import org.jetbrains.kotlin.fir.backend.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
||||
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.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.expressions.IrConstructorCall
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||
@@ -79,7 +86,7 @@ class Fir2IrLazySimpleFunction(
|
||||
}
|
||||
|
||||
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?
|
||||
|
||||
+3
-3
@@ -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 FirRegularClass && declaration.classId.isLocal) return null
|
||||
if (declaration is FirCallableMemberDeclaration<*>) {
|
||||
if (declaration is FirCallableMemberDeclaration) {
|
||||
if (declaration.visibility == Visibilities.Local) 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
|
||||
)
|
||||
}
|
||||
is FirCallableMemberDeclaration<*> -> {
|
||||
is FirCallableMemberDeclaration -> {
|
||||
if (declaration.visibility == Visibilities.Private) return null
|
||||
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.ir.util.KotlinMangler
|
||||
|
||||
interface FirMangler : KotlinMangler<FirDeclaration<*>> {
|
||||
interface FirMangler : KotlinMangler<FirDeclaration> {
|
||||
override val manglerName: String
|
||||
get() = "Fir"
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ object FirJavaVisibilityChecker : FirVisibilityChecker() {
|
||||
declarationVisibility: Visibility,
|
||||
symbol: FirBasedSymbol<*>,
|
||||
useSiteFile: FirFile,
|
||||
containingDeclarations: List<FirDeclaration<*>>,
|
||||
containingDeclarations: List<FirDeclaration>,
|
||||
dispatchReceiver: ReceiverValue?,
|
||||
session: FirSession
|
||||
): Boolean {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user