FIR IDE: introduce composite scopes
This commit is contained in:
@@ -22,6 +22,10 @@ interface KtScope : ValidityOwner {
|
|||||||
fun containsName(name: Name): Boolean
|
fun containsName(name: Name): Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface KtCompositeScope : KtScope {
|
||||||
|
val subScopes: List<KtScope>
|
||||||
|
}
|
||||||
|
|
||||||
interface KtMemberScope : KtScope {
|
interface KtMemberScope : KtScope {
|
||||||
val owner: KtClassOrObjectSymbol
|
val owner: KtClassOrObjectSymbol
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -13,4 +13,5 @@ abstract class KtScopeProvider : ValidityOwner {
|
|||||||
abstract fun getMemberScope(classSymbol: KtClassOrObjectSymbol): KtMemberScope
|
abstract fun getMemberScope(classSymbol: KtClassOrObjectSymbol): KtMemberScope
|
||||||
abstract fun getDeclaredMemberScope(classSymbol: KtClassOrObjectSymbol): KtDeclaredMemberScope
|
abstract fun getDeclaredMemberScope(classSymbol: KtClassOrObjectSymbol): KtDeclaredMemberScope
|
||||||
abstract fun getPackageScope(packageSymbol: KtPackageSymbol): KtPackageScope
|
abstract fun getPackageScope(packageSymbol: KtPackageSymbol): KtPackageScope
|
||||||
|
abstract fun getCompositeScope(subScopes: List<KtScope>): KtCompositeScope
|
||||||
}
|
}
|
||||||
+63
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* 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.idea.frontend.api.fir.scopes
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtCompositeScope
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScope
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
|
||||||
|
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
|
||||||
|
// todo do we need caches here?
|
||||||
|
@OptIn(ExperimentalStdlibApi::class)
|
||||||
|
class KtFirCompositeScope(
|
||||||
|
override val subScopes: List<KtScope>,
|
||||||
|
override val token: ValidityOwner
|
||||||
|
) : KtCompositeScope, ValidityOwnerByValidityToken {
|
||||||
|
override fun getAllNames(): Set<Name> = withValidityAssertion {
|
||||||
|
buildSet {
|
||||||
|
subScopes.flatMapTo(this) { it.getAllNames() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getCallableNames(): Set<Name> = withValidityAssertion {
|
||||||
|
buildSet {
|
||||||
|
subScopes.flatMapTo(this) { it.getCallableNames() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getClassLikeSymbolNames(): Set<Name> = withValidityAssertion {
|
||||||
|
buildSet {
|
||||||
|
subScopes.flatMapTo(this) { it.getClassLikeSymbolNames() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAllSymbols(): Sequence<KtSymbol> = withValidityAssertion {
|
||||||
|
sequence {
|
||||||
|
subScopes.forEach { yieldAll(it.getAllSymbols()) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getCallableSymbols(): Sequence<KtSymbol> = withValidityAssertion {
|
||||||
|
sequence {
|
||||||
|
subScopes.forEach { yieldAll(it.getCallableSymbols()) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getClassClassLikeSymbols(): Sequence<KtClassLikeSymbol> = withValidityAssertion {
|
||||||
|
sequence {
|
||||||
|
subScopes.forEach { yieldAll(it.getClassClassLikeSymbols()) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun containsName(name: Name): Boolean = withValidityAssertion {
|
||||||
|
subScopes.any { it.containsName(name) }
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
-4
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
|
|||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol
|
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirPackageSymbol
|
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirPackageSymbol
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
|
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtDeclaredMemberScope
|
import org.jetbrains.kotlin.idea.frontend.api.scopes.*
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtMemberScope
|
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtPackageScope
|
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScopeProvider
|
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
|
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
|
||||||
@@ -52,4 +49,8 @@ internal class KtFirScopeProvider(
|
|||||||
KtFirPackageScope(packageSymbol, token, builder, session)
|
KtFirPackageScope(packageSymbol, token, builder, session)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getCompositeScope(subScopes: List<KtScope>): KtCompositeScope = withValidityAssertion {
|
||||||
|
KtFirCompositeScope(subScopes, token)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user