diff --git a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/BaseTestCase.kt b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/BaseTestCase.kt index e02890f1d30..2094982591a 100644 --- a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/BaseTestCase.kt +++ b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/BaseTestCase.kt @@ -6,15 +6,19 @@ package org.jetbrains.kotlin.fir.lightTree import com.intellij.lang.impl.PsiBuilderFactoryImpl +import com.intellij.openapi.util.io.FileUtil +import com.intellij.openapi.vfs.CharsetToolkit import com.intellij.psi.PsiManager import com.intellij.psi.impl.DebugUtil import com.intellij.psi.impl.PsiManagerEx import com.intellij.testFramework.LightVirtualFile import com.intellij.testFramework.TestDataPath +import com.intellij.util.PathUtil +import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.idea.KotlinFileType -import org.jetbrains.kotlin.parsing.KotlinParser -import org.jetbrains.kotlin.parsing.KotlinParserDefinition +import org.jetbrains.kotlin.parsing.* import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.test.JUnit3RunnerWithInners import org.jetbrains.kotlin.test.testFramework.KtParsingTestCase import org.junit.runner.RunWith @@ -27,19 +31,21 @@ import kotlin.system.measureNanoTime */ @TestDataPath("\$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners::class) -class BaseTestCase: KtParsingTestCase( +class BaseTestCase : KtParsingTestCase( "", "kt", KotlinParserDefinition() ) { fun test() { - val file = KtFile((PsiManager.getInstance(myProject) as PsiManagerEx).fileManager.createFileViewProvider( - LightVirtualFile( - "foo", - KotlinFileType.INSTANCE, - "" - ), true - ), false) + val file = KtFile( + (PsiManager.getInstance(myProject) as PsiManagerEx).fileManager.createFileViewProvider( + LightVirtualFile( + "foo", + KotlinFileType.INSTANCE, + "" + ), true + ), false + ) val parserDefinition = KotlinParserDefinition() val lexer = parserDefinition.createLexer(myProject) val builder = PsiBuilderFactoryImpl().createBuilder(parserDefinition, lexer, "class Base { val x: Int = 1 }") @@ -51,22 +57,14 @@ class BaseTestCase: KtParsingTestCase( println(DebugUtil.nodeTreeToString(builder.treeBuilt, false)) } - fun testTotalKotlinWithGivenMode() { + fun testTotalKotlinLight() { val path = System.getProperty("user.dir") val root = File(path) var counter = 0 var time = 0L - val ktFile = KtFile((PsiManager.getInstance(myProject) as PsiManagerEx).fileManager.createFileViewProvider( - LightVirtualFile( - "foo", - KotlinFileType.INSTANCE, - "" - ), true - ), false) val parserDefinition = KotlinParserDefinition() val lexer = parserDefinition.createLexer(myProject) - val parser = parserDefinition.createParser(myProject) as KotlinParser println("BASE PATH: $path") for (file in root.walkTopDown()) { @@ -75,8 +73,9 @@ class BaseTestCase: KtParsingTestCase( if (file.extension != "kt") continue time += measureNanoTime { - val builder = PsiBuilderFactoryImpl().createBuilder(parserDefinition, lexer, file.readText()) - parser.parse(null, builder, ktFile) + val text = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() + val builder = PsiBuilderFactoryImpl().createBuilder(parserDefinition, lexer, text) + MyKotlinParser.parse(builder) DebugUtil.lightTreeToString(builder.lightTree, false) } @@ -87,5 +86,30 @@ class BaseTestCase: KtParsingTestCase( println("TIME PER FILE: ${(time / counter) * 1e-6} ms, COUNTER: $counter") } + + fun testTotalKotlinPsi() { + val path = System.getProperty("user.dir") + val root = File(path) + var counter = 0 + var time = 0L + + println("BASE PATH: $path") + for (file in root.walkTopDown()) { + if (file.isDirectory) continue + if (file.path.contains("testData") || file.path.contains("resources")) continue + if (file.extension != "kt") continue + + time += measureNanoTime { + val text = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim() + val ktFile = createPsiFile(FileUtil.getNameWithoutExtension(PathUtil.getFileName(file.path)), text) as KtFile + ktFile.toString() + } + + counter++ + } + println("SUCCESS!") + println("TIME PER FILE: ${(time / counter) * 1e-6} ms, COUNTER: $counter") + + } } diff --git a/compiler/psi/src/org/jetbrains/kotlin/parsing/MyKotlinParser.java b/compiler/psi/src/org/jetbrains/kotlin/parsing/MyKotlinParser.java new file mode 100644 index 00000000000..47d373dab92 --- /dev/null +++ b/compiler/psi/src/org/jetbrains/kotlin/parsing/MyKotlinParser.java @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.parsing; + +import com.intellij.lang.LighterASTNode; +import com.intellij.lang.PsiBuilder; +import com.intellij.util.diff.FlyweightCapableTreeStructure; + +public class MyKotlinParser { + public static FlyweightCapableTreeStructure parse(PsiBuilder builder) { + KotlinParsing ktParsing = KotlinParsing.createForTopLevel(new SemanticWhitespaceAwarePsiBuilderImpl(builder)); + ktParsing.parseFile(); + + return builder.getLightTree(); + } +}