FIR LT: Introduce source file abstraction, carry it from parsing to IR

along with source lines mapping, allows to "emulate" usage of the
PSI files which allows to extract source file and line mapping info
on every stage from source element.
It makes sense to use this mapping for the error reporting too.
This commit is contained in:
Ilya Chernikov
2022-02-19 21:07:21 +01:00
committed by teamcity
parent bd60d4b2a6
commit 03cbfea737
45 changed files with 539 additions and 239 deletions
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.fir.declarations
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.KtSourceFileLinesMapping
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirPackageDirective
@@ -29,7 +31,8 @@ abstract class FirFile : FirDeclaration() {
abstract val imports: List<FirImport>
abstract val declarations: List<FirDeclaration>
abstract val name: String
abstract val path: String?
abstract val sourceFile: KtSourceFile?
abstract val sourceFileLinesMapping: KtSourceFileLinesMapping?
abstract override val symbol: FirFileSymbol
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitFile(this, data)
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.fir.declarations.builder
import kotlin.contracts.*
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.KtSourceFileLinesMapping
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
@@ -39,7 +41,8 @@ class FirFileBuilder : FirAnnotationContainerBuilder {
val imports: MutableList<FirImport> = mutableListOf()
val declarations: MutableList<FirDeclaration> = mutableListOf()
lateinit var name: String
var path: String? = null
var sourceFile: KtSourceFile? = null
var sourceFileLinesMapping: KtSourceFileLinesMapping? = null
override fun build(): FirFile {
return FirFileImpl(
@@ -53,7 +56,8 @@ class FirFileBuilder : FirAnnotationContainerBuilder {
imports,
declarations,
name,
path,
sourceFile,
sourceFileLinesMapping,
)
}
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.KtSourceFileLinesMapping
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirPackageDirective
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
@@ -35,7 +37,8 @@ internal class FirFileImpl(
override val imports: MutableList<FirImport>,
override val declarations: MutableList<FirDeclaration>,
override val name: String,
override val path: String?,
override val sourceFile: KtSourceFile?,
override val sourceFileLinesMapping: KtSourceFileLinesMapping?,
) : FirFile() {
override val symbol: FirFileSymbol = FirFileSymbol()
@@ -415,7 +415,8 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
+fieldList(import).withTransform()
+declarations.withTransform()
+stringField("name")
+stringField("path", nullable = true)
+field("sourceFile", sourceFileType, nullable = true)
+field("sourceFileLinesMapping", sourceFileLinesMappingType, nullable = true)
+symbol("FirFileSymbol")
}
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.fir.tree.generator
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.KtSourceFileLinesMapping
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
@@ -23,6 +25,8 @@ import org.jetbrains.kotlin.types.SmartcastStability
import org.jetbrains.kotlin.types.Variance
val sourceElementType = type(KtSourceElement::class)
val sourceFileType = type(KtSourceFile::class)
val sourceFileLinesMappingType = type(KtSourceFileLinesMapping::class)
val jumpTargetType = type("fir", "FirTarget")
val constKindType = type("types", "ConstantValueKind")
val operationType = type("fir.expressions", "FirOperation")