Add path to FirFile to pass it to the DiagnosticContext
This commit is contained in:
+4
@@ -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 }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+3
-3
@@ -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<LighterASTNode> {
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -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
|
||||
|
||||
+3
-4
@@ -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++
|
||||
|
||||
+1
-1
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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("<Unsupported LValue.*?>".toRegex(), "<Unsupported LValue>")
|
||||
|
||||
//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("<Unsupported LValue.*?>".toRegex(), "<Unsupported LValue>")
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -29,6 +29,7 @@ abstract class FirFile : FirAnnotatedDeclaration() {
|
||||
abstract val imports: List<FirImport>
|
||||
abstract val declarations: List<FirDeclaration>
|
||||
abstract val name: String
|
||||
abstract val path: String?
|
||||
abstract override val symbol: FirFileSymbol
|
||||
|
||||
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitFile(this, data)
|
||||
|
||||
@@ -39,6 +39,7 @@ class FirFileBuilder : FirAnnotationContainerBuilder {
|
||||
val imports: MutableList<FirImport> = mutableListOf()
|
||||
val declarations: MutableList<FirDeclaration> = 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,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -35,6 +35,7 @@ internal class FirFileImpl(
|
||||
override val imports: MutableList<FirImport>,
|
||||
override val declarations: MutableList<FirDeclaration>,
|
||||
override val name: String,
|
||||
override val path: String?,
|
||||
) : FirFile() {
|
||||
override val symbol: FirFileSymbol = FirFileSymbol()
|
||||
|
||||
|
||||
+1
@@ -415,6 +415,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
||||
+fieldList(import).withTransform()
|
||||
+declarations.withTransform()
|
||||
+stringField("name")
|
||||
+stringField("path", nullable = true)
|
||||
+symbol("FirFileSymbol")
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
+6
-1
@@ -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,
|
||||
|
||||
+1
-1
@@ -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
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user