[FIR] Remove unneeded symbol.fir accesses

This commit is contained in:
Nikolay Lunyak
2024-01-11 14:32:37 +02:00
committed by Space Team
parent 965d8d2fd5
commit 95989fc3e2
19 changed files with 97 additions and 85 deletions
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.fir.analysis.jvm
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.fir.analysis.FirOverridesBackwardCompatibilityHelper
import org.jetbrains.kotlin.fir.containingClassLookupTag
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.isJavaOrEnhancement
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
/**
* With JVM compilation
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.isJavaOrEnhancement
* `kotlin.Throwable` does not require `override` keyword.
*/
object FirJvmOverridesBackwardCompatibilityHelper : FirOverridesBackwardCompatibilityHelper() {
override fun additionalCheck(member: FirCallableDeclaration): Boolean? {
override fun additionalCheck(member: FirCallableSymbol<*>): Boolean? {
if (!member.isJavaOrEnhancement) return false
val containingClassName = member.containingClassLookupTag()?.classId?.asSingleFqName()?.toUnsafe() ?: return false
// If the super class is mapped to a Kotlin built-in class, then we don't require `override` keyword.
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.coneType
@@ -212,10 +211,7 @@ object FirJvmStaticChecker : FirBasicDeclarationChecker() {
private fun CheckerContext.containerIsNonCompanionObject(outerLevel: Int): Boolean {
val containingClassSymbol = this.getContainerAt(outerLevel) ?: return false
@OptIn(SymbolInternals::class)
val containingClass = (containingClassSymbol.fir as? FirRegularClass) ?: return false
val containingClass = (containingClassSymbol as? FirRegularClassSymbol) ?: return false
return containingClass.classKind == ClassKind.OBJECT && !containingClass.isCompanion
}
@@ -7,18 +7,17 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirAbstractOverrideChecker
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.java.enhancement.EnhancedForWarningConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.firOverrideChecker
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenProperties
import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.scopes.impl.FirFakeOverrideGenerator
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.typeContext
@@ -41,22 +40,21 @@ object FirOverrideJavaNullabilityWarningChecker : FirAbstractOverrideChecker() {
val enhancedOverrides = scope
.getDirectOverriddenFunctions(member.symbol)
.map {
@OptIn(SymbolInternals::class)
val substitutedBase = it.fir.substituteOrNull(substitutor, context) ?: return@map it
val substitutedBase = it.substituteOrNull(substitutor, context) ?: return@map it
anyBaseEnhanced = true
if (!anyReported && !context.session.firOverrideChecker.isOverriddenFunction(member, substitutedBase)) {
if (!anyReported && !context.session.firOverrideChecker.isOverriddenFunction(member.symbol, substitutedBase)) {
anyReported = true
reporter.reportOn(
member.source,
FirJvmErrors.WRONG_NULLABILITY_FOR_JAVA_OVERRIDE,
member.symbol,
substitutedBase.symbol,
substitutedBase,
context
)
}
substitutedBase.symbol
substitutedBase
}
if (anyBaseEnhanced && !anyReported) {
@@ -70,22 +68,21 @@ object FirOverrideJavaNullabilityWarningChecker : FirAbstractOverrideChecker() {
val enhancedOverrides = scope
.getDirectOverriddenProperties(member.symbol)
.map {
@OptIn(SymbolInternals::class)
val substitutedBase = it.fir.substituteOrNull(substitutor, context) ?: return@map it
val substitutedBase = it.substituteOrNull(substitutor, context) ?: return@map it
anyBaseEnhanced = true
if (!anyReported && !context.session.firOverrideChecker.isOverriddenProperty(member, substitutedBase)) {
if (!anyReported && !context.session.firOverrideChecker.isOverriddenProperty(member.symbol, substitutedBase)) {
anyReported = true
reporter.reportOn(
member.source,
FirJvmErrors.WRONG_NULLABILITY_FOR_JAVA_OVERRIDE,
member.symbol,
substitutedBase.symbol,
substitutedBase,
context
)
}
substitutedBase.symbol
substitutedBase
}
if (anyBaseEnhanced && !anyReported) {
@@ -133,6 +130,15 @@ private fun FirSimpleFunction.substituteOrNull(
}
}
private fun FirNamedFunctionSymbol.substituteOrNull(
substitutor: EnhancedForWarningConeSubstitutor,
context: CheckerContext,
): FirNamedFunctionSymbol? {
// Ok, because `substituteOrNull` calls lazyResolveToPhase
@OptIn(SymbolInternals::class)
return fir.substituteOrNull(substitutor, context)?.symbol
}
/**
* @see org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope.createSubstitutionOverrideProperty
* @see org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope.createSubstitutedData
@@ -163,4 +169,13 @@ private fun FirProperty.substituteOrNull(
newReceiverType = newExtensionReceiverType,
)
}
}
}
private fun FirPropertySymbol.substituteOrNull(
substitutor: EnhancedForWarningConeSubstitutor,
context: CheckerContext,
): FirPropertySymbol? {
// Ok, because `substituteOrNull` calls `lazyResolveToPhase`
@OptIn(SymbolInternals::class)
return fir.substituteOrNull(substitutor, context)?.symbol
}