From 16d7d202d26aa7df4ae3a6f29d3b113fb0501f0b Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Fri, 19 Apr 2019 19:13:50 +0300 Subject: [PATCH] Add separated tests for tree generation and fir convertion --- .../kotlin/fir/lightTree/LightTree2Fir.kt | 19 ++++++--- .../LightTree2FirConverterTotalKotlin.kt | 41 +++++++++++++++---- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt index c7347158862..4910294462a 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/LightTree2Fir.kt @@ -5,31 +5,38 @@ package org.jetbrains.kotlin.fir.lightTree +import com.intellij.lang.LighterASTNode import com.intellij.lang.ParserDefinition import com.intellij.lang.impl.PsiBuilderFactoryImpl import com.intellij.lexer.Lexer import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.vfs.CharsetToolkit +import com.intellij.util.diff.FlyweightCapableTreeStructure import org.jetbrains.kotlin.fir.FirSessionBase import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.parsing.MyKotlinParser import java.io.File import java.nio.file.Path -class LightTree2Fir(val stubMode: Boolean, private val parserDefinition: ParserDefinition, private val lexer: Lexer) { +class LightTree2Fir(private val stubMode: Boolean, private val parserDefinition: ParserDefinition, private val lexer: Lexer) { fun buildFirFile(path: Path): FirFile { return buildFirFile(path.toFile()) } fun buildFirFile(file: File): FirFile { - val text = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() - return buildFirFile(text, file.name) + val code = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() + return buildFirFile(code, file.name) } - fun buildFirFile(text: String, fileName: String): FirFile { - val builder = PsiBuilderFactoryImpl().createBuilder(parserDefinition, lexer, text) + fun buildLightTree(code: String): FlyweightCapableTreeStructure { + val builder = PsiBuilderFactoryImpl().createBuilder(parserDefinition, lexer, code) MyKotlinParser.parse(builder) + return builder.lightTree + } - return Converter(object : FirSessionBase() {}, stubMode, builder.lightTree).convertFile(builder.lightTree.root, fileName) + fun buildFirFile(code: String, fileName: String): FirFile { + val lightTree = buildLightTree(code) + + return Converter(object : FirSessionBase() {}, stubMode, lightTree).convertFile(lightTree.root, fileName) } } \ No newline at end of file diff --git a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTotalKotlin.kt b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTotalKotlin.kt index 32730d52560..a0ef048b484 100644 --- a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTotalKotlin.kt +++ b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/LightTree2FirConverterTotalKotlin.kt @@ -28,7 +28,7 @@ import kotlin.system.measureNanoTime @TestDataPath("\$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners::class) class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() { - fun testTotalKotlinLight() { + private fun totalKotlinLight(onlyLightTree: Boolean) { val path = System.getProperty("user.dir") val root = File(path) var counter = 0 @@ -38,7 +38,7 @@ class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() { val lexer = parserDefinition.createLexer(myProject) val lightTreeConverter = LightTree2Fir(true, parserDefinition, lexer) - println("light test") + if (onlyLightTree) println("LightTree generation") else println("Fir from LightTree converter") println("BASE PATH: $path") for (file in root.walkTopDown()) { if (file.isDirectory) continue @@ -47,8 +47,13 @@ class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() { val text = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() time += measureNanoTime { - val firFile = lightTreeConverter.buildFirFile(text, file.name) - StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString() + if (onlyLightTree) { + val lightTree = lightTreeConverter.buildLightTree(text) + DebugUtil.lightTreeToString(lightTree, false) + } else { + val firFile = lightTreeConverter.buildFirFile(text, file.name) + StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString() + } } counter++ @@ -58,13 +63,13 @@ class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() { } - fun testTotalKotlinPsi() { + private fun totalKotlinPsi(onlyPsi: Boolean) { val path = System.getProperty("user.dir") val root = File(path) var counter = 0 var time = 0L - println("psi test") + if (onlyPsi) println("Psi generation") else println("Fir from Psi converter") println("BASE PATH: $path") for (file in root.walkTopDown()) { if (file.isDirectory) continue @@ -74,8 +79,12 @@ class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() { val text = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() time += measureNanoTime { val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text) as KtFile - val firFile = ktFile.toFirFile(stubMode = true) - StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString() + if (onlyPsi) { + DebugUtil.psiTreeToString(ktFile, false) + } else { + val firFile = ktFile.toFirFile(stubMode = true) + StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString() + } } counter++ @@ -84,4 +93,20 @@ class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() { println("TIME PER FILE: ${(time / counter) * 1e-6} ms, COUNTER: $counter") } + + fun testTotalKotlinOnlyLightTree() { + totalKotlinLight(true) + } + + fun testTotalKotlinOnlyPsi() { + totalKotlinPsi(true) + } + + fun testTotalKotlinFirFromLightTree() { + totalKotlinLight(false) + } + + fun testTotalKotlinFirFromPsi() { + totalKotlinPsi(false) + } } \ No newline at end of file