[Analysis API] provide tests for the KtResolveExtensionProvider

^KT-57930
This commit is contained in:
Ilya Kirillov
2023-04-17 18:13:00 +02:00
committed by Space Team
parent d68587de77
commit 51eaa3f9cf
12 changed files with 304 additions and 1 deletions
@@ -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)))
}
}
}
@@ -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) {
@@ -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
}