[JS] Use IrDiagnosticReporter in place of its more specific subclass

To reuse this diagnostic reporter in `serialization.common` for
reporting signature clashes (KT-63670), we must extract it to
the `serializeModuleIntoKlib` method instead of creating it in
`JsKlibCheckers`.

However, because `serialization.common` does not depend on
the `backend.common` module in which
`KtDiagnosticReporterWithImplicitIrBasedContext` is declared,
we have to use the `IrDiagnosticReporter` interface in place of
`KtDiagnosticReporterWithImplicitIrBasedContext`.

Besides, it's better from the architectural point of view:
the users of that diagnostic reporter should not know about its
implementation details.
This commit is contained in:
Sergej Jaskiewicz
2023-12-15 16:46:34 +01:00
committed by Space Team
parent 3430551681
commit 2cee4ddf5c
8 changed files with 26 additions and 28 deletions
@@ -5,15 +5,16 @@
package org.jetbrains.kotlin.ir.backend.js.checkers
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.backend.js.checkers.declarations.JsKlibEsModuleExportsChecker
import org.jetbrains.kotlin.ir.backend.js.checkers.declarations.JsKlibOtherModuleExportsChecker
import org.jetbrains.kotlin.ir.backend.js.checkers.expressions.JsKlibJsCodeCallChecker
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
@@ -34,11 +35,10 @@ object JsKlibCheckers {
cleanFiles: List<SerializedIrFile>,
dirtyModule: IrModuleFragment,
exportedNames: Map<IrFile, Map<IrDeclarationWithName, String>>,
diagnosticReporter: DiagnosticReporter,
diagnosticReporter: IrDiagnosticReporter,
configuration: CompilerConfiguration
) {
dirtyModule.acceptVoid(object : IrElementVisitorVoid {
private val reporter = KtDiagnosticReporterWithImplicitIrBasedContext(diagnosticReporter, configuration.languageVersionSettings)
private val diagnosticContext = JsKlibDiagnosticContext(configuration)
override fun visitElement(element: IrElement) {
@@ -54,7 +54,7 @@ object JsKlibCheckers {
override fun visitModuleFragment(declaration: IrModuleFragment) {
val exportedDeclarations = JsKlibExportingDeclaration.collectDeclarations(cleanFiles, declaration.files, exportedNames)
for (checker in exportedDeclarationsCheckers) {
checker.check(exportedDeclarations, this.diagnosticContext, reporter)
checker.check(exportedDeclarations, this.diagnosticContext, diagnosticReporter)
}
super.visitModuleFragment(declaration)
}
@@ -67,7 +67,7 @@ object JsKlibCheckers {
override fun visitCall(expression: IrCall) {
for (checker in callCheckers) {
checker.check(expression, this.diagnosticContext, reporter)
checker.check(expression, this.diagnosticContext, diagnosticReporter)
}
super.visitCall(expression)
}
@@ -5,10 +5,10 @@
package org.jetbrains.kotlin.ir.backend.js.checkers
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
interface JsKlibDeclarationsChecker<D> {
fun check(declarations: List<D>, context: JsKlibDiagnosticContext, reporter: KtDiagnosticReporterWithImplicitIrBasedContext)
fun check(declarations: List<D>, context: JsKlibDiagnosticContext, reporter: IrDiagnosticReporter)
}
typealias JsKlibExportedDeclarationsChecker = JsKlibDeclarationsChecker<JsKlibExportingDeclaration>
@@ -5,9 +5,9 @@
package org.jetbrains.kotlin.ir.backend.js.checkers
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.diagnostics.KtDiagnosticReporterWithContext
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFile
@@ -40,14 +40,14 @@ class JsKlibDiagnosticContext(val compilerConfiguration: CompilerConfiguration)
}
}
fun KtDiagnosticReporterWithImplicitIrBasedContext.at(
fun IrDiagnosticReporter.at(
declaration: IrDeclaration,
context: JsKlibDiagnosticContext,
): KtDiagnosticReporterWithContext.DiagnosticContextImpl {
return context.containingFile?.let { at(declaration, it) } ?: at(declaration)
}
fun KtDiagnosticReporterWithImplicitIrBasedContext.at(
fun IrDiagnosticReporter.at(
irElement: IrElement,
context: JsKlibDiagnosticContext,
): KtDiagnosticReporterWithContext.DiagnosticContextImpl {
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.ir.backend.js.checkers
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
interface JsKlibExpressionChecker<E : IrExpression> {
fun check(expression: E, context: JsKlibDiagnosticContext, reporter: KtDiagnosticReporterWithImplicitIrBasedContext)
fun check(expression: E, context: JsKlibDiagnosticContext, reporter: IrDiagnosticReporter)
}
typealias JsKlibCallChecker = JsKlibExpressionChecker<IrCall>
@@ -5,14 +5,14 @@
package org.jetbrains.kotlin.ir.backend.js.checkers.declarations
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.ir.backend.js.checkers.*
object JsKlibEsModuleExportsChecker : JsKlibExportedDeclarationsChecker {
override fun check(
declarations: List<JsKlibExportingDeclaration>,
context: JsKlibDiagnosticContext,
reporter: KtDiagnosticReporterWithImplicitIrBasedContext
reporter: IrDiagnosticReporter
) {
val allExportedNameClashes = declarations.groupBy { it.exportingName }.filterValues { it.size > 1 }
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.ir.backend.js.checkers.declarations
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.ir.backend.js.checkers.*
object JsKlibOtherModuleExportsChecker : JsKlibExportedDeclarationsChecker {
@@ -47,7 +47,7 @@ object JsKlibOtherModuleExportsChecker : JsKlibExportedDeclarationsChecker {
override fun check(
declarations: List<JsKlibExportingDeclaration>,
context: JsKlibDiagnosticContext,
reporter: KtDiagnosticReporterWithImplicitIrBasedContext
reporter: IrDiagnosticReporter,
) {
val clashes = collectClashes(declarations)
for ((declaration, clashedWith) in clashes) {
@@ -8,11 +8,11 @@ package org.jetbrains.kotlin.ir.backend.js.checkers.expressions
import com.google.gwt.dev.js.parserExceptions.AbortParsingException
import com.google.gwt.dev.js.rhino.CodePosition
import com.google.gwt.dev.js.rhino.ErrorReporter
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.ir.backend.js.checkers.JsKlibCallChecker
import org.jetbrains.kotlin.ir.backend.js.checkers.JsKlibErrors
import org.jetbrains.kotlin.ir.backend.js.checkers.JsKlibDiagnosticContext
import org.jetbrains.kotlin.ir.backend.js.checkers.JsKlibErrors
import org.jetbrains.kotlin.ir.backend.js.checkers.at
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrConst
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.name.JsStandardClassIds
object JsKlibJsCodeCallChecker : JsKlibCallChecker {
private val jsCodeFqName = JsStandardClassIds.Callables.JsCode.asSingleFqName()
override fun check(expression: IrCall, context: JsKlibDiagnosticContext, reporter: KtDiagnosticReporterWithImplicitIrBasedContext) {
override fun check(expression: IrCall, context: JsKlibDiagnosticContext, reporter: IrDiagnosticReporter) {
// Do not check IR from K1, because there are corresponding K1 FE checks in JsCallChecker
if (!context.compilerConfiguration.languageVersionSettings.languageVersion.usesK2) {
return
@@ -66,7 +66,7 @@ object JsKlibJsCodeCallChecker : JsKlibCallChecker {
private class JsErrorReporter(
val codeExpression: IrExpression,
val context: JsKlibDiagnosticContext,
val reporter: KtDiagnosticReporterWithImplicitIrBasedContext,
val reporter: IrDiagnosticReporter,
) : ErrorReporter {
override fun warning(message: String, startPosition: CodePosition, endPosition: CodePosition) {
reporter.at(codeExpression, context).report(JsKlibErrors.JSCODE_WARNING, message)
@@ -8,10 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.KtIoFileSourceFile
import org.jetbrains.kotlin.KtPsiSourceFile
import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.KtVirtualFileSourceFile
import org.jetbrains.kotlin.*
import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.analyzer.CompilationErrorException
@@ -638,9 +635,10 @@ fun serializeModuleIntoKlib(
val moduleExportedNames = moduleFragment.collectExportedNames()
val irDiagnosticReporter = KtDiagnosticReporterWithImplicitIrBasedContext(diagnosticReporter, configuration.languageVersionSettings)
if (builtInsPlatform == BuiltInsPlatform.JS) {
val cleanFilesIrData = cleanFiles.map { it.irData }
JsKlibCheckers.check(cleanFilesIrData, moduleFragment, moduleExportedNames, diagnosticReporter, configuration)
JsKlibCheckers.check(cleanFilesIrData, moduleFragment, moduleExportedNames, irDiagnosticReporter, configuration)
}
val serializedIr =