[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
|
package org.jetbrains.kotlin.ir.backend.js.checkers
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
|
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
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.JsKlibEsModuleExportsChecker
|
||||||
import org.jetbrains.kotlin.ir.backend.js.checkers.declarations.JsKlibOtherModuleExportsChecker
|
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.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.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||||
@@ -34,11 +35,10 @@ object JsKlibCheckers {
|
|||||||
cleanFiles: List<SerializedIrFile>,
|
cleanFiles: List<SerializedIrFile>,
|
||||||
dirtyModule: IrModuleFragment,
|
dirtyModule: IrModuleFragment,
|
||||||
exportedNames: Map<IrFile, Map<IrDeclarationWithName, String>>,
|
exportedNames: Map<IrFile, Map<IrDeclarationWithName, String>>,
|
||||||
diagnosticReporter: DiagnosticReporter,
|
diagnosticReporter: IrDiagnosticReporter,
|
||||||
configuration: CompilerConfiguration
|
configuration: CompilerConfiguration
|
||||||
) {
|
) {
|
||||||
dirtyModule.acceptVoid(object : IrElementVisitorVoid {
|
dirtyModule.acceptVoid(object : IrElementVisitorVoid {
|
||||||
private val reporter = KtDiagnosticReporterWithImplicitIrBasedContext(diagnosticReporter, configuration.languageVersionSettings)
|
|
||||||
private val diagnosticContext = JsKlibDiagnosticContext(configuration)
|
private val diagnosticContext = JsKlibDiagnosticContext(configuration)
|
||||||
|
|
||||||
override fun visitElement(element: IrElement) {
|
override fun visitElement(element: IrElement) {
|
||||||
@@ -54,7 +54,7 @@ object JsKlibCheckers {
|
|||||||
override fun visitModuleFragment(declaration: IrModuleFragment) {
|
override fun visitModuleFragment(declaration: IrModuleFragment) {
|
||||||
val exportedDeclarations = JsKlibExportingDeclaration.collectDeclarations(cleanFiles, declaration.files, exportedNames)
|
val exportedDeclarations = JsKlibExportingDeclaration.collectDeclarations(cleanFiles, declaration.files, exportedNames)
|
||||||
for (checker in exportedDeclarationsCheckers) {
|
for (checker in exportedDeclarationsCheckers) {
|
||||||
checker.check(exportedDeclarations, this.diagnosticContext, reporter)
|
checker.check(exportedDeclarations, this.diagnosticContext, diagnosticReporter)
|
||||||
}
|
}
|
||||||
super.visitModuleFragment(declaration)
|
super.visitModuleFragment(declaration)
|
||||||
}
|
}
|
||||||
@@ -67,7 +67,7 @@ object JsKlibCheckers {
|
|||||||
|
|
||||||
override fun visitCall(expression: IrCall) {
|
override fun visitCall(expression: IrCall) {
|
||||||
for (checker in callCheckers) {
|
for (checker in callCheckers) {
|
||||||
checker.check(expression, this.diagnosticContext, reporter)
|
checker.check(expression, this.diagnosticContext, diagnosticReporter)
|
||||||
}
|
}
|
||||||
super.visitCall(expression)
|
super.visitCall(expression)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -5,10 +5,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.checkers
|
package org.jetbrains.kotlin.ir.backend.js.checkers
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
|
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
|
||||||
|
|
||||||
interface JsKlibDeclarationsChecker<D> {
|
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>
|
typealias JsKlibExportedDeclarationsChecker = JsKlibDeclarationsChecker<JsKlibExportingDeclaration>
|
||||||
|
|||||||
+3
-3
@@ -5,9 +5,9 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.checkers
|
package org.jetbrains.kotlin.ir.backend.js.checkers
|
||||||
|
|
||||||
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
|
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.diagnostics.KtDiagnosticReporterWithContext
|
import org.jetbrains.kotlin.diagnostics.KtDiagnosticReporterWithContext
|
||||||
|
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
@@ -40,14 +40,14 @@ class JsKlibDiagnosticContext(val compilerConfiguration: CompilerConfiguration)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun KtDiagnosticReporterWithImplicitIrBasedContext.at(
|
fun IrDiagnosticReporter.at(
|
||||||
declaration: IrDeclaration,
|
declaration: IrDeclaration,
|
||||||
context: JsKlibDiagnosticContext,
|
context: JsKlibDiagnosticContext,
|
||||||
): KtDiagnosticReporterWithContext.DiagnosticContextImpl {
|
): KtDiagnosticReporterWithContext.DiagnosticContextImpl {
|
||||||
return context.containingFile?.let { at(declaration, it) } ?: at(declaration)
|
return context.containingFile?.let { at(declaration, it) } ?: at(declaration)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun KtDiagnosticReporterWithImplicitIrBasedContext.at(
|
fun IrDiagnosticReporter.at(
|
||||||
irElement: IrElement,
|
irElement: IrElement,
|
||||||
context: JsKlibDiagnosticContext,
|
context: JsKlibDiagnosticContext,
|
||||||
): KtDiagnosticReporterWithContext.DiagnosticContextImpl {
|
): KtDiagnosticReporterWithContext.DiagnosticContextImpl {
|
||||||
|
|||||||
+2
-2
@@ -5,12 +5,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.checkers
|
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.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
|
||||||
interface JsKlibExpressionChecker<E : 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>
|
typealias JsKlibCallChecker = JsKlibExpressionChecker<IrCall>
|
||||||
|
|||||||
+2
-2
@@ -5,14 +5,14 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ir.backend.js.checkers.declarations
|
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.*
|
import org.jetbrains.kotlin.ir.backend.js.checkers.*
|
||||||
|
|
||||||
object JsKlibEsModuleExportsChecker : JsKlibExportedDeclarationsChecker {
|
object JsKlibEsModuleExportsChecker : JsKlibExportedDeclarationsChecker {
|
||||||
override fun check(
|
override fun check(
|
||||||
declarations: List<JsKlibExportingDeclaration>,
|
declarations: List<JsKlibExportingDeclaration>,
|
||||||
context: JsKlibDiagnosticContext,
|
context: JsKlibDiagnosticContext,
|
||||||
reporter: KtDiagnosticReporterWithImplicitIrBasedContext
|
reporter: IrDiagnosticReporter
|
||||||
) {
|
) {
|
||||||
val allExportedNameClashes = declarations.groupBy { it.exportingName }.filterValues { it.size > 1 }
|
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
|
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.*
|
import org.jetbrains.kotlin.ir.backend.js.checkers.*
|
||||||
|
|
||||||
object JsKlibOtherModuleExportsChecker : JsKlibExportedDeclarationsChecker {
|
object JsKlibOtherModuleExportsChecker : JsKlibExportedDeclarationsChecker {
|
||||||
@@ -47,7 +47,7 @@ object JsKlibOtherModuleExportsChecker : JsKlibExportedDeclarationsChecker {
|
|||||||
override fun check(
|
override fun check(
|
||||||
declarations: List<JsKlibExportingDeclaration>,
|
declarations: List<JsKlibExportingDeclaration>,
|
||||||
context: JsKlibDiagnosticContext,
|
context: JsKlibDiagnosticContext,
|
||||||
reporter: KtDiagnosticReporterWithImplicitIrBasedContext
|
reporter: IrDiagnosticReporter,
|
||||||
) {
|
) {
|
||||||
val clashes = collectClashes(declarations)
|
val clashes = collectClashes(declarations)
|
||||||
for ((declaration, clashedWith) in clashes) {
|
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.parserExceptions.AbortParsingException
|
||||||
import com.google.gwt.dev.js.rhino.CodePosition
|
import com.google.gwt.dev.js.rhino.CodePosition
|
||||||
import com.google.gwt.dev.js.rhino.ErrorReporter
|
import com.google.gwt.dev.js.rhino.ErrorReporter
|
||||||
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
|
|
||||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
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.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.JsKlibDiagnosticContext
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.checkers.JsKlibErrors
|
||||||
import org.jetbrains.kotlin.ir.backend.js.checkers.at
|
import org.jetbrains.kotlin.ir.backend.js.checkers.at
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrConst
|
import org.jetbrains.kotlin.ir.expressions.IrConst
|
||||||
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.name.JsStandardClassIds
|
|||||||
object JsKlibJsCodeCallChecker : JsKlibCallChecker {
|
object JsKlibJsCodeCallChecker : JsKlibCallChecker {
|
||||||
private val jsCodeFqName = JsStandardClassIds.Callables.JsCode.asSingleFqName()
|
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
|
// Do not check IR from K1, because there are corresponding K1 FE checks in JsCallChecker
|
||||||
if (!context.compilerConfiguration.languageVersionSettings.languageVersion.usesK2) {
|
if (!context.compilerConfiguration.languageVersionSettings.languageVersion.usesK2) {
|
||||||
return
|
return
|
||||||
@@ -66,7 +66,7 @@ object JsKlibJsCodeCallChecker : JsKlibCallChecker {
|
|||||||
private class JsErrorReporter(
|
private class JsErrorReporter(
|
||||||
val codeExpression: IrExpression,
|
val codeExpression: IrExpression,
|
||||||
val context: JsKlibDiagnosticContext,
|
val context: JsKlibDiagnosticContext,
|
||||||
val reporter: KtDiagnosticReporterWithImplicitIrBasedContext,
|
val reporter: IrDiagnosticReporter,
|
||||||
) : ErrorReporter {
|
) : ErrorReporter {
|
||||||
override fun warning(message: String, startPosition: CodePosition, endPosition: CodePosition) {
|
override fun warning(message: String, startPosition: CodePosition, endPosition: CodePosition) {
|
||||||
reporter.at(codeExpression, context).report(JsKlibErrors.JSCODE_WARNING, message)
|
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.project.Project
|
||||||
import com.intellij.openapi.vfs.VfsUtilCore
|
import com.intellij.openapi.vfs.VfsUtilCore
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.KtIoFileSourceFile
|
import org.jetbrains.kotlin.*
|
||||||
import org.jetbrains.kotlin.KtPsiSourceFile
|
|
||||||
import org.jetbrains.kotlin.KtSourceFile
|
|
||||||
import org.jetbrains.kotlin.KtVirtualFileSourceFile
|
|
||||||
import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport
|
import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport
|
||||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||||
import org.jetbrains.kotlin.analyzer.CompilationErrorException
|
import org.jetbrains.kotlin.analyzer.CompilationErrorException
|
||||||
@@ -638,9 +635,10 @@ fun serializeModuleIntoKlib(
|
|||||||
|
|
||||||
val moduleExportedNames = moduleFragment.collectExportedNames()
|
val moduleExportedNames = moduleFragment.collectExportedNames()
|
||||||
|
|
||||||
|
val irDiagnosticReporter = KtDiagnosticReporterWithImplicitIrBasedContext(diagnosticReporter, configuration.languageVersionSettings)
|
||||||
if (builtInsPlatform == BuiltInsPlatform.JS) {
|
if (builtInsPlatform == BuiltInsPlatform.JS) {
|
||||||
val cleanFilesIrData = cleanFiles.map { it.irData }
|
val cleanFilesIrData = cleanFiles.map { it.irData }
|
||||||
JsKlibCheckers.check(cleanFilesIrData, moduleFragment, moduleExportedNames, diagnosticReporter, configuration)
|
JsKlibCheckers.check(cleanFilesIrData, moduleFragment, moduleExportedNames, irDiagnosticReporter, configuration)
|
||||||
}
|
}
|
||||||
|
|
||||||
val serializedIr =
|
val serializedIr =
|
||||||
|
|||||||
Reference in New Issue
Block a user