[Analysis API] Add tests for foreign values
This commit is contained in:
+6
@@ -214,6 +214,12 @@ public class FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerate
|
|||||||
runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverSmartCasted.kt");
|
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
|
@Test
|
||||||
@TestMetadata("initializer.kt")
|
@TestMetadata("initializer.kt")
|
||||||
public void testInitializer() {
|
public void testInitializer() {
|
||||||
|
|||||||
+6
@@ -214,6 +214,12 @@ public class FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated exten
|
|||||||
runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverSmartCasted.kt");
|
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
|
@Test
|
||||||
@TestMetadata("initializer.kt")
|
@TestMetadata("initializer.kt")
|
||||||
public void testInitializer() {
|
public void testInitializer() {
|
||||||
|
|||||||
+18
@@ -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);
|
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
|
@Test
|
||||||
@TestMetadata("localFunction.kt")
|
@TestMetadata("localFunction.kt")
|
||||||
public void testLocalFunction() {
|
public void testLocalFunction() {
|
||||||
|
|||||||
+18
@@ -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);
|
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
|
@Test
|
||||||
@TestMetadata("localFunction.kt")
|
@TestMetadata("localFunction.kt")
|
||||||
public void testLocalFunction() {
|
public void testLocalFunction() {
|
||||||
|
|||||||
+3
@@ -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.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtFileClassProvider
|
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.directives.JvmEnvironmentConfigurationDirectives.NO_RUNTIME
|
||||||
import org.jetbrains.kotlin.test.services.TestServices
|
import org.jetbrains.kotlin.test.services.TestServices
|
||||||
import org.jetbrains.kotlin.test.services.moduleStructure
|
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
|
//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(KtFileClassProvider::class.java, KtClsFileClassProvider(project))
|
||||||
registerService(ClsJavaStubByVirtualFileCache::class.java, ClsJavaStubByVirtualFileCache())
|
registerService(ClsJavaStubByVirtualFileCache::class.java, ClsJavaStubByVirtualFileCache())
|
||||||
|
registerService(ScriptDefinitionProvider::class.java, CliScriptDefinitionProvider())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-18
@@ -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())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+18
@@ -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);
|
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
|
@Test
|
||||||
@TestMetadata("localFunction.kt")
|
@TestMetadata("localFunction.kt")
|
||||||
public void testLocalFunction() {
|
public void testLocalFunction() {
|
||||||
|
|||||||
+1
-1
@@ -66,7 +66,7 @@ abstract class AbstractStandaloneSessionBuilderAgainstStdlibTest : TestWithDispo
|
|||||||
|
|
||||||
// builtin type
|
// builtin type
|
||||||
val typeReference = ktFile.findDescendantOfType<KtNamedFunction>()!!.typeReference!!
|
val typeReference = ktFile.findDescendantOfType<KtNamedFunction>()!!.typeReference!!
|
||||||
typeReference.assertIsReferenceTo(StandardClassIds.Unit)
|
typeReference.assertIsReferenceTo(StandardClassIds.Float)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun KtTypeReference.assertIsReferenceTo(classId: ClassId) {
|
private fun KtTypeReference.assertIsReferenceTo(classId: ClassId) {
|
||||||
|
|||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
ForeignValue[name: foo_DebugLabel; isMutated: false; displayText: foo_DebugLabel]
|
||||||
|
lval foo_DebugLabel: R|kotlin/String!|
|
||||||
|
R|kotlin/String!|
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
MODULE_FRAGMENT
|
||||||
|
FILE fqName:<root> fileName:fragment.kt
|
||||||
|
CLASS CLASS name:CodeFragment modality:FINAL visibility:public superTypes:[kotlin.Any]
|
||||||
|
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.CodeFragment
|
||||||
|
CONSTRUCTOR visibility:public <> () returnType:<root>.CodeFragment [primary]
|
||||||
|
BLOCK_BODY
|
||||||
|
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [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 <root>.CodeFragment.run' type=@[FlexibleNullability] kotlin.String? origin=null
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
// MODULE: context
|
||||||
|
|
||||||
|
// FILE: context.kt
|
||||||
|
fun test() {
|
||||||
|
<caret_context>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;)
|
||||||
|
<caret>foo_DebugLabel
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
public final class CodeFragment {
|
||||||
|
// source: 'fragment.kt'
|
||||||
|
public method <init>(): void
|
||||||
|
public final static method run(p0: java.lang.String): java.lang.String
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
// MODULE: context
|
||||||
|
|
||||||
|
// FILE: context.kt
|
||||||
|
fun test() {
|
||||||
|
<caret_context>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")
|
||||||
|
}
|
||||||
|
|
||||||
|
<caret>local()
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
/local
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
// MODULE: context
|
||||||
|
|
||||||
|
// FILE: context.kt
|
||||||
|
fun test() {
|
||||||
|
<caret_context>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;)
|
||||||
|
<caret>foo_DebugLabel
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
foo_DebugLabel
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
// MODULE: lib
|
||||||
|
|
||||||
|
// FILE: lib.kt
|
||||||
|
fun call(text: String) {}
|
||||||
|
|
||||||
|
|
||||||
|
// MODULE: context(lib)
|
||||||
|
|
||||||
|
// FILE: context.kts
|
||||||
|
<caret_context>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;)
|
||||||
|
<caret>foo_DebugLabel
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
foo_DebugLabel
|
||||||
+1
-1
@@ -12,7 +12,7 @@ import org.junit.jupiter.api.BeforeEach
|
|||||||
import org.junit.jupiter.api.TestInfo
|
import org.junit.jupiter.api.TestInfo
|
||||||
|
|
||||||
abstract class TestWithDisposable {
|
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!!
|
protected val disposable: Disposable get() = _disposable!!
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
|
|||||||
+2
-19
@@ -43,7 +43,7 @@ class AnalysisApiKtModuleProviderImpl(
|
|||||||
require(!this::modulesByName.isInitialized)
|
require(!this::modulesByName.isInitialized)
|
||||||
|
|
||||||
this.modulesStructure = modules
|
this.modulesStructure = modules
|
||||||
this.modulesByName = modulesStructure.mainModules.associateByName()
|
this.modulesByName = modulesStructure.mainModules.associateBy { it.testModule.name }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getModuleStructure(): KtTestModuleProjectStructure = modulesStructure
|
override fun getModuleStructure(): KtTestModuleProjectStructure = modulesStructure
|
||||||
@@ -57,21 +57,4 @@ fun TestServices.allKtFiles(): List<KtFile> = moduleStructure.modules.flatMap(kt
|
|||||||
|
|
||||||
val TestServices.ktModuleProvider: AnalysisApiKtModuleProvider by TestServices.testServiceAccessor()
|
val TestServices.ktModuleProvider: AnalysisApiKtModuleProvider by TestServices.testServiceAccessor()
|
||||||
|
|
||||||
fun TestModule.getKtModule(testServices: TestServices): KtModule = testServices.ktModuleProvider.getModule(name)
|
fun TestModule.getKtModule(testServices: TestServices): KtModule = testServices.ktModuleProvider.getModule(name)
|
||||||
|
|
||||||
fun List<KtTestModule>.associateByName(): Map<String, KtTestModule> {
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+20
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.analysis.test.framework.project.structure
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.DanglingFileResolutionMode
|
import org.jetbrains.kotlin.analysis.project.structure.DanglingFileResolutionMode
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.impl.KtDanglingFileModuleImpl
|
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.services.expressionMarkerProvider
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
|
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
|
||||||
import org.jetbrains.kotlin.psi.KtBlockCodeFragment
|
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.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtTypeCodeFragment
|
import org.jetbrains.kotlin.psi.KtTypeCodeFragment
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
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.DirectiveApplicability
|
||||||
import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer
|
import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer
|
||||||
import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue
|
import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue
|
||||||
import org.jetbrains.kotlin.test.model.TestModule
|
import org.jetbrains.kotlin.test.model.TestModule
|
||||||
import org.jetbrains.kotlin.test.services.TestServices
|
import org.jetbrains.kotlin.test.services.TestServices
|
||||||
import org.jetbrains.kotlin.test.services.sourceFileProvider
|
import org.jetbrains.kotlin.test.services.sourceFileProvider
|
||||||
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -66,6 +70,9 @@ object KtCodeFragmentTestModuleFactory : KtTestModuleFactory {
|
|||||||
CodeFragmentKind.TYPE -> KtTypeCodeFragment(project, fileName, fileText, contextElement)
|
CodeFragmentKind.TYPE -> KtTypeCodeFragment(project, fileName, fileText, contextElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val foreignValues = testFile.directives[AnalysisApiTestCodeFragmentDirectives.CODE_FRAGMENT_FOREIGN_VALUE]
|
||||||
|
TestForeignValueProviderService.submitForeignValues(codeFragment, foreignValues)
|
||||||
|
|
||||||
val module = KtDanglingFileModuleImpl(
|
val module = KtDanglingFileModuleImpl(
|
||||||
codeFragment,
|
codeFragment,
|
||||||
contextModule.ktModule,
|
contextModule.ktModule,
|
||||||
@@ -91,6 +98,19 @@ object AnalysisApiTestCodeFragmentDirectives : SimpleDirectivesContainer() {
|
|||||||
description = "Import local to the code fragment content",
|
description = "Import local to the code fragment content",
|
||||||
applicability = DirectiveApplicability.File
|
applicability = DirectiveApplicability.File
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val CODE_FRAGMENT_FOREIGN_VALUE by valueDirective<TestForeignValue>(
|
||||||
|
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 {
|
enum class CodeFragmentKind {
|
||||||
|
|||||||
+1
-1
@@ -49,7 +49,7 @@ object TestModuleStructureFactory {
|
|||||||
): KtTestModuleProjectStructure {
|
): KtTestModuleProjectStructure {
|
||||||
val modules = createModules(moduleStructure, testServices, project)
|
val modules = createModules(moduleStructure, testServices, project)
|
||||||
|
|
||||||
val modulesByName = modules.associateByName()
|
val modulesByName = modules.associateBy { it.testModule.name }
|
||||||
|
|
||||||
val libraryCache: LibraryCache = mutableMapOf()
|
val libraryCache: LibraryCache = mutableMapOf()
|
||||||
|
|
||||||
|
|||||||
+29
@@ -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<String, String> {
|
||||||
|
return codeFragment.getUserData(FOREIGN_VALUES_KEY) ?: emptyMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val FOREIGN_VALUES_KEY = Key<Map<String, String>>("TestForeignValues")
|
||||||
|
|
||||||
|
fun submitForeignValues(codeFragment: KtCodeFragment, values: List<TestForeignValue>) {
|
||||||
|
require(codeFragment.getUserData(FOREIGN_VALUES_KEY) == null)
|
||||||
|
|
||||||
|
val map = values.map { Pair(it.name, it.internalType) }.toMap()
|
||||||
|
codeFragment.putUserData(FOREIGN_VALUES_KEY, map)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
@@ -77,6 +77,12 @@ public class CodeFragmentCapturingTestGenerated extends AbstractCodeFragmentCapt
|
|||||||
runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/capturing/extensionReceiverSmartCasted.kt");
|
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
|
@Test
|
||||||
@TestMetadata("initializer.kt")
|
@TestMetadata("initializer.kt")
|
||||||
public void testInitializer() {
|
public void testInitializer() {
|
||||||
|
|||||||
+8
-2
@@ -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.NoOpKtCompilerPluginsProvider
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.services.PackagePartProviderTestImpl
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.services.PackagePartProviderTestImpl
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
|
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.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.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
|
||||||
import org.jetbrains.kotlin.test.TestInfrastructureInternals
|
import org.jetbrains.kotlin.test.TestInfrastructureInternals
|
||||||
import org.jetbrains.kotlin.test.impl.testConfiguration
|
import org.jetbrains.kotlin.test.impl.testConfiguration
|
||||||
@@ -25,9 +27,9 @@ object AnalysisApiFirTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun registerProjectServices(project: MockProject, testServices: TestServices) {
|
override fun registerProjectServices(project: MockProject, testServices: TestServices) {
|
||||||
project.apply {
|
FirStandaloneServiceRegistrar.registerProjectServices(project)
|
||||||
FirStandaloneServiceRegistrar.registerProjectServices(project)
|
|
||||||
|
|
||||||
|
project.apply {
|
||||||
registerService(LLSealedInheritorsProviderFactory::class.java, LLSealedInheritorsProviderFactoryForTests())
|
registerService(LLSealedInheritorsProviderFactory::class.java, LLSealedInheritorsProviderFactoryForTests())
|
||||||
registerService(PackagePartProviderFactory::class.java, PackagePartProviderTestImpl(testServices))
|
registerService(PackagePartProviderFactory::class.java, PackagePartProviderTestImpl(testServices))
|
||||||
registerService(KtCompilerPluginsProvider::class.java, NoOpKtCompilerPluginsProvider)
|
registerService(KtCompilerPluginsProvider::class.java, NoOpKtCompilerPluginsProvider)
|
||||||
@@ -41,5 +43,9 @@ object AnalysisApiFirTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
|
|||||||
|
|
||||||
override fun registerApplicationServices(application: MockApplication, testServices: TestServices) {
|
override fun registerApplicationServices(application: MockApplication, testServices: TestServices) {
|
||||||
FirStandaloneServiceRegistrar.registerApplicationServices(application)
|
FirStandaloneServiceRegistrar.registerApplicationServices(application)
|
||||||
|
|
||||||
|
application.apply {
|
||||||
|
registerService(ForeignValueProviderService::class.java, TestForeignValueProviderService())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-2
@@ -9,7 +9,6 @@ import com.intellij.openapi.Disposable
|
|||||||
import com.intellij.openapi.project.Project
|
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.AnalysisApiBaseTestServiceRegistrar
|
||||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiDecompiledCodeTestServiceRegistrar
|
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.KtBinaryModule
|
||||||
import org.jetbrains.kotlin.analysis.project.structure.allDirectDependenciesOfType
|
import org.jetbrains.kotlin.analysis.project.structure.allDirectDependenciesOfType
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtScriptModuleByCompilerConfiguration
|
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtScriptModuleByCompilerConfiguration
|
||||||
@@ -42,7 +41,6 @@ object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator()
|
|||||||
AnalysisApiBaseTestServiceRegistrar,
|
AnalysisApiBaseTestServiceRegistrar,
|
||||||
AnalysisApiDecompiledCodeTestServiceRegistrar,
|
AnalysisApiDecompiledCodeTestServiceRegistrar,
|
||||||
AnalysisApiFirTestServiceRegistrar,
|
AnalysisApiFirTestServiceRegistrar,
|
||||||
AnalysisApiScriptTestServiceRegistrar,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun createModules(
|
override fun createModules(
|
||||||
|
|||||||
-4
@@ -6,10 +6,8 @@
|
|||||||
package org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators
|
package org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators
|
||||||
|
|
||||||
import com.intellij.openapi.Disposable
|
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.KtScriptTestModuleFactory
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleFactory
|
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
|
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
|
||||||
|
|
||||||
open class AnalysisApiFirScriptTestConfigurator(analyseInDependentSession: Boolean) :
|
open class AnalysisApiFirScriptTestConfigurator(analyseInDependentSession: Boolean) :
|
||||||
@@ -21,6 +19,4 @@ open class AnalysisApiFirScriptTestConfigurator(analyseInDependentSession: Boole
|
|||||||
useAdditionalService<KtTestModuleFactory> { KtScriptTestModuleFactory }
|
useAdditionalService<KtTestModuleFactory> { KtScriptTestModuleFactory }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override val serviceRegistrars: List<AnalysisApiTestServiceRegistrar> = super.serviceRegistrars + AnalysisApiScriptTestServiceRegistrar
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user