Skip to content

Commit 80146c8

Browse files
cypressiousSpace Team
authored andcommitted
[FIR] Contextualize JS checkers
1 parent 450b2f4 commit 80146c8

28 files changed

+190
-155
lines changed

compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/FirJsHelpers.kt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,16 @@ fun FirBasedSymbol<*>.isEffectivelyExternalMember(session: FirSession): Boolean
3434
return fir is FirMemberDeclaration && isEffectivelyExternal(session)
3535
}
3636

37-
fun FirBasedSymbol<*>.isEffectivelyExternal(context: CheckerContext): Boolean = isEffectivelyExternal(context.session)
37+
context(context: CheckerContext)
38+
fun FirBasedSymbol<*>.isEffectivelyExternal(): Boolean = isEffectivelyExternal(context.session)
3839

39-
fun FirFunctionSymbol<*>.isOverridingExternalWithOptionalParams(context: CheckerContext): Boolean {
40+
context(context: CheckerContext)
41+
fun FirFunctionSymbol<*>.isOverridingExternalWithOptionalParams(): Boolean {
4042
if (!isSubstitutionOrIntersectionOverride && modality == Modality.ABSTRACT) return false
4143

4244
val overridden = (this as? FirNamedFunctionSymbol)?.directOverriddenFunctionsSafe(context) ?: return false
4345

44-
for (overriddenFunction in overridden.filter { it.isEffectivelyExternal(context) }) {
46+
for (overriddenFunction in overridden.filter { it.isEffectivelyExternal() }) {
4547
if (overriddenFunction.valueParameterSymbols.any { it.hasDefaultValue }) return true
4648
}
4749

@@ -134,15 +136,20 @@ internal fun FirBasedSymbol<*>.getContainingFile(): FirFile? {
134136
}
135137
}
136138

137-
fun FirBasedSymbol<*>.isNativeObject(context: CheckerContext): Boolean = isNativeObject(context.session)
139+
context(context: CheckerContext)
140+
fun FirBasedSymbol<*>.isNativeObject(): Boolean = isNativeObject(context.session)
138141

139-
fun FirBasedSymbol<*>.isNativeInterface(context: CheckerContext): Boolean = isNativeInterface(context.session)
142+
context(context: CheckerContext)
143+
fun FirBasedSymbol<*>.isNativeInterface(): Boolean = isNativeInterface(context.session)
140144

141-
fun FirBasedSymbol<*>.isPredefinedObject(context: CheckerContext): Boolean = isPredefinedObject(context.session)
145+
context(context: CheckerContext)
146+
fun FirBasedSymbol<*>.isPredefinedObject(): Boolean = isPredefinedObject(context.session)
142147

143-
fun FirBasedSymbol<*>.isExportedObject(context: CheckerContext): Boolean = isExportedObject(context.session)
148+
context(context: CheckerContext)
149+
fun FirBasedSymbol<*>.isExportedObject(): Boolean = isExportedObject(context.session)
144150

145-
fun FirBasedSymbol<*>.isLibraryObject(context: CheckerContext): Boolean = isLibraryObject(context.session)
151+
context(context: CheckerContext)
152+
fun FirBasedSymbol<*>.isLibraryObject(): Boolean = isLibraryObject(context.session)
146153

147154
internal fun FirClass.superClassNotAny(session: FirSession) = superConeTypes
148155
.filterNot { it.isAny || it.isNullableAny }

compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/FirJsModuleCheckUtils.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,9 @@ private val FirSession.jsModuleKindComponent: FirJsModuleKind? by FirSession.nul
2727
private val FirSession.jsModuleKind: ModuleKind?
2828
get() = jsModuleKindComponent?.moduleKind
2929

30+
context(context: CheckerContext, reporter: DiagnosticReporter)
3031
internal fun checkJsModuleUsage(
3132
callee: FirBasedSymbol<*>,
32-
context: CheckerContext,
33-
reporter: DiagnosticReporter,
3433
source: AbstractKtSourceElement?
3534
) {
3635
val moduleKind = context.session.jsModuleKind ?: return
@@ -48,17 +47,17 @@ internal fun checkJsModuleUsage(
4847
when (moduleKind) {
4948
ModuleKind.UMD -> {
5049
if (!callToNonModule && callToModule || callToNonModule && !callToModule) {
51-
reporter.reportOn(source, FirJsErrors.CALL_FROM_UMD_MUST_BE_JS_MODULE_AND_JS_NON_MODULE, context)
50+
reporter.reportOn(source, FirJsErrors.CALL_FROM_UMD_MUST_BE_JS_MODULE_AND_JS_NON_MODULE)
5251
}
5352
}
5453
ModuleKind.PLAIN -> {
5554
if (!callToNonModule && callToModule) {
56-
reporter.reportOn(source, FirJsErrors.CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM, callee, context)
55+
reporter.reportOn(source, FirJsErrors.CALL_TO_JS_MODULE_WITHOUT_MODULE_SYSTEM, callee)
5756
}
5857
}
5958
else -> {
6059
if (!callToModule && callToNonModule) {
61-
reporter.reportOn(source, FirJsErrors.CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM, callee, context)
60+
reporter.reportOn(source, FirJsErrors.CALL_TO_JS_NON_MODULE_WITH_MODULE_SYSTEM, callee)
6261
}
6362
}
6463
}

compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/FirJsPlatformDiagnosticSuppressor.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
1212
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
1313
import org.jetbrains.kotlin.name.JsStandardClassIds
1414

15-
private fun FirDeclaration.isLexicallyInsideJsNative(context: CheckerContext): Boolean {
15+
context(context: CheckerContext)
16+
private fun FirDeclaration.isLexicallyInsideJsNative(): Boolean {
1617
return JsStandardClassIds.Annotations.nativeAnnotations.any { hasAnnotationOrInsideAnnotatedClass(it, context.session) }
1718
}
1819

1920
class FirJsPlatformDiagnosticSuppressor : FirPlatformDiagnosticSuppressor {
20-
override fun shouldReportNoBody(declaration: FirCallableDeclaration, context: CheckerContext): Boolean =
21-
!declaration.isLexicallyInsideJsNative(context)
21+
context(context: CheckerContext)
22+
override fun shouldReportNoBody(declaration: FirCallableDeclaration): Boolean =
23+
!declaration.isLexicallyInsideJsNative()
2224
}

compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExportDeclarationChecker.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import org.jetbrains.kotlin.types.Variance
4141
object FirJsExportDeclarationChecker : FirBasicDeclarationChecker(MppCheckerKind.Platform) {
4242
context(context: CheckerContext, reporter: DiagnosticReporter)
4343
override fun check(declaration: FirDeclaration) {
44-
if (!declaration.symbol.isExportedObject(context) || declaration !is FirMemberDeclaration) {
44+
if (!declaration.symbol.isExportedObject() || declaration !is FirMemberDeclaration) {
4545
return
4646
}
4747

@@ -75,7 +75,7 @@ object FirJsExportDeclarationChecker : FirBasicDeclarationChecker(MppCheckerKind
7575
reportWrongExportedDeclaration("expect")
7676
}
7777

78-
validateDeclarationOnConsumableName(declaration, context, reporter)
78+
validateDeclarationOnConsumableName(declaration)
7979

8080
when (declaration) {
8181
is FirFunction -> {
@@ -300,10 +300,9 @@ object FirJsExportDeclarationChecker : FirBasicDeclarationChecker(MppCheckerKind
300300
|| isMap
301301
|| isMutableMap
302302

303+
context(context: CheckerContext, reporter: DiagnosticReporter)
303304
private fun validateDeclarationOnConsumableName(
304305
declaration: FirMemberDeclaration,
305-
context: CheckerContext,
306-
reporter: DiagnosticReporter,
307306
) {
308307
if (!context.isTopLevel || declaration.nameOrSpecialName.isSpecial) {
309308
return
@@ -317,6 +316,6 @@ object FirJsExportDeclarationChecker : FirBasicDeclarationChecker(MppCheckerKind
317316
return
318317
}
319318

320-
reporter.reportOn(reportTarget, FirJsErrors.NON_CONSUMABLE_EXPORTED_IDENTIFIER, name, context)
319+
reporter.reportOn(reportTarget, FirJsErrors.NON_CONSUMABLE_EXPORTED_IDENTIFIER, name)
321320
}
322321
}

compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExportedActualMatchExpectChecker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ object FirJsExportedActualMatchExpectChecker : FirBasicDeclarationChecker(MppChe
4444
}
4545

4646

47-
if (correspondingExpectDeclaration.isExportedObject(context) && !correspondingActualDeclaration.isExportedObject(context)) {
47+
if (correspondingExpectDeclaration.isExportedObject() && !correspondingActualDeclaration.isExportedObject()) {
4848
reporter.reportOn(declaration.source, FirJsErrors.NOT_EXPORTED_ACTUAL_DECLARATION_WHILE_EXPECT_IS_EXPORTED)
4949
}
5050
}

compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExternalChecker.kt

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
package org.jetbrains.kotlin.fir.analysis.js.checkers.declaration
77

88
import org.jetbrains.kotlin.*
9-
import org.jetbrains.kotlin.builtins.StandardNames
109
import org.jetbrains.kotlin.config.LanguageFeature
11-
import org.jetbrains.kotlin.descriptors.ClassKind
1210
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
1311
import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactory0
1412
import org.jetbrains.kotlin.diagnostics.reportOn
@@ -22,27 +20,27 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
2220
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyBackingField
2321
import org.jetbrains.kotlin.fir.declarations.utils.*
2422
import org.jetbrains.kotlin.fir.analysis.js.checkers.isNativeObject
25-
import org.jetbrains.kotlin.fir.analysis.js.checkers.superClassNotAny
2623
import org.jetbrains.kotlin.fir.analysis.web.common.checkers.declaration.FirWebCommonExternalChecker
2724
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
2825
import org.jetbrains.kotlin.fir.types.*
2926
import org.jetbrains.kotlin.name.CallableId
3027
import org.jetbrains.kotlin.name.JsStandardClassIds
3128
import org.jetbrains.kotlin.name.JsStandardClassIds.Annotations.JsNative
32-
import org.jetbrains.kotlin.psi.KtParameter
3329

3430
object FirJsExternalChecker : FirWebCommonExternalChecker(allowCompanionInInterface = true) {
3531
override fun isNativeOrEffectivelyExternal(symbol: FirBasedSymbol<*>, session: FirSession): Boolean {
3632
return symbol.isNativeObject(session)
3733
}
3834

39-
override fun reportExternalEnum(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
40-
reporter.reportOn(declaration.source, FirJsErrors.ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING, context)
35+
context(context: CheckerContext, reporter: DiagnosticReporter)
36+
override fun reportExternalEnum(declaration: FirDeclaration, ) {
37+
reporter.reportOn(declaration.source, FirJsErrors.ENUM_CLASS_IN_EXTERNAL_DECLARATION_WARNING)
4138
}
4239

43-
override fun additionalCheck(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
40+
context(context: CheckerContext, reporter: DiagnosticReporter)
41+
override fun additionalCheck(declaration: FirDeclaration, ) {
4442
if (declaration is FirFunction && declaration.isInline) {
45-
reporter.reportOn(declaration.source, FirWebCommonErrors.INLINE_EXTERNAL_DECLARATION, context)
43+
reporter.reportOn(declaration.source, FirWebCommonErrors.INLINE_EXTERNAL_DECLARATION)
4644
}
4745

4846
fun reportOnParametersAndReturnTypesIf(
@@ -59,7 +57,7 @@ object FirJsExternalChecker : FirWebCommonExternalChecker(allowCompanionInInterf
5957

6058
fun checkTypeIsNotInlineClass(type: ConeKotlinType, elementToReport: KtSourceElement?) {
6159
if (condition(type)) {
62-
reporter.reportOn(elementToReport, diagnosticFactory, context)
60+
reporter.reportOn(elementToReport, diagnosticFactory)
6361
}
6462
}
6563

@@ -102,7 +100,7 @@ object FirJsExternalChecker : FirWebCommonExternalChecker(allowCompanionInInterf
102100
)
103101
}
104102

105-
declaration.checkEnumEntry(context, reporter)
103+
declaration.checkEnumEntry()
106104
}
107105

108106
override fun isDefinedExternallyCallableId(callableId: CallableId): Boolean {
@@ -122,10 +120,11 @@ object FirJsExternalChecker : FirWebCommonExternalChecker(allowCompanionInInterf
122120
else -> returnTypeRef.coneType.typeArguments.firstOrNull()?.type
123121
}
124122

125-
private fun FirDeclaration.checkEnumEntry(context: CheckerContext, reporter: DiagnosticReporter) {
123+
context(context: CheckerContext, reporter: DiagnosticReporter)
124+
private fun FirDeclaration.checkEnumEntry() {
126125
if (this !is FirEnumEntry) return
127126
initializer?.let {
128-
reporter.reportOn(it.source, FirJsErrors.EXTERNAL_ENUM_ENTRY_WITH_BODY, context)
127+
reporter.reportOn(it.source, FirJsErrors.EXTERNAL_ENUM_ENTRY_WITH_BODY)
129128
}
130129
}
131130
}

compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExternalFileChecker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ object FirJsExternalFileChecker : FirBasicDeclarationChecker(MppCheckerKind.Comm
2525
override fun check(declaration: FirDeclaration) {
2626
val closestNonLocal = context.closestNonLocalWith(declaration) ?: return
2727

28-
if (closestNonLocal.isNativeObject(context) || closestNonLocal is FirTypeAliasSymbol || !context.isTopLevel) {
28+
if (closestNonLocal.isNativeObject() || closestNonLocal is FirTypeAliasSymbol || !context.isTopLevel) {
2929
return
3030
}
3131

compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsExternalInheritorOnlyChecker.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ sealed class FirJsExternalInheritorOnlyChecker(mppKind: MppCheckerKind) : FirCla
3939
}
4040
}
4141

42-
private fun FirClass.forEachParents(context: CheckerContext, f: (FirRegularClassSymbol) -> Unit) {
42+
context(context: CheckerContext)
43+
private fun FirClass.forEachParents(f: (FirRegularClassSymbol) -> Unit) {
4344
val todo = superConeTypes.toMutableList()
4445
val done = hashSetOf<FirRegularClassSymbol>()
4546

@@ -54,8 +55,8 @@ sealed class FirJsExternalInheritorOnlyChecker(mppKind: MppCheckerKind) : FirCla
5455

5556
context(context: CheckerContext, reporter: DiagnosticReporter)
5657
override fun check(declaration: FirClass) {
57-
if (!declaration.symbol.isEffectivelyExternal(context)) {
58-
declaration.forEachParents(context) { parent ->
58+
if (!declaration.symbol.isEffectivelyExternal()) {
59+
declaration.forEachParents() { parent ->
5960
if (parent.hasAnnotation(JsExternalInheritorsOnly, context.session)) {
6061
reporter.reportOn(
6162
declaration.source,

compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsInheritanceClassChecker.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ sealed class FirJsInheritanceClassChecker(mppKind: MppCheckerKind) : FirClassChe
6161
}
6262

6363
if (!isEffectivelyExternal) {
64-
val fakeOverriddenMethod = declaration.findFakeMethodOverridingExternalWithOptionalParams(context)
64+
val fakeOverriddenMethod = declaration.findFakeMethodOverridingExternalWithOptionalParams()
6565

6666
if (fakeOverriddenMethod != null) {
6767
reporter.reportOn(
@@ -89,7 +89,8 @@ sealed class FirJsInheritanceClassChecker(mppKind: MppCheckerKind) : FirClassChe
8989
return with(session.typeContext) { isTypeOrSubtypeOf { it.isSuspendOrKSuspendFunctionType(session) } }
9090
}
9191

92-
private fun FirClass.findFakeMethodOverridingExternalWithOptionalParams(context: CheckerContext): FirNamedFunctionSymbol? {
92+
context(context: CheckerContext)
93+
private fun FirClass.findFakeMethodOverridingExternalWithOptionalParams(): FirNamedFunctionSymbol? {
9394
val scope = symbol.unsubstitutedScope(context)
9495

9596
val members = scope.collectAllFunctions()
@@ -100,7 +101,7 @@ sealed class FirJsInheritanceClassChecker(mppKind: MppCheckerKind) : FirClassChe
100101
}
101102

102103
return members.firstOrNull {
103-
it.isOverridingExternalWithOptionalParams(context)
104+
it.isOverridingExternalWithOptionalParams()
104105
}
105106
}
106107
}

compiler/fir/checkers/checkers.js/src/org/jetbrains/kotlin/fir/analysis/js/checkers/declaration/FirJsInheritanceFunctionChecker.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,14 @@ sealed class FirJsInheritanceFunctionChecker(mppKind: MppCheckerKind) : FirFunct
3737

3838
context(context: CheckerContext, reporter: DiagnosticReporter)
3939
override fun check(declaration: FirFunction) {
40-
if (declaration.isNotEffectivelyExternalFunctionButOverridesExternal(context)) {
40+
if (declaration.isNotEffectivelyExternalFunctionButOverridesExternal()) {
4141
reporter.reportOn(declaration.source, FirJsErrors.OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS)
4242
}
4343
}
4444

45-
private fun FirDeclaration.isNotEffectivelyExternalFunctionButOverridesExternal(context: CheckerContext): Boolean {
46-
if (this !is FirFunction || symbol.isEffectivelyExternal(context)) return false
47-
return symbol.isOverridingExternalWithOptionalParams(context)
45+
context(context: CheckerContext)
46+
private fun FirDeclaration.isNotEffectivelyExternalFunctionButOverridesExternal(): Boolean {
47+
if (this !is FirFunction || symbol.isEffectivelyExternal()) return false
48+
return symbol.isOverridingExternalWithOptionalParams()
4849
}
4950
}

0 commit comments

Comments
 (0)