[FIR IDE] Move and rename RawFirFragmentForLazyBodiesBuilder into Fir Ide module

This commit is contained in:
Igor Yakovlev
2021-05-10 17:09:02 +02:00
committed by TeamCityServer
parent 0569f810cf
commit c5372be267
28 changed files with 168 additions and 98 deletions
@@ -1,15 +0,0 @@
// FUNCTION: bar
package test.locals
class Owner {
fun foo(i: Int) {
var x = true
fun bar() {
baz(i, x)
}
}
fun baz(j: Int, y: Boolean) {}
}
@@ -1,10 +0,0 @@
// FUNCTION: foo
package test.classes
class Outer<X> {
fun foo() {
val z = object { }
}
}
@@ -1,11 +0,0 @@
// FUNCTION: foo
package test
fun bar(): Int {
return -1
}
fun foo(): Int {
return 0
}
@@ -1,7 +0,0 @@
// PROPERTY: foo
package test
val bar: Int = 10
val foo: Int = 0
@@ -1,7 +0,0 @@
// PROPERTY: foo
package test
val bar: Int = 10
var foo: Int = 0
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.codegen.flags.AbstractWriteFlagsTest
import org.jetbrains.kotlin.codegen.ir.*
import org.jetbrains.kotlin.fir.AbstractFirLoadCompiledKotlin
import org.jetbrains.kotlin.fir.AbstractLazyBodyIsNotTouchedTilContractsPhaseTest
import org.jetbrains.kotlin.fir.builder.AbstractPartialRawFirBuilderTestCase
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderLazyBodiesTestCase
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderSourceElementMappingTestCase
import org.jetbrains.kotlin.fir.builder.AbstractRawFirBuilderTestCase
@@ -465,12 +464,6 @@ fun generateJUnit3CompilerTests(args: Array<String>) {
}
}
testGroup("compiler/fir/raw-fir/psi2fir/tests-gen", "compiler/fir/raw-fir/psi2fir/testData") {
testClass<AbstractPartialRawFirBuilderTestCase> {
model("partialRawBuilder", testMethod = "doRawFirTest")
}
}
testGroup("compiler/fir/raw-fir/light-tree2fir/tests-gen", "compiler/fir/raw-fir/psi2fir/testData") {
testClass<AbstractLightTree2FirConverterTestCase> {
model("rawBuilder")
@@ -1102,6 +1102,9 @@ fun main(args: Array<String>) {
testClass<AbstractInnerDeclarationsResolvePhaseTest> {
model("innerDeclarationsResolve")
}
testClass<AbstractPartialRawFirBuilderTestCase> {
model("partialRawBuilder", testMethod = "doRawFirTest")
}
}
testGroup(
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.api
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.builder.RawFirFragmentForLazyBodiesBuilder
import org.jetbrains.kotlin.fir.builder.RawFirReplacement
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.RawFirNonLocalDeclarationBuilder
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.RawFirReplacement
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider
import org.jetbrains.kotlin.psi.*
object DeclarationCopyBuilder {
internal object DeclarationCopyBuilder {
fun <T : KtElement> createDeclarationCopy(
state: FirModuleResolveState,
nonLocalDeclaration: KtDeclaration,
@@ -62,7 +62,6 @@ object DeclarationCopyBuilder {
if (functionBlock == null || !PsiTreeUtil.isAncestor(functionBlock, replacement.from, true)) {
return builtFunction
}
//TODO Check do we really need this optimisation? Maybe it is not optimisation at all because of Kt travers?
// right now we can't resolve builtFunction header properly, as it built right in air,
// without file, which is now required for running stages other then body resolve, so we
@@ -86,7 +85,6 @@ object DeclarationCopyBuilder {
if (classBody == null || !PsiTreeUtil.isAncestor(classBody, replacement.from, true)) {
return builtClass
}
//TODO Check do we really need this optimisation? Maybe it is not optimisation at all because of Kt travers?
return buildRegularClassCopy(originalFirClass) {
declarations.clear()
@@ -124,8 +122,6 @@ object DeclarationCopyBuilder {
if (!insideSetterBody) return builtProperty
}
//TODO Check do we really need this optimisation? Maybe it is not optimisation at all because of Kt travers?
val originalSetter = originalProperty.setter
val builtSetter = builtProperty.setter
@@ -167,7 +163,7 @@ object DeclarationCopyBuilder {
originalFirDeclaration: D,
replacement: RawFirReplacement<T>? = null,
): D {
return RawFirFragmentForLazyBodiesBuilder.buildWithReplacement(
return RawFirNonLocalDeclarationBuilder.buildWithReplacement(
session = originalFirDeclaration.moduleData.session,
baseScopeProvider = originalFirDeclaration.moduleData.session.firIdeProvider.kotlinScopeProvider,
designation = originalFirDeclaration.collectDesignation().path,
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.api
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.util.parentsOfType
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.builder.RawFirFragmentForLazyBodiesBuilder
import org.jetbrains.kotlin.fir.builder.RawFirReplacement
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.RawFirNonLocalDeclarationBuilder
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.RawFirReplacement
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.realPsi
import org.jetbrains.kotlin.fir.resolve.*
@@ -101,7 +101,7 @@ object LowLevelFirApiFacadeForResolveOnAir {
FileTowerProvider(place, onAirGetTowerContextForFile(state, place))
} else {
val validPlace = PsiTreeUtil.findFirstParent(place, false) {
RawFirFragmentForLazyBodiesBuilder.elementIsApplicable(it as KtElement)
RawFirNonLocalDeclarationBuilder.elementIsApplicable(it as KtElement)
} as KtElement
FirTowerDataContextAllElementsCollector().also {
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.builder.RawFirFragmentForLazyBodiesBuilder
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirWrappedDelegateExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirLazyBlock
@@ -36,7 +35,7 @@ internal object FirLazyBodiesCalculator {
fun calculateLazyBodiesForFunction(simpleFunction: FirSimpleFunction, designation: List<FirDeclaration>) {
if (simpleFunction.body !is FirLazyBlock) return
val newFunction = RawFirFragmentForLazyBodiesBuilder.build(
val newFunction = RawFirNonLocalDeclarationBuilder.build(
session = simpleFunction.moduleData.session,
baseScopeProvider = simpleFunction.moduleData.session.firIdeProvider.kotlinScopeProvider,
designation = designation,
@@ -52,7 +51,7 @@ internal object FirLazyBodiesCalculator {
require(!secondaryConstructor.isPrimary)
if (secondaryConstructor.body !is FirLazyBlock) return
val newFunction = RawFirFragmentForLazyBodiesBuilder.build(
val newFunction = RawFirNonLocalDeclarationBuilder.build(
session = secondaryConstructor.moduleData.session,
baseScopeProvider = secondaryConstructor.moduleData.session.firIdeProvider.kotlinScopeProvider,
designation = designation,
@@ -67,7 +66,7 @@ internal object FirLazyBodiesCalculator {
fun calculateLazyBodyForProperty(firProperty: FirProperty, designation: List<FirDeclaration>) {
if (!needCalculatingLazyBodyForProperty(firProperty)) return
val newProperty = RawFirFragmentForLazyBodiesBuilder.build(
val newProperty = RawFirNonLocalDeclarationBuilder.build(
session = firProperty.moduleData.session,
baseScopeProvider = firProperty.moduleData.session.firIdeProvider.kotlinScopeProvider,
designation = designation,
@@ -3,10 +3,12 @@
* 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.fir.builder
package org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.builder.RawFirBuilderMode
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
@@ -14,9 +16,9 @@ import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.psi.*
data class RawFirReplacement<T : KtElement>(val from: T, val to: T)
internal data class RawFirReplacement<T : KtElement>(val from: T, val to: T)
class RawFirFragmentForLazyBodiesBuilder<T : KtElement> private constructor(
internal class RawFirNonLocalDeclarationBuilder<T : KtElement> private constructor(
session: FirSession,
baseScopeProvider: FirScopeProvider,
private val declarationToBuild: KtDeclaration,
@@ -56,7 +58,7 @@ class RawFirFragmentForLazyBodiesBuilder<T : KtElement> private constructor(
}
}
val builder = RawFirFragmentForLazyBodiesBuilder(session, baseScopeProvider, declarationToBuild, replacement)
val builder = RawFirNonLocalDeclarationBuilder(session, baseScopeProvider, declarationToBuild, replacement)
builder.context.packageFqName = declarationToBuild.containingKtFile.packageFqName
val result = builder.moveNext(designation.iterator(), containingClass = null)
@@ -72,7 +74,7 @@ class RawFirFragmentForLazyBodiesBuilder<T : KtElement> private constructor(
designation: List<FirDeclaration>,
rootNonLocalDeclaration: KtDeclaration
): FirDeclaration {
val builder = RawFirFragmentForLazyBodiesBuilder<KtElement>(session, baseScopeProvider, rootNonLocalDeclaration)
val builder = RawFirNonLocalDeclarationBuilder<KtElement>(session, baseScopeProvider, rootNonLocalDeclaration)
builder.context.packageFqName = rootNonLocalDeclaration.containingKtFile.packageFqName
return builder.moveNext(designation.iterator(), containingClass = null)
}
@@ -7,9 +7,12 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.providers
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.NoMutableState
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.originalForSubstitutionOverride
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
// FUNCTION: bar
package test.locals
class Owner {
fun foo(i: Int) {
var x = true
fun bar() {
baz(i, x)
}
}
fun baz(j: Int, y: Boolean) {}
}
@@ -1,3 +1,8 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
// FUNCTION: foo
package test.classes
@@ -1,3 +1,8 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
// PROPERTY: foo
package test.classes
@@ -0,0 +1,15 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
// FUNCTION: foo
package test.classes
class Outer<X> {
fun foo() {
val z = object { }
}
}
@@ -0,0 +1,16 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
// FUNCTION: foo
package test
fun bar(): Int {
return -1
}
fun foo(): Int {
return 0
}
@@ -0,0 +1,12 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
// PROPERTY: foo
package test
val bar: Int = 10
val foo: Int = 0
@@ -0,0 +1,12 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
// PROPERTY: foo
package test
val bar: Int = 10
var foo: Int = 0
@@ -3,24 +3,36 @@
* 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.fir.builder
package org.jetbrains.kotlin.idea.fir.low.level.api
import com.intellij.openapi.util.io.FileUtilRt
import com.intellij.util.PathUtil
import junit.framework.TestCase
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.session.FirSessionFactory
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.RawFirNonLocalDeclarationBuilder
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType
import org.jetbrains.kotlin.test.InTextDirectivesUtils
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.testFramework.KtParsingTestCase
import java.io.File
abstract class AbstractPartialRawFirBuilderTestCase : AbstractRawFirBuilderTestCase() {
override fun doRawFirTest(filePath: String) {
abstract class AbstractPartialRawFirBuilderTestCase : KtParsingTestCase(
"",
"kt",
KotlinParserDefinition()
) {
fun doRawFirTest(filePath: String) {
val fileText = File(filePath).readText()
val functionName = InTextDirectivesUtils.findStringWithPrefixes(fileText, FUNCTION_DIRECTIVE)
val propertyName = InTextDirectivesUtils.findStringWithPrefixes(fileText, PROPERTY_DIRECTIVE)
@@ -75,6 +87,18 @@ abstract class AbstractPartialRawFirBuilderTestCase : AbstractRawFirBuilderTestC
}
}
private fun createKtFile(filePath: String): KtFile {
val name = PathUtil.getFileName(filePath)
val extension = FileUtilRt.getExtension(name)
val fileDirectory = PathUtil.getParentPath(filePath)
myFileExt = extension
val fileText = loadFileDefault(fileDirectory, name)
val ktFile = createPsiFile(name, fileText) as KtFile
myFile = ktFile
return ktFile
}
private fun <T : KtElement> testPartialBuilding(
filePath: String,
findPsiElement: (KtFile) -> T
@@ -82,17 +106,32 @@ abstract class AbstractPartialRawFirBuilderTestCase : AbstractRawFirBuilderTestC
val file = createKtFile(filePath)
val elementToBuild = findPsiElement(file) as KtDeclaration
val scopeProvider = object : FirScopeProvider() {
override fun getUseSiteMemberScope(klass: FirClass<*>, useSiteSession: FirSession, scopeSession: ScopeSession): FirTypeScope =
error("Should not be called")
override fun getStaticMemberScopeForCallables(
klass: FirClass<*>,
useSiteSession: FirSession,
scopeSession: ScopeSession
): FirScope? =
error("Should not be called")
override fun getNestedClassifierScope(klass: FirClass<*>, useSiteSession: FirSession, scopeSession: ScopeSession): FirScope? =
error("Should not be called")
}
val session = FirSessionFactory.createEmptySession()
val firBuilder = RawFirBuilder(session, StubFirScopeProvider)
val firBuilder = RawFirBuilder(session, scopeProvider)
val original = firBuilder.buildFirFile(file)
val designationBuilder = DesignationBuilder(elementToBuild)
original.accept(designationBuilder)
TestCase.assertTrue(designationBuilder.built)
val firElement = RawFirFragmentForLazyBodiesBuilder.build(
val firElement = RawFirNonLocalDeclarationBuilder.build(
session,
StubFirScopeProvider,
scopeProvider,
designationBuilder.designation,
elementToBuild
)
@@ -3,7 +3,7 @@
* 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.fir.builder;
package org.jetbrains.kotlin.idea.fir.low.level.api;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
@@ -17,7 +17,7 @@ import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("compiler/fir/raw-fir/psi2fir/testData/partialRawBuilder")
@TestMetadata("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public class PartialRawFirBuilderTestCaseGenerated extends AbstractPartialRawFirBuilderTestCase {
@@ -26,41 +26,41 @@ public class PartialRawFirBuilderTestCaseGenerated extends AbstractPartialRawFir
}
public void testAllFilesPresentInPartialRawBuilder() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/raw-fir/psi2fir/testData/partialRawBuilder"), Pattern.compile("^(.+)\\.kt$"), null, true);
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@TestMetadata("localFunction.kt")
public void testLocalFunction() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/partialRawBuilder/localFunction.kt");
runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder/localFunction.kt");
}
@TestMetadata("memberFunction.kt")
public void testMemberFunction() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/partialRawBuilder/memberFunction.kt");
runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder/memberFunction.kt");
}
@TestMetadata("memberProperty.kt")
public void testMemberProperty() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/partialRawBuilder/memberProperty.kt");
runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder/memberProperty.kt");
}
@TestMetadata("paramemtersCatching.kt")
public void testParamemtersCatching() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/partialRawBuilder/paramemtersCatching.kt");
runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder/paramemtersCatching.kt");
}
@TestMetadata("simpleFunction.kt")
public void testSimpleFunction() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/partialRawBuilder/simpleFunction.kt");
runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder/simpleFunction.kt");
}
@TestMetadata("simpleVal.kt")
public void testSimpleVal() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/partialRawBuilder/simpleVal.kt");
runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder/simpleVal.kt");
}
@TestMetadata("simpleVar.kt")
public void testSimpleVar() throws Exception {
runTest("compiler/fir/raw-fir/psi2fir/testData/partialRawBuilder/simpleVar.kt");
runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/partialRawBuilder/simpleVar.kt");
}
}