diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingTypeScope.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingTypeScope.kt index db9b45bb0ec..dcca4cd2506 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingTypeScope.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingTypeScope.kt @@ -41,10 +41,18 @@ internal open class KtFirDelegatingTypeScope( firScope.getCallableSignatures(getPossibleCallableNames().filter(nameFilter), builder) } + override fun getCallableSignatures(names: Collection): Sequence> = withValidityAssertion { + firScope.getCallableSignatures(names, builder) + } + override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { firScope.getClassifierSymbols(getPossibleClassifierNames().filter(nameFilter), builder) } + override fun getClassifierSymbols(names: Collection): Sequence = withValidityAssertion { + firScope.getClassifierSymbols(names, builder) + } + override fun getConstructors(): Sequence = withValidityAssertion { firScope.getConstructors(builder) } diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeTypeScope.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeTypeScope.kt index b32cca406d5..71bc164f02e 100644 --- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeTypeScope.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/scopes/KtCompositeTypeScope.kt @@ -11,7 +11,8 @@ import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.scopes.KtScopeNameFilter import org.jetbrains.kotlin.analysis.api.scopes.KtTypeScope import org.jetbrains.kotlin.analysis.api.signatures.KtCallableSignature -import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.symbols.KtClassifierSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.name.Name @KtAnalysisApiInternals @@ -44,12 +45,24 @@ class KtCompositeTypeScope( } } + override fun getCallableSignatures(names: Collection): Sequence> = withValidityAssertion { + sequence { + subScopes.forEach { yieldAll(it.getCallableSignatures(names)) } + } + } + override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { sequence { subScopes.forEach { yieldAll(it.getClassifierSymbols(nameFilter)) } } } + override fun getClassifierSymbols(names: Collection): Sequence = withValidityAssertion { + sequence { + subScopes.forEach { yieldAll(it.getClassifierSymbols(names)) } + } + } + override fun getConstructors(): Sequence = withValidityAssertion { sequence { subScopes.forEach { yieldAll(it.getConstructors()) } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/scopes/KtTypeScope.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/scopes/KtTypeScope.kt index d35044844d4..371a7dfe650 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/scopes/KtTypeScope.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/scopes/KtTypeScope.kt @@ -5,9 +5,11 @@ package org.jetbrains.kotlin.analysis.api.scopes +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.signatures.KtCallableSignature import org.jetbrains.kotlin.analysis.api.symbols.KtClassifierSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol -import org.jetbrains.kotlin.analysis.api.signatures.KtCallableSignature +import org.jetbrains.kotlin.name.Name /** * A scope inside which use-site type-parameters of callable declarations may be substituted. Such declarations are represented as [KtCallableSignature]. @@ -22,12 +24,49 @@ public interface KtTypeScope : KtScopeLike { */ public fun getCallableSignatures(nameFilter: KtScopeNameFilter = { true }): Sequence> + /** + * Return a sequence of [KtCallableSignature] which current scope contain if declaration, if declaration name present in [names] + * + * This implementation is more optimal than the one with `nameFilter` and should be used when the candidate name set is known. + */ + public fun getCallableSignatures(names: Collection): Sequence> + + /** + * Return a sequence of [KtCallableSignature] which current scope contain if declaration, if declaration name present in [names] + * + * @see getCallableSignatures + */ + public fun getCallableSignatures(vararg names: Name): Sequence> = withValidityAssertion { + getCallableSignatures(names.toList()) + } + /** * Return a sequence of [KtClassifierSymbol] which current scope contain if classifier name matches [nameFilter]. The sequence includes: * nested classes, inner classes, nested type aliases for the class scope, and top-level classes and top-level type aliases for file scope. + * + * This function needs to retrieve a set of all possible names before processing the scope. + * The overload with `names: Collection` should be used when the candidate name set is known. */ public fun getClassifierSymbols(nameFilter: KtScopeNameFilter = { true }): Sequence + /** + * Return a sequence of [KtClassifierSymbol] which current scope contains, if classifier name present in [names]. + * + * The sequence includes: nested classes, inner classes, nested type aliases for the class scope, + * and top-level classes and top-level type aliases for file scope. + * + * This implementation is more optimal than the one with `nameFilter` and should be used when the candidate name set is known. + */ + public fun getClassifierSymbols(names: Collection): Sequence + + /** + * Return a sequence of [KtClassifierSymbol] which current scope contains, if classifier name present in [names]. + * + * @see getClassifierSymbols + */ + public fun getClassifierSymbols(vararg names: Name): Sequence = + getClassifierSymbols(names.toList()) + /** * Return a sequence of [KtConstructorSymbol] which current scope contain */