Add separated tests for tree generation and fir convertion

This commit is contained in:
Ivan Kylchik
2019-04-19 19:13:50 +03:00
committed by Mikhail Glukhikh
parent 343dcca79d
commit 16d7d202d2
2 changed files with 46 additions and 14 deletions
@@ -5,31 +5,38 @@
package org.jetbrains.kotlin.fir.lightTree package org.jetbrains.kotlin.fir.lightTree
import com.intellij.lang.LighterASTNode
import com.intellij.lang.ParserDefinition import com.intellij.lang.ParserDefinition
import com.intellij.lang.impl.PsiBuilderFactoryImpl import com.intellij.lang.impl.PsiBuilderFactoryImpl
import com.intellij.lexer.Lexer import com.intellij.lexer.Lexer
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.CharsetToolkit import com.intellij.openapi.vfs.CharsetToolkit
import com.intellij.util.diff.FlyweightCapableTreeStructure
import org.jetbrains.kotlin.fir.FirSessionBase import org.jetbrains.kotlin.fir.FirSessionBase
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.parsing.MyKotlinParser import org.jetbrains.kotlin.parsing.MyKotlinParser
import java.io.File import java.io.File
import java.nio.file.Path 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 { fun buildFirFile(path: Path): FirFile {
return buildFirFile(path.toFile()) return buildFirFile(path.toFile())
} }
fun buildFirFile(file: File): FirFile { fun buildFirFile(file: File): FirFile {
val text = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() val code = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim()
return buildFirFile(text, file.name) return buildFirFile(code, file.name)
} }
fun buildFirFile(text: String, fileName: String): FirFile { fun buildLightTree(code: String): FlyweightCapableTreeStructure<LighterASTNode> {
val builder = PsiBuilderFactoryImpl().createBuilder(parserDefinition, lexer, text) val builder = PsiBuilderFactoryImpl().createBuilder(parserDefinition, lexer, code)
MyKotlinParser.parse(builder) 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)
} }
} }
@@ -28,7 +28,7 @@ import kotlin.system.measureNanoTime
@TestDataPath("\$PROJECT_ROOT") @TestDataPath("\$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners::class) @RunWith(JUnit3RunnerWithInners::class)
class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() { class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() {
fun testTotalKotlinLight() { private fun totalKotlinLight(onlyLightTree: Boolean) {
val path = System.getProperty("user.dir") val path = System.getProperty("user.dir")
val root = File(path) val root = File(path)
var counter = 0 var counter = 0
@@ -38,7 +38,7 @@ class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() {
val lexer = parserDefinition.createLexer(myProject) val lexer = parserDefinition.createLexer(myProject)
val lightTreeConverter = LightTree2Fir(true, parserDefinition, lexer) val lightTreeConverter = LightTree2Fir(true, parserDefinition, lexer)
println("light test") if (onlyLightTree) println("LightTree generation") else println("Fir from LightTree converter")
println("BASE PATH: $path") println("BASE PATH: $path")
for (file in root.walkTopDown()) { for (file in root.walkTopDown()) {
if (file.isDirectory) continue if (file.isDirectory) continue
@@ -47,8 +47,13 @@ class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() {
val text = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() val text = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim()
time += measureNanoTime { time += measureNanoTime {
val firFile = lightTreeConverter.buildFirFile(text, file.name) if (onlyLightTree) {
StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString() 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++ counter++
@@ -58,13 +63,13 @@ class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() {
} }
fun testTotalKotlinPsi() { private fun totalKotlinPsi(onlyPsi: Boolean) {
val path = System.getProperty("user.dir") val path = System.getProperty("user.dir")
val root = File(path) val root = File(path)
var counter = 0 var counter = 0
var time = 0L var time = 0L
println("psi test") if (onlyPsi) println("Psi generation") else println("Fir from Psi converter")
println("BASE PATH: $path") println("BASE PATH: $path")
for (file in root.walkTopDown()) { for (file in root.walkTopDown()) {
if (file.isDirectory) continue if (file.isDirectory) continue
@@ -74,8 +79,12 @@ class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() {
val text = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() val text = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim()
time += measureNanoTime { time += measureNanoTime {
val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text) as KtFile val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text) as KtFile
val firFile = ktFile.toFirFile(stubMode = true) if (onlyPsi) {
StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString() DebugUtil.psiTreeToString(ktFile, false)
} else {
val firFile = ktFile.toFirFile(stubMode = true)
StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString()
}
} }
counter++ counter++
@@ -84,4 +93,20 @@ class LightTree2FirConverterTotalKotlin : AbstractRawFirBuilderTestCase() {
println("TIME PER FILE: ${(time / counter) * 1e-6} ms, COUNTER: $counter") 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)
}
} }