diff --git a/.idea/dictionaries/yan.xml b/.idea/dictionaries/yan.xml index 52bb6ae1c1e..8df82c4dc6b 100644 --- a/.idea/dictionaries/yan.xml +++ b/.idea/dictionaries/yan.xml @@ -1,6 +1,7 @@ + barebone debuggee deserializes destructured diff --git a/analysis/analysis-api-fir/build.gradle.kts b/analysis/analysis-api-fir/build.gradle.kts index f1454c7c668..9dbbe8aee25 100644 --- a/analysis/analysis-api-fir/build.gradle.kts +++ b/analysis/analysis-api-fir/build.gradle.kts @@ -16,6 +16,7 @@ dependencies { api(project(":compiler:fir:java")) api(project(":analysis:low-level-api-fir")) api(project(":analysis:analysis-api")) + api(project(":analysis:analysis-api-impl-base")) api(project(":compiler:light-classes")) api(intellijCoreDep()) implementation(project(":analysis:analysis-api-providers")) @@ -26,6 +27,7 @@ dependencies { testApi(projectTests(":compiler:test-infrastructure")) testApi(projectTests(":compiler:tests-common-new")) testApi(projectTests(":compiler:fir:analysis-tests:legacy-fir-tests")) + testApi(projectTests(":analysis:analysis-api-impl-base")) testApi(project(":kotlin-test:kotlin-test-junit")) testApi(toolsJar()) testApiJUnit5() diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt index a1afd1ba5da..c1ffeaa5c27 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt @@ -6,73 +6,33 @@ package org.jetbrains.kotlin.analysis.api.fir import com.intellij.openapi.project.Project -import com.intellij.openapi.roots.ProjectRootModificationTracker -import com.intellij.psi.util.CachedValueProvider -import com.intellij.psi.util.CachedValuesManager -import com.intellij.psi.util.PsiModificationTracker -import org.jetbrains.annotations.TestOnly -import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getResolveState -import org.jetbrains.kotlin.analysis.api.* +import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol +import org.jetbrains.kotlin.analysis.api.impl.base.CachingKtAnalysisSessionProvider import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken -import org.jetbrains.kotlin.analysis.api.tokens.ValidityTokenFactory +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getResolveState import org.jetbrains.kotlin.psi.KtElement -import java.util.concurrent.ConcurrentHashMap -import kotlin.reflect.KClass @OptIn(InvalidWayOfUsingAnalysisSession::class) -class KtFirAnalysisSessionProvider(private val project: Project) : KtAnalysisSessionProvider() { - private val cache = KtAnalysisSessionCache>>(project) - - @InvalidWayOfUsingAnalysisSession - override fun getAnalysisSession(contextElement: KtElement, factory: ValidityTokenFactory): KtAnalysisSession { - val resolveState = contextElement.getResolveState() - return cache.getAnalysisSession(resolveState to factory.identifier) { - val validityToken = factory.create(project) - @Suppress("DEPRECATION") - KtFirAnalysisSession.createAnalysisSessionByResolveState(resolveState, validityToken, contextElement) - } +class KtFirAnalysisSessionProvider(project: Project) : CachingKtAnalysisSessionProvider(project) { + override fun getResolveState(contextElement: KtElement): FirModuleResolveState { + return contextElement.getResolveState() } - override fun getAnalysisSessionBySymbol(contextSymbol: KtSymbol): KtAnalysisSession { + override fun getResolveState(contextSymbol: KtSymbol): FirModuleResolveState { require(contextSymbol is KtFirSymbol<*>) - val resolveState = contextSymbol.firRef.resolveState - val token = contextSymbol.token - return getCachedAnalysisSession(resolveState, token) - ?: error("analysis session was not found for ${contextSymbol::class}, symbol.isValid=${contextSymbol.isValid()}") + return contextSymbol.firRef.resolveState } - private fun getCachedAnalysisSession(resolveState: FirModuleResolveState, token: ValidityToken): KtAnalysisSession? { - return cache.getCachedAnalysisSession(resolveState to token::class) + override fun createAnalysisSession( + resolveState: FirModuleResolveState, + validityToken: ValidityToken, + contextElement: KtElement + ): KtAnalysisSession { + @Suppress("DEPRECATION") + return KtFirAnalysisSession.createAnalysisSessionByResolveState(resolveState, validityToken, contextElement) } - - @TestOnly - override fun clearCaches() { - cache.clear() - } -} - -private class KtAnalysisSessionCache(project: Project) { - private val cache = CachedValuesManager.getManager(project).createCachedValue { - CachedValueProvider.Result( - ConcurrentHashMap(), - PsiModificationTracker.MODIFICATION_COUNT, - ProjectRootModificationTracker.getInstance(project), - project.createProjectWideOutOfBlockModificationTracker() - ) - } - - @TestOnly - fun clear() { - cache.value.clear() - } - - inline fun getAnalysisSession(key: KEY, create: () -> KtAnalysisSession): KtAnalysisSession = - cache.value.getOrPut(key) { create() } - - fun getCachedAnalysisSession(key: KEY): KtAnalysisSession? = - cache.value[key] } \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt index 58d231ee104..5ff1dc6ae70 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt @@ -38,6 +38,8 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirClassInitializerSymbol +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.types.Variance @@ -390,7 +392,10 @@ internal class KtSymbolByFirBuilder private constructor( fun buildSubstitutor(substitutor: ConeSubstitutor): KtSubstitutor { if (substitutor == ConeSubstitutor.Empty) return KtSubstitutor.Empty(token) - return KtFirSubstitutor(substitutor, this@KtSymbolByFirBuilder, token) + return when (substitutor) { + is ConeSubstitutorByMap -> KtFirMapBackedSubstitutor(substitutor, this@KtSymbolByFirBuilder, token) + else -> KtFirGenericSubstitutor(substitutor, this@KtSymbolByFirBuilder, token) + } } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt index 6f70dd5a8aa..e5851ded5a6 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeF import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.parentsOfType import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession @@ -55,10 +54,8 @@ import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.name.parentOrNull +import org.jetbrains.kotlin.analysis.api.impl.barebone.parentsOfType +import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index 8e3334fec74..6151ef9462a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -10,12 +10,12 @@ import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.FirRealSourceElementKind import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.psi -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.parentOfType import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.components.KtSymbolContainingDeclarationProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirTypeParameterSymbol +import org.jetbrains.kotlin.analysis.api.impl.barebone.parentOfType import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt index 8fedd362fdb..fc1e33cf7a6 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt @@ -13,11 +13,11 @@ import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue import org.jetbrains.kotlin.fir.visibilityChecker import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignation import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.parentsOfType import org.jetbrains.kotlin.analysis.api.components.KtVisibilityChecker import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFileSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol +import org.jetbrains.kotlin.analysis.api.impl.barebone.parentsOfType import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReferenceResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReferenceResolver.kt index 273ce918a18..618617ba5ed 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReferenceResolver.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReferenceResolver.kt @@ -13,7 +13,7 @@ import com.intellij.psi.impl.source.resolve.ResolveCache import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext import org.jetbrains.kotlin.analysis.api.tokens.HackToForceAllowRunningAnalyzeOnEDT import org.jetbrains.kotlin.analysis.api.analyse -import org.jetbrains.kotlin.analysis.api.fir.utils.runInPossiblyEdtThread +import org.jetbrains.kotlin.analysis.api.impl.base.util.runInPossiblyEdtThread object KtFirReferenceResolver : ResolveCache.PolyVariantResolver { class KotlinResolveResult(element: PsiElement) : PsiElementResolveResult(element) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/renderer/FirIdeRenderer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/renderer/FirIdeRenderer.kt index f0403444181..4bbba78836a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/renderer/FirIdeRenderer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/renderer/FirIdeRenderer.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions import org.jetbrains.kotlin.analysis.api.components.RendererModifier import org.jetbrains.kotlin.analysis.api.fir.types.PublicTypeApproximator +import org.jetbrains.kotlin.fir.analysis.checkers.PsiSourceNavigator.getRawName import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.renderer.render @@ -405,7 +406,7 @@ internal class FirIdeRenderer private constructor( visitEnumEntry(enumEntry, data) data.append(",") } - partitioned.second.forEach { + sortDeclarations(partitioned.second).forEach { if (!it.skipDeclarationForEnumClass()) { it.accept(this, data) } @@ -414,7 +415,7 @@ internal class FirIdeRenderer private constructor( fun renderDeclarationForNotEnumClass() { check(!regularClass.isEnumClass) - regularClass.declarations.forEach { + sortDeclarations(regularClass.declarations).forEach { if (!it.isDefaultPrimaryConstructor()) { it.accept(this, data) } @@ -679,6 +680,33 @@ internal class FirIdeRenderer private constructor( supertypes.joinTo(this, ", ") { renderType(it) } } + fun sortDeclarations(declarations: List): List { + if (!options.sortNestedDeclarations) return declarations + + fun getDeclarationKind(declaration: FirDeclaration): Int = when (declaration) { + is FirEnumEntry -> 0 + is FirConstructor -> if (declaration.isPrimary) 1 else 2 + is FirProperty -> 3 + is FirFunction -> 4 + else -> 5 + } + + return declarations.sortedWith(Comparator { left, right -> + val kindResult = getDeclarationKind(left) - getDeclarationKind(right) + if (kindResult != 0) { + return@Comparator kindResult + } + + val nameResult = (left.getRawName() ?: "").compareTo(right.getRawName() ?: "") + if (nameResult != 0) { + return@Comparator nameResult + } + + val leftString = StringBuilder().also { builder -> left.accept(this, builder) }.toString() + val rightString = StringBuilder().also { builder -> right.accept(this, builder) }.toString() + return@Comparator leftString.compareTo(rightString) + }) + } private fun getClassifierKindPrefix(classifier: FirDeclaration): String = when (classifier) { is FirTypeAlias -> "typealias" diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt index 8faa95d6851..697d32551b7 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt @@ -7,22 +7,49 @@ package org.jetbrains.kotlin.analysis.api.fir.types import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef +import org.jetbrains.kotlin.analysis.api.impl.base.KtMapBackedSubstitutor +import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap -internal class KtFirSubstitutor( - private val _substitutor: ConeSubstitutor, +internal abstract class AbstractKtFirSubstitutor( + private val _substitutor: T, builder: KtSymbolByFirBuilder, override val token: ValidityToken, ) : KtSubstitutor { - private val builderRef by weakRef(builder) - val substitutor: ConeSubstitutor get() = withValidityAssertion { _substitutor } + protected val builderRef by weakRef(builder) + val substitutor: T get() = withValidityAssertion { _substitutor } override fun substituteOrNull(type: KtType): KtType? = withValidityAssertion { require(type is KtFirType) substitutor.substituteOrNull(type.coneType)?.type?.let { builderRef.typeBuilder.buildKtType(it) } } +} + +internal class KtFirGenericSubstitutor( + _substitutor: ConeSubstitutor, + builder: KtSymbolByFirBuilder, + token: ValidityToken +) : AbstractKtFirSubstitutor(_substitutor, builder, token) + +internal class KtFirMapBackedSubstitutor( + _substitutor: ConeSubstitutorByMap, + builder: KtSymbolByFirBuilder, + token: ValidityToken +) : AbstractKtFirSubstitutor(_substitutor, builder, token), KtMapBackedSubstitutor { + override fun getAsMap(): Map { + val result = mutableMapOf() + for ((typeParameter, type) in substitutor.substitution) { + val typeParameterSymbol = builderRef.classifierBuilder.buildTypeParameterSymbolByLookupTag(typeParameter.toLookupTag()) + if (typeParameterSymbol != null) { + result[typeParameterSymbol] = builderRef.typeBuilder.buildKtType(type) + } + } + + return result + } } \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/AbstractFirReferenceResolveTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/AbstractFirReferenceResolveTest.kt new file mode 100644 index 00000000000..fa578b3ca1d --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/AbstractFirReferenceResolveTest.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2021 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 + +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.AbstractReferenceResolveTest + +abstract class AbstractFirReferenceResolveTest : AbstractReferenceResolveTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirFrontendApiTestConfiguratorService.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirFrontendApiTestConfiguratorService.kt new file mode 100644 index 00000000000..f782818e384 --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirFrontendApiTestConfiguratorService.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2021 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 + +import com.intellij.mock.MockApplication +import com.intellij.mock.MockProject +import com.intellij.openapi.Disposable +import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession +import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.references.HLApiReferenceProviderService +import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.FirLowLevelFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.idea.references.KotlinFirReferenceContributor +import org.jetbrains.kotlin.idea.references.KotlinReferenceProviderContributor +import org.jetbrains.kotlin.psi.KotlinReferenceProvidersService +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder + +object FirFrontendApiTestConfiguratorService : FrontendApiTestConfiguratorService { + override fun TestConfigurationBuilder.configureTest(disposable: Disposable) { + with(FirLowLevelFrontendApiTestConfiguratorService) { configureTest(disposable) } + } + + override fun processTestFiles(files: List): List { + return FirLowLevelFrontendApiTestConfiguratorService.processTestFiles(files) + } + + override fun getOriginalFile(file: KtFile): KtFile { + return FirLowLevelFrontendApiTestConfiguratorService.getOriginalFile(file) + } + + @OptIn(InvalidWayOfUsingAnalysisSession::class) + override fun registerProjectServices(project: MockProject) { + FirLowLevelFrontendApiTestConfiguratorService.registerProjectServices(project) + project.registerService(KtAnalysisSessionProvider::class.java, KtFirAnalysisSessionProvider::class.java) + } + + override fun registerApplicationServices(application: MockApplication) { + FirLowLevelFrontendApiTestConfiguratorService.registerApplicationServices(application) + if (application.getServiceIfCreated(KotlinReferenceProvidersService::class.java) == null) { + application.registerService(KotlinReferenceProvidersService::class.java, HLApiReferenceProviderService::class.java) + application.registerService(KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java) + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/ReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirReferenceResolveTestGenerated.java similarity index 99% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/ReferenceResolveTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirReferenceResolveTestGenerated.java index aab2e21ea9a..0b20771dd78 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/ReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirReferenceResolveTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/referenceResolve") @TestDataPath("$PROJECT_ROOT") -public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest { +public class FirReferenceResolveTestGenerated extends AbstractFirReferenceResolveTest { @Test public void testAllFilesPresentInReferenceResolve() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve"), Pattern.compile("^([^.]+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirTestWithOutOfBlockModification.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirTestWithOutOfBlockModification.kt new file mode 100644 index 00000000000..e6d06e59e0d --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirTestWithOutOfBlockModification.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2010-2021 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 + +import com.intellij.openapi.components.ServiceManager +import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory +import org.jetbrains.kotlin.psi.KtFile + +object FirTestWithOutOfBlockModification { + fun doOutOfBlockModification(ktFile: KtFile) { + ServiceManager.getService(ktFile.project, KotlinModificationTrackerFactory::class.java) + .incrementModificationsCount() + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirCompileTimeConstantEvaluatorTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirCompileTimeConstantEvaluatorTest.kt new file mode 100644 index 00000000000..e430c9f194a --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirCompileTimeConstantEvaluatorTest.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2021 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.components + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.components.AbstractCompileTimeConstantEvaluatorTest + +abstract class AbstractFirCompileTimeConstantEvaluatorTest : AbstractCompileTimeConstantEvaluatorTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirExpectedExpressionTypeTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirExpectedExpressionTypeTest.kt new file mode 100644 index 00000000000..dc55be028b6 --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirExpectedExpressionTypeTest.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2021 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.components + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.components.AbstractExpectedExpressionTypeTest + +abstract class AbstractFirExpectedExpressionTypeTest : AbstractExpectedExpressionTypeTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractGetSuperTypesTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirGetSuperTypesTest.kt similarity index 79% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractGetSuperTypesTest.kt rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirGetSuperTypesTest.kt index 0595ffdd710..93daadc8b35 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractGetSuperTypesTest.kt +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirGetSuperTypesTest.kt @@ -7,15 +7,20 @@ package org.jetbrains.kotlin.analysis.api.fir.components import org.jetbrains.kotlin.analysis.api.analyse import org.jetbrains.kotlin.analysis.api.components.KtTypeRendererOptions -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleFileTest +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.assertions -abstract class AbstractGetSuperTypesTest : AbstractHLApiSingleFileTest() { +abstract class AbstractFirGetSuperTypesTest : AbstractHLApiSingleFileTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService + override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) { val expression = testServices.expressionMarkerProvider.getSelectedElement(ktFile) diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirHLExpressionTypeTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirHLExpressionTypeTest.kt new file mode 100644 index 00000000000..3a179fccfd1 --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirHLExpressionTypeTest.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2021 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.components + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.components.AbstractHLExpressionTypeTest + +abstract class AbstractFirHLExpressionTypeTest : AbstractHLExpressionTypeTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirHasCommonSubtypeTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirHasCommonSubtypeTest.kt new file mode 100644 index 00000000000..587be3ac1ec --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirHasCommonSubtypeTest.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2021 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.components + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.components.AbstractHasCommonSubtypeTest + +abstract class AbstractFirHasCommonSubtypeTest : AbstractHasCommonSubtypeTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirOverriddenDeclarationProviderTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirOverriddenDeclarationProviderTest.kt new file mode 100644 index 00000000000..a3217b9775d --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirOverriddenDeclarationProviderTest.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2021 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.components + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.components.AbstractOverriddenDeclarationProviderTest + +abstract class AbstractFirOverriddenDeclarationProviderTest : AbstractOverriddenDeclarationProviderTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirRendererTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirRendererTest.kt new file mode 100644 index 00000000000..aa2fa99eefa --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirRendererTest.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2021 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.components + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.components.AbstractRendererTest + +abstract class AbstractFirRendererTest : AbstractRendererTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirResolveCallTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirResolveCallTest.kt new file mode 100644 index 00000000000..d88a8e94643 --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractFirResolveCallTest.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2021 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.components + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.fir.AbstractResolveCallTest + +abstract class AbstractFirResolveCallTest : AbstractResolveCallTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractHLImportOptimizerTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractHLImportOptimizerTest.kt index 99553af6c1a..57dbfd49282 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractHLImportOptimizerTest.kt +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractHLImportOptimizerTest.kt @@ -5,13 +5,18 @@ package org.jetbrains.kotlin.analysis.api.fir.components -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleModuleTest +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleModuleTest import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.assertions abstract class AbstractHLImportOptimizerTest : AbstractHLApiSingleModuleTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService + override fun doTestByFileStructure(ktFiles: List, module: TestModule, testServices: TestServices) { val mainKtFile = ktFiles.singleOrNull() ?: ktFiles.first { it.name == "main.kt" } val unusedImports = analyseForTest(mainKtFile) { analyseImports(mainKtFile).unusedImports } diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/CompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirCompileTimeConstantEvaluatorTestGenerated.java similarity index 97% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/CompileTimeConstantEvaluatorTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirCompileTimeConstantEvaluatorTestGenerated.java index 2e67efed3fc..f395e4b8efd 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/CompileTimeConstantEvaluatorTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirCompileTimeConstantEvaluatorTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/components/compileTimeConstantEvaluator") @TestDataPath("$PROJECT_ROOT") -public class CompileTimeConstantEvaluatorTestGenerated extends AbstractCompileTimeConstantEvaluatorTest { +public class FirCompileTimeConstantEvaluatorTestGenerated extends AbstractFirCompileTimeConstantEvaluatorTest { @Test public void testAllFilesPresentInCompileTimeConstantEvaluator() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantEvaluator"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ExpectedExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirExpectedExpressionTypeTestGenerated.java similarity index 99% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ExpectedExpressionTypeTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirExpectedExpressionTypeTestGenerated.java index d8f02879eae..77415a94e37 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ExpectedExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirExpectedExpressionTypeTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/components/expectedExpressionType") @TestDataPath("$PROJECT_ROOT") -public class ExpectedExpressionTypeTestGenerated extends AbstractExpectedExpressionTypeTest { +public class FirExpectedExpressionTypeTestGenerated extends AbstractFirExpectedExpressionTypeTest { @Test public void testAllFilesPresentInExpectedExpressionType() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expectedExpressionType"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/GetSuperTypesTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirGetSuperTypesTestGenerated.java similarity index 97% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/GetSuperTypesTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirGetSuperTypesTestGenerated.java index b730437af70..4c4e432ad5e 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/GetSuperTypesTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirGetSuperTypesTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/components/getSuperTypes") @TestDataPath("$PROJECT_ROOT") -public class GetSuperTypesTestGenerated extends AbstractGetSuperTypesTest { +public class FirGetSuperTypesTestGenerated extends AbstractFirGetSuperTypesTest { @Test public void testAllFilesPresentInGetSuperTypes() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/getSuperTypes"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/HLExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirHLExpressionTypeTestGenerated.java similarity index 98% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/HLExpressionTypeTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirHLExpressionTypeTestGenerated.java index 702d5432c45..f0cddff71c1 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/HLExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirHLExpressionTypeTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/components/expressionType") @TestDataPath("$PROJECT_ROOT") -public class HLExpressionTypeTestGenerated extends AbstractHLExpressionTypeTest { +public class FirHLExpressionTypeTestGenerated extends AbstractFirHLExpressionTypeTest { @Test public void testAllFilesPresentInExpressionType() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionType"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/HasCommonSubtypeTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirHasCommonSubtypeTestGenerated.java similarity index 95% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/HasCommonSubtypeTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirHasCommonSubtypeTestGenerated.java index 880241cb53d..a58aeca9b6f 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/HasCommonSubtypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirHasCommonSubtypeTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/components/hasCommonSubtype") @TestDataPath("$PROJECT_ROOT") -public class HasCommonSubtypeTestGenerated extends AbstractHasCommonSubtypeTest { +public class FirHasCommonSubtypeTestGenerated extends AbstractFirHasCommonSubtypeTest { @Test public void testAllFilesPresentInHasCommonSubtype() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/hasCommonSubtype"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/OverriddenDeclarationProviderTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirOverriddenDeclarationProviderTestGenerated.java similarity index 96% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/OverriddenDeclarationProviderTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirOverriddenDeclarationProviderTestGenerated.java index ed9b3597d2d..996fe883ed1 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/OverriddenDeclarationProviderTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirOverriddenDeclarationProviderTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/components/overridenDeclarations") @TestDataPath("$PROJECT_ROOT") -public class OverriddenDeclarationProviderTestGenerated extends AbstractOverriddenDeclarationProviderTest { +public class FirOverriddenDeclarationProviderTestGenerated extends AbstractFirOverriddenDeclarationProviderTest { @Test public void testAllFilesPresentInOverridenDeclarations() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/overridenDeclarations"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/RendererTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirRendererTestGenerated.java similarity index 98% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/RendererTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirRendererTestGenerated.java index 05b0b02736c..50fed9e67d6 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/RendererTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirRendererTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/components/declarationRenderer") @TestDataPath("$PROJECT_ROOT") -public class RendererTestGenerated extends AbstractRendererTest { +public class FirRendererTestGenerated extends AbstractFirRendererTest { @Test public void testAllFilesPresentInDeclarationRenderer() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/declarationRenderer"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirResolveCallTestGenerated.java similarity index 99% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ResolveCallTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirResolveCallTestGenerated.java index 7e580792749..a000e856a45 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirResolveCallTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/analysisSession/resolveCall") @TestDataPath("$PROJECT_ROOT") -public class ResolveCallTestGenerated extends AbstractResolveCallTest { +public class FirResolveCallTestGenerated extends AbstractFirResolveCallTest { @Test public void testAllFilesPresentInResolveCall() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/analysisSession/resolveCall"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractFirFileScopeTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractFirFileScopeTest.kt new file mode 100644 index 00000000000..808898e75c3 --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractFirFileScopeTest.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2021 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.scopes + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.scopes.AbstractFileScopeTest + +abstract class AbstractFirFileScopeTest : AbstractFileScopeTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractFirMemberScopeByFqNameTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractFirMemberScopeByFqNameTest.kt new file mode 100644 index 00000000000..923ff340d7c --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractFirMemberScopeByFqNameTest.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2021 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.scopes + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.fir.FirTestWithOutOfBlockModification +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.scopes.AbstractMemberScopeByFqNameTest +import org.jetbrains.kotlin.psi.KtFile + +abstract class AbstractFirMemberScopeByFqNameTest : AbstractMemberScopeByFqNameTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService + + override fun doOutOfBlockModification(ktFile: KtFile) { + FirTestWithOutOfBlockModification.doOutOfBlockModification(ktFile) + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/FileScopeTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/FirFileScopeTestGenerated.java similarity index 94% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/FileScopeTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/FirFileScopeTestGenerated.java index 9ba5f8980c5..fb9104afb88 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/FileScopeTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/FirFileScopeTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/fileScopeTest") @TestDataPath("$PROJECT_ROOT") -public class FileScopeTestGenerated extends AbstractFileScopeTest { +public class FirFileScopeTestGenerated extends AbstractFirFileScopeTest { @Test public void testAllFilesPresentInFileScopeTest() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/fileScopeTest"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/MemberScopeByFqNameTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/FirMemberScopeByFqNameTestGenerated.java similarity index 95% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/MemberScopeByFqNameTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/FirMemberScopeByFqNameTestGenerated.java index db943cb19d6..86331ed91ba 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/MemberScopeByFqNameTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/FirMemberScopeByFqNameTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/memberScopeByFqName") @TestDataPath("$PROJECT_ROOT") -public class MemberScopeByFqNameTestGenerated extends AbstractMemberScopeByFqNameTest { +public class FirMemberScopeByFqNameTestGenerated extends AbstractFirMemberScopeByFqNameTest { @Test public void testAllFilesPresentInMemberScopeByFqName() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/memberScopeByFqName"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractFirSymbolByFqNameTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractFirSymbolByFqNameTest.kt new file mode 100644 index 00000000000..bafeb89bedc --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractFirSymbolByFqNameTest.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2021 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.symbols + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.fir.FirTestWithOutOfBlockModification +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.symbols.AbstractSymbolByFqNameTest +import org.jetbrains.kotlin.psi.KtFile + +abstract class AbstractFirSymbolByFqNameTest : AbstractSymbolByFqNameTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService + + override fun doOutOfBlockModification(ktFile: KtFile) { + FirTestWithOutOfBlockModification.doOutOfBlockModification(ktFile) + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractFirSymbolByPsiTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractFirSymbolByPsiTest.kt new file mode 100644 index 00000000000..516ad182ba4 --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractFirSymbolByPsiTest.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2021 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.symbols + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.fir.FirTestWithOutOfBlockModification +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.symbols.AbstractSymbolByPsiTest +import org.jetbrains.kotlin.psi.KtFile + +abstract class AbstractFirSymbolByPsiTest : AbstractSymbolByPsiTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService + + override fun doOutOfBlockModification(ktFile: KtFile) { + FirTestWithOutOfBlockModification.doOutOfBlockModification(ktFile) + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractFirSymbolByReferenceTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractFirSymbolByReferenceTest.kt new file mode 100644 index 00000000000..c86b30d080b --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractFirSymbolByReferenceTest.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2021 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.symbols + +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.fir.FirTestWithOutOfBlockModification +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.base.test.symbols.AbstractSymbolByReferenceTest +import org.jetbrains.kotlin.psi.KtFile + +abstract class AbstractFirSymbolByReferenceTest : AbstractSymbolByReferenceTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirFrontendApiTestConfiguratorService + + override fun doOutOfBlockModification(ktFile: KtFile) { + FirTestWithOutOfBlockModification.doOutOfBlockModification(ktFile) + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/SymbolByFqNameTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/FirSymbolByFqNameTestGenerated.java similarity index 97% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/SymbolByFqNameTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/FirSymbolByFqNameTestGenerated.java index 7bf8c6f6435..03b1e0f9fbf 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/SymbolByFqNameTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/FirSymbolByFqNameTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/symbols/symbolByFqName") @TestDataPath("$PROJECT_ROOT") -public class SymbolByFqNameTestGenerated extends AbstractSymbolByFqNameTest { +public class FirSymbolByFqNameTestGenerated extends AbstractFirSymbolByFqNameTest { @Test public void testAllFilesPresentInSymbolByFqName() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolByFqName"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/SymbolByPsiTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/FirSymbolByPsiTestGenerated.java similarity index 98% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/SymbolByPsiTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/FirSymbolByPsiTestGenerated.java index 3c0bd49d359..ba23eeecbc7 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/SymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/FirSymbolByPsiTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/symbols/symbolByPsi") @TestDataPath("$PROJECT_ROOT") -public class SymbolByPsiTestGenerated extends AbstractSymbolByPsiTest { +public class FirSymbolByPsiTestGenerated extends AbstractFirSymbolByPsiTest { @Test public void testAllFilesPresentInSymbolByPsi() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolByPsi"), Pattern.compile("^(.+)\\.kt$"), null, true); diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/SymbolByReferenceTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/FirSymbolByReferenceTestGenerated.java similarity index 94% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/SymbolByReferenceTestGenerated.java rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/FirSymbolByReferenceTestGenerated.java index bd65820c1f6..7204b5d73a9 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/SymbolByReferenceTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/FirSymbolByReferenceTestGenerated.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("analysis/analysis-api/testData/symbols/symbolByReference") @TestDataPath("$PROJECT_ROOT") -public class SymbolByReferenceTestGenerated extends AbstractSymbolByReferenceTest { +public class FirSymbolByReferenceTestGenerated extends AbstractFirSymbolByReferenceTest { @Test @TestMetadata("accessorField.kt") public void testAccessorField() throws Exception { diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/framework/AbstractHLApiSingleModuleTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/framework/AbstractHLApiSingleModuleTest.kt deleted file mode 100644 index b1585a19313..00000000000 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/framework/AbstractHLApiSingleModuleTest.kt +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2010-2021 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.framework - -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.test.model.TestModule -import org.jetbrains.kotlin.test.services.TestModuleStructure -import org.jetbrains.kotlin.test.services.TestServices - -abstract class AbstractHLApiSingleModuleTest : AbstractHLApiTest() { - final override fun doTestByFileStructure(ktFiles: List, moduleStructure: TestModuleStructure, testServices: TestServices) { - val singleModule = moduleStructure.modules.single() - doTestByFileStructure(ktFiles, singleModule, testServices) - } - - protected abstract fun doTestByFileStructure(ktFiles: List, module: TestModule, testServices: TestServices) -} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/framework/AbstractHLApiTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/framework/AbstractHLApiTest.kt deleted file mode 100644 index b460b01a457..00000000000 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/framework/AbstractHLApiTest.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2010-2021 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.framework - -import com.intellij.mock.MockApplication -import com.intellij.mock.MockProject -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiTest -import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession -import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider -import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSessionProvider -import org.jetbrains.kotlin.idea.references.HLApiReferenceProviderService -import org.jetbrains.kotlin.idea.references.KotlinFirReferenceContributor -import org.jetbrains.kotlin.idea.references.KotlinReferenceProviderContributor -import org.jetbrains.kotlin.psi.KotlinReferenceProvidersService - -abstract class AbstractHLApiTest : AbstractLowLevelApiTest() { - @OptIn(InvalidWayOfUsingAnalysisSession::class) - override fun registerServicesForProject(project: MockProject) { - super.registerServicesForProject(project) - project.registerService(KtAnalysisSessionProvider::class.java, KtFirAnalysisSessionProvider::class.java) - } - - override fun registerApplicationServices(application: MockApplication) { - super.registerApplicationServices(application) - if (application.getServiceIfCreated(KotlinReferenceProvidersService::class.java) != null) return - application.registerService(KotlinReferenceProvidersService::class.java, HLApiReferenceProviderService::class.java) - application.registerService(KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java) - } -} \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/testUtils.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/testUtils.kt deleted file mode 100644 index e17a1589bab..00000000000 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/testUtils.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2010-2020 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 - -import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.DuplicatedFirSourceElementsException -import org.jetbrains.kotlin.test.InTextDirectivesUtils - -/** - * Temporary - * @see org.jetbrains.kotlin.analysis.low.level.api.fir.DuplicatedFirSourceElementsException.IS_ENABLED - */ -inline fun withPossiblyDisabledDuplicatedFirSourceElementsException(fileText: String, action: () -> T): T { - val isDisabled = InTextDirectivesUtils.isDirectiveDefined(fileText, "IGNORE_DUPLICATED_FIR_SOURCE_EXCEPTION") - - @Suppress("LiftReturnOrAssignment") - if (isDisabled) { - val wasEnabled = DuplicatedFirSourceElementsException.IS_ENABLED - DuplicatedFirSourceElementsException.IS_ENABLED = false - try { - return action() - } finally { - DuplicatedFirSourceElementsException.IS_ENABLED = wasEnabled - } - } else { - return action() - } -} diff --git a/analysis/analysis-api-impl-barebone/build.gradle.kts b/analysis/analysis-api-impl-barebone/build.gradle.kts new file mode 100644 index 00000000000..0944e7c6c4e --- /dev/null +++ b/analysis/analysis-api-impl-barebone/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + kotlin("jvm") + id("jps-compatible") +} + +dependencies { + api(project(":compiler:psi")) + api(project(":analysis:analysis-api-providers")) + api(project(":analysis:project-structure")) + api(intellijCoreDep()) { includeJars("intellij-core", rootProject = rootProject) } + + testApiJUnit5() + testApi(project(":kotlin-test:kotlin-test-junit")) + testApi(projectTests(":compiler:tests-common")) + testApi(projectTests(":compiler:test-infrastructure-utils")) + testApi(projectTests(":compiler:test-infrastructure")) + testApi(projectTests(":compiler:tests-common-new")) +} + +sourceSets { + "main" { projectDefault() } + "test" { projectDefault() } +} + +testsJar() \ No newline at end of file diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/annotations/annotations.kt b/analysis/analysis-api-impl-barebone/src/org/jetbrains/kotlin/analysis/api/impl/barebone/annotations/annotations.kt similarity index 83% rename from analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/annotations/annotations.kt rename to analysis/analysis-api-impl-barebone/src/org/jetbrains/kotlin/analysis/api/impl/barebone/annotations/annotations.kt index cb9af432dbe..7de988391f3 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/annotations/annotations.kt +++ b/analysis/analysis-api-impl-barebone/src/org/jetbrains/kotlin/analysis/api/impl/barebone/annotations/annotations.kt @@ -3,7 +3,7 @@ * 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.annotations +package org.jetbrains.kotlin.analysis.api.impl.barebone.annotations @RequiresOptIn annotation class PrivateForInline diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/annotations/threads.kt b/analysis/analysis-api-impl-barebone/src/org/jetbrains/kotlin/analysis/api/impl/barebone/annotations/threads.kt similarity index 72% rename from analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/annotations/threads.kt rename to analysis/analysis-api-impl-barebone/src/org/jetbrains/kotlin/analysis/api/impl/barebone/annotations/threads.kt index 7231faca83a..be158adecf1 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/annotations/threads.kt +++ b/analysis/analysis-api-impl-barebone/src/org/jetbrains/kotlin/analysis/api/impl/barebone/annotations/threads.kt @@ -1,9 +1,9 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 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.annotations +package org.jetbrains.kotlin.analysis.api.impl.barebone.annotations @Target(AnnotationTarget.CLASS) annotation class ThreadSafe diff --git a/analysis/analysis-api-impl-barebone/src/org/jetbrains/kotlin/analysis/api/impl/barebone/psiUtils.kt b/analysis/analysis-api-impl-barebone/src/org/jetbrains/kotlin/analysis/api/impl/barebone/psiUtils.kt new file mode 100644 index 00000000000..1c270d642dd --- /dev/null +++ b/analysis/analysis-api-impl-barebone/src/org/jetbrains/kotlin/analysis/api/impl/barebone/psiUtils.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2010-2021 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.barebone + +import com.intellij.psi.PsiElement +import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.kotlin.psi.psiUtil.parents +import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf + +inline fun PsiElement.parentOfType(withSelf: Boolean = false): T? { + return PsiTreeUtil.getParentOfType(this, T::class.java, !withSelf) +} + +fun PsiElement.parentsOfType(clazz: Class, withSelf: Boolean = true): Sequence { + return (if (withSelf) parentsWithSelf else parents).filterIsInstance(clazz) +} + +inline fun PsiElement.parentsOfType(withSelf: Boolean = true): Sequence = + parentsOfType(T::class.java, withSelf) diff --git a/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/AbstractCompilerBasedTest.kt b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/AbstractCompilerBasedTest.kt new file mode 100644 index 00000000000..9423664cfe7 --- /dev/null +++ b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/AbstractCompilerBasedTest.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2021 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.barebone.test + +import com.intellij.openapi.Disposable +import com.intellij.openapi.util.Disposer +import org.jetbrains.kotlin.test.TestConfiguration +import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest +import org.jetbrains.kotlin.test.services.isKtFile +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.TestInfo + +abstract class AbstractCompilerBasedTest : AbstractKotlinCompilerTest() { + private var _disposable: Disposable? = null + protected val disposable: Disposable get() = _disposable!! + + @BeforeEach + private fun intiDisposable(testInfo: TestInfo) { + _disposable = Disposer.newDisposable("disposable for ${testInfo.displayName}") + } + + @AfterEach + private fun disposeDisposable() { + _disposable?.let { Disposer.dispose(it) } + _disposable = null + } + + protected fun ignoreTest(filePath: String, configuration: TestConfiguration): Boolean { + val modules = configuration.moduleStructureExtractor.splitTestDataByModules(filePath, configuration.directives) + + if (modules.modules.none { it.files.any { it.isKtFile } }) { + return true // nothing to highlight + } + + return false + } +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AbstractLowLevelApiTest.kt b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/AbstractFrontendApiTest.kt similarity index 65% rename from analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AbstractLowLevelApiTest.kt rename to analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/AbstractFrontendApiTest.kt index 22d71407706..48387a1c32a 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AbstractLowLevelApiTest.kt +++ b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/AbstractFrontendApiTest.kt @@ -3,28 +3,19 @@ * 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.test.base +package org.jetbrains.kotlin.analysis.api.impl.barebone.test import com.intellij.mock.MockApplication import com.intellij.mock.MockProject +import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.util.Computable import com.intellij.openapi.util.Disposer import com.intellij.testFramework.TestDataFile -import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.analyse -import org.jetbrains.kotlin.analysis.api.analyseInDependedAnalysisSession -import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.ModuleRegistrarPreAnalysisHandler -import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.TestKtModuleProvider -import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.projectModuleProvider -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalKtFile import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.platform.jvm.JvmPlatforms -import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.jetbrains.kotlin.test.TestInfrastructureInternals -import org.jetbrains.kotlin.test.bind import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.testConfiguration import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives @@ -40,13 +31,58 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.TestInfo import java.nio.file.Path import java.nio.file.Paths +import kotlin.io.path.exists import java.util.concurrent.ExecutionException import kotlin.io.path.nameWithoutExtension -abstract class AbstractLowLevelApiTest : TestWithDisposable() { - private lateinit var testInfo: KotlinTestInfo - private var useDependedAnalysisSession: Boolean = false - open protected val enableTestInDependedMode: Boolean = true +interface FrontendApiTestConfiguratorService { + fun TestConfigurationBuilder.configureTest(disposable: Disposable) + + fun processTestFiles(files: List): List = files + fun getOriginalFile(file: KtFile): KtFile = file + + fun registerProjectServices(project: MockProject) + fun registerApplicationServices(application: MockApplication) +} + +abstract class AbstractFrontendApiTest : TestWithDisposable() { + protected open val enableTestInDependedMode: Boolean = true + + protected lateinit var testInfo: KotlinTestInfo + private set + + protected var useDependedAnalysisSession: Boolean = false + + protected lateinit var testDataPath: Path + private set + + protected abstract val configurator: FrontendApiTestConfiguratorService + + protected open val testPrefix: String? + get() = null + + protected open fun configureTest(builder: TestConfigurationBuilder) { + with(configurator) { + builder.configureTest(disposable) + } + } + + protected abstract fun doTestByFileStructure(ktFiles: List, moduleStructure: TestModuleStructure, testServices: TestServices) + + protected fun testDataFileSibling(extension: String): Path { + val extensionWithDot = "." + extension.removePrefix(".") + val baseName = testDataPath.nameWithoutExtension + + val testPrefix = this.testPrefix + if (testPrefix != null) { + val prefixedFile = testDataPath.resolveSibling("$baseName.$testPrefix$extensionWithDot") + if (prefixedFile.exists()) { + return prefixedFile + } + } + + return testDataPath.resolveSibling(baseName + extensionWithDot) + } @OptIn(TestInfrastructureInternals::class) private val configure: TestConfigurationBuilder.() -> Unit = { @@ -68,22 +104,12 @@ abstract class AbstractLowLevelApiTest : TestWithDisposable() { useSourcePreprocessor(::ExpressionMarkersSourceFilePreprocessor) useAdditionalService { ExpressionMarkerProvider() } useAdditionalService(::TestKtModuleProvider) - usePreAnalysisHandlers(::ModuleRegistrarPreAnalysisHandler.bind(disposable)) configureTest(this) startingArtifactFactory = { ResultingArtifact.Source() } - this.testInfo = this@AbstractLowLevelApiTest.testInfo + this.testInfo = this@AbstractFrontendApiTest.testInfo } - protected lateinit var testDataPath: Path - - protected fun testDataFileSibling(extension: String): Path { - val extensionWithDot = "." + extension.removePrefix(".") - return testDataPath.resolveSibling(testDataPath.nameWithoutExtension + extensionWithDot) - } - - open fun configureTest(builder: TestConfigurationBuilder) {} - protected fun runTest(@TestDataFile path: String) { testDataPath = Paths.get(path) val testConfiguration = testConfiguration(path, configure) @@ -99,7 +125,6 @@ abstract class AbstractLowLevelApiTest : TestWithDisposable() { } } - val singleModule = moduleStructure.modules.single() val project = testServices.compilerConfigurationProvider.getProject(singleModule) val moduleInfoProvider = testServices.projectModuleProvider @@ -107,7 +132,7 @@ abstract class AbstractLowLevelApiTest : TestWithDisposable() { val moduleInfo = moduleInfoProvider.getModule(singleModule.name) with(project as MockProject) { - registerServicesForProject(this) + configurator.registerProjectServices(this) } registerApplicationServices() @@ -122,11 +147,7 @@ abstract class AbstractLowLevelApiTest : TestWithDisposable() { } try { useDependedAnalysisSession = true - doTestByFileStructure(ktFiles.map { - val fakeFile = it.copy() as KtFile - fakeFile.originalKtFile = it - fakeFile - }, moduleStructure, testServices) + doTestByFileStructure(configurator.processTestFiles(ktFiles), moduleStructure, testServices) } catch (e: SkipDependedModeException) { // Skip the test if needed } catch (e: ExecutionException) { @@ -140,16 +161,10 @@ abstract class AbstractLowLevelApiTest : TestWithDisposable() { private fun registerApplicationServices() { val application = ApplicationManager.getApplication() as MockApplication KotlinCoreEnvironment.underApplicationLock { - registerApplicationServices(application) + configurator.registerApplicationServices(application) } } - protected open fun registerServicesForProject(project: MockProject) {} - - protected open fun registerApplicationServices(application: MockApplication) {} - - protected abstract fun doTestByFileStructure(ktFiles: List, moduleStructure: TestModuleStructure, testServices: TestServices) - @BeforeEach fun initTestInfo(testInfo: TestInfo) { this.testInfo = KotlinTestInfo( @@ -159,35 +174,9 @@ abstract class AbstractLowLevelApiTest : TestWithDisposable() { ) } - protected inline fun analyseOnPooledThreadInReadAction(context: KtElement, crossinline action: KtAnalysisSession.() -> R): R = - executeOnPooledThreadInReadAction { - analyseForTest(context) { action() } - } - - protected inline fun runReadAction(crossinline runnable: () -> T): T { - return ApplicationManager.getApplication().runReadAction(Computable { runnable() }) - } - - protected inline fun executeOnPooledThreadInReadAction(crossinline action: () -> R): R = - ApplicationManager.getApplication().executeOnPooledThread { runReadAction(action) }.get() - - - protected fun analyseForTest(contextElement: KtElement, action: KtAnalysisSession.() -> R): R { - return if (useDependedAnalysisSession) { - // Depended mode does not support analysing a KtFile. See org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir#getResolveStateForDependentCopy - if (contextElement is KtFile) throw SkipDependedModeException() - - require(!contextElement.isPhysical) - analyseInDependedAnalysisSession(contextElement.containingKtFile.originalKtFile!!, contextElement, action) - } else { - analyse(contextElement, action) - } - } - - private class SkipDependedModeException : Exception() + protected class SkipDependedModeException : Exception() companion object { val DISABLE_DEPENDED_MODE_DIRECTIVE = "DISABLE_DEPENDED_MODE" } -} - +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/ExpressionMarkersSourceFilePreprocessor.kt b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/ExpressionMarkersSourceFilePreprocessor.kt similarity index 92% rename from analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/ExpressionMarkersSourceFilePreprocessor.kt rename to analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/ExpressionMarkersSourceFilePreprocessor.kt index 20930635bfd..1d9af71d22b 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/ExpressionMarkersSourceFilePreprocessor.kt +++ b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/ExpressionMarkersSourceFilePreprocessor.kt @@ -3,13 +3,13 @@ * 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.test.base +package org.jetbrains.kotlin.analysis.api.impl.barebone.test import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace -import org.jetbrains.kotlin.analysis.low.level.api.fir.annotations.PrivateForInline -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.parentOfType +import org.jetbrains.kotlin.analysis.api.impl.barebone.parentOfType +import org.jetbrains.kotlin.fir.PrivateForInline import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.psiUtil.elementsInRange @@ -83,7 +83,6 @@ class ExpressionMarkerProvider : TestService { ?: error("No expression found at caret") } - fun getSelectedElement(file: KtFile): KtElement { val range = selected[file.name] ?: error("No selected expression found in file") @@ -99,7 +98,7 @@ class ExpressionMarkerProvider : TestService { .dropLastWhile { it is PsiWhiteSpace } } -private fun String.indexOfOrNull(substring: String) = - indexOf(substring).takeIf { it >= 0 } - val TestServices.expressionMarkerProvider: ExpressionMarkerProvider by TestServices.testServiceAccessor() + +fun String.indexOfOrNull(substring: String) = + indexOf(substring).takeIf { it >= 0 } \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/TestProjectModuleProvider.kt b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/TestKtModuleProvider.kt similarity index 84% rename from analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/TestProjectModuleProvider.kt rename to analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/TestKtModuleProvider.kt index 852b81623ee..11cd2bb3bde 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/TestProjectModuleProvider.kt +++ b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/TestKtModuleProvider.kt @@ -3,7 +3,7 @@ * 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.compiler.based +package org.jetbrains.kotlin.analysis.api.impl.barebone.test import com.intellij.openapi.project.Project import org.jetbrains.kotlin.psi.KtFile @@ -21,12 +21,12 @@ class TestKtModuleProvider( cache[testModule.name] = TestKtSourceModule(project, testModule, ktFiles, testServices) } - internal fun getModuleInfoByKtFile(ktFile: KtFile): TestKtSourceModule = + fun getModuleInfoByKtFile(ktFile: KtFile): TestKtSourceModule = cache.values.first { moduleSourceInfo -> (if (ktFile.isPhysical) ktFile else ktFile.originalFile) in moduleSourceInfo.ktFiles } - internal fun getModule(moduleName: String): TestKtSourceModule = + fun getModule(moduleName: String): TestKtSourceModule = cache.getValue(moduleName) } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/TestSourceSetProjectModule.kt b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/TestKtSourceModule.kt similarity index 97% rename from analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/TestSourceSetProjectModule.kt rename to analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/TestKtSourceModule.kt index c3b06edca1e..ca311c06840 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/TestSourceSetProjectModule.kt +++ b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/TestKtSourceModule.kt @@ -3,7 +3,7 @@ * 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.compiler.based +package org.jetbrains.kotlin.analysis.api.impl.barebone.test import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices @@ -32,7 +31,7 @@ import java.nio.file.Path import java.nio.file.Paths @OptIn(ExperimentalStdlibApi::class) -internal class TestKtSourceModule( +class TestKtSourceModule( override val project: Project, val testModule: TestModule, val testFilesToKtFiles: Map, @@ -57,10 +56,12 @@ internal class TestKtSourceModule( ) } } + override val directRefinementDependencies: List by lazy(LazyThreadSafetyMode.PUBLICATION) { testModule.dependsOnDependencies .map { moduleProvider.getModule(it.moduleName) } } + override val directFriendDependencies: List by lazy(LazyThreadSafetyMode.PUBLICATION) { buildList { testModule.friendDependencies.mapTo(this) { moduleProvider.getModule(it.moduleName) } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/TestWithDisposable.kt b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/TestWithDisposable.kt similarity index 92% rename from analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/TestWithDisposable.kt rename to analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/TestWithDisposable.kt index 32bfd136606..155608629c2 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/TestWithDisposable.kt +++ b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/TestWithDisposable.kt @@ -3,7 +3,7 @@ * 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.test.base +package org.jetbrains.kotlin.analysis.api.impl.barebone.test import com.intellij.openapi.Disposable import com.intellij.openapi.util.Disposer diff --git a/analysis/analysis-api-impl-base/build.gradle.kts b/analysis/analysis-api-impl-base/build.gradle.kts new file mode 100644 index 00000000000..9412d13a14b --- /dev/null +++ b/analysis/analysis-api-impl-base/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + kotlin("jvm") + id("jps-compatible") +} + +dependencies { + api(project(":compiler:psi")) + api(project(":analysis:analysis-api")) + api(project(":analysis:analysis-api-impl-barebone")) + api(intellijCoreDep()) { includeJars("intellij-core", rootProject = rootProject) } + + testApiJUnit5() + testApi(project(":kotlin-test:kotlin-test-junit")) + testApi(project(":analysis:analysis-api")) + testApi(projectTests(":compiler:tests-common")) + testApi(projectTests(":compiler:test-infrastructure-utils")) + testApi(projectTests(":compiler:test-infrastructure")) + testApi(projectTests(":compiler:tests-common-new")) + testApi(projectTests(":analysis:analysis-api-impl-barebone")) + testImplementation(project(":kotlin-reflect")) + testImplementation(toolsJar()) +} + +sourceSets { + "main" { projectDefault() } + "test" { projectDefault() } +} + +testsJar() \ No newline at end of file diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt new file mode 100644 index 00000000000..86f978c114c --- /dev/null +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/CachingKtAnalysisSessionProvider.kt @@ -0,0 +1,85 @@ +/* + * Copyright 2010-2021 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 + +import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.ProjectRootModificationTracker +import com.intellij.psi.util.CachedValueProvider +import com.intellij.psi.util.CachedValuesManager +import com.intellij.psi.util.PsiModificationTracker +import org.jetbrains.annotations.TestOnly +import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker +import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider +import org.jetbrains.kotlin.analysis.api.isValid +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken +import org.jetbrains.kotlin.analysis.api.tokens.ValidityTokenFactory +import org.jetbrains.kotlin.psi.KtElement +import java.util.concurrent.ConcurrentHashMap +import kotlin.reflect.KClass + +@OptIn(InvalidWayOfUsingAnalysisSession::class) +abstract class CachingKtAnalysisSessionProvider(private val project: Project) : KtAnalysisSessionProvider() { + private val cache = KtAnalysisSessionCache>>(project) + + protected abstract fun getResolveState(contextElement: KtElement): State + protected abstract fun getResolveState(contextSymbol: KtSymbol): State + + protected abstract fun createAnalysisSession( + resolveState: State, + validityToken: ValidityToken, + contextElement: KtElement + ): KtAnalysisSession + + @InvalidWayOfUsingAnalysisSession + final override fun getAnalysisSession(contextElement: KtElement, factory: ValidityTokenFactory): KtAnalysisSession { + val resolveState = getResolveState(contextElement) + return cache.getAnalysisSession(resolveState to factory.identifier) { + val validityToken = factory.create(project) + createAnalysisSession(resolveState, validityToken, contextElement) + } + } + + final override fun getAnalysisSessionBySymbol(contextSymbol: KtSymbol): KtAnalysisSession { + val resolveState = getResolveState(contextSymbol) + val token = contextSymbol.token + return getCachedAnalysisSession(resolveState, token) + ?: error("analysis session was not found for ${contextSymbol::class}, symbol.isValid=${contextSymbol.isValid()}") + } + + private fun getCachedAnalysisSession(resolveState: State, token: ValidityToken): KtAnalysisSession? { + return cache.getCachedAnalysisSession(resolveState to token::class) + } + + @TestOnly + final override fun clearCaches() { + cache.clear() + } +} + +private class KtAnalysisSessionCache(project: Project) { + private val cache = CachedValuesManager.getManager(project).createCachedValue { + CachedValueProvider.Result( + ConcurrentHashMap(), + PsiModificationTracker.MODIFICATION_COUNT, + ProjectRootModificationTracker.getInstance(project), + project.createProjectWideOutOfBlockModificationTracker() + ) + } + + @TestOnly + fun clear() { + cache.value.clear() + } + + inline fun getAnalysisSession(key: KEY, create: () -> KtAnalysisSession): KtAnalysisSession = + cache.value.getOrPut(key) { create() } + + fun getCachedAnalysisSession(key: KEY): KtAnalysisSession? = + cache.value[key] +} \ No newline at end of file diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/KtMapBackedSubstitutor.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/KtMapBackedSubstitutor.kt new file mode 100644 index 00000000000..3fb5bd8cef6 --- /dev/null +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/KtMapBackedSubstitutor.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2021 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 + +import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol +import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor +import org.jetbrains.kotlin.analysis.api.types.KtType + +interface KtMapBackedSubstitutor : KtSubstitutor { + fun getAsMap(): Map +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/HLApiReferenceProviderService.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/references/HLApiReferenceProviderService.kt similarity index 90% rename from analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/HLApiReferenceProviderService.kt rename to analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/references/HLApiReferenceProviderService.kt index 1e043e8db9a..3d6d314993a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/HLApiReferenceProviderService.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/references/HLApiReferenceProviderService.kt @@ -3,7 +3,7 @@ * 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.idea.references +package org.jetbrains.kotlin.analysis.api.impl.base.references import com.intellij.psi.ContributedReferenceHost import com.intellij.psi.PsiElement @@ -15,7 +15,9 @@ import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.PsiModificationTracker import com.intellij.util.containers.ConcurrentFactoryMap import com.intellij.util.containers.MultiMap -import org.jetbrains.kotlin.idea.references.* +import org.jetbrains.kotlin.idea.references.KotlinPsiReferenceProvider +import org.jetbrains.kotlin.idea.references.KotlinPsiReferenceRegistrar +import org.jetbrains.kotlin.idea.references.KotlinReferenceProviderContributor import org.jetbrains.kotlin.psi.KotlinReferenceProvidersService import org.jetbrains.kotlin.utils.SmartList diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/threadUtils.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/util/threadUtils.kt similarity index 72% rename from analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/threadUtils.kt rename to analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/util/threadUtils.kt index ade53c5e0b6..f171d404842 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/threadUtils.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/util/threadUtils.kt @@ -1,16 +1,16 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 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.utils +package org.jetbrains.kotlin.analysis.api.impl.base.util import com.intellij.openapi.application.ApplicationManager import org.jetbrains.kotlin.analysis.api.tokens.HackToForceAllowRunningAnalyzeOnEDT import org.jetbrains.kotlin.analysis.api.tokens.hackyAllowRunningOnEdt @HackToForceAllowRunningAnalyzeOnEDT -internal inline fun runInPossiblyEdtThread(action: () -> R): R = when { +inline fun runInPossiblyEdtThread(action: () -> R): R = when { !ApplicationManager.getApplication().isDispatchThread -> action() else -> hackyAllowRunningOnEdt(action) } \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/AbstractReferenceResolveTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/AbstractReferenceResolveTest.kt similarity index 95% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/AbstractReferenceResolveTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/AbstractReferenceResolveTest.kt index 58eb32dc5fb..b2fd8f8aaad 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/AbstractReferenceResolveTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/AbstractReferenceResolveTest.kt @@ -3,7 +3,7 @@ * 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 +package org.jetbrains.kotlin.analysis.api.impl.base.test import com.intellij.psi.PsiReference import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference @@ -11,11 +11,11 @@ import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions import org.jetbrains.kotlin.analysis.api.components.RendererModifier -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleModuleTest +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleModuleTest import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.markers.KtNamedSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider import org.jetbrains.kotlin.idea.references.KtReference import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtDeclaration @@ -120,7 +120,8 @@ abstract class AbstractReferenceResolveTest : AbstractHLApiSingleModuleTest() { } private val renderingOptions = KtDeclarationRendererOptions.DEFAULT.copy( - modifiers = RendererModifier.DEFAULT - RendererModifier.ANNOTATIONS + modifiers = RendererModifier.DEFAULT - RendererModifier.ANNOTATIONS, + sortNestedDeclarations = true ) private fun PsiReference.unwrapMultiReferences(): List = when (this) { diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/SymbolByFqName.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/SymbolByFqName.kt similarity index 98% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/SymbolByFqName.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/SymbolByFqName.kt index e959431aa6b..af7bcf8ea39 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/SymbolByFqName.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/SymbolByFqName.kt @@ -3,7 +3,7 @@ * 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 +package org.jetbrains.kotlin.analysis.api.impl.base.test import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.analysis.api.KtAnalysisSession diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/commonTestUtils.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/commonTestUtils.kt new file mode 100644 index 00000000000..f3c5efa13b4 --- /dev/null +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/commonTestUtils.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2021 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 + +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.util.Computable +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.analyse +import org.jetbrains.kotlin.psi.KtElement + +inline fun runReadAction(crossinline runnable: () -> T): T { + return ApplicationManager.getApplication().runReadAction(Computable { runnable() }) +} + +fun executeOnPooledThreadInReadAction(action: () -> R): R = + ApplicationManager.getApplication().executeOnPooledThread { runReadAction(action) }.get() + +inline fun analyseOnPooledThreadInReadAction(context: KtElement, crossinline action: KtAnalysisSession.() -> R): R = + executeOnPooledThreadInReadAction { + analyse(context) { action() } + } \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractCompileTimeConstantEvaluatorTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractCompileTimeConstantEvaluatorTest.kt similarity index 92% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractCompileTimeConstantEvaluatorTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractCompileTimeConstantEvaluatorTest.kt index 7cc63ebbe58..5eb58606c4e 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractCompileTimeConstantEvaluatorTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractCompileTimeConstantEvaluatorTest.kt @@ -3,11 +3,11 @@ * 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.components +package org.jetbrains.kotlin.analysis.api.impl.base.test.components -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleFileTest +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest import org.jetbrains.kotlin.analysis.api.symbols.markers.* -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtValueArgument diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractExpectedExpressionTypeTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractExpectedExpressionTypeTest.kt similarity index 76% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractExpectedExpressionTypeTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractExpectedExpressionTypeTest.kt index 173047bde48..256442dd82e 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractExpectedExpressionTypeTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractExpectedExpressionTypeTest.kt @@ -3,10 +3,12 @@ * 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.components +package org.jetbrains.kotlin.analysis.api.impl.base.test.components -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleFileTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.api.analyse +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.api.impl.base.test.executeOnPooledThreadInReadAction +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.model.TestModule diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractHLExpressionTypeTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractHLExpressionTypeTest.kt similarity index 74% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractHLExpressionTypeTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractHLExpressionTypeTest.kt index 361e1cc7da1..850b31115b5 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractHLExpressionTypeTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractHLExpressionTypeTest.kt @@ -3,10 +3,12 @@ * 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.components +package org.jetbrains.kotlin.analysis.api.impl.base.test.components -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleFileTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.api.analyse +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.api.impl.base.test.executeOnPooledThreadInReadAction +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.model.TestModule diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractHasCommonSubtypeTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractHasCommonSubtypeTest.kt similarity index 95% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractHasCommonSubtypeTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractHasCommonSubtypeTest.kt index 737ad4ed540..930e9f7d6f3 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractHasCommonSubtypeTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractHasCommonSubtypeTest.kt @@ -3,11 +3,12 @@ * 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.components +package org.jetbrains.kotlin.analysis.api.impl.base.test.components import com.intellij.openapi.util.text.StringUtil import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleFileTest +import org.jetbrains.kotlin.analysis.api.analyse +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtTreeVisitorVoid diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractOverriddenDeclarationProviderTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractOverriddenDeclarationProviderTest.kt similarity index 88% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractOverriddenDeclarationProviderTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractOverriddenDeclarationProviderTest.kt index 75dd7ced4d7..de56ab7ac71 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractOverriddenDeclarationProviderTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractOverriddenDeclarationProviderTest.kt @@ -3,13 +3,14 @@ * 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.components +package org.jetbrains.kotlin.analysis.api.impl.base.test.components -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleModuleTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.parentsOfType import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.components.KtTypeRendererOptions +import org.jetbrains.kotlin.analysis.api.impl.barebone.parentsOfType +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.api.impl.base.test.executeOnPooledThreadInReadAction +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleModuleTest import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSyntheticJavaPropertySymbol diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractRendererTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractRendererTest.kt similarity index 79% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractRendererTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractRendererTest.kt index 598f5dc291c..55c6e19cb56 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractRendererTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractRendererTest.kt @@ -3,11 +3,13 @@ * 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.components +package org.jetbrains.kotlin.analysis.api.impl.base.test.components -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleFileTest +import org.jetbrains.kotlin.analysis.api.analyse import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions import org.jetbrains.kotlin.analysis.api.components.KtTypeRendererOptions +import org.jetbrains.kotlin.analysis.api.impl.base.test.executeOnPooledThreadInReadAction +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices @@ -18,7 +20,8 @@ abstract class AbstractRendererTest : AbstractHLApiSingleFileTest() { val options = KtDeclarationRendererOptions.DEFAULT.copy( approximateTypes = true, renderContainingDeclarations = true, - typeRendererOptions = KtTypeRendererOptions.SHORT_NAMES + typeRendererOptions = KtTypeRendererOptions.SHORT_NAMES, + sortNestedDeclarations = true ) val actual = executeOnPooledThreadInReadAction { diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractResolveCallTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/fir/AbstractResolveCallTest.kt similarity index 87% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractResolveCallTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/fir/AbstractResolveCallTest.kt index 22ef8be4a8a..f22f136c287 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractResolveCallTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/fir/AbstractResolveCallTest.kt @@ -3,7 +3,7 @@ * 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.components +package org.jetbrains.kotlin.analysis.api.impl.base.test.fir import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.KtAnalysisSession @@ -11,14 +11,14 @@ import org.jetbrains.kotlin.analysis.api.calls.KtCall import org.jetbrains.kotlin.analysis.api.calls.KtDelegatedConstructorCallKind import org.jetbrains.kotlin.analysis.api.calls.KtErrorCallTarget import org.jetbrains.kotlin.analysis.api.calls.KtSuccessCallTarget -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleModuleTest -import org.jetbrains.kotlin.analysis.api.fir.types.KtFirSubstitutor +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.api.impl.base.KtMapBackedSubstitutor +import org.jetbrains.kotlin.analysis.api.impl.base.test.executeOnPooledThreadInReadAction +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleModuleTest import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.markers.KtPossibleMemberSymbol import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider -import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices @@ -91,6 +91,7 @@ private fun KtCall.stringRepresentation(): String { append(": ${annotatedType.type.render()}") } is KtValueParameterSymbol -> "${if (isVararg) "vararg " else ""}$name: ${annotatedType.type.render()}" + is KtTypeParameterSymbol -> this.nameOrAnonymous.asString() is KtVariableSymbol -> "${if (isVal) "val" else "var"} $name: ${annotatedType.type.render()}" is KtSuccessCallTarget -> symbol.stringValue() is KtErrorCallTarget -> "ERR<${this.diagnostic.defaultMessage}, [${candidates.joinToString { it.stringValue() }}]>" @@ -99,12 +100,12 @@ private fun KtCall.stringRepresentation(): String { is KtExpression -> this.text is KtDelegatedConstructorCallKind -> toString() is KtSubstitutor.Empty -> "" - is KtFirSubstitutor -> { - when (val substitutor = substitutor) { - is ConeSubstitutorByMap -> "" - else -> "" - } + is KtMapBackedSubstitutor -> { + val mappingText = getAsMap().orEmpty().entries + .joinToString(prefix = "{", postfix = "}") { (k, v) -> k.stringValue() + " = " + v.asStringForDebugging() } + "" } + is KtSubstitutor -> "" else -> error("unexpected parameter type ${this::class}") } diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractFileScopeTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/scopes/AbstractFileScopeTest.kt similarity index 86% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractFileScopeTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/scopes/AbstractFileScopeTest.kt index 299cf82c997..e878110e968 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractFileScopeTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/scopes/AbstractFileScopeTest.kt @@ -3,9 +3,11 @@ * 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.scopes +package org.jetbrains.kotlin.analysis.api.impl.base.test.scopes -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleFileTest +import org.jetbrains.kotlin.analysis.api.analyse +import org.jetbrains.kotlin.analysis.api.impl.base.test.executeOnPooledThreadInReadAction +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest import org.jetbrains.kotlin.analysis.api.symbols.DebugSymbolRenderer import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.model.TestModule diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractMemberScopeTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/scopes/AbstractMemberScopeTest.kt similarity index 82% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractMemberScopeTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/scopes/AbstractMemberScopeTest.kt index eb8acea6353..7cdc25dbec5 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/scopes/AbstractMemberScopeTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/scopes/AbstractMemberScopeTest.kt @@ -3,11 +3,11 @@ * 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.scopes +package org.jetbrains.kotlin.analysis.api.impl.base.test.scopes import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.fir.SymbolByFqName -import org.jetbrains.kotlin.analysis.api.fir.symbols.AbstractSymbolByFqNameTest +import org.jetbrains.kotlin.analysis.api.impl.base.test.SymbolByFqName +import org.jetbrains.kotlin.analysis.api.impl.base.test.symbols.AbstractSymbolByFqNameTest import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.psi.KtFile diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolByFqNameTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolByFqNameTest.kt similarity index 89% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolByFqNameTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolByFqNameTest.kt index 0ef5c970d31..ee5896078a3 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolByFqNameTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolByFqNameTest.kt @@ -3,10 +3,10 @@ * 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.symbols +package org.jetbrains.kotlin.analysis.api.impl.base.test.symbols import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.fir.SymbolByFqName +import org.jetbrains.kotlin.analysis.api.impl.base.test.SymbolByFqName import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolByPsiTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolByPsiTest.kt similarity index 94% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolByPsiTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolByPsiTest.kt index 071d1e30413..95617a568f5 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolByPsiTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolByPsiTest.kt @@ -3,7 +3,7 @@ * 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.symbols +package org.jetbrains.kotlin.analysis.api.impl.base.test.symbols import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolByReferenceTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolByReferenceTest.kt similarity index 86% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolByReferenceTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolByReferenceTest.kt index 6f64204f58d..0051d4bb8ce 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolByReferenceTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolByReferenceTest.kt @@ -3,10 +3,10 @@ * 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.symbols +package org.jetbrains.kotlin.analysis.api.impl.base.test.symbols -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.psi.KtFile diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolTest.kt similarity index 86% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolTest.kt index 35d7d32ec45..47ad0937b02 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/symbols/AbstractSymbolTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/symbols/AbstractSymbolTest.kt @@ -1,14 +1,13 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 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.symbols +package org.jetbrains.kotlin.analysis.api.impl.base.test.symbols -import com.intellij.openapi.components.ServiceManager -import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleFileTest import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.impl.base.test.analyseOnPooledThreadInReadAction +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest import org.jetbrains.kotlin.analysis.api.symbols.DebugSymbolRenderer import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer @@ -30,6 +29,8 @@ abstract class AbstractSymbolTest : AbstractHLApiSingleFileTest() { abstract fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): List + abstract fun doOutOfBlockModification(ktFile: KtFile) + override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) { val createPointers = SymbolTestDirectives.DO_NOT_CHECK_SYMBOL_RESTORE !in module.directives val pointersWithRendered = analyseOnPooledThreadInReadAction(ktFile) { @@ -74,11 +75,6 @@ abstract class AbstractSymbolTest : AbstractHLApiSingleFileTest() { val actual = restored.joinToString(separator = "\n") testServices.assertions.assertEqualsToFile(testDataFileSibling(".txt"), actual) } - - private fun doOutOfBlockModification(ktFile: KtFile) { - ServiceManager.getService(ktFile.project, KotlinModificationTrackerFactory::class.java) - .incrementModificationsCount() - } } private object SymbolTestDirectives : SimpleDirectivesContainer() { diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/framework/AbstractHLApiSingleFileTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/test/framework/AbstractHLApiSingleFileTest.kt similarity index 91% rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/framework/AbstractHLApiSingleFileTest.kt rename to analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/test/framework/AbstractHLApiSingleFileTest.kt index 2b01fc5948d..1d557f042f7 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/framework/AbstractHLApiSingleFileTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/test/framework/AbstractHLApiSingleFileTest.kt @@ -3,7 +3,7 @@ * 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.framework +package org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.model.TestModule diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/test/framework/AbstractHLApiSingleModuleTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/test/framework/AbstractHLApiSingleModuleTest.kt new file mode 100644 index 00000000000..06aa6aa499c --- /dev/null +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/test/framework/AbstractHLApiSingleModuleTest.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2010-2021 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.test.framework + +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.util.Computable +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.analyse +import org.jetbrains.kotlin.analysis.api.analyseInDependedAnalysisSession +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.AbstractFrontendApiTest +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.TestModuleStructure +import org.jetbrains.kotlin.test.services.TestServices + +abstract class AbstractHLApiSingleModuleTest : AbstractFrontendApiTest() { + final override fun doTestByFileStructure(ktFiles: List, moduleStructure: TestModuleStructure, testServices: TestServices) { + val singleModule = moduleStructure.modules.single() + doTestByFileStructure(ktFiles, singleModule, testServices) + } + + protected abstract fun doTestByFileStructure(ktFiles: List, module: TestModule, testServices: TestServices) + + protected inline fun analyseOnPooledThreadInReadAction(context: KtElement, crossinline action: KtAnalysisSession.() -> R): R = + executeOnPooledThreadInReadAction { + analyseForTest(context) { action() } + } + + protected inline fun runReadAction(crossinline runnable: () -> T): T { + return ApplicationManager.getApplication().runReadAction(Computable { runnable() }) + } + + protected inline fun executeOnPooledThreadInReadAction(crossinline action: () -> R): R = + ApplicationManager.getApplication().executeOnPooledThread { runReadAction(action) }.get() + + + protected fun analyseForTest(contextElement: KtElement, action: KtAnalysisSession.() -> R): R { + return if (useDependedAnalysisSession) { + // Depended mode does not support analysing a KtFile. + // See org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir#getResolveStateForDependentCopy + if (contextElement is KtFile) { + throw SkipDependedModeException() + } + + require(!contextElement.isPhysical) + analyseInDependedAnalysisSession(configurator.getOriginalFile(contextElement.containingKtFile), contextElement, action) + } else { + analyse(contextElement, action) + } + } +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/build.gradle.kts b/analysis/low-level-api-fir/build.gradle.kts index 853de24bd5f..08695dbf350 100644 --- a/analysis/low-level-api-fir/build.gradle.kts +++ b/analysis/low-level-api-fir/build.gradle.kts @@ -16,6 +16,7 @@ dependencies { api(project(":compiler:fir:checkers:checkers.jvm")) api(project(":compiler:fir:java")) api(project(":compiler:backend.common.jvm")) + api(project(":analysis:analysis-api-impl-barebone")) testApi(project(":analysis:analysis-api-fir")) implementation(project(":compiler:ir.psi2ir")) implementation(project(":compiler:fir:entrypoint")) @@ -32,6 +33,7 @@ dependencies { testApi(toolsJar()) testApi(projectTests(":compiler:tests-common")) testApi(projectTests(":compiler:fir:analysis-tests:legacy-fir-tests")) + testApi(projectTests(":analysis:analysis-api-impl-barebone")) testApi(project(":kotlin-test:kotlin-test-junit")) testApiJUnit5() testApi(project(":kotlin-reflect")) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/FirModuleResolveStateDepended.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/FirModuleResolveStateDepended.kt index fa565514c27..4afe82ec1d4 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/FirModuleResolveStateDepended.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/FirModuleResolveStateDepended.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.analysis.low.level.api.fir.annotations.InternalForInline +import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.InternalForInline import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/FirModuleResolveStateImpl.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/FirModuleResolveStateImpl.kt index b93a3d2c231..a235663b979 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/FirModuleResolveStateImpl.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/FirModuleResolveStateImpl.kt @@ -6,7 +6,16 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.analysis.low.level.api.fir.annotations.InternalForInline +import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.InternalForInline +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirFile +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression +import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression +import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostics.DiagnosticsCollector @@ -28,15 +37,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.analysis.project.structure.getKtModule -import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.expressions.FirAnonymousFunctionExpression -import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression -import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.psi.* diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirModuleResolveState.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirModuleResolveState.kt index eb26258269d..0e64c60ef72 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirModuleResolveState.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirModuleResolveState.kt @@ -6,10 +6,10 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.api import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.InternalForInline import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.analysis.low.level.api.fir.annotations.InternalForInline import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.ModuleFileCache import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType import org.jetbrains.kotlin.analysis.project.structure.KtModule diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacade.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacade.kt index 7b163f4db46..a761b9ccef4 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacade.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacade.kt @@ -6,13 +6,12 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.api import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.InternalForInline import org.jetbrains.kotlin.analysis.low.level.api.fir.FirIdeResolveStateService -import org.jetbrains.kotlin.analysis.low.level.api.fir.annotations.InternalForInline import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.analysis.project.structure.getKtModule -import org.jetbrains.kotlin.analyzer.ModuleSourceInfoBase import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic import org.jetbrains.kotlin.fir.declarations.* diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt index 70648ce1605..77fe1905cb4 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacadeForResolveOnAir.kt @@ -6,7 +6,19 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.api import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.kotlin.analysis.api.impl.barebone.parentOfType +import org.jetbrains.kotlin.analysis.api.impl.barebone.parentsOfType import org.jetbrains.kotlin.analysis.low.level.api.fir.DeclarationCopyBuilder.withBodyFrom +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.realPsi +import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.transformers.FirTypeResolveTransformer +import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector +import org.jetbrains.kotlin.fir.scopes.createImportingScopes +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef +import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.analysis.low.level.api.fir.FirModuleResolveStateDepended import org.jetbrains.kotlin.analysis.low.level.api.fir.FirModuleResolveStateImpl import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FileTowerProvider @@ -20,19 +32,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.firIdeProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.FirIdeSourcesSession import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.parentOfType -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.parentsOfType import org.jetbrains.kotlin.analysis.project.structure.getKtModule -import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.expressions.FirAnnotation -import org.jetbrains.kotlin.fir.realPsi -import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.fir.resolve.transformers.FirTypeResolveTransformer -import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector -import org.jetbrains.kotlin.fir.scopes.createImportingScopes -import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef -import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.isAncestor diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt index 2fd82e31d5f..71e95ee5de7 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt @@ -7,11 +7,11 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder import com.intellij.psi.PsiElement import org.jetbrains.annotations.TestOnly +import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.ThreadSafe import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.analysis.low.level.api.fir.annotations.ThreadSafe import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.FirFileBuilder import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.ModuleFileCache diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/FirFileBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/FirFileBuilder.kt index 8422bf509f0..2f53db0835c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/FirFileBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/FirFileBuilder.kt @@ -5,13 +5,13 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder +import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.ThreadSafe import org.jetbrains.kotlin.fir.builder.RawFirBuilder import org.jetbrains.kotlin.fir.builder.BodyBuildingMode import org.jetbrains.kotlin.fir.builder.PsiHandlingMode import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.FirPhaseRunner -import org.jetbrains.kotlin.analysis.low.level.api.fir.annotations.ThreadSafe import org.jetbrains.kotlin.psi.KtFile /** diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LockProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LockProvider.kt index ab02caf47da..fb822b9361c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LockProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/LockProvider.kt @@ -5,8 +5,8 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder +import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.PrivateForInline import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.analysis.low.level.api.fir.annotations.PrivateForInline import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveTreeBuilder import org.jetbrains.kotlin.analysis.low.level.api.fir.util.lockWithPCECheck import java.util.concurrent.locks.ReentrantLock diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/ModuleFileCache.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/ModuleFileCache.kt index 955ba1f8453..f095d450f02 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/ModuleFileCache.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/builder/ModuleFileCache.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder import com.intellij.concurrency.ConcurrentCollectionFactory +import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.ThreadSafe import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration @@ -13,7 +14,6 @@ import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol -import org.jetbrains.kotlin.analysis.low.level.api.fir.annotations.ThreadSafe import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.KtFile diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/NonLocalDeclarationUtils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/NonLocalDeclarationUtils.kt index 517c272e8d5..eb4581851c8 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/NonLocalDeclarationUtils.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/NonLocalDeclarationUtils.kt @@ -5,11 +5,11 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve +import org.jetbrains.kotlin.analysis.api.impl.barebone.parentOfType import org.jetbrains.kotlin.fir.FirFakeSourceElement import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.psi -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.parentOfType import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.getParentOfType diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/FirIdeSessionProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/FirIdeSessionProvider.kt index e852a499e8b..048a9f69f61 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/FirIdeSessionProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/FirIdeSessionProvider.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.analysis.low.level.api.fir.annotations.Immutable +import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.Immutable import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.ModuleFileCache import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt index a61b2df85d9..58bc878b66a 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt @@ -12,6 +12,8 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor import com.intellij.psi.impl.source.tree.LeafPsiElement import com.intellij.psi.util.* +import org.jetbrains.kotlin.analysis.api.impl.barebone.parentOfType +import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.cfg.containingDeclarationForPseudocode import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.FirDeclaration @@ -20,8 +22,6 @@ import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral -import org.jetbrains.kotlin.psi.psiUtil.parents -import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import java.util.concurrent.TimeUnit import java.util.concurrent.locks.Lock import kotlin.reflect.KProperty @@ -135,15 +135,4 @@ fun KtElement.getElementTextInContext(): String { return builder.toString().trimIndent().trim() } -private const val ELEMENT_TAG = "ELEMENT" - -inline fun PsiElement.parentOfType(withSelf: Boolean = false): T? { - return PsiTreeUtil.getParentOfType(this, T::class.java, !withSelf) -} - -fun PsiElement.parentsOfType(clazz: Class, withSelf: Boolean = true): Sequence { - return (if (withSelf) parentsWithSelf else parents).filterIsInstance(clazz) -} - -inline fun PsiElement.parentsOfType(withSelf: Boolean = true): Sequence = - parentsOfType(T::class.java, withSelf) +private const val ELEMENT_TAG = "ELEMENT" \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractGetOrBuildFirTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractGetOrBuildFirTest.kt index 70a75fc9604..deb4363b1f0 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractGetOrBuildFirTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractGetOrBuildFirTest.kt @@ -7,13 +7,13 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir import com.intellij.psi.PsiElement import com.intellij.psi.util.PsiTreeUtil +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirRenderer import org.jetbrains.kotlin.fir.declarations.FirImport import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt similarity index 73% rename from analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTest.kt rename to analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt index 9335d742846..31fe601f909 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt @@ -5,14 +5,14 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based -import com.intellij.openapi.Disposable -import com.intellij.openapi.util.Disposer +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.AbstractCompilerBasedTest +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.TestKtModuleProvider +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.projectModuleProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile import org.jetbrains.kotlin.analysis.low.level.api.fir.createResolveStateForNoCaching import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.FirLazyTransformerForIDE import org.jetbrains.kotlin.platform.jvm.JvmPlatforms -import org.jetbrains.kotlin.test.TestConfiguration import org.jetbrains.kotlin.test.bind import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.firHandlersStep @@ -20,28 +20,14 @@ import org.jetbrains.kotlin.test.builders.testConfiguration import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives import org.jetbrains.kotlin.test.directives.model.DirectivesContainer import org.jetbrains.kotlin.test.frontend.fir.FirOutputArtifact -import org.jetbrains.kotlin.test.model.* -import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest -import org.jetbrains.kotlin.test.services.* -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.TestInfo - -abstract class AbstractCompilerBasedTest : AbstractKotlinCompilerTest() { - private var _disposable: Disposable? = null - protected val disposable: Disposable get() = _disposable!! - - @BeforeEach - private fun intiDisposable(testInfo: TestInfo) { - _disposable = Disposer.newDisposable("disposable for ${testInfo.displayName}") - } - - @AfterEach - private fun disposeDisposable() { - _disposable?.let { Disposer.dispose(it) } - _disposable = null - } +import org.jetbrains.kotlin.test.model.DependencyKind +import org.jetbrains.kotlin.test.model.FrontendFacade +import org.jetbrains.kotlin.test.model.FrontendKinds +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.compilerConfigurationProvider +abstract class AbstractCompilerBasedTestForFir : AbstractCompilerBasedTest() { final override fun TestConfigurationBuilder.configuration() { globalDefaults { frontend = FrontendKinds.FIR @@ -62,7 +48,6 @@ abstract class AbstractCompilerBasedTest : AbstractKotlinCompilerTest() { open fun TestConfigurationBuilder.configureTest() {} - inner class LowLevelFirFrontendFacade( testServices: TestServices ) : FrontendFacade(testServices, FrontendKinds.FIR) { @@ -103,14 +88,4 @@ abstract class AbstractCompilerBasedTest : AbstractKotlinCompilerTest() { FirLazyTransformerForIDE.enableDeepEnsure = oldEnableDeepEnsure } } - - private fun ignoreTest(filePath: String, configuration: TestConfiguration): Boolean { - val modules = configuration.moduleStructureExtractor.splitTestDataByModules(filePath, configuration.directives) - - if (modules.modules.none { it.files.any { it.isKtFile } }) { - return true // nothing to highlight - } - - return false - } -} +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/ModuleRegistrarPreAnalysisHandler.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/ModuleRegistrarPreAnalysisHandler.kt index 94bff16beb7..8617af874e5 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/ModuleRegistrarPreAnalysisHandler.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/ModuleRegistrarPreAnalysisHandler.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based import com.intellij.mock.MockProject import com.intellij.openapi.Disposable +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.projectModuleProvider import org.jetbrains.kotlin.test.services.* class ModuleRegistrarPreAnalysisHandler( diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/testServices.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/testServices.kt index 1d9642ced4f..9a4adb4d48b 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/testServices.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/testServices.kt @@ -13,6 +13,7 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSessionProvider +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.projectModuleProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.FirIdeResolveStateService import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.FirSealedClassInheritorsProcessorFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.PackagePartProviderFactory diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractDiagnosisCompilerTestDataSpecTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractDiagnosisCompilerTestDataSpecTest.kt index af9e02d7d84..e73f508c192 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractDiagnosisCompilerTestDataSpecTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractDiagnosisCompilerTestDataSpecTest.kt @@ -5,13 +5,13 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based -import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.AbstractCompilerBasedTest +import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.AbstractCompilerBasedTestForFir import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.addIdeTestIgnoreHandler import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.runners.baseFirDiagnosticTestConfiguration import org.jetbrains.kotlin.test.runners.baseFirSpecDiagnosticTestConfiguration -abstract class AbstractDiagnosisCompilerTestDataSpecTest : AbstractCompilerBasedTest() { +abstract class AbstractDiagnosisCompilerTestDataSpecTest : AbstractCompilerBasedTestForFir() { override fun TestConfigurationBuilder.configureTest() { baseFirDiagnosticTestConfiguration(frontendFacade = ::LowLevelFirFrontendFacade) baseFirSpecDiagnosticTestConfiguration() diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractDiagnosisCompilerTestDataTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractDiagnosisCompilerTestDataTest.kt index c8fc41b1a9c..74575df34e6 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractDiagnosisCompilerTestDataTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractDiagnosisCompilerTestDataTest.kt @@ -5,12 +5,12 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based -import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.AbstractCompilerBasedTest +import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.AbstractCompilerBasedTestForFir import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.addIdeTestIgnoreHandler import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.runners.baseFirDiagnosticTestConfiguration -abstract class AbstractDiagnosisCompilerTestDataTest : AbstractCompilerBasedTest() { +abstract class AbstractDiagnosisCompilerTestDataTest : AbstractCompilerBasedTestForFir() { override fun TestConfigurationBuilder.configureTest() { baseFirDiagnosticTestConfiguration(frontendFacade = ::LowLevelFirFrontendFacade) addIdeTestIgnoreHandler() diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AbstractLowLevelApiSingleModuleTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AbstractLowLevelApiSingleModuleTest.kt index 5c6e53979a6..210587b2c27 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AbstractLowLevelApiSingleModuleTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AbstractLowLevelApiSingleModuleTest.kt @@ -5,4 +5,10 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.test.base -abstract class AbstractLowLevelApiSingleModuleTest : AbstractLowLevelApiTest() \ No newline at end of file +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.AbstractFrontendApiTest +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService + +abstract class AbstractLowLevelApiSingleModuleTest : AbstractFrontendApiTest() { + override val configurator: FrontendApiTestConfiguratorService + get() = FirLowLevelFrontendApiTestConfiguratorService +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/FirLowLevelFrontendApiTestConfiguratorService.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/FirLowLevelFrontendApiTestConfiguratorService.kt new file mode 100644 index 00000000000..d3dd0121034 --- /dev/null +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/FirLowLevelFrontendApiTestConfiguratorService.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2021 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.test.base + +import com.intellij.mock.MockApplication +import com.intellij.mock.MockProject +import com.intellij.openapi.Disposable +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.ModuleRegistrarPreAnalysisHandler +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalKtFile +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.bind +import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder + +object FirLowLevelFrontendApiTestConfiguratorService : FrontendApiTestConfiguratorService { + override fun TestConfigurationBuilder.configureTest(disposable: Disposable) { + usePreAnalysisHandlers(::ModuleRegistrarPreAnalysisHandler.bind(disposable)) + } + + override fun processTestFiles(files: List): List { + return files.map { + val fakeFile = it.copy() as KtFile + fakeFile.originalKtFile = it + fakeFile + } + } + + override fun getOriginalFile(file: KtFile): KtFile { + return file.originalKtFile!! + } + + override fun registerProjectServices(project: MockProject) {} + override fun registerApplicationServices(application: MockApplication) {} +} \ No newline at end of file diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt index 06b7d3f6a05..f91514b0cca 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt @@ -5,13 +5,8 @@ package org.jetbrains.kotlin.generators.tests.analysis.api -import org.jetbrains.kotlin.analysis.api.fir.AbstractReferenceResolveTest +import org.jetbrains.kotlin.analysis.api.fir.AbstractFirReferenceResolveTest import org.jetbrains.kotlin.analysis.api.fir.components.* -import org.jetbrains.kotlin.analysis.api.fir.scopes.AbstractFileScopeTest -import org.jetbrains.kotlin.analysis.api.fir.scopes.AbstractMemberScopeByFqNameTest -import org.jetbrains.kotlin.analysis.api.fir.symbols.AbstractSymbolByFqNameTest -import org.jetbrains.kotlin.analysis.api.fir.symbols.AbstractSymbolByPsiTest -import org.jetbrains.kotlin.analysis.api.fir.symbols.AbstractSymbolByReferenceTest import org.jetbrains.kotlin.analysis.low.level.api.fir.* import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.AbstractDiagnosticTraversalCounterTest import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.AbstractFirContextCollectionTest @@ -20,6 +15,15 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based import org.jetbrains.kotlin.analysis.low.level.api.fir.file.structure.AbstractFileStructureTest import org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.AbstractInnerDeclarationsResolvePhaseTest import org.jetbrains.kotlin.generators.util.TestGeneratorUtil +import org.jetbrains.kotlin.analysis.api.fir.components.AbstractFirExpectedExpressionTypeTest +import org.jetbrains.kotlin.analysis.api.fir.components.AbstractFirHLExpressionTypeTest +import org.jetbrains.kotlin.analysis.api.fir.components.AbstractFirOverriddenDeclarationProviderTest +import org.jetbrains.kotlin.analysis.api.fir.components.AbstractFirRendererTest +import org.jetbrains.kotlin.analysis.api.fir.scopes.AbstractFirFileScopeTest +import org.jetbrains.kotlin.analysis.api.fir.scopes.AbstractFirMemberScopeByFqNameTest +import org.jetbrains.kotlin.analysis.api.fir.symbols.AbstractFirSymbolByFqNameTest +import org.jetbrains.kotlin.analysis.api.fir.symbols.AbstractFirSymbolByPsiTest +import org.jetbrains.kotlin.analysis.api.fir.symbols.AbstractFirSymbolByReferenceTest import org.jetbrains.kotlin.spec.utils.GeneralConfiguration import org.jetbrains.kotlin.spec.utils.tasks.detectDirsWithTestsMapFileOnly import org.jetbrains.kotlin.generators.generateTestGroupSuiteWithJUnit5 @@ -33,51 +37,51 @@ fun main(args: Array) { generateTestGroupSuiteWithJUnit5(args) { testGroup("analysis/analysis-api-fir/tests", "analysis/analysis-api/testData") { - testClass { + testClass { model("analysisSession/resolveCall") } - testClass { + testClass { model("memberScopeByFqName") } - testClass { + testClass { model("fileScopeTest", extension = "kt") } - testClass { + testClass { model("symbols/symbolByPsi") } - testClass { + testClass { model("symbols/symbolByFqName") } - testClass { + testClass { model("symbols/symbolByReference") } - testClass { + testClass { model("components/compileTimeConstantEvaluator") } - testClass { + testClass { model("components/expectedExpressionType") } - testClass { + testClass { model("components/overridenDeclarations") } - testClass { + testClass { model("components/expressionType") } - testClass { + testClass { model("components/declarationRenderer") } - testClass { + testClass { model("referenceResolve", pattern = TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME) } @@ -85,11 +89,11 @@ fun main(args: Array) { model("components/importOptimizer", pattern = TestGeneratorUtil.KT_WITHOUT_DOTS_IN_NAME) } - testClass { + testClass { model("components/hasCommonSubtype") } - testClass { + testClass { model("components/getSuperTypes") } } diff --git a/settings.gradle b/settings.gradle index 99c0fb25e98..c1e4c2c55ee 100644 --- a/settings.gradle +++ b/settings.gradle @@ -474,6 +474,8 @@ include ":generators:analysis-api-generator", ":analysis:analysis-api-fir:analysis-api-fir-generator", ":analysis:analysis-api-fir", ":analysis:analysis-api", + ":analysis:analysis-api-impl-barebone", + ":analysis:analysis-api-impl-base", ":analysis:analysis-api-providers", ":analysis:symbol-light-classes", ":analysis:project-structure"