[Analysis API] provide tests for the KtResolveExtensionProvider
^KT-57930
This commit is contained in:
committed by
Space Team
parent
d68587de77
commit
51eaa3f9cf
+66
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* 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.fir.test.cases.generated.cases.references;
|
||||
|
||||
import com.intellij.testFramework.TestDataPath;
|
||||
import org.jetbrains.kotlin.test.util.KtTestUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode;
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.AbstractReferenceResolveWithResolveExtensionTest;
|
||||
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/analysis-api/testData/resolveExtensions/referenceResolve")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
public class FirIdeNormalAnalysisSourceModuleReferenceResolveWithResolveExtensionTestGenerated extends AbstractReferenceResolveWithResolveExtensionTest {
|
||||
@NotNull
|
||||
@Override
|
||||
public AnalysisApiTestConfigurator getConfigurator() {
|
||||
return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator(
|
||||
new AnalysisApiTestConfiguratorFactoryData(
|
||||
FrontendKind.Fir,
|
||||
TestModuleKind.Source,
|
||||
AnalysisSessionMode.Normal,
|
||||
AnalysisApiMode.Ide
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAllFilesPresentInReferenceResolve() throws Exception {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/resolveExtensions/referenceResolve"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("classMember.kt")
|
||||
public void testClassMember() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/resolveExtensions/referenceResolve/classMember.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("extensionFunction.kt")
|
||||
public void testExtensionFunction() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/resolveExtensions/referenceResolve/extensionFunction.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("topLevelFunction.kt")
|
||||
public void testTopLevelFunction() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/resolveExtensions/referenceResolve/topLevelFunction.kt");
|
||||
}
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 2010-2022 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.cases.references
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.util.KtResolveExtensionProviderForTest
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.util.KtResolveExtensionProviderForTestPreAnalysisHandler
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.util.KtResolveExtensionFileForTests
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.test.bind
|
||||
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
|
||||
|
||||
abstract class AbstractReferenceResolveWithResolveExtensionTest : AbstractReferenceResolveTest() {
|
||||
override fun configureTest(builder: TestConfigurationBuilder) {
|
||||
super.configureTest(builder)
|
||||
val provider = KtResolveExtensionProviderForTest(
|
||||
listOf(
|
||||
KtResolveExtensionFileForTests(
|
||||
"extension1.kt",
|
||||
packageName = FqName("generated"),
|
||||
topLevelClassifiersNames = setOf("GeneratedClass1"),
|
||||
topLevelCallableNames = setOf("generatedTopLevelFunction1", "generatedTopLevelExtensionFunction1"),
|
||||
fileText = """|package generated
|
||||
|
|
||||
|class GeneratedClass1 {
|
||||
| fun generatedClassMember1(): Int
|
||||
|}
|
||||
|
|
||||
|fun generatedTopLevelFunction1(): GeneratedClass2
|
||||
|
|
||||
|fun String.generatedTopLevelExtensionFunction1(boolean: Boolean): Int
|
||||
""".trimMargin()
|
||||
),
|
||||
KtResolveExtensionFileForTests(
|
||||
"extension2.kt",
|
||||
packageName = FqName("generated"),
|
||||
topLevelClassifiersNames = setOf("GeneratedClass2"),
|
||||
topLevelCallableNames = setOf(),
|
||||
fileText = """|package generated
|
||||
|
|
||||
|class GeneratedClass2 {
|
||||
| fun generatedClassMember2(): GeneratedClass1
|
||||
|}
|
||||
""".trimMargin(),
|
||||
)
|
||||
),
|
||||
setOf(FqName("generated"))
|
||||
)
|
||||
with(builder) {
|
||||
usePreAnalysisHandlers(::KtResolveExtensionProviderForTestPreAnalysisHandler.bind(listOf(provider)))
|
||||
}
|
||||
}
|
||||
}
|
||||
+11
-1
@@ -7,10 +7,12 @@ package org.jetbrains.kotlin.analysis.api.impl.base.test.configurators
|
||||
|
||||
import com.intellij.mock.MockApplication
|
||||
import com.intellij.mock.MockProject
|
||||
import com.intellij.openapi.extensions.ExtensionPoint
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.references.HLApiReferenceProviderService
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtDefaultLifetimeTokenProvider
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtReadActionConfinementDefaultLifetimeTokenProvider
|
||||
import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionProvider
|
||||
import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProvider
|
||||
import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProviderImpl
|
||||
import org.jetbrains.kotlin.analysis.providers.*
|
||||
@@ -22,7 +24,15 @@ import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.test.services.TestServices
|
||||
|
||||
object AnalysisApiBaseTestServiceRegistrar: AnalysisApiTestServiceRegistrar() {
|
||||
override fun registerProjectExtensionPoints(project: MockProject, testServices: TestServices) {}
|
||||
override fun registerProjectExtensionPoints(project: MockProject, testServices: TestServices) {
|
||||
project.extensionArea.apply {
|
||||
registerExtensionPoint(
|
||||
KtResolveExtensionProvider.EP_NAME.name,
|
||||
KtResolveExtensionProvider::class.java.name,
|
||||
ExtensionPoint.Kind.INTERFACE,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(KtAnalysisApiInternals::class)
|
||||
override fun registerProjectServices(project: MockProject, testServices: TestServices) {
|
||||
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* 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.util
|
||||
|
||||
import com.intellij.mock.MockProject
|
||||
import com.intellij.openapi.util.ModificationTracker
|
||||
import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtension
|
||||
import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionFile
|
||||
import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionProvider
|
||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||
import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.test.services.PreAnalysisHandler
|
||||
import org.jetbrains.kotlin.test.services.TestModuleStructure
|
||||
import org.jetbrains.kotlin.test.services.TestServices
|
||||
|
||||
class KtResolveExtensionProviderForTest(
|
||||
private val files: List<KtResolveExtensionFile>,
|
||||
private val packages: Set<FqName>,
|
||||
) : KtResolveExtensionProvider() {
|
||||
override fun provideExtensionsFor(module: KtModule): List<KtResolveExtension> {
|
||||
return listOf(KtResolveExtensionForTest(files, packages))
|
||||
}
|
||||
}
|
||||
|
||||
class KtResolveExtensionProviderForTestPreAnalysisHandler(
|
||||
testServices: TestServices,
|
||||
private val providers: List<KtResolveExtensionProviderForTest>,
|
||||
) : PreAnalysisHandler(testServices) {
|
||||
override fun preprocessModuleStructure(moduleStructure: TestModuleStructure) {
|
||||
val project = testServices.environmentManager.getProject() as MockProject
|
||||
val extensionPoint = project.extensionArea.getExtensionPoint(KtResolveExtensionProvider.EP_NAME)
|
||||
for (provider in providers) {
|
||||
extensionPoint.registerExtension(provider, project)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class KtResolveExtensionForTest(
|
||||
private val files: List<KtResolveExtensionFile>,
|
||||
private val packages: Set<FqName>,
|
||||
) : KtResolveExtension() {
|
||||
override fun getKtFiles(): List<KtResolveExtensionFile> = files
|
||||
override fun getModificationTracker(): ModificationTracker = ModificationTracker.NEVER_CHANGED
|
||||
override fun getContainedPackages(): Set<FqName> = packages
|
||||
}
|
||||
|
||||
class KtResolveExtensionFileForTests(
|
||||
private val fileName: String,
|
||||
private val packageName: FqName,
|
||||
topLevelClassifiersNames: Set<String>,
|
||||
topLevelCallableNames: Set<String>,
|
||||
private val fileText: String,
|
||||
) : KtResolveExtensionFile() {
|
||||
|
||||
private val topLevelClassifiersNames: Set<Name> = topLevelClassifiersNames.mapTo(mutableSetOf()) { Name.identifier(it) }
|
||||
private val topLevelCallableNames: Set<Name> = topLevelCallableNames.mapTo(mutableSetOf()) { Name.identifier(it) }
|
||||
override fun getFileName(): String = fileName
|
||||
override fun getFilePackageName(): FqName = packageName
|
||||
override fun getTopLevelClassifierNames(): Set<Name> = topLevelClassifiersNames
|
||||
override fun getTopLevelCallableNames(): Set<Name> = topLevelCallableNames
|
||||
|
||||
override fun buildFileText(): String = fileText
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* 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.standalone.fir.test.cases.generated.cases.references;
|
||||
|
||||
import com.intellij.testFramework.TestDataPath;
|
||||
import org.jetbrains.kotlin.test.util.KtTestUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.kotlin.analysis.api.standalone.fir.test.AnalysisApiFirStandaloneModeTestConfiguratorFactory;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode;
|
||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode;
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.AbstractReferenceResolveWithResolveExtensionTest;
|
||||
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/analysis-api/testData/resolveExtensions/referenceResolve")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
public class FirStandaloneNormalAnalysisSourceModuleReferenceResolveWithResolveExtensionTestGenerated extends AbstractReferenceResolveWithResolveExtensionTest {
|
||||
@NotNull
|
||||
@Override
|
||||
public AnalysisApiTestConfigurator getConfigurator() {
|
||||
return AnalysisApiFirStandaloneModeTestConfiguratorFactory.INSTANCE.createConfigurator(
|
||||
new AnalysisApiTestConfiguratorFactoryData(
|
||||
FrontendKind.Fir,
|
||||
TestModuleKind.Source,
|
||||
AnalysisSessionMode.Normal,
|
||||
AnalysisApiMode.Standalone
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAllFilesPresentInReferenceResolve() throws Exception {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/resolveExtensions/referenceResolve"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("classMember.kt")
|
||||
public void testClassMember() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/resolveExtensions/referenceResolve/classMember.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("extensionFunction.kt")
|
||||
public void testExtensionFunction() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/resolveExtensions/referenceResolve/extensionFunction.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("topLevelFunction.kt")
|
||||
public void testTopLevelFunction() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/resolveExtensions/referenceResolve/topLevelFunction.kt");
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
import generated.*
|
||||
|
||||
fun main() {
|
||||
val a = GeneratedClass2()
|
||||
a.gener<caret>atedClassMember2()
|
||||
}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
Resolved to:
|
||||
0: (in generated.GeneratedClass2) fun generatedClassMember2(): generated.GeneratedClass1
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
import generated.*
|
||||
|
||||
fun main() {
|
||||
"string".generatedTopLeve<caret>lExtensionFunction1(true)
|
||||
}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
Resolved to:
|
||||
0: (in generated) fun kotlin.String.generatedTopLevelExtensionFunction1(boolean: kotlin.Boolean): kotlin.Int
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
import generated.*
|
||||
|
||||
fun main() {
|
||||
generatedTopLevelFunc<caret>tion1()
|
||||
}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
Resolved to:
|
||||
0: (in generated) fun generatedTopLevelFunction1(): generated.GeneratedClass2
|
||||
+15
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typePro
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeProvider.AbstractHasCommonSubtypeTest
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeProvider.AbstractTypeReferenceTest
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.AbstractReferenceResolveTest
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.AbstractReferenceResolveWithResolveExtensionTest
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.AbstractReferenceShortenerTest
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSingleSymbolByPsi
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolByFqNameTest
|
||||
@@ -86,6 +87,20 @@ internal fun AnalysisApiTestGroup.generateAnalysisApiTests() {
|
||||
group(filter = testModuleKindIs(TestModuleKind.Source)) {
|
||||
generateAnalysisApiComponentsTests()
|
||||
generateAnalysisApiNonComponentsTests()
|
||||
generateResolveExtensionsTests()
|
||||
}
|
||||
}
|
||||
|
||||
private fun AnalysisApiTestGroup.generateResolveExtensionsTests() {
|
||||
group(
|
||||
"resolveExtensions",
|
||||
filter = analysisSessionModeIs(AnalysisSessionMode.Normal) and
|
||||
frontendIs(FrontendKind.Fir) and
|
||||
testModuleKindIs(TestModuleKind.Source)
|
||||
) {
|
||||
test(AbstractReferenceResolveWithResolveExtensionTest::class) {
|
||||
model("referenceResolve")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user