From 75d8710bf6e98742ab7a008547b24848f03aa391 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Wed, 16 Sep 2020 13:19:50 +0300 Subject: [PATCH] FIR IDE: Add name filtering to scope `KtScope` and implementations --- .../kotlin/idea/frontend/api/scopes/KtScope.kt | 6 ++++-- .../frontend/api/fir/scopes/KtFirCompositeScope.kt | 10 +++++----- .../frontend/api/fir/scopes/KtFirDelegatingScope.kt | 10 +++++----- .../api/fir/scopes/KtFirNonStarImportingScope.kt | 10 +++++----- .../frontend/api/fir/scopes/KtFirPackageScope.kt | 10 +++++----- .../api/fir/scopes/KtFirStarImportingScope.kt | 13 +++++-------- 6 files changed, 29 insertions(+), 30 deletions(-) diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/scopes/KtScope.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/scopes/KtScope.kt index adab0e086b3..f73e5b2267b 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/scopes/KtScope.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/scopes/KtScope.kt @@ -27,14 +27,16 @@ interface KtScope : ValidityTokenOwner { } } - fun getCallableSymbols(): Sequence - fun getClassifierSymbols(): Sequence + fun getCallableSymbols(nameFilter: KtScopeNameFilter = { true }): Sequence + fun getClassifierSymbols(nameFilter: KtScopeNameFilter = { true }): Sequence fun containsName(name: Name): Boolean = withValidityAssertion { name in getCallableNames() || name in getClassifierNames() } } +typealias KtScopeNameFilter = (Name) -> Boolean + interface KtCompositeScope : KtScope { val subScopes: List } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirCompositeScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirCompositeScope.kt index d0d9dd59de3..1c3f554c0a6 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirCompositeScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirCompositeScope.kt @@ -9,8 +9,8 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken 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.scopes.KtScopeNameFilter import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassifierSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion @@ -47,15 +47,15 @@ class KtFirCompositeScope( } } - override fun getCallableSymbols(): Sequence = withValidityAssertion { + override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { sequence { - subScopes.forEach { yieldAll(it.getCallableSymbols()) } + subScopes.forEach { yieldAll(it.getCallableSymbols(nameFilter)) } } } - override fun getClassifierSymbols(): Sequence = withValidityAssertion { + override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { sequence { - subScopes.forEach { yieldAll(it.getClassifierSymbols()) } + subScopes.forEach { yieldAll(it.getClassifierSymbols(nameFilter)) } } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt index 4bdd5f3bf45..10e0e1a6005 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt @@ -14,8 +14,8 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScope +import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScopeNameFilter import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassifierSymbol import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.name.Name @@ -41,12 +41,12 @@ internal abstract class KtFirDelegatingScope( firScope.getClassifierNames() } - override fun getCallableSymbols(): Sequence = withValidityAssertion { - firScope.getCallableSymbols(getCallableNames(), builder) + override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { + firScope.getCallableSymbols(getCallableNames().filter(nameFilter), builder) } - override fun getClassifierSymbols(): Sequence = withValidityAssertion { - firScope.getClassifierSymbols(getClassifierNames(), builder) + override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { + firScope.getClassifierSymbols(getClassifierNames().filter(nameFilter), builder) } override fun containsName(name: Name): Boolean = withValidityAssertion { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirNonStarImportingScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirNonStarImportingScope.kt index 02edb7ef307..33cee8042e4 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirNonStarImportingScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirNonStarImportingScope.kt @@ -13,9 +13,9 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.scopes.KtNonStarImportingScope +import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScopeNameFilter import org.jetbrains.kotlin.idea.frontend.api.scopes.NonStarImport import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassifierSymbol import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.name.Name @@ -43,12 +43,12 @@ internal class KtFirNonStarImportingScope( } } - override fun getCallableSymbols(): Sequence = withValidityAssertion { - firScope.getCallableSymbols(getCallableNames(), builder) + override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { + firScope.getCallableSymbols(getCallableNames().filter(nameFilter), builder) } - override fun getClassifierSymbols(): Sequence = withValidityAssertion { - firScope.getClassifierSymbols(getClassifierNames(), builder) + override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { + firScope.getClassifierSymbols(getClassifierNames().filter(nameFilter), builder) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt index 96404648346..a039c7943fa 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirPackageScope.kt @@ -12,8 +12,8 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.scopes.KtPackageScope +import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScopeNameFilter import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassifierSymbol import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelClassByPackageIndex @@ -45,11 +45,11 @@ internal class KtFirPackageScope( .mapNotNullTo(hashSetOf()) { it.nameAsName } } - override fun getCallableSymbols(): Sequence = withValidityAssertion { - firScope.getCallableSymbols(getCallableNames(), builder) + override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { + firScope.getCallableSymbols(getCallableNames().filter(nameFilter), builder) } - override fun getClassifierSymbols(): Sequence = withValidityAssertion { - firScope.getClassifierSymbols(getClassifierNames(), builder) + override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { + firScope.getClassifierSymbols(getClassifierNames().filter(nameFilter), builder) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt index 9274e68cbac..f1e255166a0 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirStarImportingScope.kt @@ -16,11 +16,8 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef -import org.jetbrains.kotlin.idea.frontend.api.scopes.Import -import org.jetbrains.kotlin.idea.frontend.api.scopes.KtStarImportingScope -import org.jetbrains.kotlin.idea.frontend.api.scopes.StarImport +import org.jetbrains.kotlin.idea.frontend.api.scopes.* import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassifierSymbol import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelClassByPackageIndex @@ -51,12 +48,12 @@ internal class KtFirStarImportingScope( } } - override fun getCallableSymbols(): Sequence = withValidityAssertion { - firScope.getCallableSymbols(getCallableNames(), builder) + override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { + firScope.getCallableSymbols(getCallableNames().filter(nameFilter), builder) } - override fun getClassifierSymbols(): Sequence = withValidityAssertion { - firScope.getClassifierSymbols(getClassifierNames(), builder) + override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { + firScope.getClassifierSymbols(getClassifierNames().filter(nameFilter), builder) } // todo cache?