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:
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.codegen.inline.GENERATE_SMAP
|
||||
import org.jetbrains.kotlin.test.KotlinBaseTest
|
||||
import org.jetbrains.kotlin.test.util.JUnit4Assertions
|
||||
import org.junit.Assert
|
||||
import java.io.File
|
||||
import java.io.StringReader
|
||||
|
||||
object SMAPTestUtil {
|
||||
@@ -62,7 +63,7 @@ object SMAPTestUtil {
|
||||
}.associateBy { it.sourceFile }
|
||||
|
||||
for (source in sourceData) {
|
||||
val ktFileName = "/" + source.sourceFile
|
||||
val ktFileName = "/" + File(source.sourceFile).name
|
||||
.replace(".smap-nonseparate-compilation", ".kt")
|
||||
.replace(".smap-separate-compilation", ".kt")
|
||||
.replace(".smap", ".kt")
|
||||
|
||||
+8
-1
@@ -11,6 +11,7 @@ import com.intellij.openapi.vfs.VirtualFileManager
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiElementFinder
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import org.jetbrains.kotlin.KtInMemoryTextSourceFile
|
||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
|
||||
import org.jetbrains.kotlin.checkers.BaseDiagnosticsTest
|
||||
@@ -46,6 +47,7 @@ import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.resolve.AnalyzingUtils
|
||||
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
|
||||
import org.jetbrains.kotlin.toSourceLinesMapping
|
||||
import java.io.File
|
||||
|
||||
abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
|
||||
@@ -133,7 +135,12 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
|
||||
if (useLightTree) {
|
||||
val lightTreeBuilder = LightTree2Fir(session, firProvider.kotlinScopeProvider)
|
||||
ktFiles.mapTo(firFiles) {
|
||||
val firFile = lightTreeBuilder.buildFirFile(it.text, it.name, it.virtualFilePath)
|
||||
val firFile =
|
||||
lightTreeBuilder.buildFirFile(
|
||||
it.text,
|
||||
KtInMemoryTextSourceFile(it.name, it.virtualFilePath, it.text),
|
||||
it.text.toSourceLinesMapping()
|
||||
)
|
||||
(session.firProvider as FirProviderImpl).recordFile(firFile)
|
||||
firFile
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import com.intellij.openapi.util.io.FileUtil
|
||||
import com.intellij.openapi.util.text.StringUtil
|
||||
import com.intellij.openapi.vfs.CharsetToolkit
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.KtIoFileSourceFile
|
||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeStubDiagnostic
|
||||
@@ -26,6 +27,7 @@ import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitorVoid
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||
import org.jetbrains.kotlin.readSourceFileWithMapping
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.sumByLong
|
||||
import java.io.File
|
||||
import java.io.PrintStream
|
||||
@@ -139,16 +141,18 @@ class FirResolveBench(val withProgress: Boolean, val listener: BenchListener? =
|
||||
return files.map { file ->
|
||||
val before = vmStateSnapshot()
|
||||
val firFile: FirFile
|
||||
val code: String
|
||||
val time = measureNanoTime {
|
||||
code = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim()
|
||||
firFile = builder.buildFirFile(code, file.name, file.path)
|
||||
val sourceFile = KtIoFileSourceFile(file)
|
||||
val (code, linesMapping) = with(file.inputStream().reader(Charsets.UTF_8)) {
|
||||
this.readSourceFileWithMapping()
|
||||
}
|
||||
totalLines += linesMapping.linesCount
|
||||
firFile = builder.buildFirFile(code, sourceFile, linesMapping)
|
||||
(builder.session.firProvider as FirProviderImpl).recordFile(firFile)
|
||||
}
|
||||
val after = vmStateSnapshot()
|
||||
val diff = after - before
|
||||
recordTime(builder::class, diff, time)
|
||||
totalLines += StringUtil.countNewLines(code)
|
||||
firFile
|
||||
}.also {
|
||||
listener?.after(builder::class)
|
||||
|
||||
Reference in New Issue
Block a user