diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/context/CheckerContext.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/context/CheckerContext.kt index c4f5386d1c7..264d15a4860 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/context/CheckerContext.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/context/CheckerContext.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.expressions.FirGetClassCall import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.languageVersionSettings @@ -84,6 +85,9 @@ abstract class CheckerContext : MutableDiagnosticContext() { override val languageVersionSettings: LanguageVersionSettings get() = session.languageVersionSettings + + override val containingFilePath: String? + get() = containingDeclarations.firstOrNull()?.let { (it as? FirFile)?.path } } /** diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt index 9e551f4cf9b..e41a784a90b 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt @@ -47,7 +47,7 @@ class LightTree2Fir( fun buildFirFile(file: File): FirFile { val code = FileUtil.loadFile(file, CharsetToolkit.UTF8, true) - return buildFirFile(code, file.name) + return buildFirFile(code, file.name, file.path) } fun buildLightTree(code: String): FlyweightCapableTreeStructure { @@ -56,10 +56,10 @@ class LightTree2Fir( return builder.lightTree } - fun buildFirFile(code: String, fileName: String): FirFile { + fun buildFirFile(code: String, fileName: String, path: String?): FirFile { val lightTree = buildLightTree(code) return DeclarationsConverter(session, scopeProvider, lightTree) - .convertFile(lightTree.root, fileName) + .convertFile(lightTree.root, fileName, path) } } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 04e300c7977..3f2746bfdf1 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -84,7 +84,7 @@ class DeclarationsConverter( * [org.jetbrains.kotlin.parsing.KotlinParsing.parseFile] * [org.jetbrains.kotlin.parsing.KotlinParsing.parsePreamble] */ - fun convertFile(file: LighterASTNode, fileName: String = ""): FirFile { + fun convertFile(file: LighterASTNode, fileName: String = "", filePath: String?): FirFile { if (file.tokenType != KT_FILE) { //TODO throw error throw Exception() @@ -118,6 +118,7 @@ class DeclarationsConverter( origin = FirDeclarationOrigin.Source moduleData = baseModuleData name = fileName + path = filePath this.packageDirective = packageDirective ?: buildPackageDirective { packageFqName = context.packageFqName } annotations += fileAnnotationList imports += importList diff --git a/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/TotalKotlinTest.kt b/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/TotalKotlinTest.kt index e31aea624ed..bb016ea8fe5 100644 --- a/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/TotalKotlinTest.kt +++ b/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/TotalKotlinTest.kt @@ -12,7 +12,6 @@ import com.intellij.testFramework.TestDataPath import com.intellij.util.PathUtil import org.jetbrains.kotlin.fir.FirRenderer import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase -import org.jetbrains.kotlin.fir.builder.BodyBuildingMode import org.jetbrains.kotlin.fir.builder.StubFirScopeProvider import org.jetbrains.kotlin.fir.session.FirSessionFactory import org.jetbrains.kotlin.psi.KtFile @@ -34,12 +33,12 @@ class TotalKotlinTest : AbstractRawFirBuilderTestCase() { } } - private fun generateFirFromLightTree(onlyLightTree: Boolean, converter: LightTree2Fir, text: String, fileName: String) { + private fun generateFirFromLightTree(onlyLightTree: Boolean, converter: LightTree2Fir, text: String, fileName: String, filePath: String) { if (onlyLightTree) { val lightTree = converter.buildLightTree(text) DebugUtil.lightTreeToString(lightTree, false) } else { - val firFile = converter.buildFirFile(text, fileName) + val firFile = converter.buildFirFile(text, fileName, filePath) StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString() } } @@ -59,7 +58,7 @@ class TotalKotlinTest : AbstractRawFirBuilderTestCase() { path.walkTopDown { val text = FileUtil.loadFile(it, CharsetToolkit.UTF8, true).trim() time += measureNanoTime { - generateFirFromLightTree(onlyLightTree, lightTreeConverter, text, it.name) + generateFirFromLightTree(onlyLightTree, lightTreeConverter, text, it.name, it.path) } counter++ diff --git a/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/benchmark/generators/LightTree2FirGenerator.kt b/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/benchmark/generators/LightTree2FirGenerator.kt index cc512b2c1f7..7f91fddfdb3 100644 --- a/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/benchmark/generators/LightTree2FirGenerator.kt +++ b/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/benchmark/generators/LightTree2FirGenerator.kt @@ -31,7 +31,7 @@ open class LightTree2FirGenerator : TreeGenerator, AbstractRawFirBuilderTestCase session = FirSessionFactory.createEmptySession(), scopeProvider = StubFirScopeProvider ) - val firFile = lightTreeConverter.buildFirFile(text, file.name) + val firFile = lightTreeConverter.buildFirFile(text, file.name, file.path) StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString() } diff --git a/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt b/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt index f88649ed8eb..eb913dc249a 100644 --- a/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt +++ b/compiler/fir/raw-fir/light-tree2fir/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt @@ -68,7 +68,7 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() { val treeFromPsi = StringBuilder().also { FirRenderer(it).visitFile(firFileFromPsi) }.toString() //light tree - val firFileFromLightTree = lightTreeConverter.buildFirFile(text, file.name) + val firFileFromLightTree = lightTreeConverter.buildFirFile(text, file.name, file.path) val treeFromLightTree = StringBuilder().also { FirRenderer(it).visitFile(firFileFromLightTree) }.toString() return@compareBase treeFromLightTree == treeFromPsi @@ -98,7 +98,7 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() { .replace("".toRegex(), "") //light tree - val firFileFromLightTree = lightTreeConverter.buildFirFile(text, file.name) + val firFileFromLightTree = lightTreeConverter.buildFirFile(text, file.name, file.path) val treeFromLightTree = StringBuilder().also { FirRenderer(it).visitFile(firFileFromLightTree) }.toString() .replace("".toRegex(), "") diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 9fbd98993cf..3cf4551cc89 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -907,6 +907,7 @@ open class RawFirBuilder( moduleData = baseModuleData origin = FirDeclarationOrigin.Source name = file.name + path = file.virtualFile?.path packageDirective = buildPackageDirective { packageFqName = context.packageFqName source = file.packageDirective?.toKtPsiSourceElement() diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirFile.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirFile.kt index 97e5e8dda46..4b11a03838b 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirFile.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/FirFile.kt @@ -29,6 +29,7 @@ abstract class FirFile : FirAnnotatedDeclaration() { abstract val imports: List abstract val declarations: List abstract val name: String + abstract val path: String? abstract override val symbol: FirFileSymbol override fun accept(visitor: FirVisitor, data: D): R = visitor.visitFile(this, data) diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFileBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFileBuilder.kt index 32a1c967822..12d9094fb84 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFileBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirFileBuilder.kt @@ -39,6 +39,7 @@ class FirFileBuilder : FirAnnotationContainerBuilder { val imports: MutableList = mutableListOf() val declarations: MutableList = mutableListOf() lateinit var name: String + var path: String? = null override fun build(): FirFile { return FirFileImpl( @@ -52,6 +53,7 @@ class FirFileBuilder : FirAnnotationContainerBuilder { imports, declarations, name, + path, ) } diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFileImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFileImpl.kt index c34af9c605d..998733b7e60 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFileImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirFileImpl.kt @@ -35,6 +35,7 @@ internal class FirFileImpl( override val imports: MutableList, override val declarations: MutableList, override val name: String, + override val path: String?, ) : FirFile() { override val symbol: FirFileSymbol = FirFileSymbol() diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index 38eb07b6655..141554d63f7 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt @@ -415,6 +415,7 @@ object NodeConfigurator : AbstractFieldConfigurator(FirTreeBuild +fieldList(import).withTransform() +declarations.withTransform() +stringField("name") + +stringField("path", nullable = true) +symbol("FirFileSymbol") } diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporter.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporter.kt index faf069e6fc9..c8e50091994 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporter.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/diagnostics/DiagnosticReporter.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.diagnostics import org.jetbrains.kotlin.config.LanguageVersionSettings interface DiagnosticContext { + val containingFilePath: String? + fun isDiagnosticSuppressed(diagnostic: KtDiagnostic): Boolean val languageVersionSettings: LanguageVersionSettings diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/KtDiagnosticReporterWithImplicitIrBasedContext.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/KtDiagnosticReporterWithImplicitIrBasedContext.kt index 1946799d5de..87e05713b51 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/KtDiagnosticReporterWithImplicitIrBasedContext.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/KtDiagnosticReporterWithImplicitIrBasedContext.kt @@ -11,6 +11,8 @@ import org.jetbrains.kotlin.diagnostics.* import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.declarations.name +import org.jetbrains.kotlin.ir.declarations.path import org.jetbrains.kotlin.ir.util.file class KtDiagnosticReporterWithImplicitIrBasedContext( @@ -36,12 +38,15 @@ class KtDiagnosticReporterWithImplicitIrBasedContext( val sourceElement = irElement.sourceElement() override fun isDiagnosticSuppressed(diagnostic: KtDiagnostic): Boolean { - TODO("Not yet implemented") + return false +// TODO("Not yet implemented") } override val languageVersionSettings: LanguageVersionSettings get() = this@KtDiagnosticReporterWithImplicitIrBasedContext.languageVersionSettings + override val containingFilePath: String = containingIrFile.path + @OptIn(InternalDiagnosticFactoryMethod::class) fun report( factory: KtDiagnosticFactory0, diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt index 18016d914c8..a68d57dfeab 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt @@ -131,7 +131,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() { if (useLightTree) { val lightTreeBuilder = LightTree2Fir(session, firProvider.kotlinScopeProvider) ktFiles.mapTo(firFiles) { - val firFile = lightTreeBuilder.buildFirFile(it.text, it.name) + val firFile = lightTreeBuilder.buildFirFile(it.text, it.name, it.virtualFilePath) (session.firProvider as FirProviderImpl).recordFile(firFile) firFile } diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/FirResolveBench.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/FirResolveBench.kt index 47a17ae516e..65837d16e20 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/FirResolveBench.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/FirResolveBench.kt @@ -142,7 +142,7 @@ class FirResolveBench(val withProgress: Boolean, val listener: BenchListener? = val code: String val time = measureNanoTime { code = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() - firFile = builder.buildFirFile(code, file.name) + firFile = builder.buildFirFile(code, file.name, file.path) (builder.session.firProvider as FirProviderImpl).recordFile(firFile) } val after = vmStateSnapshot()