[IR] Extract IrDiagnosticReporter interface

^KT-62292
This commit is contained in:
Pavel Kunyavskiy
2023-11-14 13:08:11 +01:00
committed by Space Team
parent faaefbd8e7
commit 41098a2e34
10 changed files with 49 additions and 34 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.pipeline package org.jetbrains.kotlin.fir.pipeline
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizedResult import org.jetbrains.kotlin.backend.common.actualizer.IrActualizedResult
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
@@ -143,9 +144,11 @@ fun FirResult.convertToIrAndActualize(
actualizationResult = IrActualizer.actualize( actualizationResult = IrActualizer.actualize(
fir2IrResult.irModuleFragment, fir2IrResult.irModuleFragment,
commonIrOutputs.map { it.irModuleFragment }, commonIrOutputs.map { it.irModuleFragment },
fir2IrConfiguration.diagnosticReporter, KtDiagnosticReporterWithImplicitIrBasedContext(
fir2IrConfiguration.diagnosticReporter,
fir2IrConfiguration.languageVersionSettings
),
actualizerTypeContextProvider(fir2IrResult.irModuleFragment.irBuiltins), actualizerTypeContextProvider(fir2IrResult.irModuleFragment.irBuiltins),
fir2IrConfiguration.languageVersionSettings,
commonMemberStorage.symbolTable, commonMemberStorage.symbolTable,
fir2IrResult.components.fakeOverrideBuilder, fir2IrResult.components.fakeOverrideBuilder,
fir2IrConfiguration.useIrFakeOverrideBuilder, fir2IrConfiguration.useIrFakeOverrideBuilder,
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.KtDiagnostic import org.jetbrains.kotlin.diagnostics.KtDiagnostic
import org.jetbrains.kotlin.diagnostics.KtDiagnosticReporterWithContext import org.jetbrains.kotlin.diagnostics.KtDiagnosticReporterWithContext
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
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
@@ -28,7 +29,7 @@ import java.util.*
class KtDiagnosticReporterWithImplicitIrBasedContext( class KtDiagnosticReporterWithImplicitIrBasedContext(
diagnosticReporter: DiagnosticReporter, diagnosticReporter: DiagnosticReporter,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings
) : KtDiagnosticReporterWithContext(diagnosticReporter, languageVersionSettings) { ) : KtDiagnosticReporterWithContext(diagnosticReporter, languageVersionSettings), IrDiagnosticReporter {
private val suppressCache = IrBasedSuppressCache() private val suppressCache = IrBasedSuppressCache()
@@ -36,13 +37,13 @@ class KtDiagnosticReporterWithImplicitIrBasedContext(
(PsiSourceManager.findPsiElement(this, containingIrFile)?.let(::KtRealPsiSourceElement) (PsiSourceManager.findPsiElement(this, containingIrFile)?.let(::KtRealPsiSourceElement)
?: sourceElement()) ?: sourceElement())
fun at(irElement: IrElement, containingIrDeclaration: IrDeclaration): DiagnosticContextImpl = override fun at(irElement: IrElement, containingIrDeclaration: IrDeclaration): DiagnosticContextImpl =
at(irElement, containingIrDeclaration.file) at(irElement, containingIrDeclaration.file)
fun at(irDeclaration: IrDeclaration): DiagnosticContextImpl = override fun at(irDeclaration: IrDeclaration): DiagnosticContextImpl =
at(irDeclaration, irDeclaration.file) at(irDeclaration, irDeclaration.file)
fun at(irElement: IrElement, containingIrFile: IrFile): DiagnosticContextImpl = override fun at(irElement: IrElement, containingIrFile: IrFile): DiagnosticContextImpl =
at(irElement.toSourceElement(containingIrFile), irElement, containingIrFile) at(irElement.toSourceElement(containingIrFile), irElement, containingIrFile)
fun at( fun at(
@@ -5,8 +5,6 @@
package org.jetbrains.kotlin.backend.common.actualizer package org.jetbrains.kotlin.backend.common.actualizer
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
import org.jetbrains.kotlin.backend.common.CommonBackendErrors
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
@@ -16,7 +14,6 @@ import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.IrTypeSystemContext import org.jetbrains.kotlin.ir.types.IrTypeSystemContext
import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.classifierOrFail
import org.jetbrains.kotlin.ir.util.isInterface
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
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
@@ -35,7 +32,6 @@ import org.jetbrains.kotlin.resolve.OverridingUtil
internal class ActualFakeOverridesAdder( internal class ActualFakeOverridesAdder(
private val expectActualMap: Map<IrSymbol, IrSymbol>, private val expectActualMap: Map<IrSymbol, IrSymbol>,
private val expectToActualClassMap: Map<ClassId, IrClassSymbol>, private val expectToActualClassMap: Map<ClassId, IrClassSymbol>,
private val diagnosticsReporter: KtDiagnosticReporterWithImplicitIrBasedContext,
private val typeSystemContext: IrTypeSystemContext private val typeSystemContext: IrTypeSystemContext
) : IrElementVisitorVoid { ) : IrElementVisitorVoid {
private val overrideChecker = IrOverrideChecker(typeSystemContext, emptyList()) private val overrideChecker = IrOverrideChecker(typeSystemContext, emptyList())
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.backend.common.actualizer package org.jetbrains.kotlin.backend.common.actualizer
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
@@ -47,7 +47,7 @@ internal class ExpectActualCollector(
private val mainFragment: IrModuleFragment, private val mainFragment: IrModuleFragment,
private val dependentFragments: List<IrModuleFragment>, private val dependentFragments: List<IrModuleFragment>,
private val typeSystemContext: IrTypeSystemContext, private val typeSystemContext: IrTypeSystemContext,
private val diagnosticsReporter: KtDiagnosticReporterWithImplicitIrBasedContext, private val diagnosticsReporter: IrDiagnosticReporter,
private val expectActualTracker: ExpectActualTracker?, private val expectActualTracker: ExpectActualTracker?,
) { ) {
data class Result(val expectToActualMap: MutableMap<IrSymbol, IrSymbol>, val classActualizationInfo: ClassActualizationInfo) data class Result(val expectToActualMap: MutableMap<IrSymbol, IrSymbol>, val classActualizationInfo: ClassActualizationInfo)
@@ -246,7 +246,7 @@ private class ExpectActualLinkCollector : IrElementVisitor<Unit, ExpectActualLin
class MatchingContext( class MatchingContext(
typeSystemContext: IrTypeSystemContext, typeSystemContext: IrTypeSystemContext,
private val destination: MutableMap<IrSymbol, IrSymbol>, private val destination: MutableMap<IrSymbol, IrSymbol>,
private val diagnosticsReporter: KtDiagnosticReporterWithImplicitIrBasedContext, private val diagnosticsReporter: IrDiagnosticReporter,
private val expectActualTracker: ExpectActualTracker?, private val expectActualTracker: ExpectActualTracker?,
internal val classActualizationInfo: ClassActualizationInfo, internal val classActualizationInfo: ClassActualizationInfo,
private val currentExpectFile: IrFile?, private val currentExpectFile: IrFile?,
@@ -5,11 +5,8 @@
package org.jetbrains.kotlin.backend.common.actualizer package org.jetbrains.kotlin.backend.common.actualizer
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.backend.common.actualizer.checker.IrExpectActualCheckers import org.jetbrains.kotlin.backend.common.actualizer.checker.IrExpectActualCheckers
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.overrides.IrFakeOverrideBuilder import org.jetbrains.kotlin.ir.overrides.IrFakeOverrideBuilder
@@ -30,15 +27,13 @@ object IrActualizer {
fun actualize( fun actualize(
mainFragment: IrModuleFragment, mainFragment: IrModuleFragment,
dependentFragments: List<IrModuleFragment>, dependentFragments: List<IrModuleFragment>,
diagnosticReporter: DiagnosticReporter, ktDiagnosticReporter: IrDiagnosticReporter,
typeSystemContext: IrTypeSystemContext, typeSystemContext: IrTypeSystemContext,
languageVersionSettings: LanguageVersionSettings,
symbolTable: SymbolTable, symbolTable: SymbolTable,
fakeOverrideBuilder: IrFakeOverrideBuilder, fakeOverrideBuilder: IrFakeOverrideBuilder,
useIrFakeOverrideBuilder: Boolean, useIrFakeOverrideBuilder: Boolean,
expectActualTracker: ExpectActualTracker? expectActualTracker: ExpectActualTracker?
): IrActualizedResult { ): IrActualizedResult {
val ktDiagnosticReporter = KtDiagnosticReporterWithImplicitIrBasedContext(diagnosticReporter, languageVersionSettings)
// The ir modules processing is performed phase-to-phase: // The ir modules processing is performed phase-to-phase:
// 1. Collect expect-actual links for classes and their members from dependent fragments // 1. Collect expect-actual links for classes and their members from dependent fragments
@@ -67,7 +62,6 @@ object IrActualizer {
ActualFakeOverridesAdder( ActualFakeOverridesAdder(
expectActualMap, expectActualMap,
actualDeclarations.actualClasses, actualDeclarations.actualClasses,
ktDiagnosticReporter,
typeSystemContext typeSystemContext
).apply { dependentFragments.forEach { visitModuleFragment(it) } } ).apply { dependentFragments.forEach { visitModuleFragment(it) } }
} }
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.backend.common.actualizer package org.jetbrains.kotlin.backend.common.actualizer
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.backend.common.CommonBackendErrors import org.jetbrains.kotlin.backend.common.CommonBackendErrors
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
@@ -94,12 +94,12 @@ private fun recordTypeParametersMapping(
} }
} }
internal fun KtDiagnosticReporterWithImplicitIrBasedContext.reportMissingActual(expectSymbol: IrSymbol) { internal fun IrDiagnosticReporter.reportMissingActual(expectSymbol: IrSymbol) {
reportMissingActual(expectSymbol.owner as IrDeclaration) reportMissingActual(expectSymbol.owner as IrDeclaration)
} }
@OptIn(ObsoleteDescriptorBasedAPI::class) @OptIn(ObsoleteDescriptorBasedAPI::class)
internal fun KtDiagnosticReporterWithImplicitIrBasedContext.reportMissingActual(irDeclaration: IrDeclaration) { internal fun IrDiagnosticReporter.reportMissingActual(irDeclaration: IrDeclaration) {
at(irDeclaration).report( at(irDeclaration).report(
CommonBackendErrors.NO_ACTUAL_FOR_EXPECT, CommonBackendErrors.NO_ACTUAL_FOR_EXPECT,
(irDeclaration as? IrDeclarationWithName)?.name?.asString().orEmpty(), (irDeclaration as? IrDeclarationWithName)?.name?.asString().orEmpty(),
@@ -107,7 +107,7 @@ internal fun KtDiagnosticReporterWithImplicitIrBasedContext.reportMissingActual(
) )
} }
internal fun KtDiagnosticReporterWithImplicitIrBasedContext.reportExpectActualIncompatibility( internal fun IrDiagnosticReporter.reportExpectActualIncompatibility(
expectSymbol: IrSymbol, expectSymbol: IrSymbol,
actualSymbol: IrSymbol, actualSymbol: IrSymbol,
incompatibility: ExpectActualCheckingCompatibility.Incompatible<*>, incompatibility: ExpectActualCheckingCompatibility.Incompatible<*>,
@@ -122,7 +122,7 @@ internal fun KtDiagnosticReporterWithImplicitIrBasedContext.reportExpectActualIn
) )
} }
internal fun KtDiagnosticReporterWithImplicitIrBasedContext.reportExpectActualMismatch( internal fun IrDiagnosticReporter.reportExpectActualMismatch(
expectSymbol: IrSymbol, expectSymbol: IrSymbol,
actualSymbol: IrSymbol, actualSymbol: IrSymbol,
incompatibility: ExpectActualMatchingCompatibility.Mismatch, incompatibility: ExpectActualMatchingCompatibility.Mismatch,
@@ -137,7 +137,7 @@ internal fun KtDiagnosticReporterWithImplicitIrBasedContext.reportExpectActualMi
) )
} }
internal fun KtDiagnosticReporterWithImplicitIrBasedContext.reportActualAnnotationsNotMatchExpect( internal fun IrDiagnosticReporter.reportActualAnnotationsNotMatchExpect(
expectSymbol: IrSymbol, expectSymbol: IrSymbol,
actualSymbol: IrSymbol, actualSymbol: IrSymbol,
incompatibilityType: ExpectActualAnnotationsIncompatibilityType<IrConstructorCall>, incompatibilityType: ExpectActualAnnotationsIncompatibilityType<IrConstructorCall>,
@@ -151,7 +151,7 @@ internal fun KtDiagnosticReporterWithImplicitIrBasedContext.reportActualAnnotati
) )
} }
internal fun KtDiagnosticReporterWithImplicitIrBasedContext.reportActualAnnotationConflictingDefaultArgumentValue( internal fun IrDiagnosticReporter.reportActualAnnotationConflictingDefaultArgumentValue(
reportOn: IrElement, reportOn: IrElement,
file: IrFile, file: IrFile,
actualParam: IrValueParameter, actualParam: IrValueParameter,
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.backend.common.actualizer.checker package org.jetbrains.kotlin.backend.common.actualizer.checker
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.backend.common.actualizer.ClassActualizationInfo import org.jetbrains.kotlin.backend.common.actualizer.ClassActualizationInfo
import org.jetbrains.kotlin.backend.common.actualizer.IrExpectActualMatchingContext import org.jetbrains.kotlin.backend.common.actualizer.IrExpectActualMatchingContext
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
@@ -16,7 +16,7 @@ internal interface IrExpectActualChecker {
val matchedExpectToActual: Map<IrSymbol, IrSymbol> val matchedExpectToActual: Map<IrSymbol, IrSymbol>
val classActualizationInfo: ClassActualizationInfo val classActualizationInfo: ClassActualizationInfo
val typeSystemContext: IrTypeSystemContext val typeSystemContext: IrTypeSystemContext
val diagnosticsReporter: KtDiagnosticReporterWithImplicitIrBasedContext val diagnosticsReporter: IrDiagnosticReporter
val matchingContext: IrExpectActualMatchingContext val matchingContext: IrExpectActualMatchingContext
} }
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.backend.common.actualizer.checker package org.jetbrains.kotlin.backend.common.actualizer.checker
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext import org.jetbrains.kotlin.ir.IrDiagnosticReporter
import org.jetbrains.kotlin.backend.common.actualizer.ClassActualizationInfo import org.jetbrains.kotlin.backend.common.actualizer.ClassActualizationInfo
import org.jetbrains.kotlin.backend.common.actualizer.IrExpectActualMatchingContext import org.jetbrains.kotlin.backend.common.actualizer.IrExpectActualMatchingContext
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
@@ -16,7 +16,7 @@ internal class IrExpectActualCheckers(
override val matchedExpectToActual: Map<IrSymbol, IrSymbol>, override val matchedExpectToActual: Map<IrSymbol, IrSymbol>,
override val classActualizationInfo: ClassActualizationInfo, override val classActualizationInfo: ClassActualizationInfo,
override val typeSystemContext: IrTypeSystemContext, override val typeSystemContext: IrTypeSystemContext,
override val diagnosticsReporter: KtDiagnosticReporterWithImplicitIrBasedContext, override val diagnosticsReporter: IrDiagnosticReporter,
) : IrExpectActualChecker.Context { ) : IrExpectActualChecker.Context {
private val checkers: Set<IrExpectActualChecker> = setOf( private val checkers: Set<IrExpectActualChecker> = setOf(
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.ir
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.diagnostics.KtDiagnosticReporterWithContext.DiagnosticContextImpl
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFile
interface IrDiagnosticReporter {
val languageVersionSettings: LanguageVersionSettings
fun at(irDeclaration: IrDeclaration): DiagnosticContextImpl
fun at(irElement: IrElement, containingIrFile: IrFile): DiagnosticContextImpl
fun at(irElement: IrElement, containingIrDeclaration: IrDeclaration): DiagnosticContextImpl
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.test.backend.ir package org.jetbrains.kotlin.test.backend.ir
import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.JvmIrTypeSystemContext import org.jetbrains.kotlin.backend.jvm.JvmIrTypeSystemContext
@@ -32,9 +33,11 @@ class IrActualizerAndPluginsFacade(
val result = IrActualizer.actualize( val result = IrActualizer.actualize(
inputArtifact.irModuleFragment, inputArtifact.irModuleFragment,
inputArtifact.dependentIrModuleFragments, inputArtifact.dependentIrModuleFragments,
inputArtifact.diagnosticReporter, KtDiagnosticReporterWithImplicitIrBasedContext(
inputArtifact.diagnosticReporter,
testServices.compilerConfigurationProvider.getCompilerConfiguration(module).languageVersionSettings,
),
typeSystemContext, typeSystemContext,
testServices.compilerConfigurationProvider.getCompilerConfiguration(module).languageVersionSettings,
inputArtifact.fir2IrComponents!!.symbolTable, inputArtifact.fir2IrComponents!!.symbolTable,
inputArtifact.fir2IrComponents!!.fakeOverrideBuilder, inputArtifact.fir2IrComponents!!.fakeOverrideBuilder,
useIrFakeOverrideBuilder = CodegenTestDirectives.ENABLE_IR_FAKE_OVERRIDE_GENERATION in module.directives, useIrFakeOverrideBuilder = CodegenTestDirectives.ENABLE_IR_FAKE_OVERRIDE_GENERATION in module.directives,