diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java index 2e8a63c680a..ebb1c9b18d9 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java @@ -214,6 +214,12 @@ public class FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerate runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverSmartCasted.kt"); } + @Test + @TestMetadata("foreignValue.kt") + public void testForeignValue() { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.kt"); + } + @Test @TestMetadata("initializer.kt") public void testInitializer() { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java index aae015ab4f4..f35d5045128 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java @@ -214,6 +214,12 @@ public class FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated exten runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverSmartCasted.kt"); } + @Test + @TestMetadata("foreignValue.kt") + public void testForeignValue() { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.kt"); + } + @Test @TestMetadata("initializer.kt") public void testInitializer() { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirIdeDependentAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirIdeDependentAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java index 21193ed8d4f..37f5298d0cc 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirIdeDependentAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirIdeDependentAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java @@ -45,6 +45,24 @@ public class FirIdeDependentAnalysisSourceModuleContainingDeclarationProviderByR KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("codeFragmentFromInside.kt") + public void testCodeFragmentFromInside() { + runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/codeFragmentFromInside.kt"); + } + + @Test + @TestMetadata("foreignValue.kt") + public void testForeignValue() { + runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValue.kt"); + } + + @Test + @TestMetadata("foreignValueScript.kt") + public void testForeignValueScript() { + runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValueScript.kt"); + } + @Test @TestMetadata("localFunction.kt") public void testLocalFunction() { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirIdeNormalAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirIdeNormalAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java index d70428ec71f..46d81ac44ae 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirIdeNormalAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirIdeNormalAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java @@ -45,6 +45,24 @@ public class FirIdeNormalAnalysisSourceModuleContainingDeclarationProviderByRefe KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("codeFragmentFromInside.kt") + public void testCodeFragmentFromInside() { + runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/codeFragmentFromInside.kt"); + } + + @Test + @TestMetadata("foreignValue.kt") + public void testForeignValue() { + runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValue.kt"); + } + + @Test + @TestMetadata("foreignValueScript.kt") + public void testForeignValueScript() { + runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValueScript.kt"); + } + @Test @TestMetadata("localFunction.kt") public void testLocalFunction() { diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt index 03e96a6f8c7..64602023738 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiBaseTestServiceRegistrar.kt @@ -31,6 +31,8 @@ import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModul import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFileClassProvider +import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.CliScriptDefinitionProvider +import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionProvider import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.NO_RUNTIME import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.moduleStructure @@ -51,6 +53,7 @@ object AnalysisApiBaseTestServiceRegistrar : AnalysisApiTestServiceRegistrar() { //but getClasses is used during java resolve, thus it's required to return some PsiClass for such cases registerService(KtFileClassProvider::class.java, KtClsFileClassProvider(project)) registerService(ClsJavaStubByVirtualFileCache::class.java, ClsJavaStubByVirtualFileCache()) + registerService(ScriptDefinitionProvider::class.java, CliScriptDefinitionProvider()) } } diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiScriptTestServiceRegistrar.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiScriptTestServiceRegistrar.kt deleted file mode 100644 index 8fa3faea859..00000000000 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/configurators/AnalysisApiScriptTestServiceRegistrar.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * 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.api.impl.base.test.configurators - -import com.intellij.mock.MockProject -import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar -import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.CliScriptDefinitionProvider -import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionProvider -import org.jetbrains.kotlin.test.services.TestServices - -object AnalysisApiScriptTestServiceRegistrar : AnalysisApiTestServiceRegistrar() { - override fun registerProjectServices(project: MockProject, testServices: TestServices) { - project.registerService(ScriptDefinitionProvider::class.java, CliScriptDefinitionProvider()) - } -} diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirStandaloneNormalAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirStandaloneNormalAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java index 87632fdbdac..60132b73242 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirStandaloneNormalAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/containingDeclarationProvider/FirStandaloneNormalAnalysisSourceModuleContainingDeclarationProviderByReferenceTestGenerated.java @@ -45,6 +45,24 @@ public class FirStandaloneNormalAnalysisSourceModuleContainingDeclarationProvide KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("codeFragmentFromInside.kt") + public void testCodeFragmentFromInside() { + runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/codeFragmentFromInside.kt"); + } + + @Test + @TestMetadata("foreignValue.kt") + public void testForeignValue() { + runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValue.kt"); + } + + @Test + @TestMetadata("foreignValueScript.kt") + public void testForeignValueScript() { + runTest("analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValueScript.kt"); + } + @Test @TestMetadata("localFunction.kt") public void testLocalFunction() { diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/AbstractStandaloneSessionBuilderAgainstStdlibTest.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/AbstractStandaloneSessionBuilderAgainstStdlibTest.kt index a4f6e0f2a2e..1b68f9213ec 100644 --- a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/AbstractStandaloneSessionBuilderAgainstStdlibTest.kt +++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/session/builder/AbstractStandaloneSessionBuilderAgainstStdlibTest.kt @@ -66,7 +66,7 @@ abstract class AbstractStandaloneSessionBuilderAgainstStdlibTest : TestWithDispo // builtin type val typeReference = ktFile.findDescendantOfType()!!.typeReference!! - typeReference.assertIsReferenceTo(StandardClassIds.Unit) + typeReference.assertIsReferenceTo(StandardClassIds.Float) } private fun KtTypeReference.assertIsReferenceTo(classId: ClassId) { diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.capturing.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.capturing.txt new file mode 100644 index 00000000000..c407479df06 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.capturing.txt @@ -0,0 +1,3 @@ +ForeignValue[name: foo_DebugLabel; isMutated: false; displayText: foo_DebugLabel] + lval foo_DebugLabel: R|kotlin/String!| + R|kotlin/String!| diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.ir.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.ir.txt new file mode 100644 index 00000000000..d067adb7a89 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.ir.txt @@ -0,0 +1,12 @@ +MODULE_FRAGMENT + FILE fqName: fileName:fragment.kt + CLASS CLASS name:CodeFragment modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.CodeFragment + CONSTRUCTOR visibility:public <> () returnType:.CodeFragment [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + FUN name:run visibility:public modality:FINAL <> (p0:@[FlexibleNullability] kotlin.String?) returnType:@[FlexibleNullability] kotlin.String? + VALUE_PARAMETER name:p0 index:0 type:@[FlexibleNullability] kotlin.String? + EXPRESSION_BODY + BLOCK type=@[FlexibleNullability] kotlin.String? origin=null + GET_VAR 'p0: @[FlexibleNullability] kotlin.String? declared in .CodeFragment.run' type=@[FlexibleNullability] kotlin.String? origin=null diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.kt new file mode 100644 index 00000000000..c9de1a7e0e6 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.kt @@ -0,0 +1,18 @@ +// MODULE: context + +// FILE: context.kt +fun test() { + call("foo") +} + +fun call(text: String) {} + + +// MODULE: main +// MODULE_KIND: CodeFragment +// CONTEXT_MODULE: context + +// FILE: fragment.kt +// CODE_FRAGMENT_KIND: EXPRESSION +// CODE_FRAGMENT_FOREIGN_VALUE: foo_DebugLabel(Ljava/lang/String;) +foo_DebugLabel \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.txt new file mode 100644 index 00000000000..a97a3af64a0 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.txt @@ -0,0 +1,5 @@ +public final class CodeFragment { + // source: 'fragment.kt' + public method (): void + public final static method run(p0: java.lang.String): java.lang.String +} diff --git a/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/codeFragmentFromInside.kt b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/codeFragmentFromInside.kt new file mode 100644 index 00000000000..cbce704f824 --- /dev/null +++ b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/codeFragmentFromInside.kt @@ -0,0 +1,21 @@ +// MODULE: context + +// FILE: context.kt +fun test() { + call("foo") +} + +fun call(text: String) {} + + +// MODULE: main +// MODULE_KIND: CodeFragment +// CONTEXT_MODULE: context + +// FILE: fragment.kt +// CODE_FRAGMENT_KIND: BLOCK +fun local() { + call("bar") +} + +local() \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/codeFragmentFromInside.txt b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/codeFragmentFromInside.txt new file mode 100644 index 00000000000..2c553cb4208 --- /dev/null +++ b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/codeFragmentFromInside.txt @@ -0,0 +1 @@ +/local diff --git a/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValue.kt b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValue.kt new file mode 100644 index 00000000000..c9de1a7e0e6 --- /dev/null +++ b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValue.kt @@ -0,0 +1,18 @@ +// MODULE: context + +// FILE: context.kt +fun test() { + call("foo") +} + +fun call(text: String) {} + + +// MODULE: main +// MODULE_KIND: CodeFragment +// CONTEXT_MODULE: context + +// FILE: fragment.kt +// CODE_FRAGMENT_KIND: EXPRESSION +// CODE_FRAGMENT_FOREIGN_VALUE: foo_DebugLabel(Ljava/lang/String;) +foo_DebugLabel \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValue.txt b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValue.txt new file mode 100644 index 00000000000..aa6f4d272d6 --- /dev/null +++ b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValue.txt @@ -0,0 +1 @@ +foo_DebugLabel diff --git a/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValueScript.kt b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValueScript.kt new file mode 100644 index 00000000000..73340e3ea16 --- /dev/null +++ b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValueScript.kt @@ -0,0 +1,20 @@ +// MODULE: lib + +// FILE: lib.kt +fun call(text: String) {} + + +// MODULE: context(lib) + +// FILE: context.kts +call("foo") + + +// MODULE: main +// MODULE_KIND: CodeFragment +// CONTEXT_MODULE: context + +// FILE: fragment.kt +// CODE_FRAGMENT_KIND: EXPRESSION +// CODE_FRAGMENT_FOREIGN_VALUE: foo_DebugLabel(Ljava/lang/String;) +foo_DebugLabel \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValueScript.txt b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValueScript.txt new file mode 100644 index 00000000000..aa6f4d272d6 --- /dev/null +++ b/analysis/analysis-api/testData/components/containingDeclarationProvider/containingDeclarationByReference/foreignValueScript.txt @@ -0,0 +1 @@ +foo_DebugLabel diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/TestWithDisposable.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/TestWithDisposable.kt index 6379761d414..067067075b7 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/TestWithDisposable.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/TestWithDisposable.kt @@ -12,7 +12,7 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.TestInfo abstract class TestWithDisposable { - private var _disposable: Disposable? = null + private var _disposable: Disposable? = Disposer.newDisposable("Disposable for Analysis Api tests") protected val disposable: Disposable get() = _disposable!! @BeforeEach diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/AnalysisApiKtModuleProviderImpl.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/AnalysisApiKtModuleProviderImpl.kt index d077959e8c1..36a524416a4 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/AnalysisApiKtModuleProviderImpl.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/AnalysisApiKtModuleProviderImpl.kt @@ -43,7 +43,7 @@ class AnalysisApiKtModuleProviderImpl( require(!this::modulesByName.isInitialized) this.modulesStructure = modules - this.modulesByName = modulesStructure.mainModules.associateByName() + this.modulesByName = modulesStructure.mainModules.associateBy { it.testModule.name } } override fun getModuleStructure(): KtTestModuleProjectStructure = modulesStructure @@ -57,21 +57,4 @@ fun TestServices.allKtFiles(): List = moduleStructure.modules.flatMap(kt val TestServices.ktModuleProvider: AnalysisApiKtModuleProvider by TestServices.testServiceAccessor() -fun TestModule.getKtModule(testServices: TestServices): KtModule = testServices.ktModuleProvider.getModule(name) - -fun List.associateByName(): Map { - return associateBy { ktTestModule -> - when (val ktModule = ktTestModule.ktModule) { - is KtModuleByCompilerConfiguration -> ktModule.moduleName - is KtSourceModule -> ktModule.moduleName - is KtLibraryModule -> ktModule.libraryName - is KtLibrarySourceModule -> ktModule.libraryName - is KtSdkModule -> ktModule.sdkName - is KtBuiltinsModule -> "Builtins for ${ktModule.platform}" - is KtNotUnderContentRootModule -> ktModule.name - is KtScriptModule -> ktModule.file.name - is KtDanglingFileModule -> ktModule.file.name - else -> error("Unsupported module type: " + ktModule.javaClass.name) - } - } -} +fun TestModule.getKtModule(testServices: TestServices): KtModule = testServices.ktModuleProvider.getModule(name) \ No newline at end of file diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/KtCodeFragmentTestModuleFactory.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/KtCodeFragmentTestModuleFactory.kt index fe17df3ef21..2b897ac8014 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/KtCodeFragmentTestModuleFactory.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/KtCodeFragmentTestModuleFactory.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.analysis.test.framework.project.structure import com.intellij.openapi.project.Project import org.jetbrains.kotlin.analysis.project.structure.DanglingFileResolutionMode import org.jetbrains.kotlin.analysis.project.structure.impl.KtDanglingFileModuleImpl +import org.jetbrains.kotlin.analysis.test.framework.services.TestForeignValue +import org.jetbrains.kotlin.analysis.test.framework.services.TestForeignValueProviderService import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind import org.jetbrains.kotlin.psi.KtBlockCodeFragment @@ -17,12 +19,14 @@ import org.jetbrains.kotlin.psi.KtExpressionCodeFragment import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtTypeCodeFragment import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.psi.psiUtil.isIdentifier import org.jetbrains.kotlin.test.directives.model.DirectiveApplicability import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.sourceFileProvider +import org.jetbrains.org.objectweb.asm.Type import java.nio.file.Path /** @@ -66,6 +70,9 @@ object KtCodeFragmentTestModuleFactory : KtTestModuleFactory { CodeFragmentKind.TYPE -> KtTypeCodeFragment(project, fileName, fileText, contextElement) } + val foreignValues = testFile.directives[AnalysisApiTestCodeFragmentDirectives.CODE_FRAGMENT_FOREIGN_VALUE] + TestForeignValueProviderService.submitForeignValues(codeFragment, foreignValues) + val module = KtDanglingFileModuleImpl( codeFragment, contextModule.ktModule, @@ -91,6 +98,19 @@ object AnalysisApiTestCodeFragmentDirectives : SimpleDirectivesContainer() { description = "Import local to the code fragment content", applicability = DirectiveApplicability.File ) + + val CODE_FRAGMENT_FOREIGN_VALUE by valueDirective( + description = "Value injected to a code fragment", + applicability = DirectiveApplicability.File, + parser = fun(rawText: String): TestForeignValue? { + val match = CODE_FRAGMENT_FOREIGN_VALUE_REGEX.matchEntire(rawText) ?: return null + val valueName = match.groupValues[1].also { require(it.isIdentifier()) } + val valueType = match.groupValues[2].also { Type.getType(it) } // Check that it is a valid type descriptor + return TestForeignValue(valueName, valueType) + } + ) + + private val CODE_FRAGMENT_FOREIGN_VALUE_REGEX = Regex("^(.+)\\((.+)\\)$") } enum class CodeFragmentKind { diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/TestModuleStructureFactory.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/TestModuleStructureFactory.kt index 03b72da7707..fe4577cfd1d 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/TestModuleStructureFactory.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/project/structure/TestModuleStructureFactory.kt @@ -49,7 +49,7 @@ object TestModuleStructureFactory { ): KtTestModuleProjectStructure { val modules = createModules(moduleStructure, testServices, project) - val modulesByName = modules.associateByName() + val modulesByName = modules.associateBy { it.testModule.name } val libraryCache: LibraryCache = mutableMapOf() diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/TestForeignValueProviderService.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/TestForeignValueProviderService.kt new file mode 100644 index 00000000000..09249d58c02 --- /dev/null +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/services/TestForeignValueProviderService.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2024 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.test.framework.services + +import com.intellij.openapi.util.Key +import org.jetbrains.kotlin.analysis.providers.ForeignValueProviderService +import org.jetbrains.kotlin.psi.KtCodeFragment + +class TestForeignValue(val name: String, val internalType: String) + +class TestForeignValueProviderService : ForeignValueProviderService { + override fun getForeignValues(codeFragment: KtCodeFragment): Map { + return codeFragment.getUserData(FOREIGN_VALUES_KEY) ?: emptyMap() + } + + companion object { + private val FOREIGN_VALUES_KEY = Key>("TestForeignValues") + + fun submitForeignValues(codeFragment: KtCodeFragment, values: List) { + require(codeFragment.getUserData(FOREIGN_VALUES_KEY) == null) + + val map = values.map { Pair(it.name, it.internalType) }.toMap() + codeFragment.putUserData(FOREIGN_VALUES_KEY, map) + } + } +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/CodeFragmentCapturingTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/CodeFragmentCapturingTestGenerated.java index fe7269d7073..7920cba687c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/CodeFragmentCapturingTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/CodeFragmentCapturingTestGenerated.java @@ -77,6 +77,12 @@ public class CodeFragmentCapturingTestGenerated extends AbstractCodeFragmentCapt runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverSmartCasted.kt"); } + @Test + @TestMetadata("foreignValue.kt") + public void testForeignValue() { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/foreignValue.kt"); + } + @Test @TestMetadata("initializer.kt") public void testInitializer() { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt index adb15572d6d..5201393c648 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt @@ -13,7 +13,9 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.services.LLSealedInherito import org.jetbrains.kotlin.analysis.low.level.api.fir.services.NoOpKtCompilerPluginsProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.services.PackagePartProviderTestImpl import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider +import org.jetbrains.kotlin.analysis.providers.ForeignValueProviderService import org.jetbrains.kotlin.analysis.providers.PackagePartProviderFactory +import org.jetbrains.kotlin.analysis.test.framework.services.TestForeignValueProviderService import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar import org.jetbrains.kotlin.test.TestInfrastructureInternals import org.jetbrains.kotlin.test.impl.testConfiguration @@ -25,9 +27,9 @@ object AnalysisApiFirTestServiceRegistrar : AnalysisApiTestServiceRegistrar() { } override fun registerProjectServices(project: MockProject, testServices: TestServices) { - project.apply { - FirStandaloneServiceRegistrar.registerProjectServices(project) + FirStandaloneServiceRegistrar.registerProjectServices(project) + project.apply { registerService(LLSealedInheritorsProviderFactory::class.java, LLSealedInheritorsProviderFactoryForTests()) registerService(PackagePartProviderFactory::class.java, PackagePartProviderTestImpl(testServices)) registerService(KtCompilerPluginsProvider::class.java, NoOpKtCompilerPluginsProvider) @@ -41,5 +43,9 @@ object AnalysisApiFirTestServiceRegistrar : AnalysisApiTestServiceRegistrar() { override fun registerApplicationServices(application: MockApplication, testServices: TestServices) { FirStandaloneServiceRegistrar.registerApplicationServices(application) + + application.apply { + registerService(ForeignValueProviderService::class.java, TestForeignValueProviderService()) + } } } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/FirLowLevelCompilerBasedTestConfigurator.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/FirLowLevelCompilerBasedTestConfigurator.kt index 4b73fb14a5a..5645ddbe91c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/FirLowLevelCompilerBasedTestConfigurator.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/FirLowLevelCompilerBasedTestConfigurator.kt @@ -9,7 +9,6 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.project.Project import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiBaseTestServiceRegistrar import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiDecompiledCodeTestServiceRegistrar -import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiScriptTestServiceRegistrar import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule import org.jetbrains.kotlin.analysis.project.structure.allDirectDependenciesOfType import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtScriptModuleByCompilerConfiguration @@ -42,7 +41,6 @@ object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator() AnalysisApiBaseTestServiceRegistrar, AnalysisApiDecompiledCodeTestServiceRegistrar, AnalysisApiFirTestServiceRegistrar, - AnalysisApiScriptTestServiceRegistrar, ) override fun createModules( diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirScriptTestConfigurator.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirScriptTestConfigurator.kt index 05e6a36a4ab..7cf6ea0363c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirScriptTestConfigurator.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirScriptTestConfigurator.kt @@ -6,10 +6,8 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators import com.intellij.openapi.Disposable -import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiScriptTestServiceRegistrar import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtScriptTestModuleFactory import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleFactory -import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder open class AnalysisApiFirScriptTestConfigurator(analyseInDependentSession: Boolean) : @@ -21,6 +19,4 @@ open class AnalysisApiFirScriptTestConfigurator(analyseInDependentSession: Boole useAdditionalService { KtScriptTestModuleFactory } } } - - override val serviceRegistrars: List = super.serviceRegistrars + AnalysisApiScriptTestServiceRegistrar }