Skip to content

Commit 163e0c4

Browse files
committed
UPDATE_AA_VERSION: 2.0.0-dev-19480
1 parent 685b024 commit 163e0c4

File tree

6 files changed

+132
-14
lines changed

6 files changed

+132
-14
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ junit5Version=5.8.2
99
junitPlatformVersion=1.8.2
1010
googleTruthVersion=1.1
1111

12-
aaKotlinBaseVersion=2.0.0-dev-18803
12+
aaKotlinBaseVersion=2.0.0-dev-19480
1313
aaIntellijVersion=213.7172.25
1414
aaGuavaVersion=29.0-jre
1515
aaAsmVersion=9.0

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/IncrementalContextAA.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import com.google.devtools.ksp.impl.symbol.kotlin.typeArguments
3232
import com.google.devtools.ksp.symbol.KSClassDeclaration
3333
import com.google.devtools.ksp.symbol.KSDeclaration
3434
import com.google.devtools.ksp.symbol.KSNode
35+
import com.google.devtools.ksp.symbol.Origin
3536
import com.intellij.psi.PsiJavaFile
3637
import com.intellij.util.containers.MultiMap
3738
import com.intellij.util.io.DataExternalizer
@@ -252,8 +253,11 @@ internal fun recordLookupForGetAllFunctions(supers: List<KtType>) =
252253
it is KtFunctionLikeSymbol
253254
}
254255

255-
internal fun recordGetSealedSubclasses(classDeclaration: KSClassDeclaration) =
256-
ResolverAAImpl.instance.incrementalContext.recordGetSealedSubclasses(classDeclaration)
256+
internal fun recordGetSealedSubclasses(classDeclaration: KSClassDeclaration) {
257+
if (classDeclaration.origin == Origin.KOTLIN) {
258+
ResolverAAImpl.instance.incrementalContext.recordGetSealedSubclasses(classDeclaration)
259+
}
260+
}
257261

258262
class LookupTrackerWrapperImpl(val lookupTracker: LookupTracker) : LookupTrackerWrapper {
259263
override val lookups: MultiMap<LookupSymbolWrapper, String>

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import com.google.devtools.ksp.impl.symbol.kotlin.analyze
3333
import com.google.devtools.ksp.processing.*
3434
import com.google.devtools.ksp.standalone.IncrementalKotlinDeclarationProviderFactory
3535
import com.google.devtools.ksp.standalone.IncrementalKotlinPackageProviderFactory
36+
import com.google.devtools.ksp.standalone.KspStandaloneDirectInheritorsProvider
3637
import com.google.devtools.ksp.standalone.buildKspLibraryModule
3738
import com.google.devtools.ksp.standalone.buildKspSourceModule
3839
import com.google.devtools.ksp.symbol.KSFile
@@ -70,8 +71,8 @@ import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtSta
7071
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.LLFirStandaloneLibrarySymbolProviderFactory
7172
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory
7273
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getFirResolveSession
73-
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.LLSealedInheritorsProviderFactory
7474
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirLibrarySymbolProviderFactory
75+
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLSealedInheritorsProvider
7576
import org.jetbrains.kotlin.analysis.project.structure.KtModule
7677
import org.jetbrains.kotlin.analysis.project.structure.builder.KtModuleBuilder
7778
import org.jetbrains.kotlin.analysis.project.structure.builder.KtModuleProviderBuilder
@@ -110,7 +111,6 @@ import org.jetbrains.kotlin.config.LanguageVersion
110111
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
111112
import org.jetbrains.kotlin.config.languageVersionSettings
112113
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider
113-
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProviderImpl
114114
import org.jetbrains.kotlin.fir.session.registerResolveComponents
115115
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
116116
import org.jetbrains.kotlin.platform.CommonPlatforms
@@ -328,19 +328,19 @@ class KotlinSymbolProcessing(
328328
KotlinDeclarationProviderFactory::class.java,
329329
IncrementalKotlinDeclarationProviderFactory(this)
330330
)
331+
registerService(
332+
KotlinDirectInheritorsProvider::class.java,
333+
KspStandaloneDirectInheritorsProvider::class.java
334+
)
331335
registerService(
332336
KotlinDeclarationProviderMerger::class.java,
333337
KotlinStaticDeclarationProviderMerger(this)
334338
)
335339
registerService(KotlinPackageProviderFactory::class.java, IncrementalKotlinPackageProviderFactory(project))
336340

337341
registerService(
338-
LLSealedInheritorsProviderFactory::class.java,
339-
object : LLSealedInheritorsProviderFactory {
340-
override fun createSealedInheritorsProvider(): SealedClassInheritorsProvider {
341-
return SealedClassInheritorsProviderImpl
342-
}
343-
}
342+
SealedClassInheritorsProvider::class.java,
343+
LLSealedInheritorsProvider::class.java,
344344
)
345345

346346
registerService(

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/standalone/IncrementalKotlinDeclarationProvider.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,11 @@ class IncrementalKotlinDeclarationProvider(var del: KotlinDeclarationProvider) :
7777
class IncrementalKotlinDeclarationProviderFactory(
7878
private val project: Project,
7979
) : KotlinDeclarationProviderFactory() {
80-
private var provider: IncrementalKotlinDeclarationProvider? = null
80+
var provider: IncrementalKotlinDeclarationProvider? = null
8181
private lateinit var scope: GlobalSearchScope
8282
private var contextualModule: KtModule? = null
8383
private var files: Collection<KtFile> = emptyList()
84-
private lateinit var staticFactory: KotlinDeclarationProviderFactory
84+
lateinit var staticFactory: KotlinDeclarationProviderFactory
8585

8686
override fun createDeclarationProvider(
8787
scope: GlobalSearchScope,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package com.google.devtools.ksp.standalone
2+
3+
import com.intellij.openapi.project.Project
4+
import com.intellij.psi.search.GlobalSearchScope
5+
import org.jetbrains.kotlin.analysis.api.fir.utils.isSubClassOf
6+
import org.jetbrains.kotlin.analysis.api.standalone.base.providers.KotlinStandaloneDirectInheritorsProvider
7+
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirInternals
8+
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionCache
9+
import org.jetbrains.kotlin.analysis.project.structure.KtDanglingFileModule
10+
import org.jetbrains.kotlin.analysis.project.structure.KtModule
11+
import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider
12+
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProviderFactory
13+
import org.jetbrains.kotlin.analysis.providers.KotlinDirectInheritorsProvider
14+
import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticDeclarationProviderFactory
15+
import org.jetbrains.kotlin.fir.declarations.FirClass
16+
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
17+
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
18+
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
19+
import org.jetbrains.kotlin.name.ClassId
20+
import org.jetbrains.kotlin.name.Name
21+
import org.jetbrains.kotlin.psi.KtClass
22+
import org.jetbrains.kotlin.psi.KtClassOrObject
23+
import org.jetbrains.kotlin.psi.psiUtil.contains
24+
25+
// TODO: copied from upstream as a workaround, remove after upstream fixes standalone session builder for KSP.
26+
@OptIn(LLFirInternals::class, SymbolInternals::class)
27+
class KspStandaloneDirectInheritorsProvider(private val project: Project) : KotlinDirectInheritorsProvider {
28+
private val staticDeclarationProviderFactory by lazy {
29+
(
30+
(KotlinDeclarationProviderFactory.getInstance(project) as? IncrementalKotlinDeclarationProviderFactory)
31+
?.staticFactory as? KotlinStaticDeclarationProviderFactory
32+
) ?: error(
33+
"`${KotlinStandaloneDirectInheritorsProvider::class.simpleName}" +
34+
"` expects the following declaration provider factory to be" +
35+
" registered: `${KotlinStaticDeclarationProviderFactory::class.simpleName}`"
36+
)
37+
}
38+
39+
override fun getDirectKotlinInheritors(
40+
ktClass: KtClass,
41+
scope: GlobalSearchScope,
42+
includeLocalInheritors: Boolean,
43+
): Iterable<KtClassOrObject> {
44+
val classId = ktClass.getClassId() ?: return emptyList()
45+
46+
val aliases = mutableSetOf(classId.shortClassName)
47+
calculateAliases(classId.shortClassName, aliases)
48+
49+
val possibleInheritors = aliases.flatMap { staticDeclarationProviderFactory.getDirectInheritorCandidates(it) }
50+
51+
if (possibleInheritors.isEmpty()) {
52+
return emptyList()
53+
}
54+
55+
// The index provides candidates from an original module, not dangling files. If we resolve the supertypes of a candidate in the
56+
// context of its session, we will resolve to FIR classes from non-dangling, original modules. If `ktClass` is inside a dangling
57+
// file, the FIR class for `ktClass` will come from the dangling module. So we'd compare the original FIR class for the supertype
58+
// with the dangling FIR class for `ktClass`, resulting in a mismatch. To avoid such incompatible comparisons, we need to resolve
59+
// `ktClass` to the original FIR class.
60+
//
61+
// Note that this means we don't support providing inheritors based on the dangling file yet, for example if an inheritor was added
62+
// or removed only in the dangling file.
63+
val baseKtModule = when (
64+
val ktModule = ProjectStructureProvider.getModule(project, ktClass, contextualModule = null)
65+
) {
66+
is KtDanglingFileModule -> ktModule.contextModule
67+
else -> ktModule
68+
}
69+
70+
val baseFirClass = ktClass.toFirSymbol(classId, baseKtModule)?.fir as? FirClass ?: return emptyList()
71+
return possibleInheritors.filter { isValidInheritor(it, baseFirClass, scope, includeLocalInheritors) }
72+
}
73+
74+
private fun calculateAliases(aliasedName: Name, aliases: MutableSet<Name>) {
75+
staticDeclarationProviderFactory.getInheritableTypeAliases(aliasedName).forEach { alias ->
76+
val aliasName = alias.nameAsSafeName
77+
val isNewAliasName = aliases.add(aliasName)
78+
if (isNewAliasName) {
79+
calculateAliases(aliasName, aliases)
80+
}
81+
}
82+
}
83+
84+
private fun isValidInheritor(
85+
candidate: KtClassOrObject,
86+
baseFirClass: FirClass,
87+
scope: GlobalSearchScope,
88+
includeLocalInheritors: Boolean,
89+
): Boolean {
90+
if (!includeLocalInheritors && candidate.isLocal) {
91+
return false
92+
}
93+
94+
if (!scope.contains(candidate)) {
95+
return false
96+
}
97+
98+
val candidateClassId = candidate.getClassId() ?: return false
99+
val candidateKtModule = ProjectStructureProvider.getModule(project, candidate, contextualModule = null)
100+
val candidateFirSymbol = candidate.toFirSymbol(candidateClassId, candidateKtModule) ?: return false
101+
val candidateFirClass = candidateFirSymbol.fir as? FirClass ?: return false
102+
103+
return isSubClassOf(
104+
candidateFirClass,
105+
baseFirClass,
106+
candidateFirClass.moduleData.session,
107+
allowIndirectSubtyping = false
108+
)
109+
}
110+
111+
private fun KtClassOrObject.toFirSymbol(classId: ClassId, ktModule: KtModule): FirClassLikeSymbol<*>? {
112+
val session = LLFirSessionCache.getInstance(project).getSession(ktModule, preferBinary = true)
113+
return session.symbolProvider.getClassLikeSymbolByClassId(classId)
114+
}
115+
}

test-utils/src/test/kotlin/com/google/devtools/ksp/test/KSPAATest.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,6 @@ class KSPAATest : AbstractKSPAATest() {
546546
runTest("../kotlin-analysis-api/testData/resolveJavaType.kt")
547547
}
548548

549-
@Disabled
550549
@TestMetadata("sealedClass.kt")
551550
@Test
552551
fun testSealedClass() {

0 commit comments

Comments
 (0)