From 4fbbe9f27442650d13e11b83eb974a9391ce60d8 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 4 Aug 2023 02:26:23 +0900 Subject: [PATCH] [LL API] Add in-body modification tests for code fragments --- .../codeFragments/localClass.fragment.kt | 7 ++ .../codeFragments/localClass.kt | 3 + .../codeFragments/localClass.txt | 21 ++++++ .../codeFragments/localFunction.fragment.kt | 7 ++ .../codeFragments/localFunction.kt | 3 + .../codeFragments/localFunction.txt | 14 ++++ .../codeFragments/simple.fragment.kt | 1 + .../codeFragments/simple.kt | 10 +++ .../codeFragments/simple.txt | 7 ++ .../AbstractLowLevelApiCodeFragmentTest.kt | 30 +++++--- ...ractCodeFragmentInBlockModificationTest.kt | 29 ++++++++ .../AbstractInBlockModificationTest.kt | 71 +++++++++++-------- ...gmentInBlockModificationTestGenerated.java | 44 ++++++++++++ ...tRootInBlockModificationTestGenerated.java | 2 +- ...criptInBlockModificationTestGenerated.java | 2 +- ...ourceInBlockModificationTestGenerated.java | 2 +- .../kotlin/fir/renderer/FirRenderer.kt | 5 ++ .../tests/analysis/api/firLowLevel.kt | 17 +++-- 18 files changed, 222 insertions(+), 53 deletions(-) create mode 100644 analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.fragment.kt create mode 100644 analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.kt create mode 100644 analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.txt create mode 100644 analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.fragment.kt create mode 100644 analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.kt create mode 100644 analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.txt create mode 100644 analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.fragment.kt create mode 100644 analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.kt create mode 100644 analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.txt create mode 100644 analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractCodeFragmentInBlockModificationTest.kt create mode 100644 analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/CodeFragmentInBlockModificationTestGenerated.java diff --git a/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.fragment.kt b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.fragment.kt new file mode 100644 index 00000000000..39cdc05dd8a --- /dev/null +++ b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.fragment.kt @@ -0,0 +1,7 @@ +class Foo(val x: Int) { + fun foo() { + foo() + } +} + +Foo(1) \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.kt b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.kt new file mode 100644 index 00000000000..98cc7bab0a0 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.kt @@ -0,0 +1,3 @@ +fun test() { + Unit +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.txt b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.txt new file mode 100644 index 00000000000..54095735ad1 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.txt @@ -0,0 +1,21 @@ +BEFORE MODIFICATION: +CODE FRAGMENT: { + local final [ResolvedTo(RAW_FIR)] class Foo : R|kotlin/Any| { + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=Foo] constructor([ResolvedTo(RAW_FIR)] [CorrespondingProperty=/x] x: R|kotlin/Int|): R|Foo| { + super() + } + + public final [ResolvedTo(RAW_FIR)] [IsFromPrimaryConstructor=true] val x: R|kotlin/Int| = R|/x| + public [ResolvedTo(RAW_FIR)] [ContainingClassKey=Foo] get(): R|kotlin/Int| + + public final [ResolvedTo(RAW_FIR)] fun foo(): R|kotlin/Unit| { + this@R|/Foo|.R|/foo|() + } + + } + + R|/Foo.Foo|(Int(1)) +} + +AFTER MODIFICATION: +CODE FRAGMENT: { LAZY_BLOCK } diff --git a/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.fragment.kt b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.fragment.kt new file mode 100644 index 00000000000..273f803b6d8 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.fragment.kt @@ -0,0 +1,7 @@ +fun foo() {} + +fun bar() { + foo() +} + +bar() \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.kt b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.kt new file mode 100644 index 00000000000..98cc7bab0a0 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.kt @@ -0,0 +1,3 @@ +fun test() { + Unit +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.txt b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.txt new file mode 100644 index 00000000000..c712fecbd00 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.txt @@ -0,0 +1,14 @@ +BEFORE MODIFICATION: +CODE FRAGMENT: { + local final? [ResolvedTo(RAW_FIR)] fun foo(): R|kotlin/Unit| { + } + + local final? [ResolvedTo(RAW_FIR)] fun bar(): R|kotlin/Unit| { + R|/foo|() + } + + R|/bar|() +} + +AFTER MODIFICATION: +CODE FRAGMENT: { LAZY_BLOCK } diff --git a/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.fragment.kt b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.fragment.kt new file mode 100644 index 00000000000..a9cc6a1b619 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.fragment.kt @@ -0,0 +1 @@ +foo \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.kt b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.kt new file mode 100644 index 00000000000..87edd81e747 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.kt @@ -0,0 +1,10 @@ +package test + +class Foo + +fun test() { + val foo = Foo() + consume(foo) +} + +fun consume(foo: Foo) {} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.txt b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.txt new file mode 100644 index 00000000000..abcfce30800 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.txt @@ -0,0 +1,7 @@ +BEFORE MODIFICATION: +CODE FRAGMENT: { + R|/foo| +} + +AFTER MODIFICATION: +CODE FRAGMENT: { LAZY_BLOCK } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLowLevelApiCodeFragmentTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLowLevelApiCodeFragmentTest.kt index 18516f99085..9d7e3da4e2e 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLowLevelApiCodeFragmentTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractLowLevelApiCodeFragmentTest.kt @@ -8,12 +8,12 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider -import org.jetbrains.kotlin.psi.KtCodeFragment -import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives +import org.jetbrains.kotlin.test.model.TestFile import org.jetbrains.kotlin.test.services.TestModuleStructure import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.sourceFileProvider import java.io.File abstract class AbstractLowLevelApiCodeFragmentTest : AbstractLowLevelApiSingleFileTest() { @@ -22,20 +22,30 @@ abstract class AbstractLowLevelApiCodeFragmentTest : AbstractLowLevelApiSingleFi abstract fun doTest(ktCodeFragment: KtCodeFragment, moduleStructure: TestModuleStructure, testServices: TestServices) final override fun doTestByFileStructure(ktFile: KtFile, moduleStructure: TestModuleStructure, testServices: TestServices) { - val contextElement = testServices.expressionMarkerProvider.getElementOfTypeAtCaret(ktFile) + val contextElement = testServices.expressionMarkerProvider.getElementOfTypeAtCaret(ktFile) - val fragmentText = moduleStructure.originalTestDataFiles.single() + val fragmentFile = moduleStructure.originalTestDataFiles.single() .run { File(parent, "$nameWithoutExtension.fragment.$extension") } - .readText() - val isBlockFragment = fragmentText.any { it == '\n' } + val fragmentTestFile = TestFile( + "fragment.kt", + fragmentFile.readText(), + fragmentFile, + startLineNumberInOriginalFile = 0, + isAdditional = true, + RegisteredDirectives.Empty + ) + + val processedFragmentText = testServices.sourceFileProvider.getContentOfSourceFile(fragmentTestFile) + + val isBlockFragment = processedFragmentText.any { it == '\n' } val project = ktFile.project val factory = KtPsiFactory(project, markGenerated = false) val ktCodeFragment = when { - isBlockFragment -> factory.createBlockCodeFragment(fragmentText, contextElement) - else -> factory.createExpressionCodeFragment(fragmentText, contextElement) + isBlockFragment -> factory.createBlockCodeFragment(processedFragmentText, contextElement) + else -> factory.createExpressionCodeFragment(processedFragmentText, contextElement) } doTest(ktCodeFragment, moduleStructure, testServices) diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractCodeFragmentInBlockModificationTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractCodeFragmentInBlockModificationTest.kt new file mode 100644 index 00000000000..3271f6a5294 --- /dev/null +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractCodeFragmentInBlockModificationTest.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2023 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. + */ + +package org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure + +import org.jetbrains.kotlin.analysis.low.level.api.fir.AbstractLowLevelApiCodeFragmentTest +import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider +import org.jetbrains.kotlin.psi.KtCodeFragment +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.test.services.TestModuleStructure +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.assertions +import kotlin.test.assertNull + +abstract class AbstractCodeFragmentInBlockModificationTest : AbstractLowLevelApiCodeFragmentTest() { + override fun doTest(ktCodeFragment: KtCodeFragment, moduleStructure: TestModuleStructure, testServices: TestServices) { + val targetElement = testServices.expressionMarkerProvider + .getBottommostSelectedElementOfType(ktCodeFragment, KtElement::class.java) + + assertNull(targetElement.getNonLocalReanalyzableContainingDeclaration()) + + val (before, after) = testInBlockModification(ktCodeFragment, ktCodeFragment, testServices) + val actualText = "BEFORE MODIFICATION:\n$before\nAFTER MODIFICATION:\n$after" + + testServices.assertions.assertEqualsToTestDataFileSibling(actualText) + } +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractInBlockModificationTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractInBlockModificationTest.kt index 9c1d5e195a6..aebde3c5784 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractInBlockModificationTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/AbstractInBlockModificationTest.kt @@ -16,7 +16,8 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.Analys import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor -import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtAnnotated +import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.test.services.TestModuleStructure @@ -32,43 +33,51 @@ abstract class AbstractInBlockModificationTest : AbstractLowLevelApiSingleFileTe val declaration = selectedElement.getNonLocalReanalyzableContainingDeclaration() val actual = if (declaration != null) { - resolveWithCaches(ktFile) { firSession -> - val firDeclarationBefore = declaration.getOrBuildFirOfType(firSession) - val declarationTextBefore = firDeclarationBefore.render() - - declaration.modifyBody() - invalidateAfterInBlockModification(declaration) - - val declarationTextAfterModification = firDeclarationBefore.render() - testServices.assertions.assertNotEquals(declarationTextBefore, declarationTextAfterModification) { - "The declaration before and after modification must be in different state" - } - - val firDeclarationAfter = declaration.getOrBuildFirOfType(firSession) - testServices.assertions.assertEquals(firDeclarationBefore, firDeclarationAfter) { - "The declaration before and after must be the same" - } - - val declarationTextAfter = firDeclarationAfter.render() - testServices.assertions.assertEquals(declarationTextBefore, declarationTextAfter) { - "The declaration must have the same in the resolved state" - } - - "BEFORE MODIFICATION:\n$declarationTextBefore\nAFTER MODIFICATION:\n$declarationTextAfterModification" - } + val (before, after) = testInBlockModification(ktFile, declaration, testServices) + "BEFORE MODIFICATION:\n$before\nAFTER MODIFICATION:\n$after" } else { "IN-BLOCK MODIFICATION IS NOT APPLICABLE FOR THIS PLACE" } testServices.assertions.assertEqualsToTestDataFileSibling(actual) } +} - /** - * Emulate modification inside the body - */ - private fun KtDeclaration.modifyBody() { - parentsWithSelf.filterIsInstance().forEach { - it.subtreeChanged() +internal fun testInBlockModification(file: KtFile, declaration: KtAnnotated, testServices: TestServices): Pair { + return resolveWithCaches(file) { firSession -> + val firDeclarationBefore = declaration.getOrBuildFirOfType(firSession) + val declarationTextBefore = firDeclarationBefore.render() + + declaration.modifyBody() + invalidateAfterInBlockModification(declaration) + + val declarationTextAfterModification = firDeclarationBefore.render() + testServices.assertions.assertNotEquals(declarationTextBefore, declarationTextAfterModification) { + "The declaration before and after modification must be in different state" + } + + val firDeclarationAfter = declaration.getOrBuildFirOfType(firSession) + testServices.assertions.assertEquals(firDeclarationBefore, firDeclarationAfter) { + "The declaration before and after must be the same" + } + + val declarationTextAfter = firDeclarationAfter.render() + testServices.assertions.assertEquals(declarationTextBefore, declarationTextAfter) { + "The declaration must have the same in the resolved state" + } + + Pair(declarationTextBefore, declarationTextAfterModification) + } +} + +/** + * Emulate modification inside the body + */ +private fun KtAnnotated.modifyBody() { + for (parent in parentsWithSelf) { + when (parent) { + is ASTDelegatePsiElement -> parent.subtreeChanged() + is KtCodeFragment -> parent.subtreeChanged() } } } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/CodeFragmentInBlockModificationTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/CodeFragmentInBlockModificationTestGenerated.java new file mode 100644 index 00000000000..538ca384294 --- /dev/null +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/CodeFragmentInBlockModificationTestGenerated.java @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2023 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. + */ + +package org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/low-level-api-fir/testdata/inBlockModification/codeFragments") +@TestDataPath("$PROJECT_ROOT") +public class CodeFragmentInBlockModificationTestGenerated extends AbstractCodeFragmentInBlockModificationTest { + @Test + public void testAllFilesPresentInCodeFragments() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/inBlockModification/codeFragments"), Pattern.compile("^([^.]+)\\.kt$"), null, false); + } + + @Test + @TestMetadata("localClass.kt") + public void testLocalClass() throws Exception { + runTest("analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localClass.kt"); + } + + @Test + @TestMetadata("localFunction.kt") + public void testLocalFunction() throws Exception { + runTest("analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/localFunction.kt"); + } + + @Test + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + runTest("analysis/low-level-api-fir/testdata/inBlockModification/codeFragments/simple.kt"); + } +} diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/OutOfContentRootInBlockModificationTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/OutOfContentRootInBlockModificationTestGenerated.java index f412c369544..47fb201a881 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/OutOfContentRootInBlockModificationTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/OutOfContentRootInBlockModificationTestGenerated.java @@ -21,7 +21,7 @@ import java.util.regex.Pattern; public class OutOfContentRootInBlockModificationTestGenerated extends AbstractOutOfContentRootInBlockModificationTest { @Test public void testAllFilesPresentInInBlockModification() throws Exception { - KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/inBlockModification"), Pattern.compile("^(.+)\\.(kt)$"), null, true); + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/inBlockModification"), Pattern.compile("^(.+)\\.(kt)$"), null, false); } @Test diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/ScriptInBlockModificationTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/ScriptInBlockModificationTestGenerated.java index a579cdccef9..e0cafbaf0c8 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/ScriptInBlockModificationTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/ScriptInBlockModificationTestGenerated.java @@ -21,7 +21,7 @@ import java.util.regex.Pattern; public class ScriptInBlockModificationTestGenerated extends AbstractScriptInBlockModificationTest { @Test public void testAllFilesPresentInInBlockModification() throws Exception { - KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/inBlockModification"), Pattern.compile("^(.+)\\.(kts)$"), null, true); + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/inBlockModification"), Pattern.compile("^(.+)\\.(kts)$"), null, false); } @Test diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/SourceInBlockModificationTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/SourceInBlockModificationTestGenerated.java index f9f2db51208..bfbe7aab65c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/SourceInBlockModificationTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/SourceInBlockModificationTestGenerated.java @@ -21,7 +21,7 @@ import java.util.regex.Pattern; public class SourceInBlockModificationTestGenerated extends AbstractSourceInBlockModificationTest { @Test public void testAllFilesPresentInInBlockModification() throws Exception { - KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/inBlockModification"), Pattern.compile("^(.+)\\.(kt)$"), null, true); + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/inBlockModification"), Pattern.compile("^(.+)\\.(kt)$"), null, false); } @Test diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt index f8123cd9b97..f5324dadd7c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt @@ -202,6 +202,11 @@ class FirRenderer( printer.popIndent() } + override fun visitCodeFragment(codeFragment: FirCodeFragment) { + printer.print("CODE FRAGMENT:") + bodyRenderer?.renderBody(codeFragment.block) + } + override fun visitFileAnnotationsContainer(fileAnnotationsContainer: FirFileAnnotationsContainer) { if (fileAnnotationsContainerRenderer != null) { fileAnnotationsContainerRenderer.render(fileAnnotationsContainer) diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt index cdfbb893d5b..c4fa409da9e 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/firLowLevel.kt @@ -15,12 +15,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.AbstractSource import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based.AbstractDiagnosticCompilerTestDataTest import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based.AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataSpecTest import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based.AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.AbstractOutOfContentRootFileStructureTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.AbstractOutOfContentRootInBlockModificationTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.AbstractScriptFileStructureTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.AbstractScriptInBlockModificationTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.AbstractSourceFileStructureTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.AbstractSourceInBlockModificationTest +import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.* import org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.AbstractErrorResistanceTest import org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.AbstractOutOfContentRootWholeFileResolvePhaseTest import org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.AbstractScriptWholeFileResolvePhaseTest @@ -69,15 +64,19 @@ internal fun TestGroupSuite.generateFirLowLevelApiTests() { } testClass { - model("inBlockModification", pattern = TestGeneratorUtil.KT) + model("inBlockModification", recursive = false, pattern = TestGeneratorUtil.KT) } testClass { - model("inBlockModification", pattern = TestGeneratorUtil.KT) + model("inBlockModification", recursive = false, pattern = TestGeneratorUtil.KT) } testClass { - model("inBlockModification", pattern = TestGeneratorUtil.KTS) + model("inBlockModification", recursive = false, pattern = TestGeneratorUtil.KTS) + } + + testClass { + model("inBlockModification/codeFragments", recursive = false, pattern = TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME) } testClass {