mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-03-10 08:31:29 +00:00
RawFirBuilder: optimize package name calculation in compiler mode
This commit is contained in:
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.context.withModule
|
|||||||
import org.jetbrains.kotlin.context.withProject
|
import org.jetbrains.kotlin.context.withProject
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
import org.jetbrains.kotlin.diagnostics.Severity
|
import org.jetbrains.kotlin.diagnostics.Severity
|
||||||
|
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.createSessionForTests
|
import org.jetbrains.kotlin.fir.createSessionForTests
|
||||||
import org.jetbrains.kotlin.fir.java.FirJavaElementFinder
|
import org.jetbrains.kotlin.fir.java.FirJavaElementFinder
|
||||||
@@ -154,7 +155,7 @@ abstract class AbstractSimpleFileBenchmark {
|
|||||||
.uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(env.project))
|
.uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(env.project))
|
||||||
val session = createSessionForTests(env, scope)
|
val session = createSessionForTests(env, scope)
|
||||||
val firProvider = session.firProvider as FirProviderImpl
|
val firProvider = session.firProvider as FirProviderImpl
|
||||||
val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider)
|
val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider, PsiHandlingMode.COMPILER)
|
||||||
|
|
||||||
val totalTransformer = FirTotalResolveProcessor(session)
|
val totalTransformer = FirTotalResolveProcessor(session)
|
||||||
val firFile = builder.buildFirFile(file).also(firProvider::recordFile)
|
val firFile = builder.buildFirFile(file).also(firProvider::recordFile)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrResult
|
|||||||
import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider
|
import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
|
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
|
||||||
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
|
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
|
||||||
|
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
|
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
|
||||||
@@ -63,7 +64,7 @@ class FirAnalyzerFacade(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider)
|
val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider, PsiHandlingMode.COMPILER)
|
||||||
ktFiles.map {
|
ktFiles.map {
|
||||||
builder.buildFirFile(it).also { firFile ->
|
builder.buildFirFile(it).also { firFile ->
|
||||||
firProvider.recordFile(firFile)
|
firProvider.recordFile(firFile)
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
|||||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
|
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
|
||||||
import org.jetbrains.kotlin.fir.analysis.FirCheckersResolveProcessor
|
import org.jetbrains.kotlin.fir.analysis.FirCheckersResolveProcessor
|
||||||
|
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.dump.MultiModuleHtmlFirDump
|
import org.jetbrains.kotlin.fir.dump.MultiModuleHtmlFirDump
|
||||||
@@ -158,7 +159,7 @@ class FirResolveModularizedTotalKotlinTest : AbstractModularizedTest() {
|
|||||||
}
|
}
|
||||||
bench.buildFiles(lightTree2Fir, allSourceFiles)
|
bench.buildFiles(lightTree2Fir, allSourceFiles)
|
||||||
} else {
|
} else {
|
||||||
val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider)
|
val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider, PsiHandlingMode.COMPILER)
|
||||||
bench.buildFiles(builder, ktFiles)
|
bench.buildFiles(builder, ktFiles)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import com.intellij.testFramework.LightVirtualFile
|
|||||||
import com.intellij.testFramework.TestDataPath
|
import com.intellij.testFramework.TestDataPath
|
||||||
import org.jetbrains.kotlin.fir.FirRenderer
|
import org.jetbrains.kotlin.fir.FirRenderer
|
||||||
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase
|
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilderMode
|
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
|
||||||
import org.jetbrains.kotlin.fir.builder.StubFirScopeProvider
|
import org.jetbrains.kotlin.fir.builder.StubFirScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.lightTree.converter.DeclarationsConverter
|
import org.jetbrains.kotlin.fir.lightTree.converter.DeclarationsConverter
|
||||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
||||||
@@ -73,7 +73,7 @@ class SimpleTestCase : AbstractRawFirBuilderTestCase() {
|
|||||||
println(StringBuilder().also { FirRenderer(it).visitFile(firFromLightTreeFile) }.toString())
|
println(StringBuilder().also { FirRenderer(it).visitFile(firFromLightTreeFile) }.toString())
|
||||||
|
|
||||||
val psiFile = createPsiFile("foo", code) as KtFile
|
val psiFile = createPsiFile("foo", code) as KtFile
|
||||||
val firFromPsiFile = psiFile.toFirFile(RawFirBuilderMode.STUBS)
|
val firFromPsiFile = psiFile.toFirFile(BodyBuildingMode.STUBS)
|
||||||
println("Fir from PSI")
|
println("Fir from PSI")
|
||||||
println(StringBuilder().also { FirRenderer(it).visitFile(firFromPsiFile) }.toString())
|
println(StringBuilder().also { FirRenderer(it).visitFile(firFromPsiFile) }.toString())
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import com.intellij.testFramework.TestDataPath
|
|||||||
import com.intellij.util.PathUtil
|
import com.intellij.util.PathUtil
|
||||||
import org.jetbrains.kotlin.fir.FirRenderer
|
import org.jetbrains.kotlin.fir.FirRenderer
|
||||||
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase
|
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilderMode
|
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
|
||||||
import org.jetbrains.kotlin.fir.builder.StubFirScopeProvider
|
import org.jetbrains.kotlin.fir.builder.StubFirScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
import org.jetbrains.kotlin.fir.session.FirSessionFactory
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
@@ -29,7 +29,7 @@ class TotalKotlinTest : AbstractRawFirBuilderTestCase() {
|
|||||||
if (onlyPsi) {
|
if (onlyPsi) {
|
||||||
DebugUtil.psiTreeToString(ktFile, false)
|
DebugUtil.psiTreeToString(ktFile, false)
|
||||||
} else {
|
} else {
|
||||||
val firFile = ktFile.toFirFile(RawFirBuilderMode.STUBS)
|
val firFile = ktFile.toFirFile(BodyBuildingMode.STUBS)
|
||||||
StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString()
|
StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import com.intellij.psi.impl.DebugUtil
|
|||||||
import com.intellij.util.PathUtil
|
import com.intellij.util.PathUtil
|
||||||
import org.jetbrains.kotlin.fir.FirRenderer
|
import org.jetbrains.kotlin.fir.FirRenderer
|
||||||
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase
|
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilderMode
|
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.openjdk.jmh.annotations.Scope
|
import org.openjdk.jmh.annotations.Scope
|
||||||
import org.openjdk.jmh.annotations.State
|
import org.openjdk.jmh.annotations.State
|
||||||
@@ -25,7 +25,7 @@ open class Psi2FirGenerator : TreeGenerator, AbstractRawFirBuilderTestCase() {
|
|||||||
|
|
||||||
override fun generateFir(text: String, file: File, stubMode: Boolean) {
|
override fun generateFir(text: String, file: File, stubMode: Boolean) {
|
||||||
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(RawFirBuilderMode.stubs(stubMode))
|
val firFile = ktFile.toFirFile(BodyBuildingMode.stubs(stubMode))
|
||||||
StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString()
|
StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import junit.framework.TestCase
|
|||||||
import org.jetbrains.kotlin.checkers.BaseDiagnosticsTest.Companion.DIAGNOSTIC_IN_TESTDATA_PATTERN
|
import org.jetbrains.kotlin.checkers.BaseDiagnosticsTest.Companion.DIAGNOSTIC_IN_TESTDATA_PATTERN
|
||||||
import org.jetbrains.kotlin.fir.FirRenderer
|
import org.jetbrains.kotlin.fir.FirRenderer
|
||||||
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase
|
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilderMode
|
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
|
||||||
import org.jetbrains.kotlin.fir.builder.StubFirScopeProvider
|
import org.jetbrains.kotlin.fir.builder.StubFirScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
|
import org.jetbrains.kotlin.fir.lightTree.LightTree2Fir
|
||||||
import org.jetbrains.kotlin.fir.lightTree.walkTopDown
|
import org.jetbrains.kotlin.fir.lightTree.walkTopDown
|
||||||
@@ -66,7 +66,7 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
|
|||||||
|
|
||||||
//psi
|
//psi
|
||||||
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 firFileFromPsi = ktFile.toFirFile(RawFirBuilderMode.stubs(stubMode))
|
val firFileFromPsi = ktFile.toFirFile(BodyBuildingMode.stubs(stubMode))
|
||||||
val treeFromPsi = StringBuilder().also { FirRenderer(it).visitFile(firFileFromPsi) }.toString()
|
val treeFromPsi = StringBuilder().also { FirRenderer(it).visitFile(firFileFromPsi) }.toString()
|
||||||
|
|
||||||
//light tree
|
//light tree
|
||||||
|
|||||||
@@ -48,23 +48,30 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
|||||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||||
|
|
||||||
open class RawFirBuilder(
|
open class RawFirBuilder(
|
||||||
session: FirSession, val baseScopeProvider: FirScopeProvider, builderMode: RawFirBuilderMode = RawFirBuilderMode.NORMAL
|
session: FirSession,
|
||||||
|
val baseScopeProvider: FirScopeProvider,
|
||||||
|
private val psiMode: PsiHandlingMode,
|
||||||
|
bodyBuildingMode: BodyBuildingMode = BodyBuildingMode.NORMAL
|
||||||
) : BaseFirBuilder<PsiElement>(session) {
|
) : BaseFirBuilder<PsiElement>(session) {
|
||||||
|
|
||||||
private val stubMode get() = mode == RawFirBuilderMode.STUBS
|
@Deprecated("Please replace with primary constructor call")
|
||||||
|
constructor(session: FirSession, baseScopeProvider: FirScopeProvider, mode: BodyBuildingMode = BodyBuildingMode.NORMAL) :
|
||||||
|
this(session, baseScopeProvider, psiMode = PsiHandlingMode.IDE, bodyBuildingMode = mode)
|
||||||
|
|
||||||
|
private val stubMode get() = mode == BodyBuildingMode.STUBS
|
||||||
|
|
||||||
protected open fun bindFunctionTarget(target: FirFunctionTarget, function: FirFunction) = target.bind(function)
|
protected open fun bindFunctionTarget(target: FirFunctionTarget, function: FirFunction) = target.bind(function)
|
||||||
|
|
||||||
var mode: RawFirBuilderMode = builderMode
|
var mode: BodyBuildingMode = bodyBuildingMode
|
||||||
private set
|
private set
|
||||||
|
|
||||||
private inline fun <T> disabledLazyMode(body: () -> T): T {
|
private inline fun <T> disabledLazyMode(body: () -> T): T {
|
||||||
if (mode != RawFirBuilderMode.LAZY_BODIES) return body()
|
if (mode != BodyBuildingMode.LAZY_BODIES) return body()
|
||||||
return try {
|
return try {
|
||||||
mode = RawFirBuilderMode.NORMAL
|
mode = BodyBuildingMode.NORMAL
|
||||||
body()
|
body()
|
||||||
} finally {
|
} finally {
|
||||||
mode = RawFirBuilderMode.LAZY_BODIES
|
mode = BodyBuildingMode.LAZY_BODIES
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,7 +296,7 @@ open class RawFirBuilder(
|
|||||||
when {
|
when {
|
||||||
!hasBody() ->
|
!hasBody() ->
|
||||||
null to null
|
null to null
|
||||||
mode == RawFirBuilderMode.LAZY_BODIES -> {
|
mode == BodyBuildingMode.LAZY_BODIES -> {
|
||||||
val block = buildLazyBlock {
|
val block = buildLazyBlock {
|
||||||
source = bodyExpression?.toFirSourceElement()
|
source = bodyExpression?.toFirSourceElement()
|
||||||
?: error("hasBody() == true but body is null")
|
?: error("hasBody() == true but body is null")
|
||||||
@@ -734,7 +741,7 @@ open class RawFirBuilder(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitKtFile(file: KtFile, data: Unit): FirElement {
|
override fun visitKtFile(file: KtFile, data: Unit): FirElement {
|
||||||
context.packageFqName = file.packageFqName
|
context.packageFqName = if (psiMode == PsiHandlingMode.COMPILER) file.packageFqNameByTree else file.packageFqName
|
||||||
return buildFile {
|
return buildFile {
|
||||||
source = file.toFirSourceElement()
|
source = file.toFirSourceElement()
|
||||||
moduleData = baseModuleData
|
moduleData = baseModuleData
|
||||||
@@ -1317,10 +1324,10 @@ open class RawFirBuilder(
|
|||||||
val isVar = isVar
|
val isVar = isVar
|
||||||
val propertyInitializer = when {
|
val propertyInitializer = when {
|
||||||
!hasInitializer() -> null
|
!hasInitializer() -> null
|
||||||
mode == RawFirBuilderMode.LAZY_BODIES -> buildLazyExpression {
|
mode == BodyBuildingMode.LAZY_BODIES -> buildLazyExpression {
|
||||||
source = initializer?.toFirSourceElement()
|
source = initializer?.toFirSourceElement()
|
||||||
}
|
}
|
||||||
mode == RawFirBuilderMode.STUBS -> buildExpressionStub()
|
mode == BodyBuildingMode.STUBS -> buildExpressionStub()
|
||||||
else -> initializer.toFirExpression("Should have initializer")
|
else -> initializer.toFirExpression("Should have initializer")
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1373,9 +1380,9 @@ open class RawFirBuilder(
|
|||||||
source =
|
source =
|
||||||
if (stubMode) null else delegateExpression?.toFirSourceElement(FirFakeSourceElementKind.WrappedDelegate)
|
if (stubMode) null else delegateExpression?.toFirSourceElement(FirFakeSourceElementKind.WrappedDelegate)
|
||||||
expression = when (mode) {
|
expression = when (mode) {
|
||||||
RawFirBuilderMode.NORMAL -> delegateExpression.toFirExpression("Should have delegate")
|
BodyBuildingMode.NORMAL -> delegateExpression.toFirExpression("Should have delegate")
|
||||||
RawFirBuilderMode.STUBS -> buildExpressionStub()
|
BodyBuildingMode.STUBS -> buildExpressionStub()
|
||||||
RawFirBuilderMode.LAZY_BODIES -> buildLazyExpression {
|
BodyBuildingMode.LAZY_BODIES -> buildLazyExpression {
|
||||||
source = delegateExpression!!.toFirSourceElement()
|
source = delegateExpression!!.toFirSourceElement()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2284,7 +2291,7 @@ open class RawFirBuilder(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class RawFirBuilderMode {
|
enum class BodyBuildingMode {
|
||||||
/**
|
/**
|
||||||
* Build every expression and every body
|
* Build every expression and every body
|
||||||
*/
|
*/
|
||||||
@@ -2302,10 +2309,25 @@ enum class RawFirBuilderMode {
|
|||||||
LAZY_BODIES;
|
LAZY_BODIES;
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun lazyBodies(lazyBodies: Boolean): RawFirBuilderMode =
|
fun lazyBodies(lazyBodies: Boolean): BodyBuildingMode =
|
||||||
if (lazyBodies) LAZY_BODIES else NORMAL
|
if (lazyBodies) LAZY_BODIES else NORMAL
|
||||||
|
|
||||||
fun stubs(stubs: Boolean): RawFirBuilderMode =
|
fun stubs(stubs: Boolean): BodyBuildingMode =
|
||||||
if (stubs) STUBS else NORMAL
|
if (stubs) STUBS else NORMAL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated("Please replace with BodyBuildingMode")
|
||||||
|
typealias RawFirBuilderMode = BodyBuildingMode
|
||||||
|
|
||||||
|
enum class PsiHandlingMode {
|
||||||
|
/**
|
||||||
|
* Do not build any stubs while handling PSI
|
||||||
|
*/
|
||||||
|
COMPILER,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build stubs if possible while handling PSI
|
||||||
|
*/
|
||||||
|
IDE;
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import java.io.File
|
|||||||
abstract class AbstractRawFirBuilderLazyBodiesTestCase : AbstractRawFirBuilderTestCase() {
|
abstract class AbstractRawFirBuilderLazyBodiesTestCase : AbstractRawFirBuilderTestCase() {
|
||||||
override fun doRawFirTest(filePath: String) {
|
override fun doRawFirTest(filePath: String) {
|
||||||
val file = createKtFile(filePath)
|
val file = createKtFile(filePath)
|
||||||
val firFile = file.toFirFile(RawFirBuilderMode.LAZY_BODIES)
|
val firFile = file.toFirFile(BodyBuildingMode.LAZY_BODIES)
|
||||||
val firFileDump = StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString()
|
val firFileDump = StringBuilder().also { FirRenderer(it).visitFile(firFile) }.toString()
|
||||||
val expectedPath = filePath.replace(".kt", ".lazyBodies.txt")
|
val expectedPath = filePath.replace(".kt", ".lazyBodies.txt")
|
||||||
KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump)
|
KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump)
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase(
|
|||||||
|
|
||||||
protected open fun doRawFirTest(filePath: String) {
|
protected open fun doRawFirTest(filePath: String) {
|
||||||
val file = createKtFile(filePath)
|
val file = createKtFile(filePath)
|
||||||
val firFile = file.toFirFile(RawFirBuilderMode.NORMAL)
|
val firFile = file.toFirFile(BodyBuildingMode.NORMAL)
|
||||||
val firFileDump = StringBuilder().also { FirRenderer(it, mode = FirRenderer.RenderMode.WithDeclarationAttributes).visitFile(firFile) }.toString()
|
val firFileDump = StringBuilder().also { FirRenderer(it, mode = FirRenderer.RenderMode.WithDeclarationAttributes).visitFile(firFile) }.toString()
|
||||||
val expectedPath = filePath.replace(".kt", ".txt")
|
val expectedPath = filePath.replace(".kt", ".txt")
|
||||||
KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump)
|
KotlinTestUtils.assertEqualsToFile(File(expectedPath), firFileDump)
|
||||||
@@ -75,9 +75,14 @@ abstract class AbstractRawFirBuilderTestCase : KtParsingTestCase(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun KtFile.toFirFile(mode: RawFirBuilderMode = RawFirBuilderMode.NORMAL): FirFile {
|
protected fun KtFile.toFirFile(bodyBuildingMode: BodyBuildingMode = BodyBuildingMode.NORMAL): FirFile {
|
||||||
val session = FirSessionFactory.createEmptySession()
|
val session = FirSessionFactory.createEmptySession()
|
||||||
return RawFirBuilder(session, StubFirScopeProvider, mode).buildFirFile(this)
|
return RawFirBuilder(
|
||||||
|
session,
|
||||||
|
StubFirScopeProvider,
|
||||||
|
psiMode = PsiHandlingMode.COMPILER,
|
||||||
|
bodyBuildingMode = bodyBuildingMode
|
||||||
|
).buildFirFile(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirElement.traverseChildren(result: MutableSet<FirElement> = hashSetOf()): MutableSet<FirElement> {
|
private fun FirElement.traverseChildren(result: MutableSet<FirElement> = hashSetOf()): MutableSet<FirElement> {
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class RawFirBuilderTotalKotlinTestCase : AbstractRawFirBuilderTestCase() {
|
|||||||
val ktFile = createKtFile(file.toRelativeString(root))
|
val ktFile = createKtFile(file.toRelativeString(root))
|
||||||
val firFile: FirFile
|
val firFile: FirFile
|
||||||
time += measureNanoTime {
|
time += measureNanoTime {
|
||||||
firFile = ktFile.toFirFile(RawFirBuilderMode.stubs(stubMode))
|
firFile = ktFile.toFirFile(BodyBuildingMode.stubs(stubMode))
|
||||||
}
|
}
|
||||||
totalLength += StringBuilder().also { FirRenderer(it).visitFile(firFile) }.length
|
totalLength += StringBuilder().also { FirRenderer(it).visitFile(firFile) }.length
|
||||||
counter++
|
counter++
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic
|
|||||||
import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils
|
import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilderMode
|
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
|
||||||
|
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
|
import org.jetbrains.kotlin.fir.extensions.BunchOfRegisteredExtensions
|
||||||
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
|
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
|
||||||
@@ -132,7 +133,8 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
|
|||||||
val firBuilder = RawFirBuilder(
|
val firBuilder = RawFirBuilder(
|
||||||
session,
|
session,
|
||||||
firProvider.kotlinScopeProvider,
|
firProvider.kotlinScopeProvider,
|
||||||
RawFirBuilderMode.lazyBodies(useLazyBodiesModeForRawFir)
|
psiMode = if (useLazyBodiesModeForRawFir) PsiHandlingMode.IDE else PsiHandlingMode.COMPILER,
|
||||||
|
bodyBuildingMode = BodyBuildingMode.lazyBodies(useLazyBodiesModeForRawFir)
|
||||||
)
|
)
|
||||||
ktFiles.mapTo(firFiles) {
|
ktFiles.mapTo(firFiles) {
|
||||||
val firFile = firBuilder.buildFirFile(it)
|
val firFile = firBuilder.buildFirFile(it)
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ import org.jetbrains.annotations.TestOnly
|
|||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilderMode
|
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
|
||||||
|
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
@@ -135,7 +136,8 @@ object KtDeclarationAndFirDeclarationEqualityChecker {
|
|||||||
return RawFirBuilder(
|
return RawFirBuilder(
|
||||||
createEmptySession(),
|
createEmptySession(),
|
||||||
DummyScopeProvider,
|
DummyScopeProvider,
|
||||||
RawFirBuilderMode.STUBS
|
psiMode = PsiHandlingMode.IDE,
|
||||||
|
bodyBuildingMode = BodyBuildingMode.STUBS
|
||||||
).buildTypeReference(this)
|
).buildTypeReference(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,8 @@
|
|||||||
package org.jetbrains.kotlin.idea.fir.low.level.api.file.builder
|
package org.jetbrains.kotlin.idea.fir.low.level.api.file.builder
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilderMode
|
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
|
||||||
|
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
|
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
|
||||||
@@ -31,7 +32,12 @@ internal class FirFileBuilder(
|
|||||||
cache: ModuleFileCache,
|
cache: ModuleFileCache,
|
||||||
preferLazyBodies: Boolean
|
preferLazyBodies: Boolean
|
||||||
): FirFile = cache.fileCached(ktFile) {
|
): FirFile = cache.fileCached(ktFile) {
|
||||||
RawFirBuilder(cache.session, scopeProvider, RawFirBuilderMode.lazyBodies(preferLazyBodies)).buildFirFile(ktFile)
|
RawFirBuilder(
|
||||||
|
cache.session,
|
||||||
|
scopeProvider,
|
||||||
|
psiMode = PsiHandlingMode.IDE,
|
||||||
|
bodyBuildingMode = BodyBuildingMode.lazyBodies(preferLazyBodies)
|
||||||
|
).buildFirFile(ktFile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
|
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||||
@@ -22,7 +23,7 @@ internal fun buildFileFirAnnotation(
|
|||||||
|
|
||||||
val replacementApplier = replacement?.Applier()
|
val replacementApplier = replacement?.Applier()
|
||||||
|
|
||||||
val builder = object : RawFirBuilder(session, baseScopeProvider) {
|
val builder = object : RawFirBuilder(session, baseScopeProvider, psiMode = PsiHandlingMode.IDE) {
|
||||||
inner class VisitorWithReplacement : Visitor() {
|
inner class VisitorWithReplacement : Visitor() {
|
||||||
override fun convertElement(element: KtElement): FirElement? =
|
override fun convertElement(element: KtElement): FirElement? =
|
||||||
super.convertElement(replacementApplier?.tryReplace(element) ?: element)
|
super.convertElement(replacementApplier?.tryReplace(element) ?: element)
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilderMode
|
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
|
||||||
|
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isInner
|
import org.jetbrains.kotlin.fir.declarations.utils.isInner
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||||
@@ -24,7 +25,7 @@ internal class RawFirNonLocalDeclarationBuilder private constructor(
|
|||||||
private val declarationToBuild: KtDeclaration,
|
private val declarationToBuild: KtDeclaration,
|
||||||
private val functionsToRebind: Set<FirFunction>? = null,
|
private val functionsToRebind: Set<FirFunction>? = null,
|
||||||
private val replacementApplier: RawFirReplacement.Applier? = null
|
private val replacementApplier: RawFirReplacement.Applier? = null
|
||||||
) : RawFirBuilder(session, baseScopeProvider, RawFirBuilderMode.NORMAL) {
|
) : RawFirBuilder(session, baseScopeProvider, psiMode = PsiHandlingMode.IDE, bodyBuildingMode = BodyBuildingMode.NORMAL) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun buildWithReplacement(
|
fun buildWithReplacement(
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve
|
package org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
|
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.types.FirUserTypeRef
|
import org.jetbrains.kotlin.fir.types.FirUserTypeRef
|
||||||
@@ -16,7 +17,7 @@ internal fun buildFirUserTypeRef(
|
|||||||
session: FirSession,
|
session: FirSession,
|
||||||
baseScopeProvider: FirScopeProvider
|
baseScopeProvider: FirScopeProvider
|
||||||
): FirUserTypeRef {
|
): FirUserTypeRef {
|
||||||
val builder = object : RawFirBuilder(session, baseScopeProvider) {
|
val builder = object : RawFirBuilder(session, baseScopeProvider, psiMode = PsiHandlingMode.IDE) {
|
||||||
fun build(): FirUserTypeRef = Visitor().visitTypeReference(typeReference, Unit) as FirUserTypeRef
|
fun build(): FirUserTypeRef = Visitor().visitTypeReference(typeReference, Unit) as FirUserTypeRef
|
||||||
}
|
}
|
||||||
builder.context.packageFqName = typeReference.containingKtFile.packageFqName
|
builder.context.packageFqName = typeReference.containingKtFile.packageFqName
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ package org.jetbrains.kotlin.idea.fir.low.level.api
|
|||||||
import junit.framework.TestCase
|
import junit.framework.TestCase
|
||||||
import org.jetbrains.kotlin.fir.FirRenderer
|
import org.jetbrains.kotlin.fir.FirRenderer
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilderMode
|
import org.jetbrains.kotlin.fir.builder.BodyBuildingMode
|
||||||
|
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyBodiesCalculator
|
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyBodiesCalculator
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider
|
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.test.base.AbstractLowLevelApiSingleFileTest
|
import org.jetbrains.kotlin.idea.fir.low.level.api.test.base.AbstractLowLevelApiSingleFileTest
|
||||||
@@ -22,9 +23,21 @@ abstract class AbstractFirLazyBodiesCalculatorTest : AbstractLowLevelApiSingleFi
|
|||||||
val session = resolveState.rootModuleSession
|
val session = resolveState.rootModuleSession
|
||||||
val provider = session.firIdeProvider.kotlinScopeProvider
|
val provider = session.firIdeProvider.kotlinScopeProvider
|
||||||
|
|
||||||
val laziedFirFile = RawFirBuilder(session, provider, RawFirBuilderMode.LAZY_BODIES).buildFirFile(ktFile)
|
val laziedFirFile = RawFirBuilder(
|
||||||
|
session,
|
||||||
|
provider,
|
||||||
|
psiMode = PsiHandlingMode.IDE,
|
||||||
|
bodyBuildingMode = BodyBuildingMode.LAZY_BODIES
|
||||||
|
).buildFirFile(ktFile)
|
||||||
|
|
||||||
FirLazyBodiesCalculator.calculateLazyBodies(laziedFirFile)
|
FirLazyBodiesCalculator.calculateLazyBodies(laziedFirFile)
|
||||||
val fullFirFile = RawFirBuilder(session, provider, RawFirBuilderMode.NORMAL).buildFirFile(ktFile)
|
|
||||||
|
val fullFirFile = RawFirBuilder(
|
||||||
|
session,
|
||||||
|
provider,
|
||||||
|
psiMode = PsiHandlingMode.IDE,
|
||||||
|
bodyBuildingMode = BodyBuildingMode.NORMAL
|
||||||
|
).buildFirFile(ktFile)
|
||||||
|
|
||||||
val laziedFirFileDump = StringBuilder().also { FirRenderer(it).visitFile(laziedFirFile) }.toString()
|
val laziedFirFileDump = StringBuilder().also { FirRenderer(it).visitFile(laziedFirFile) }.toString()
|
||||||
val fullFirFileDump = StringBuilder().also { FirRenderer(it).visitFile(fullFirFile) }.toString()
|
val fullFirFileDump = StringBuilder().also { FirRenderer(it).visitFile(fullFirFile) }.toString()
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api
|
|||||||
|
|
||||||
import junit.framework.TestCase
|
import junit.framework.TestCase
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
|
import org.jetbrains.kotlin.fir.builder.PsiHandlingMode
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
@@ -106,7 +107,7 @@ abstract class AbstractPartialRawFirBuilderTestCase : AbstractLowLevelApiSingleF
|
|||||||
}
|
}
|
||||||
|
|
||||||
val session = FirSessionFactory.createEmptySession()
|
val session = FirSessionFactory.createEmptySession()
|
||||||
val firBuilder = RawFirBuilder(session, scopeProvider)
|
val firBuilder = RawFirBuilder(session, scopeProvider, PsiHandlingMode.IDE)
|
||||||
val original = firBuilder.buildFirFile(file)
|
val original = firBuilder.buildFirFile(file)
|
||||||
|
|
||||||
val designationBuilder = DesignationBuilder(elementToBuild)
|
val designationBuilder = DesignationBuilder(elementToBuild)
|
||||||
|
|||||||
Reference in New Issue
Block a user