[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:
committed by
Space Team
parent
3430551681
commit
2cee4ddf5c
+8
-8
@@ -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)
|
||||
}
|
||||
|
||||
+2
-2
@@ -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>
|
||||
|
||||
+3
-3
@@ -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 {
|
||||
|
||||
+2
-2
@@ -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>
|
||||
|
||||
+2
-2
@@ -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 }
|
||||
|
||||
|
||||
+2
-2
@@ -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) {
|
||||
|
||||
+4
-4
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user