diff --git a/platform/polySymbols/api-dump-experimental.txt b/platform/polySymbols/api-dump-experimental.txt index 975d3a4d7964..1369c7e6db32 100644 --- a/platform/polySymbols/api-dump-experimental.txt +++ b/platform/polySymbols/api-dump-experimental.txt @@ -4,7 +4,6 @@ *:com.intellij.polySymbols.PolySymbol - com.intellij.model.Symbol - com.intellij.navigation.NavigatableSymbol -- com.intellij.polySymbols.PolySymbolsScope - com.intellij.polySymbols.utils.PolySymbolsPrioritizedScope - *sf:Companion:com.intellij.polySymbols.PolySymbol$Companion - sf:PROP_DOC_HIDE_PATTERN:com.intellij.polySymbols.PolySymbolProperty @@ -18,7 +17,6 @@ - getApiStatus():com.intellij.polySymbols.PolySymbolApiStatus - getDocumentationTarget(com.intellij.psi.PsiElement):com.intellij.platform.backend.documentation.DocumentationTarget - getIcon():javax.swing.Icon -- getModificationCount():J - getModifiers():java.util.Set - a:getName():java.lang.String - getNavigationTargets(com.intellij.openapi.project.Project):java.util.Collection @@ -251,13 +249,6 @@ - sf:BUNDLE:java.lang.String - s:message(java.lang.String,java.lang.Object[]):java.lang.String - s:messagePointer(java.lang.String,java.lang.Object[]):java.util.function.Supplier -*:com.intellij.polySymbols.PolySymbolsScope -- com.intellij.openapi.util.ModificationTracker -- a:createPointer():com.intellij.model.Pointer -- getCodeCompletions(com.intellij.polySymbols.PolySymbolQualifiedName,com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams,com.intellij.util.containers.Stack):java.util.List -- getMatchingSymbols(com.intellij.polySymbols.PolySymbolQualifiedName,com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams,com.intellij.util.containers.Stack):java.util.List -- getSymbols(com.intellij.polySymbols.PolySymbolQualifiedKind,com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams,com.intellij.util.containers.Stack):java.util.List -- isExclusiveFor(com.intellij.polySymbols.PolySymbolQualifiedKind):Z *:com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem - *sf:Companion:com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem$Companion - a:addToResult(com.intellij.codeInsight.completion.CompletionParameters,com.intellij.codeInsight.completion.CompletionResultSet,D):V @@ -449,7 +440,10 @@ - sf:PROP_CSS_ARGUMENTS:com.intellij.polySymbols.PolySymbolProperty *:com.intellij.polySymbols.customElements.CustomElementsSymbol - com.intellij.polySymbols.documentation.PolySymbolWithDocumentation +- com.intellij.polySymbols.query.PolySymbolsScope - *sf:Companion:com.intellij.polySymbols.customElements.CustomElementsSymbol$Companion +- a:createPointer():com.intellij.model.Pointer +- getModificationCount():J *f:com.intellij.polySymbols.customElements.CustomElementsSymbol$Companion - f:getCEM_DECLARATIONS():com.intellij.polySymbols.PolySymbolQualifiedKind - f:getCEM_MODULES():com.intellij.polySymbols.PolySymbolQualifiedKind @@ -701,7 +695,7 @@ - f:create(com.intellij.polySymbols.query.PolySymbolsQueryExecutor,I,kotlin.jvm.functions.Function1):com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams - bs:create$default(com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams$Companion,com.intellij.polySymbols.query.PolySymbolsQueryExecutor,I,kotlin.jvm.functions.Function1,I,java.lang.Object):com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams *a:com.intellij.polySymbols.query.PolySymbolsCompoundScope -- com.intellij.polySymbols.PolySymbolsScope +- com.intellij.polySymbols.query.PolySymbolsScope - ():V - pa:build(com.intellij.polySymbols.query.PolySymbolsQueryExecutor,kotlin.jvm.functions.Function1):V - a:createPointer():com.intellij.model.Pointer @@ -794,13 +788,13 @@ - a:run():java.util.List *:com.intellij.polySymbols.query.PolySymbolsQueryExecutor$QueryBuilder - com.intellij.polySymbols.query.PolySymbolsQueryParams$Builder -- a:additionalScope(com.intellij.polySymbols.PolySymbolsScope):java.lang.Object +- a:additionalScope(com.intellij.polySymbols.query.PolySymbolsScope):java.lang.Object - a:additionalScope(java.util.Collection):java.lang.Object -- a:additionalScope(com.intellij.polySymbols.PolySymbolsScope[]):java.lang.Object +- a:additionalScope(com.intellij.polySymbols.query.PolySymbolsScope[]):java.lang.Object *:com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory - com.intellij.openapi.Disposable - *sf:Companion:com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory$Companion -- a:addScope(com.intellij.polySymbols.PolySymbolsScope,com.intellij.openapi.vfs.VirtualFile,com.intellij.openapi.Disposable):V +- a:addScope(com.intellij.polySymbols.query.PolySymbolsScope,com.intellij.openapi.vfs.VirtualFile,com.intellij.openapi.Disposable):V - a:create(com.intellij.psi.PsiElement,Z):com.intellij.polySymbols.query.PolySymbolsQueryExecutor - bs:create$default(com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory,com.intellij.psi.PsiElement,Z,I,java.lang.Object):com.intellij.polySymbols.query.PolySymbolsQueryExecutor - s:getInstance(com.intellij.openapi.project.Project):com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory @@ -814,7 +808,7 @@ - a:addCustomizer(com.intellij.polySymbols.query.PolySymbolsQueryResultsCustomizer):com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory$PolySymbolsQueryExecutorBuilder - a:addNameConversionRules(com.intellij.polySymbols.query.PolySymbolNameConversionRules):com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory$PolySymbolsQueryExecutorBuilder - a:addPolyContext(java.lang.String,java.lang.String):com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory$PolySymbolsQueryExecutorBuilder -- a:addRootScope(com.intellij.polySymbols.PolySymbolsScope):com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory$PolySymbolsQueryExecutorBuilder +- a:addRootScope(com.intellij.polySymbols.query.PolySymbolsScope):com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory$PolySymbolsQueryExecutorBuilder - a:addRootScopes(java.util.List):com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory$PolySymbolsQueryExecutorBuilder - a:allowResolve(Z):com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory$PolySymbolsQueryExecutorBuilder - a:create():com.intellij.polySymbols.query.PolySymbolsQueryExecutor @@ -856,6 +850,13 @@ - s:getQueryResultsCustomizer(com.intellij.psi.PsiElement,com.intellij.polySymbols.context.PolyContext):com.intellij.polySymbols.query.PolySymbolsQueryResultsCustomizer *f:com.intellij.polySymbols.query.PolySymbolsQueryResultsCustomizerFactory$Companion - f:getQueryResultsCustomizer(com.intellij.psi.PsiElement,com.intellij.polySymbols.context.PolyContext):com.intellij.polySymbols.query.PolySymbolsQueryResultsCustomizer +*:com.intellij.polySymbols.query.PolySymbolsScope +- com.intellij.openapi.util.ModificationTracker +- a:createPointer():com.intellij.model.Pointer +- getCodeCompletions(com.intellij.polySymbols.PolySymbolQualifiedName,com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams,com.intellij.util.containers.Stack):java.util.List +- getMatchingSymbols(com.intellij.polySymbols.PolySymbolQualifiedName,com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams,com.intellij.util.containers.Stack):java.util.List +- getSymbols(com.intellij.polySymbols.PolySymbolQualifiedKind,com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams,com.intellij.util.containers.Stack):java.util.List +- isExclusiveFor(com.intellij.polySymbols.PolySymbolQualifiedKind):Z *:com.intellij.polySymbols.refactoring.PolySymbolRenameTarget - com.intellij.refactoring.rename.api.RenameTarget - *sf:Companion:com.intellij.polySymbols.refactoring.PolySymbolRenameTarget$Companion @@ -910,7 +911,9 @@ - navigationRequest():com.intellij.platform.backend.navigation.NavigationRequest *:com.intellij.polySymbols.utils.PolySymbolDelegate - com.intellij.polySymbols.PolySymbol +- com.intellij.polySymbols.query.PolySymbolsScope - *sf:Companion:com.intellij.polySymbols.utils.PolySymbolDelegate$Companion +- a:createPointer():com.intellij.model.Pointer - get(com.intellij.polySymbols.PolySymbolProperty):java.lang.Object - getAccessModifier():com.intellij.polySymbols.PolySymbolAccessModifier - getApiStatus():com.intellij.polySymbols.PolySymbolApiStatus @@ -942,6 +945,7 @@ - com.intellij.polySymbols.documentation.PolySymbolWithDocumentation - com.intellij.polySymbols.utils.PolySymbolDelegate - createDocumentation(com.intellij.psi.PsiElement):com.intellij.polySymbols.documentation.PolySymbolDocumentation +- a:createPointer():com.intellij.model.Pointer - getDefaultValue():java.lang.String - getDescription():java.lang.String - getDescriptionSections():java.util.Map @@ -965,7 +969,7 @@ - sf:coalesceWith(com.intellij.polySymbols.PolySymbolApiStatus,com.intellij.polySymbols.PolySymbolApiStatus):com.intellij.polySymbols.PolySymbolApiStatus - sf:createPsiRangeNavigationItem(com.intellij.platform.backend.navigation.NavigationTarget,com.intellij.psi.PsiElement,I):com.intellij.pom.Navigatable - sf:getCompleteMatch(com.intellij.polySymbols.PolySymbol):Z -- sf:getDefaultCodeCompletions(com.intellij.polySymbols.PolySymbolsScope,com.intellij.polySymbols.PolySymbolQualifiedName,com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams,com.intellij.util.containers.Stack):java.util.List +- sf:getDefaultCodeCompletions(com.intellij.polySymbols.query.PolySymbolsScope,com.intellij.polySymbols.PolySymbolQualifiedName,com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams,com.intellij.util.containers.Stack):java.util.List - sf:getHideFromCompletion(com.intellij.polySymbols.PolySymbol):Z - sf:getKind(com.intellij.polySymbols.PolySymbol):java.lang.String - sf:getNameSegments(com.intellij.polySymbols.PolySymbol):java.util.List @@ -981,12 +985,12 @@ - sf:unwrapMatchedSymbols(com.intellij.polySymbols.PolySymbol):kotlin.sequences.Sequence - sf:withMatchedKind(com.intellij.polySymbols.PolySymbol,com.intellij.polySymbols.PolySymbolQualifiedKind):com.intellij.polySymbols.PolySymbol - sf:withMatchedName(com.intellij.polySymbols.PolySymbol,java.lang.String):com.intellij.polySymbols.PolySymbol -- sf:withNavigationTarget(com.intellij.polySymbols.PolySymbol,com.intellij.psi.PsiElement):com.intellij.polySymbols.PolySymbol +- sf:withNavigationTarget(com.intellij.polySymbols.PolySymbol,com.intellij.psi.PsiElement):com.intellij.polySymbols.utils.PolySymbolDelegate - sf:withOffset(java.util.List,I):java.util.List - sf:withSegments(com.intellij.polySymbols.query.PolySymbolMatch,java.util.List):com.intellij.polySymbols.query.PolySymbolMatch - sf:withSymbols(com.intellij.polySymbols.PolySymbolNameSegment,java.util.List):com.intellij.polySymbols.PolySymbolNameSegment *a:com.intellij.polySymbols.utils.PolySymbolsIsolatedMappingScope -- com.intellij.polySymbols.PolySymbolsScope +- com.intellij.polySymbols.query.PolySymbolsScope - (java.util.Map,java.lang.String,com.intellij.psi.PsiElement):V - pa:acceptSymbol(com.intellij.polySymbols.PolySymbol):Z - f:equals(java.lang.Object):Z @@ -1002,7 +1006,7 @@ *:com.intellij.polySymbols.utils.PolySymbolsPrioritizedScope - a:getPriority():com.intellij.polySymbols.PolySymbol$Priority *a:com.intellij.polySymbols.utils.PolySymbolsScopeWithCache -- com.intellij.polySymbols.PolySymbolsScope +- com.intellij.polySymbols.query.PolySymbolsScope - (java.lang.String,com.intellij.openapi.project.Project,com.intellij.openapi.util.UserDataHolder,java.lang.Object):V - a:createPointer():com.intellij.model.Pointer - equals(java.lang.Object):Z @@ -1032,7 +1036,7 @@ - pa:getScopesBuilderProvider():kotlin.jvm.functions.Function2 - hashCode():I *p:com.intellij.polySymbols.utils.PolySymbolsStructuredScope$PolySymbolsPsiScope -- com.intellij.polySymbols.PolySymbolsScope +- com.intellij.polySymbols.query.PolySymbolsScope - a:getAllSymbols(com.intellij.polySymbols.PolySymbolQualifiedKind):java.util.List - a:getChildren():java.util.List - a:getLocalSymbols():java.util.List @@ -1056,11 +1060,13 @@ *:com.intellij.polySymbols.utils.PsiSourcedPolySymbolDelegate - com.intellij.polySymbols.search.PsiSourcedPolySymbol - com.intellij.polySymbols.utils.PolySymbolDelegate +- a:createPointer():com.intellij.model.Pointer - getNavigationTargets(com.intellij.openapi.project.Project):java.util.Collection - getPsiContext():com.intellij.psi.PsiElement - getSource():com.intellij.psi.PsiElement *:com.intellij.polySymbols.webTypes.WebTypesSymbol - com.intellij.polySymbols.documentation.PolySymbolWithDocumentation +- com.intellij.polySymbols.query.PolySymbolsScope - com.intellij.polySymbols.search.PsiSourcedPolySymbol - *sf:Companion:com.intellij.polySymbols.webTypes.WebTypesSymbol$Companion - sf:PROP_NO_DOC:com.intellij.polySymbols.PolySymbolProperty @@ -1118,6 +1124,7 @@ - f:getIcon():javax.swing.Icon - f:getLocation():com.intellij.polySymbols.webTypes.WebTypesSymbol$Location - f:getMatchingSymbols(com.intellij.polySymbols.PolySymbolQualifiedName,com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams,com.intellij.util.containers.Stack):java.util.List +- getModificationCount():J - getModifiers():java.util.Set - f:getName():java.lang.String - f:getOrigin():com.intellij.polySymbols.PolySymbolOrigin diff --git a/platform/polySymbols/backend/src/com/intellij/polySymbols/completion/PolySymbolsCompletionProviderBase.kt b/platform/polySymbols/backend/src/com/intellij/polySymbols/completion/PolySymbolsCompletionProviderBase.kt index 5ed53aadae33..afb049461b62 100644 --- a/platform/polySymbols/backend/src/com/intellij/polySymbols/completion/PolySymbolsCompletionProviderBase.kt +++ b/platform/polySymbols/backend/src/com/intellij/polySymbols/completion/PolySymbolsCompletionProviderBase.kt @@ -13,10 +13,10 @@ import com.intellij.openapi.util.getAndUpdateUserData import com.intellij.patterns.StandardPatterns import com.intellij.polySymbols.FrameworkId import com.intellij.polySymbols.PolySymbolQualifiedKind -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItemCustomizer.Companion.customizeItems import com.intellij.polySymbols.query.PolySymbolsQueryExecutor import com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.psi.PsiElement import com.intellij.psi.util.startOffset import com.intellij.util.ProcessingContext @@ -72,6 +72,7 @@ abstract class PolySymbolsCompletionProviderBase : CompletionPro fun isFurtherCodeCompletionPreventedFor(parameters: CompletionParameters, vararg qualifiedKind: PolySymbolQualifiedKind): Boolean = (parameters.process as CompletionProcessEx).getUserData(preventedCodeCompletionsKey) ?.let { prevented -> qualifiedKind.any { prevented.contains(it) } } == true + @JvmStatic fun processCompletionQueryResults( queryExecutor: PolySymbolsQueryExecutor, diff --git a/platform/polySymbols/backend/src/com/intellij/polySymbols/patterns/PolySymbolsPatternReferenceResolver.kt b/platform/polySymbols/backend/src/com/intellij/polySymbols/patterns/PolySymbolsPatternReferenceResolver.kt index a8b64f14f38e..b2bd88931e06 100644 --- a/platform/polySymbols/backend/src/com/intellij/polySymbols/patterns/PolySymbolsPatternReferenceResolver.kt +++ b/platform/polySymbols/backend/src/com/intellij/polySymbols/patterns/PolySymbolsPatternReferenceResolver.kt @@ -1,12 +1,16 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.patterns -import com.intellij.polySymbols.* +import com.intellij.polySymbols.PolySymbol +import com.intellij.polySymbols.PolySymbolModifier +import com.intellij.polySymbols.PolySymbolQualifiedKind +import com.intellij.polySymbols.PolySymbolQualifiedName import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.impl.canUnwrapSymbols import com.intellij.polySymbols.query.PolySymbolMatch import com.intellij.polySymbols.query.PolySymbolNameConversionRules import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.webTypes.filters.PolySymbolsFilter import com.intellij.util.containers.Stack import org.jetbrains.annotations.ApiStatus diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/CustomElementsSymbol.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/CustomElementsSymbol.kt index 49f79467ee20..dc1c7fda1e4b 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/CustomElementsSymbol.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/CustomElementsSymbol.kt @@ -1,11 +1,16 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.customElements +import com.intellij.model.Pointer import com.intellij.polySymbols.PolySymbolQualifiedKind import com.intellij.polySymbols.documentation.PolySymbolWithDocumentation +import com.intellij.polySymbols.query.PolySymbolsScope -interface CustomElementsSymbol : PolySymbolWithDocumentation { +interface CustomElementsSymbol : PolySymbolWithDocumentation, PolySymbolsScope { + override fun createPointer(): Pointer + + override fun getModificationCount(): Long = 0 companion object { diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/impl/CustomElementsClassOrMixinDeclarationAdapter.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/impl/CustomElementsClassOrMixinDeclarationAdapter.kt index 0279148a7a30..ffc7fb2b69fc 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/impl/CustomElementsClassOrMixinDeclarationAdapter.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/impl/CustomElementsClassOrMixinDeclarationAdapter.kt @@ -14,10 +14,7 @@ import com.intellij.polySymbols.customElements.json.toApiStatus import com.intellij.polySymbols.documentation.PolySymbolWithDocumentation import com.intellij.polySymbols.impl.StaticPolySymbolsScopeBase import com.intellij.polySymbols.patterns.PolySymbolsPattern -import com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams -import com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams -import com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams -import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.* import com.intellij.polySymbols.search.PsiSourcedPolySymbol import com.intellij.psi.PsiElement import com.intellij.util.containers.Stack @@ -70,6 +67,8 @@ class CustomElementsClassOrMixinDeclarationAdapter private constructor( .toList() .also { contributions -> _superContributions = contributions } + override fun getModificationCount(): Long = 0 + override val origin: CustomElementsJsonOrigin get() = base.origin @@ -121,7 +120,7 @@ class CustomElementsClassOrMixinDeclarationAdapter private constructor( qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams, scope: Stack, - ): List = + ): List = base.rootScope .getSymbols(base.declaration, this.origin, qualifiedKind, params) .toList() diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/impl/CustomElementsContainerSymbolBase.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/impl/CustomElementsContainerSymbolBase.kt index 15a0c7c46c91..0936fc20bbce 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/impl/CustomElementsContainerSymbolBase.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/customElements/impl/CustomElementsContainerSymbolBase.kt @@ -2,11 +2,9 @@ package com.intellij.polySymbols.customElements.impl import com.intellij.model.Pointer -import com.intellij.util.containers.Stack import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolQualifiedKind import com.intellij.polySymbols.PolySymbolQualifiedName -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.customElements.CustomElementsJsonOrigin import com.intellij.polySymbols.customElements.CustomElementsManifestScopeBase @@ -14,7 +12,8 @@ import com.intellij.polySymbols.customElements.json.CustomElementsContribution import com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams import com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams import com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams -import java.util.* +import com.intellij.polySymbols.query.PolySymbolsScope +import com.intellij.util.containers.Stack abstract class CustomElementsContainerSymbolBase protected constructor( name: String, @@ -23,23 +22,29 @@ abstract class CustomElementsContainerSymbolBase(name, container, origin) { - override fun getMatchingSymbols(qualifiedName: PolySymbolQualifiedName, - params: PolySymbolsNameMatchQueryParams, - scope: Stack): List = + override fun getMatchingSymbols( + qualifiedName: PolySymbolQualifiedName, + params: PolySymbolsNameMatchQueryParams, + scope: Stack, + ): List = rootScope .getMatchingSymbols(contribution, this.origin, qualifiedName, params, scope) .toList() - override fun getSymbols(qualifiedKind: PolySymbolQualifiedKind, - params: PolySymbolsListSymbolsQueryParams, - scope: Stack): List = + override fun getSymbols( + qualifiedKind: PolySymbolQualifiedKind, + params: PolySymbolsListSymbolsQueryParams, + scope: Stack, + ): List = rootScope .getSymbols(contribution, this.origin, qualifiedKind, params) .toList() - override fun getCodeCompletions(qualifiedName: PolySymbolQualifiedName, - params: PolySymbolsCodeCompletionQueryParams, - scope: Stack): List = + override fun getCodeCompletions( + qualifiedName: PolySymbolQualifiedName, + params: PolySymbolsCodeCompletionQueryParams, + scope: Stack, + ): List = rootScope .getCodeCompletions(contribution, this.origin, qualifiedName, params, scope) .toList() diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbol.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbol.kt index 53979473893c..dc14c81a6a81 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbol.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbol.kt @@ -9,10 +9,11 @@ import com.intellij.polySymbols.documentation.PolySymbolWithDocumentation import com.intellij.polySymbols.documentation.impl.PolySymbolDocumentationTargetImpl import com.intellij.polySymbols.js.JS_PROPERTIES import com.intellij.polySymbols.js.JS_STRING_LITERALS +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.search.PsiSourcedPolySymbol import com.intellij.psi.PsiElement -interface WebTypesSymbol : PsiSourcedPolySymbol, PolySymbolWithDocumentation { +interface WebTypesSymbol : PsiSourcedPolySymbol, PolySymbolWithDocumentation, PolySymbolsScope { val location: Location? diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbolBase.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbolBase.kt index 45209db1dfac..616f3fc0978a 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbolBase.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbolBase.kt @@ -11,10 +11,7 @@ import com.intellij.polySymbols.html.PROP_HTML_ATTRIBUTE_VALUE import com.intellij.polySymbols.html.PolySymbolHtmlAttributeValue import com.intellij.polySymbols.html.htmlAttributeValue import com.intellij.polySymbols.patterns.PolySymbolsPattern -import com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams -import com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams -import com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams -import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.* import com.intellij.polySymbols.utils.merge import com.intellij.polySymbols.webTypes.impl.WebTypesJsonContributionAdapter import com.intellij.polySymbols.webTypes.impl.wrap @@ -72,6 +69,8 @@ open class WebTypesSymbolBase : WebTypesSymbol { override fun toString(): String = base.toString() + override fun getModificationCount(): Long = 0 + override fun equals(other: Any?): Boolean = other === this || other is WebTypesSymbolBase @@ -110,7 +109,7 @@ open class WebTypesSymbolBase : WebTypesSymbol { qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams, scope: Stack, - ): List = + ): List = base.rootScope .getSymbols(base.contributionForQuery, this.origin as WebTypesJsonOrigin, qualifiedKind, params) .toList() @@ -210,7 +209,7 @@ open class WebTypesSymbolBase : WebTypesSymbol { final override fun isExclusiveFor(qualifiedKind: PolySymbolQualifiedKind): Boolean = base.isExclusiveFor(qualifiedKind) - || superContributions.any { it.isExclusiveFor(qualifiedKind) } + || superContributions.flatMap { it.queryScope }.any { it.isExclusiveFor(qualifiedKind) } override fun matchContext(context: PolyContext): Boolean = super.matchContext(context) && base.contribution.requiredContext.evaluate(context) diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/filters/PolySymbolsFilter.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/filters/PolySymbolsFilter.kt index 0e072ceddfe2..1c3aaf519a0f 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/filters/PolySymbolsFilter.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/filters/PolySymbolsFilter.kt @@ -2,22 +2,26 @@ package com.intellij.polySymbols.webTypes.filters import com.intellij.polySymbols.PolySymbol -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.webTypes.impl.PolySymbolsFilterEP interface PolySymbolsFilter { - fun filterCodeCompletions(codeCompletions: List, - queryExecutor: PolySymbolsQueryExecutor, - scope: List, - properties: Map): List + fun filterCodeCompletions( + codeCompletions: List, + queryExecutor: PolySymbolsQueryExecutor, + scope: List, + properties: Map, + ): List - fun filterNameMatches(matches: List, - queryExecutor: PolySymbolsQueryExecutor, - scope: List, - properties: Map): List + fun filterNameMatches( + matches: List, + queryExecutor: PolySymbolsQueryExecutor, + scope: List, + properties: Map, + ): List companion object { diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/filters/PolySymbolsMatchPrefixFilter.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/filters/PolySymbolsMatchPrefixFilter.kt index 485ae3d72280..bb3e165298e5 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/filters/PolySymbolsMatchPrefixFilter.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/filters/PolySymbolsMatchPrefixFilter.kt @@ -2,26 +2,30 @@ package com.intellij.polySymbols.webTypes.filters import com.intellij.polySymbols.PolySymbol -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.PolySymbolsScope import org.jetbrains.annotations.ApiStatus @ApiStatus.Internal class PolySymbolsMatchPrefixFilter : PolySymbolsFilter { - override fun filterCodeCompletions(codeCompletions: List, - queryExecutor: PolySymbolsQueryExecutor, - scope: List, - properties: Map): List { + override fun filterCodeCompletions( + codeCompletions: List, + queryExecutor: PolySymbolsQueryExecutor, + scope: List, + properties: Map, + ): List { val prefix = properties["prefix"] as? String ?: return codeCompletions return codeCompletions.filter { it.name.startsWith(prefix) } } - override fun filterNameMatches(matches: List, - queryExecutor: PolySymbolsQueryExecutor, - scope: List, - properties: Map): List { + override fun filterNameMatches( + matches: List, + queryExecutor: PolySymbolsQueryExecutor, + scope: List, + properties: Map, + ): List { val prefix = properties["prefix"] as? String ?: return matches return matches.filter { it.name.startsWith(prefix) } } diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/impl/PolySymbolsFilterEP.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/impl/PolySymbolsFilterEP.kt index 8ea1e90e96d3..338e14f98b42 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/impl/PolySymbolsFilterEP.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/impl/PolySymbolsFilterEP.kt @@ -3,12 +3,12 @@ package com.intellij.polySymbols.webTypes.impl import com.intellij.openapi.extensions.CustomLoadingExtensionPointBean import com.intellij.openapi.extensions.ExtensionPointName -import com.intellij.util.xmlb.annotations.Attribute import com.intellij.polySymbols.PolySymbol -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.webTypes.filters.PolySymbolsFilter +import com.intellij.util.xmlb.annotations.Attribute class PolySymbolsFilterEP() : CustomLoadingExtensionPointBean() { diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/impl/WebTypesPatternUtils.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/impl/WebTypesPatternUtils.kt index 7fa2af313162..34e67c1d7f8e 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/impl/WebTypesPatternUtils.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/impl/WebTypesPatternUtils.kt @@ -5,7 +5,6 @@ import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolApiStatus.Companion.isDeprecatedOrObsolete import com.intellij.polySymbols.PolySymbolModifier import com.intellij.polySymbols.PolySymbolQualifiedKind -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.impl.canUnwrapSymbols import com.intellij.polySymbols.patterns.ComplexPatternOptions @@ -14,6 +13,7 @@ import com.intellij.polySymbols.patterns.impl.* import com.intellij.polySymbols.query.PolySymbolMatch import com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.utils.namespace import com.intellij.polySymbols.webTypes.WebTypesJsonOrigin import com.intellij.polySymbols.webTypes.json.* diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/json/WebTypesJsonUtils.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/json/WebTypesJsonUtils.kt index c4f3aa8b2742..eac09fd08af3 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/json/WebTypesJsonUtils.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/json/WebTypesJsonUtils.kt @@ -19,10 +19,7 @@ import com.intellij.polySymbols.html.NAMESPACE_HTML import com.intellij.polySymbols.html.PolySymbolHtmlAttributeValue import com.intellij.polySymbols.impl.canUnwrapSymbols import com.intellij.polySymbols.js.* -import com.intellij.polySymbols.query.PolySymbolMatch -import com.intellij.polySymbols.query.PolySymbolNameConversionRules -import com.intellij.polySymbols.query.PolySymbolNameConverter -import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.* import com.intellij.polySymbols.utils.NameCaseUtils import com.intellij.polySymbols.utils.PolySymbolTypeSupport import com.intellij.polySymbols.utils.lastPolySymbol diff --git a/platform/polySymbols/src/com/intellij/polySymbols/PolySymbol.kt b/platform/polySymbols/src/com/intellij/polySymbols/PolySymbol.kt index 10aad228560c..78fcdc5406fc 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/PolySymbol.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/PolySymbol.kt @@ -7,6 +7,7 @@ import com.intellij.model.Pointer import com.intellij.model.Symbol import com.intellij.navigation.NavigatableSymbol import com.intellij.openapi.project.Project +import com.intellij.openapi.util.ModificationTracker import com.intellij.openapi.util.NlsSafe import com.intellij.platform.backend.documentation.DocumentationTarget import com.intellij.platform.backend.navigation.NavigationTarget @@ -15,6 +16,7 @@ import com.intellij.polySymbols.context.PolyContext import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.query.PolySymbolMatch import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.refactoring.PolySymbolRenameTarget import com.intellij.polySymbols.search.PolySymbolSearchTarget import com.intellij.polySymbols.utils.* @@ -43,7 +45,7 @@ import javax.swing.Icon * INAPPLICABLE_JVM_NAME -> https://youtrack.jetbrains.com/issue/KT-31420 **/ @Suppress("INAPPLICABLE_JVM_NAME") -interface PolySymbol : PolySymbolsScope, Symbol, NavigatableSymbol, PolySymbolsPrioritizedScope { +interface PolySymbol : Symbol, NavigatableSymbol, PolySymbolsPrioritizedScope { /** * Specifies where this symbol comes from. Besides descriptive information like @@ -115,10 +117,10 @@ interface PolySymbol : PolySymbolsScope, Symbol, NavigatableSymbol, PolySymbolsP /** * When pattern is being evaluated, matched symbols can provide additional scope for further resolution in the pattern. - * By default, the `queryScope` returns the symbol itself + * By default, the `queryScope` returns the symbol itself if it is a [PolySymbolsScope] */ val queryScope: List - get() = listOf(this) + get() = listOfNotNull(this as? PolySymbolsScope) /** * Specifies whether the symbol is an extension. @@ -218,12 +220,6 @@ interface PolySymbol : PolySymbolsScope, Symbol, NavigatableSymbol, PolySymbolsP override fun getNavigationTargets(project: Project): Collection = emptyList() - /** - * Symbols can be used in [CachedValue]s as dependencies. - * If a symbol instance can mutate over time, it should properly implement this method. - */ - override fun getModificationCount(): Long = 0 - /** * Returns the pointer to the symbol, which can survive between read actions. * The dereferenced symbol should be valid, i.e. any PSI based properties should return valid PsiElements. diff --git a/platform/polySymbols/src/com/intellij/polySymbols/impl/SearchMap.kt b/platform/polySymbols/src/com/intellij/polySymbols/impl/SearchMap.kt index f9eb5ef2c75b..bd3b22574f9d 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/impl/SearchMap.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/impl/SearchMap.kt @@ -2,28 +2,17 @@ package com.intellij.polySymbols.impl import com.intellij.openapi.util.text.StringUtil -import com.intellij.polySymbols.PolySymbol -import com.intellij.polySymbols.PolySymbolKind -import com.intellij.polySymbols.PolySymbolNamespace -import com.intellij.polySymbols.PolySymbolQualifiedKind -import com.intellij.polySymbols.PolySymbolQualifiedName -import com.intellij.polySymbols.PolySymbolsScope +import com.intellij.polySymbols.* import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.patterns.PolySymbolsPattern -import com.intellij.polySymbols.query.PolySymbolNamesProvider -import com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams -import com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams -import com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams -import com.intellij.polySymbols.query.PolySymbolsQueryParams +import com.intellij.polySymbols.query.* import com.intellij.polySymbols.utils.match import com.intellij.polySymbols.utils.toCodeCompletionItems import com.intellij.polySymbols.utils.withMatchedName import com.intellij.util.SmartList import com.intellij.util.containers.Stack import com.intellij.util.text.CharSequenceSubSequence -import java.util.TreeMap -import kotlin.sequences.flatMap -import kotlin.sequences.plus +import java.util.* internal abstract class SearchMap internal constructor( private val namesProvider: PolySymbolNamesProvider, @@ -71,7 +60,7 @@ internal abstract class SearchMap internal constructor( .map { it.withMatchedName(qualifiedName.name) } .plus(collectPatternContributions(qualifiedName, params, scope)) - internal fun getSymbols(qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams): Sequence = + internal fun getSymbols(qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams): Sequence = statics.subMap(SearchMapEntry(qualifiedKind), SearchMapEntry(qualifiedKind, kindExclusive = true)) .values.asSequence() .plus(patterns.subMap(SearchMapEntry(qualifiedKind), SearchMapEntry(qualifiedKind, kindExclusive = true)).values) diff --git a/platform/polySymbols/src/com/intellij/polySymbols/impl/StaticPolySymbolsScope.kt b/platform/polySymbols/src/com/intellij/polySymbols/impl/StaticPolySymbolsScope.kt index ca5f6161ae93..8ade25d97e3f 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/impl/StaticPolySymbolsScope.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/impl/StaticPolySymbolsScope.kt @@ -3,9 +3,9 @@ package com.intellij.polySymbols.impl import com.intellij.model.Pointer import com.intellij.polySymbols.FrameworkId -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.context.PolyContextRulesProvider import com.intellij.polySymbols.query.PolySymbolNameConversionRulesProvider +import com.intellij.polySymbols.query.PolySymbolsScope interface StaticPolySymbolsScope : PolySymbolsScope, PolyContextRulesProvider { diff --git a/platform/polySymbols/src/com/intellij/polySymbols/impl/StaticPolySymbolsScopeBase.kt b/platform/polySymbols/src/com/intellij/polySymbols/impl/StaticPolySymbolsScopeBase.kt index d591a4018503..f3b5b7f4ddd2 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/impl/StaticPolySymbolsScopeBase.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/impl/StaticPolySymbolsScopeBase.kt @@ -7,7 +7,6 @@ import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.context.PolyContext import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.query.* -import com.intellij.polySymbols.impl.SearchMap import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.Stack import org.jetbrains.annotations.ApiStatus.Internal @@ -45,7 +44,7 @@ abstract class StaticPolySymbolsScopeBase, - ): List = + ): List = getMaps(params).flatMap { it.getSymbols(qualifiedKind, params) }.toList() @@ -75,7 +74,7 @@ abstract class StaticPolySymbolsScopeBase = + ): List = getMap(params.queryExecutor, contribution, origin) .getSymbols(qualifiedKind, params) .toList() diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPattern.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPattern.kt index 716ab6bf6f92..8b2799e870a1 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPattern.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPattern.kt @@ -1,14 +1,14 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.patterns -import com.intellij.util.containers.Stack import com.intellij.polySymbols.PolySymbol -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.patterns.impl.* import com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams import com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams import com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams +import com.intellij.polySymbols.query.PolySymbolsScope +import com.intellij.util.containers.Stack import org.jetbrains.annotations.ApiStatus @ApiStatus.NonExtendable @@ -18,39 +18,51 @@ abstract class PolySymbolsPattern internal constructor() { internal open fun isStaticAndRequired(): Boolean = true - internal fun match(owner: PolySymbol?, - scope: Stack, - name: String, - params: PolySymbolsNameMatchQueryParams): List = + internal fun match( + owner: PolySymbol?, + scope: Stack, + name: String, + params: PolySymbolsNameMatchQueryParams, + ): List = match(owner, scope, null, MatchParameters(name, params), 0, name.length) .map { it.removeEmptySegments() } - internal fun list(owner: PolySymbol?, - scope: Stack, - params: PolySymbolsListSymbolsQueryParams): List = + internal fun list( + owner: PolySymbol?, + scope: Stack, + params: PolySymbolsListSymbolsQueryParams, + ): List = list(owner, scope, null, ListParameters(params)) .map { it.removeEmptySegments() } - internal fun complete(owner: PolySymbol?, - scope: Stack, - name: String, - params: PolySymbolsCodeCompletionQueryParams): List = + internal fun complete( + owner: PolySymbol?, + scope: Stack, + name: String, + params: PolySymbolsCodeCompletionQueryParams, + ): List = complete(owner, Stack(scope), null, CompletionParameters(name, params), 0, name.length).items - internal abstract fun match(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: MatchParameters, start: Int, end: Int): List + internal abstract fun match( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: MatchParameters, start: Int, end: Int, + ): List - internal abstract fun list(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: ListParameters): List + internal abstract fun list( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: ListParameters, + ): List - internal abstract fun complete(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: CompletionParameters, start: Int, end: Int): CompletionResults + internal abstract fun complete( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: CompletionParameters, start: Int, end: Int, + ): CompletionResults } \ No newline at end of file diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPatternFactory.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPatternFactory.kt index e9dec42ba6a0..0d5eb483d4a9 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPatternFactory.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPatternFactory.kt @@ -1,19 +1,21 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.patterns -import com.intellij.util.containers.Stack import com.intellij.polySymbols.PolySymbolQualifiedName -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.patterns.impl.* import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.PolySymbolsScope +import com.intellij.util.containers.Stack import org.jetbrains.annotations.ApiStatus @ApiStatus.Internal object PolySymbolsPatternFactory { - fun createComplexPattern(optionsProvider: (queryExecutor: PolySymbolsQueryExecutor, contextStack: Stack) -> ComplexPatternOptions, - isStaticAndRequiredProvider: () -> Boolean, - patternsProvider: () -> List): PolySymbolsPattern = + fun createComplexPattern( + optionsProvider: (queryExecutor: PolySymbolsQueryExecutor, contextStack: Stack) -> ComplexPatternOptions, + isStaticAndRequiredProvider: () -> Boolean, + patternsProvider: () -> List, + ): PolySymbolsPattern = ComplexPattern(object : ComplexPatternConfigProvider { override fun getPatterns(): List = patternsProvider() @@ -26,9 +28,11 @@ object PolySymbolsPatternFactory { }) - fun createComplexPattern(options: ComplexPatternOptions, - isStaticAndRequired: Boolean, - vararg patterns: PolySymbolsPattern): PolySymbolsPattern = + fun createComplexPattern( + options: ComplexPatternOptions, + isStaticAndRequired: Boolean, + vararg patterns: PolySymbolsPattern, + ): PolySymbolsPattern = ComplexPattern(object : ComplexPatternConfigProvider { override fun getPatterns(): List = diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPatternSymbolsResolver.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPatternSymbolsResolver.kt index a485c5a88549..35f75b67f1cd 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPatternSymbolsResolver.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/PolySymbolsPatternSymbolsResolver.kt @@ -1,12 +1,12 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.patterns -import com.intellij.util.containers.Stack import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolQualifiedKind -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.PolySymbolsScope +import com.intellij.util.containers.Stack import org.jetbrains.annotations.ApiStatus @ApiStatus.Internal @@ -16,17 +16,23 @@ interface PolySymbolsPatternSymbolsResolver { val delegate: PolySymbol? - fun codeCompletion(name: String, - position: Int, - scopeStack: Stack, - queryExecutor: PolySymbolsQueryExecutor): List + fun codeCompletion( + name: String, + position: Int, + scopeStack: Stack, + queryExecutor: PolySymbolsQueryExecutor, + ): List - fun listSymbols(scopeStack: Stack, - queryExecutor: PolySymbolsQueryExecutor, - expandPatterns: Boolean): List + fun listSymbols( + scopeStack: Stack, + queryExecutor: PolySymbolsQueryExecutor, + expandPatterns: Boolean, + ): List - fun matchName(name: String, - scopeStack: Stack, - queryExecutor: PolySymbolsQueryExecutor): List + fun matchName( + name: String, + scopeStack: Stack, + queryExecutor: PolySymbolsQueryExecutor, + ): List } \ No newline at end of file diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/CompletionAutoPopupPattern.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/CompletionAutoPopupPattern.kt index 02ee866d44d7..8ccef14448d5 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/CompletionAutoPopupPattern.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/CompletionAutoPopupPattern.kt @@ -1,39 +1,45 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.patterns.impl -import com.intellij.util.containers.Stack import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolNameSegment -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.patterns.PolySymbolsPatternSymbolsResolver +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.utils.hideFromCompletion +import com.intellij.util.containers.Stack internal class CompletionAutoPopupPattern(val isSticky: Boolean) : PolySymbolsPattern() { override fun getStaticPrefixes(): Sequence = sequenceOf("") - override fun match(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: MatchParameters, - start: Int, - end: Int): List = + override fun match( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: MatchParameters, + start: Int, + end: Int, + ): List = listOf(MatchResult(PolySymbolNameSegment.create(start, start))) - override fun list(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: ListParameters): List = + override fun list( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: ListParameters, + ): List = emptyList() - override fun complete(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: CompletionParameters, - start: Int, - end: Int): CompletionResults = + override fun complete( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: CompletionParameters, + start: Int, + end: Int, + ): CompletionResults = if (symbolsResolver == null || symbolsResolver.delegate?.hideFromCompletion == true) { CompletionResults(emptyList(), true) } diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/ComplexPattern.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/ComplexPattern.kt index 6662b78e62b0..f38a3b4e4c03 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/ComplexPattern.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/ComplexPattern.kt @@ -6,12 +6,12 @@ import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolApiStatus import com.intellij.polySymbols.PolySymbolApiStatus.Companion.isDeprecatedOrObsolete import com.intellij.polySymbols.PolySymbolNameSegment -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.impl.copy import com.intellij.polySymbols.impl.selectBest import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.patterns.PolySymbolsPatternSymbolsResolver import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.utils.coalesceWith import com.intellij.polySymbols.utils.isCritical import com.intellij.util.SmartList @@ -174,18 +174,15 @@ internal class ComplexPattern(private val configProvider: ComplexPatternConfigPr ): T { val options = configProvider.getOptions(queryExecutor, scopeStack) - val additionalScope = options.additionalScope - if (additionalScope != null) { - scopeStack.push(additionalScope) - } + val additionalScope = options.additionalScope?.queryScope + additionalScope?.forEach { scopeStack.push(it) } + try { return action(patterns, options.symbolsResolver, options.apiStatus, options.isRequired, options.priority, options.repeats, options.unique) } finally { - if (additionalScope != null) { - scopeStack.pop() - } + additionalScope?.forEach { _ -> scopeStack.pop() } } } diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/ComplexPatternConfigProvider.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/ComplexPatternConfigProvider.kt index a25019614a0d..2fa373d21538 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/ComplexPatternConfigProvider.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/ComplexPatternConfigProvider.kt @@ -1,11 +1,11 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.patterns.impl -import com.intellij.util.containers.Stack -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.patterns.ComplexPatternOptions import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.PolySymbolsScope +import com.intellij.util.containers.Stack internal interface ComplexPatternConfigProvider { diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/PatternImplUtils.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/PatternImplUtils.kt index 69808cda15e6..9cc1b4bc1543 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/PatternImplUtils.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/PatternImplUtils.kt @@ -2,14 +2,14 @@ package com.intellij.polySymbols.patterns.impl import com.intellij.openapi.progress.ProgressManager -import com.intellij.util.containers.Stack import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolApiStatus import com.intellij.polySymbols.PolySymbolNameSegment -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.completion.impl.PolySymbolCodeCompletionItemImpl import com.intellij.polySymbols.impl.copy +import com.intellij.polySymbols.query.PolySymbolsScope +import com.intellij.util.containers.Stack internal fun PolySymbolCodeCompletionItem.withStopSequencePatternEvaluation(stop: Boolean): PolySymbolCodeCompletionItem = if ((this as PolySymbolCodeCompletionItemImpl).stopSequencePatternEvaluation != stop) diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/RegExpPattern.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/RegExpPattern.kt index 2b7abc5d3267..c4de07eea213 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/RegExpPattern.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/RegExpPattern.kt @@ -1,14 +1,14 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.patterns.impl -import com.intellij.util.containers.Stack -import com.intellij.util.text.CharSequenceSubSequence import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolNameSegment -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.patterns.PolySymbolsPatternSymbolsResolver +import com.intellij.polySymbols.query.PolySymbolsScope +import com.intellij.util.containers.Stack +import com.intellij.util.text.CharSequenceSubSequence import java.util.regex.Pattern internal class RegExpPattern(private val regex: String, private val caseSensitive: Boolean = false) : PolySymbolsPattern() { @@ -23,12 +23,14 @@ internal class RegExpPattern(private val regex: String, private val caseSensitiv override fun isStaticAndRequired(): Boolean = false - override fun match(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: MatchParameters, - start: Int, - end: Int): List { + override fun match( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: MatchParameters, + start: Int, + end: Int, + ): List { val matcher = pattern.matcher(CharSequenceSubSequence(params.name, start, end)) return if (matcher.find(0) && matcher.start() == 0) listOf(MatchResult(PolySymbolNameSegment.create( @@ -39,18 +41,22 @@ internal class RegExpPattern(private val regex: String, private val caseSensitiv else emptyList() } - override fun list(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: ListParameters): List = + override fun list( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: ListParameters, + ): List = emptyList() - override fun complete(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: CompletionParameters, - start: Int, - end: Int): CompletionResults = + override fun complete( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: CompletionParameters, + start: Int, + end: Int, + ): CompletionResults = getPatternCompletablePrefix(regex) .takeIf { it.isNotBlank() } ?.let { diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SequencePattern.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SequencePattern.kt index 8671e13b0919..1ce822e1cb70 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SequencePattern.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SequencePattern.kt @@ -2,13 +2,17 @@ package com.intellij.polySymbols.patterns.impl import com.intellij.openapi.util.text.StringUtil -import com.intellij.polySymbols.* +import com.intellij.polySymbols.PolySymbol +import com.intellij.polySymbols.PolySymbolNameSegment +import com.intellij.polySymbols.PolySymbolOrigin +import com.intellij.polySymbols.PolySymbolQualifiedKind import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.completion.impl.CompoundInsertHandler import com.intellij.polySymbols.html.NAMESPACE_HTML import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.patterns.PolySymbolsPatternSymbolsResolver import com.intellij.polySymbols.query.PolySymbolMatch +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.utils.asSingleSymbol import com.intellij.polySymbols.utils.coalesceWith import com.intellij.polySymbols.utils.nameSegments diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SingleSymbolReferencePattern.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SingleSymbolReferencePattern.kt index e3d66c6c8825..c338490b4940 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SingleSymbolReferencePattern.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SingleSymbolReferencePattern.kt @@ -1,33 +1,35 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.patterns.impl -import com.intellij.util.containers.Stack import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolModifier import com.intellij.polySymbols.PolySymbolNameSegment import com.intellij.polySymbols.PolySymbolQualifiedName -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.patterns.PolySymbolsPatternSymbolsResolver import com.intellij.polySymbols.query.PolySymbolNamesProvider +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.utils.asSingleSymbol import com.intellij.polySymbols.utils.nameMatches import com.intellij.polySymbols.utils.qualifiedName +import com.intellij.util.containers.Stack class SingleSymbolReferencePattern( private val path: List, - private val excludeModifiers: List = listOf(PolySymbolModifier.ABSTRACT) + private val excludeModifiers: List = listOf(PolySymbolModifier.ABSTRACT), ) : PolySymbolsPattern() { override fun getStaticPrefixes(): Sequence = emptySequence() - override fun match(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: MatchParameters, - start: Int, - end: Int): List = + override fun match( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: MatchParameters, + start: Int, + end: Int, + ): List = if (owner?.nameMatches(params.name.substring(start, end), params.queryExecutor) == true) params.queryExecutor.nameMatchQuery(path) { exclude(excludeModifiers) @@ -39,10 +41,12 @@ class SingleSymbolReferencePattern( else emptyList() - override fun list(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: ListParameters): List = + override fun list( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: ListParameters, + ): List = if (owner != null) { params.queryExecutor.nameMatchQuery(path) { exclude(excludeModifiers) @@ -54,12 +58,14 @@ class SingleSymbolReferencePattern( } else emptyList() - override fun complete(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: CompletionParameters, - start: Int, - end: Int): CompletionResults = + override fun complete( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: CompletionParameters, + start: Int, + end: Int, + ): CompletionResults = if (owner != null && params.queryExecutor.nameMatchQuery(path) { exclude(excludeModifiers) diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/StaticPattern.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/StaticPattern.kt index 920f79946cbc..2583337baf7a 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/StaticPattern.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/StaticPattern.kt @@ -1,39 +1,45 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.patterns.impl -import com.intellij.util.containers.Stack import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolNameSegment -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.patterns.PolySymbolsPatternSymbolsResolver +import com.intellij.polySymbols.query.PolySymbolsScope +import com.intellij.util.containers.Stack internal class StaticPattern(val content: String) : PolySymbolsPattern() { override fun getStaticPrefixes(): Sequence = sequenceOf(content) - override fun match(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: MatchParameters, - start: Int, - end: Int): List = + override fun match( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: MatchParameters, + start: Int, + end: Int, + ): List = if (content.length <= end - start && params.name.startsWith(content, start)) listOf(MatchResult(PolySymbolNameSegment.create(start, start + content.length))) else emptyList() - override fun list(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: ListParameters): List = + override fun list( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: ListParameters, + ): List = listOf(ListResult(content, PolySymbolNameSegment.create(0, content.length))) - override fun complete(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: CompletionParameters, - start: Int, - end: Int): CompletionResults = + override fun complete( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: CompletionParameters, + start: Int, + end: Int, + ): CompletionResults = CompletionResults(PolySymbolCodeCompletionItem.create(content, start)) override fun toString(): String = diff --git a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SymbolReferencePattern.kt b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SymbolReferencePattern.kt index 52d9825acbec..5061375cc289 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SymbolReferencePattern.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/patterns/impl/SymbolReferencePattern.kt @@ -2,19 +2,19 @@ package com.intellij.polySymbols.patterns.impl import com.intellij.openapi.progress.ProgressManager -import com.intellij.util.applyIf -import com.intellij.util.containers.Stack import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolNameSegment -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.impl.selectBest import com.intellij.polySymbols.impl.withDisplayName import com.intellij.polySymbols.impl.withOffset import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.patterns.PolySymbolsPatternSymbolsResolver import com.intellij.polySymbols.query.PolySymbolMatch +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.utils.lastPolySymbol import com.intellij.polySymbols.utils.nameSegments +import com.intellij.util.applyIf +import com.intellij.util.containers.Stack import kotlin.math.max internal class SymbolReferencePattern(val displayName: String?) : PolySymbolsPattern() { @@ -22,12 +22,14 @@ internal class SymbolReferencePattern(val displayName: String?) : PolySymbolsPat override fun isStaticAndRequired(): Boolean = false - override fun match(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: MatchParameters, - start: Int, - end: Int): List { + override fun match( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: MatchParameters, + start: Int, + end: Int, + ): List { if (start == end) { // TODO should be "missing required part", but needs improvements in sequence pattern code completion return listOf(MatchResult(listOf(PolySymbolNameSegment.create( @@ -67,10 +69,12 @@ internal class SymbolReferencePattern(val displayName: String?) : PolySymbolsPat )) } - override fun list(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: ListParameters): List = + override fun list( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: ListParameters, + ): List = symbolsResolver ?.listSymbols(scopeStack, params.queryExecutor, params.expandPatterns) ?.groupBy { it.name } @@ -92,12 +96,14 @@ internal class SymbolReferencePattern(val displayName: String?) : PolySymbolsPat } ?: emptyList() - override fun complete(owner: PolySymbol?, - scopeStack: Stack, - symbolsResolver: PolySymbolsPatternSymbolsResolver?, - params: CompletionParameters, - start: Int, - end: Int): CompletionResults = + override fun complete( + owner: PolySymbol?, + scopeStack: Stack, + symbolsResolver: PolySymbolsPatternSymbolsResolver?, + params: CompletionParameters, + start: Int, + end: Int, + ): CompletionResults = symbolsResolver ?.codeCompletion(params.name.substring(start, end), max(params.position - start, 0), scopeStack, params.queryExecutor) ?.let { results -> diff --git a/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsCompoundScope.kt b/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsCompoundScope.kt index 672f2fd02db0..1ce310cc1d58 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsCompoundScope.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsCompoundScope.kt @@ -2,12 +2,11 @@ package com.intellij.polySymbols.query import com.intellij.model.Pointer -import com.intellij.util.containers.Stack import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolQualifiedKind import com.intellij.polySymbols.PolySymbolQualifiedName -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem +import com.intellij.util.containers.Stack /** * A special purpose scope, which provides other scopes, possibly calling a [PolySymbolsQueryExecutor] to retrieve them. @@ -18,8 +17,10 @@ import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem */ abstract class PolySymbolsCompoundScope : PolySymbolsScope { - protected abstract fun build(queryExecutor: PolySymbolsQueryExecutor, - consumer: (PolySymbolsScope) -> Unit) + protected abstract fun build( + queryExecutor: PolySymbolsQueryExecutor, + consumer: (PolySymbolsScope) -> Unit, + ) fun getScopes(queryExecutor: PolySymbolsQueryExecutor): List { if (requiresResolve() && !queryExecutor.allowResolve) return emptyList() @@ -37,19 +38,25 @@ abstract class PolySymbolsCompoundScope : PolySymbolsScope { protected open fun requiresResolve(): Boolean = true - final override fun getMatchingSymbols(qualifiedName: PolySymbolQualifiedName, - params: PolySymbolsNameMatchQueryParams, - scope: Stack): List = + final override fun getMatchingSymbols( + qualifiedName: PolySymbolQualifiedName, + params: PolySymbolsNameMatchQueryParams, + scope: Stack, + ): List = throw UnsupportedOperationException("PolySymbolsCompoundScope must be queried through PolySymbolQueryExecutor.") - final override fun getSymbols(qualifiedKind: PolySymbolQualifiedKind, - params: PolySymbolsListSymbolsQueryParams, - scope: Stack): List = + final override fun getSymbols( + qualifiedKind: PolySymbolQualifiedKind, + params: PolySymbolsListSymbolsQueryParams, + scope: Stack, + ): List = throw UnsupportedOperationException("PolySymbolsCompoundScope must be queried through PolySymbolQueryExecutor.") - final override fun getCodeCompletions(qualifiedName: PolySymbolQualifiedName, - params: PolySymbolsCodeCompletionQueryParams, - scope: Stack): List = + final override fun getCodeCompletions( + qualifiedName: PolySymbolQualifiedName, + params: PolySymbolsCodeCompletionQueryParams, + scope: Stack, + ): List = throw UnsupportedOperationException("PolySymbolsCompoundScope must be queried through PolySymbolQueryExecutor.") final override fun isExclusiveFor(qualifiedKind: PolySymbolQualifiedKind): Boolean = diff --git a/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsQueryConfigurator.kt b/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsQueryConfigurator.kt index 9dd16197a625..68aa9dc77010 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsQueryConfigurator.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsQueryConfigurator.kt @@ -4,10 +4,9 @@ package com.intellij.polySymbols.query import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile -import com.intellij.psi.PsiElement -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.context.PolyContext import com.intellij.polySymbols.context.PolyContextRulesProvider +import com.intellij.psi.PsiElement import org.jetbrains.annotations.ApiStatus.Internal import org.jetbrains.annotations.TestOnly @@ -19,9 +18,11 @@ interface PolySymbolsQueryConfigurator { fun getContextRulesProviders(project: Project, dir: VirtualFile): List = emptyList() - fun getNameConversionRulesProviders(project: Project, - element: PsiElement?, - context: PolyContext): List = + fun getNameConversionRulesProviders( + project: Project, + element: PsiElement?, + context: PolyContext, + ): List = emptyList() fun beforeQueryExecutorCreation(project: Project) { diff --git a/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsQueryExecutorFactory.kt b/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsQueryExecutorFactory.kt index b51ae68ccd7f..1b2fd62c6579 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsQueryExecutorFactory.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsQueryExecutorFactory.kt @@ -5,11 +5,10 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile -import com.intellij.psi.PsiElement import com.intellij.polySymbols.PolyContextKind import com.intellij.polySymbols.PolyContextName -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.query.impl.PolySymbolsQueryExecutorBuilderImpl +import com.intellij.psi.PsiElement import org.jetbrains.annotations.TestOnly /** diff --git a/platform/polySymbols/src/com/intellij/polySymbols/PolySymbolsScope.kt b/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsScope.kt similarity index 82% rename from platform/polySymbols/src/com/intellij/polySymbols/PolySymbolsScope.kt rename to platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsScope.kt index 538529d15804..c606b3a71727 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/PolySymbolsScope.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/query/PolySymbolsScope.kt @@ -1,15 +1,14 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.intellij.polySymbols +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.polySymbols.query import com.intellij.model.Pointer import com.intellij.openapi.util.ModificationTracker +import com.intellij.polySymbols.PolySymbol +import com.intellij.polySymbols.PolySymbolQualifiedKind +import com.intellij.polySymbols.PolySymbolQualifiedName import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem -import com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams -import com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams -import com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams import com.intellij.polySymbols.utils.getDefaultCodeCompletions import com.intellij.polySymbols.utils.match -import com.intellij.polySymbols.utils.toCodeCompletionItems import com.intellij.util.containers.Stack /** @@ -34,7 +33,7 @@ interface PolySymbolsScope : ModificationTracker { /** * Returns symbols within the scope, which matches provided namespace, kind and name. - * Use [PolySymbol.match] to match Poly Symbols in the scope against provided name. + * Use [match] to match Poly Symbols in the scope against provided name. * * If the scope contains many symbols, or results should be cached consider extending [com.intellij.polySymbols.utils.PolySymbolsScopeWithCache]. * @@ -50,7 +49,6 @@ interface PolySymbolsScope : ModificationTracker { strictScope(params.strictScope) copyFiltersFrom(params) }, scope) - .filterIsInstance() .flatMap { it.match(qualifiedName.name, params, scope) } /** @@ -63,17 +61,17 @@ interface PolySymbolsScope : ModificationTracker { qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams, scope: Stack, - ): List = + ): List = emptyList() /** * Returns code completions for symbols within the scope. * - * Use [PolySymbol.toCodeCompletionItems] to create code completions from `PolySymbol`s in the scope. + * Use [com.intellij.polySymbols.utils.toCodeCompletionItems] to create code completions from `PolySymbol`s in the scope. * * If the scope contains many symbols, or results should be cached consider extending [com.intellij.polySymbols.utils.PolySymbolsScopeWithCache]. * - * Default implementation calls `getSymbols` and runs [PolySymbol.toCodeCompletionItems] on each symbol. + * Default implementation calls `getSymbols` and runs [com.intellij.polySymbols.utils.toCodeCompletionItems] on each symbol. */ fun getCodeCompletions( qualifiedName: PolySymbolQualifiedName, diff --git a/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolMatchBase.kt b/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolMatchBase.kt index 4f271226be8a..9050c8e45d59 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolMatchBase.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolMatchBase.kt @@ -14,6 +14,7 @@ import com.intellij.polySymbols.documentation.PolySymbolWithDocumentation import com.intellij.polySymbols.documentation.impl.PolySymbolDocumentationTargetImpl import com.intellij.polySymbols.query.PolySymbolMatch import com.intellij.polySymbols.query.PolySymbolMatchBuilder +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.refactoring.PolySymbolRenameTarget import com.intellij.polySymbols.search.PolySymbolSearchTarget import com.intellij.polySymbols.search.PsiSourcedPolySymbol diff --git a/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorBuilderImpl.kt b/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorBuilderImpl.kt index c0b821a315b8..38ae11ef2f3c 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorBuilderImpl.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorBuilderImpl.kt @@ -4,13 +4,13 @@ package com.intellij.polySymbols.query.impl import com.intellij.openapi.util.ModificationTracker import com.intellij.polySymbols.PolyContextKind import com.intellij.polySymbols.PolyContextName -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.context.PolyContext.Companion.KIND_FRAMEWORK import com.intellij.polySymbols.context.impl.PolyContextImpl import com.intellij.polySymbols.query.PolySymbolNameConversionRules import com.intellij.polySymbols.query.PolySymbolsQueryExecutor import com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory.PolySymbolsQueryExecutorBuilder import com.intellij.polySymbols.query.PolySymbolsQueryResultsCustomizer +import com.intellij.polySymbols.query.PolySymbolsScope class PolySymbolsQueryExecutorBuilderImpl() : PolySymbolsQueryExecutorBuilder { private val rootScopes = mutableListOf() diff --git a/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorFactoryImpl.kt b/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorFactoryImpl.kt index e9af82a73cb9..a4afe83ed17a 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorFactoryImpl.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorFactoryImpl.kt @@ -10,20 +10,19 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.intellij.openapi.util.ModificationTracker import com.intellij.openapi.vfs.VirtualFile -import com.intellij.psi.PsiElement -import com.intellij.util.asSafely -import com.intellij.util.containers.MultiMap import com.intellij.polySymbols.PolyContextKind import com.intellij.polySymbols.PolySymbol -import com.intellij.polySymbols.utils.PolySymbolsPrioritizedScope -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.context.PolyContext import com.intellij.polySymbols.context.PolyContextKindRules import com.intellij.polySymbols.context.PolyContextRulesProvider import com.intellij.polySymbols.context.impl.buildPolyContext import com.intellij.polySymbols.query.* +import com.intellij.polySymbols.utils.PolySymbolsPrioritizedScope import com.intellij.polySymbols.utils.createModificationTracker import com.intellij.polySymbols.utils.findOriginalFile +import com.intellij.psi.PsiElement +import com.intellij.util.asSafely +import com.intellij.util.containers.MultiMap class PolySymbolsQueryExecutorFactoryImpl(private val project: Project) : PolySymbolsQueryExecutorFactory, Disposable { @@ -71,9 +70,11 @@ class PolySymbolsQueryExecutorFactoryImpl(private val project: Project) : PolySy allowResolve) } - override fun addScope(scope: PolySymbolsScope, - contextDirectory: VirtualFile?, - disposable: Disposable) { + override fun addScope( + scope: PolySymbolsScope, + contextDirectory: VirtualFile?, + disposable: Disposable, + ) { ApplicationManager.getApplication().assertWriteAccessAllowed() modificationCount++ customScope.putValue(contextDirectory, scope) @@ -85,8 +86,10 @@ class PolySymbolsQueryExecutorFactoryImpl(private val project: Project) : PolySy override fun dispose() { } - internal fun getContextRules(project: Project, - dir: VirtualFile): Pair, ModificationTracker> { + internal fun getContextRules( + project: Project, + dir: VirtualFile, + ): Pair, ModificationTracker> { val result = MultiMap() getCustomScope(dir) diff --git a/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorImpl.kt b/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorImpl.kt index 09d83ef82b35..48aa46249202 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorImpl.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolsQueryExecutorImpl.kt @@ -6,7 +6,10 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.diagnostic.thisLogger import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.util.RecursionManager -import com.intellij.polySymbols.* +import com.intellij.polySymbols.PolySymbol +import com.intellij.polySymbols.PolySymbolModifier +import com.intellij.polySymbols.PolySymbolQualifiedKind +import com.intellij.polySymbols.PolySymbolQualifiedName import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.context.PolyContext import com.intellij.polySymbols.impl.filterByQueryParams @@ -22,7 +25,6 @@ import com.intellij.util.asSafely import com.intellij.util.concurrency.annotations.RequiresReadLock import com.intellij.util.containers.Stack import org.jetbrains.annotations.ApiStatus -import java.util.* import kotlin.math.max import kotlin.math.min @@ -462,7 +464,8 @@ class PolySymbolsQueryExecutorImpl( params: PolySymbolsListSymbolsQueryParams, ): List = pattern?.let { pattern -> - context.push(this) + val additionalScope = this.queryScope + additionalScope.forEach { context.push(it) } try { return pattern .list(this, context, params) @@ -471,7 +474,7 @@ class PolySymbolsQueryExecutorImpl( } } finally { - context.pop() + additionalScope.forEach { _ -> context.pop() } } } ?: listOf(this) @@ -483,12 +486,13 @@ class PolySymbolsQueryExecutorImpl( resultsCustomizer.apply(this, strict, qualifiedName) } - private val PolySymbolsQueryParams.recursionKey: List get() { - val result = SmartList() - result.add(requiredModifiers) - result.add(excludeModifiers) - result.add(excludeAccessModifiers) - requiredAccessModifier?.let { result.add(it) } - return result - } + private val PolySymbolsQueryParams.recursionKey: List + get() { + val result = SmartList() + result.add(requiredModifiers) + result.add(excludeModifiers) + result.add(excludeAccessModifiers) + requiredAccessModifier?.let { result.add(it) } + return result + } } diff --git a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegate.kt b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegate.kt index e7166a24123b..9ee836ccedfd 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegate.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegate.kt @@ -2,6 +2,7 @@ package com.intellij.polySymbols.utils import com.intellij.find.usages.api.SearchTarget +import com.intellij.model.Pointer import com.intellij.navigation.NavigatableSymbol import com.intellij.openapi.project.Project import com.intellij.platform.backend.documentation.DocumentationTarget @@ -12,6 +13,7 @@ import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams import com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams import com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.refactoring.PolySymbolRenameTarget import com.intellij.polySymbols.refactoring.impl.PolySymbolDelegatedRenameTargetImpl import com.intellij.polySymbols.search.PolySymbolSearchTarget @@ -21,7 +23,7 @@ import com.intellij.refactoring.rename.api.RenameTarget import com.intellij.util.containers.Stack import javax.swing.Icon -interface PolySymbolDelegate : PolySymbol { +interface PolySymbolDelegate : PolySymbol, PolySymbolsScope { val delegate: T @@ -31,10 +33,6 @@ interface PolySymbolDelegate : PolySymbol { get() = delegate.origin override val qualifiedKind: PolySymbolQualifiedKind get() = delegate.qualifiedKind - - override fun getModificationCount(): Long = - delegate.modificationCount - override val queryScope: List get() = delegate.queryScope override val name: String @@ -70,25 +68,28 @@ interface PolySymbolDelegate : PolySymbol { params: PolySymbolsNameMatchQueryParams, scope: Stack, ): List = - delegate.getMatchingSymbols(qualifiedName, params, scope) - + (delegate as? PolySymbolsScope)?.getMatchingSymbols(qualifiedName, params, scope) + ?: emptyList() override fun getSymbols( qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams, scope: Stack, - ): List = - delegate.getSymbols(qualifiedKind, params, scope) + ): List = + (delegate as? PolySymbolsScope)?.getSymbols(qualifiedKind, params, scope) + ?: emptyList() override fun getCodeCompletions( qualifiedName: PolySymbolQualifiedName, params: PolySymbolsCodeCompletionQueryParams, scope: Stack, ): List = - delegate.getCodeCompletions(qualifiedName, params, scope) + (delegate as? PolySymbolsScope)?.getCodeCompletions(qualifiedName, params, scope) + ?: emptyList() override fun isExclusiveFor(qualifiedKind: PolySymbolQualifiedKind): Boolean = - delegate.isExclusiveFor(qualifiedKind) + (delegate as? PolySymbolsScope)?.isExclusiveFor(qualifiedKind) + ?: false override val searchTarget: PolySymbolSearchTarget? get() = when (delegate) { @@ -102,6 +103,11 @@ interface PolySymbolDelegate : PolySymbol { else -> delegate.renameTarget } + override fun createPointer(): Pointer> + + override fun getModificationCount(): Long = + (delegate as? PolySymbolsScope)?.modificationCount ?: 0 + companion object { @JvmStatic diff --git a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegateWithDocumentation.kt b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegateWithDocumentation.kt index 9a814e5eea80..b1ee0da2d829 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegateWithDocumentation.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegateWithDocumentation.kt @@ -1,6 +1,7 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.utils +import com.intellij.model.Pointer import com.intellij.platform.backend.documentation.DocumentationTarget import com.intellij.polySymbols.documentation.PolySymbolDocumentation import com.intellij.polySymbols.documentation.PolySymbolWithDocumentation @@ -23,4 +24,6 @@ interface PolySymbolDelegateWithDocumentation : override fun getDocumentationTarget(location: PsiElement?): DocumentationTarget? = delegate.getDocumentationTarget(location) + override fun createPointer(): Pointer> + } \ No newline at end of file diff --git a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolUtils.kt b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolUtils.kt index 95fe85ed7b5e..9061a3b4b0b4 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolUtils.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolUtils.kt @@ -86,7 +86,7 @@ fun PolySymbol.withMatchedKind(qualifiedKind: PolySymbolQualifiedKind): PolySymb } else this -fun PolySymbol.withNavigationTarget(target: PsiElement): PolySymbol = +fun PolySymbol.withNavigationTarget(target: PsiElement): PolySymbolDelegate = object : PolySymbolDelegate { override val delegate: PolySymbol get() = this@withNavigationTarget @@ -94,7 +94,7 @@ fun PolySymbol.withNavigationTarget(target: PsiElement): PolySymbol = override fun getNavigationTargets(project: Project): Collection = listOf(SymbolNavigationService.getInstance().psiElementNavigationTarget(target)) - override fun createPointer(): Pointer { + override fun createPointer(): Pointer> { val symbolPtr = delegate.createPointer() val targetPtr = target.createSmartPointer() return Pointer { @@ -153,7 +153,8 @@ fun PolySymbol.match( context: Stack, ): List { pattern?.let { pattern -> - context.push(this) + val additionalScope = this.queryScope + additionalScope.forEach { context.push(it) } try { return pattern .match(this, context, nameToMatch, params) @@ -167,7 +168,7 @@ fun PolySymbol.match( } } finally { - context.pop() + additionalScope.forEach { _ -> context.pop() } } } @@ -185,13 +186,14 @@ fun PolySymbol.toCodeCompletionItems( context: Stack, ): List = pattern?.let { pattern -> - context.push(this) + val additionalScope = this.queryScope + additionalScope.forEach { context.push(it) } try { pattern.complete(this, context, name, params) .applyIcons(this) } finally { - context.pop() + additionalScope.forEach { _ -> context.pop() } } } ?: params.queryExecutor.namesProvider diff --git a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsIsolatedMappingScope.kt b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsIsolatedMappingScope.kt index aa2db80388c0..1c0f7679af2f 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsIsolatedMappingScope.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsIsolatedMappingScope.kt @@ -64,7 +64,7 @@ abstract class PolySymbolsIsolatedMappingScope( return result } - override fun getSymbols(qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams, scope: Stack): List { + override fun getSymbols(qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams, scope: Stack): List { if (!params.queryExecutor.allowResolve || (framework != null && params.framework != framework)) return emptyList() val sourceKind = mappings[qualifiedKind] ?: return emptyList() diff --git a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsScopeWithCache.kt b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsScopeWithCache.kt index 2e6aa751f1f5..a9825695dec1 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsScopeWithCache.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsScopeWithCache.kt @@ -9,15 +9,9 @@ import com.intellij.polySymbols.FrameworkId import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolQualifiedKind import com.intellij.polySymbols.PolySymbolQualifiedName -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem -import com.intellij.polySymbols.query.PolySymbolNamesProvider -import com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams -import com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams -import com.intellij.polySymbols.query.PolySymbolsNameMatchQueryParams -import com.intellij.polySymbols.query.PolySymbolsQueryExecutor -import com.intellij.polySymbols.query.PolySymbolsQueryParams import com.intellij.polySymbols.impl.SearchMap +import com.intellij.polySymbols.query.* import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager @@ -28,7 +22,7 @@ import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentMap /** - * Used when implementing a [com.intellij.polySymbols.PolySymbolsScope], which contains many elements. + * Used when implementing a [PolySymbolsScope], which contains many elements. * * Caches the list of symbols and uses efficient cache to speed up queries. When extending the class, * you only need to override the initialize method and provide parameters to the super constructor to specify how results should be cached. @@ -142,7 +136,7 @@ abstract class PolySymbolsScopeWithCache( qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams, scope: Stack, - ): List = + ): List = if ((params.queryExecutor.allowResolve || !requiresResolve) && (framework == null || params.framework == framework) && provides(qualifiedKind)) { diff --git a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsStructuredScope.kt b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsStructuredScope.kt index b874b9eba422..c6aaf7a32524 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsStructuredScope.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolsStructuredScope.kt @@ -2,6 +2,12 @@ package com.intellij.polySymbols.utils import com.intellij.model.Pointer import com.intellij.openapi.util.TextRange +import com.intellij.polySymbols.PolySymbol +import com.intellij.polySymbols.PolySymbolQualifiedKind +import com.intellij.polySymbols.query.PolySymbolsCompoundScope +import com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams +import com.intellij.polySymbols.query.PolySymbolsQueryExecutor +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor import com.intellij.psi.util.CachedValueProvider @@ -10,12 +16,6 @@ import com.intellij.psi.util.PsiModificationTracker import com.intellij.util.SmartList import com.intellij.util.containers.Stack import com.intellij.util.takeWhileInclusive -import com.intellij.polySymbols.PolySymbol -import com.intellij.polySymbols.PolySymbolQualifiedKind -import com.intellij.polySymbols.PolySymbolsScope -import com.intellij.polySymbols.query.PolySymbolsCompoundScope -import com.intellij.polySymbols.query.PolySymbolsListSymbolsQueryParams -import com.intellij.polySymbols.query.PolySymbolsQueryExecutor abstract class PolySymbolsStructuredScope(protected val location: T) : PolySymbolsCompoundScope() { @@ -200,7 +200,7 @@ abstract class PolySymbolsStructuredScope(protec qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams, scope: Stack, - ): List = + ): List = getAllSymbols(qualifiedKind) override fun getAllSymbols(qualifiedKind: PolySymbolQualifiedKind): List = diff --git a/platform/polySymbols/src/com/intellij/polySymbols/utils/PsiSourcedPolySymbolDelegate.kt b/platform/polySymbols/src/com/intellij/polySymbols/utils/PsiSourcedPolySymbolDelegate.kt index 40e8161472db..79add50cfbae 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/utils/PsiSourcedPolySymbolDelegate.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/utils/PsiSourcedPolySymbolDelegate.kt @@ -1,6 +1,7 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.polySymbols.utils +import com.intellij.model.Pointer import com.intellij.openapi.project.Project import com.intellij.platform.backend.navigation.NavigationTarget import com.intellij.polySymbols.search.PsiSourcedPolySymbol @@ -17,4 +18,6 @@ interface PsiSourcedPolySymbolDelegate : PolySymbolDel override fun getNavigationTargets(project: Project): Collection = delegate.getNavigationTargets(project) + override fun createPointer(): Pointer> + } \ No newline at end of file diff --git a/platform/polySymbols/testSrc/com/intellij/polySymbols/query/impl/PolySymbolsMockQueryExecutorFactory.kt b/platform/polySymbols/testSrc/com/intellij/polySymbols/query/impl/PolySymbolsMockQueryExecutorFactory.kt index a49e32a4d28b..3b5f64c5ca0e 100644 --- a/platform/polySymbols/testSrc/com/intellij/polySymbols/query/impl/PolySymbolsMockQueryExecutorFactory.kt +++ b/platform/polySymbols/testSrc/com/intellij/polySymbols/query/impl/PolySymbolsMockQueryExecutorFactory.kt @@ -2,16 +2,16 @@ package com.intellij.polySymbols.query.impl import com.intellij.openapi.Disposable import com.intellij.openapi.vfs.VirtualFile -import com.intellij.psi.PsiElement import com.intellij.polySymbols.PolyContextKind import com.intellij.polySymbols.PolyContextName -import com.intellij.polySymbols.PolySymbolsScope import com.intellij.polySymbols.context.PolyContext import com.intellij.polySymbols.context.PolyContext.Companion.KIND_FRAMEWORK import com.intellij.polySymbols.query.PolySymbolsQueryExecutor import com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory import com.intellij.polySymbols.query.PolySymbolsQueryResultsCustomizerFactory +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.utils.createModificationTracker +import com.intellij.psi.PsiElement class PolySymbolsMockQueryExecutorFactory : PolySymbolsQueryExecutorFactory { @@ -22,14 +22,14 @@ class PolySymbolsMockQueryExecutorFactory : PolySymbolsQueryExecutorFactory { override fun create(location: PsiElement?, allowResolve: Boolean): PolySymbolsQueryExecutor = PolySymbolsQueryExecutorImpl(location, scopeList, PolySymbolNamesProviderImpl( - context[KIND_FRAMEWORK], - context[KIND_FRAMEWORK]?.let { framework -> - scopeList.filterIsInstance().map { - it.getNameConversionRulesProvider(framework).getNameConversionRules() - } - } ?: emptyList(), - createModificationTracker( - scopeList.filterIsInstance().map { it.createPointer() })), + context[KIND_FRAMEWORK], + context[KIND_FRAMEWORK]?.let { framework -> + scopeList.filterIsInstance().map { + it.getNameConversionRulesProvider(framework).getNameConversionRules() + } + } ?: emptyList(), + createModificationTracker( + scopeList.filterIsInstance().map { it.createPointer() })), PolySymbolsQueryResultsCustomizerFactory.getQueryResultsCustomizer(location, PolyContext.create(context)), PolyContext.create(context), allowResolve) diff --git a/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlQueryConfigurator.kt b/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlQueryConfigurator.kt index c9fc41c7d8d9..8693e35efd0c 100644 --- a/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlQueryConfigurator.kt +++ b/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlQueryConfigurator.kt @@ -20,6 +20,7 @@ import com.intellij.polySymbols.utils.match import com.intellij.psi.PsiElement import com.intellij.psi.SmartPointerManager import com.intellij.psi.createSmartPointer +import com.intellij.psi.util.PsiModificationTracker import com.intellij.psi.util.parentOfType import com.intellij.psi.util.parentOfTypes import com.intellij.psi.xml.XmlAttribute @@ -64,21 +65,28 @@ class PolySymbolsHtmlQueryConfigurator : PolySymbolsQueryConfigurator { override fun build(queryExecutor: PolySymbolsQueryExecutor, consumer: (PolySymbolsScope) -> Unit) { val context = location.parentOfTypes(XmlTag::class, XmlAttribute::class) val element = (context as? XmlTag) ?: (context as? XmlAttribute)?.parent ?: return - val elementScope = element.takeIf { queryExecutor.allowResolve } - ?.descriptor?.asSafely()?.symbol?.let { listOf(it) } - ?: queryExecutor.nameMatchQuery(HTML_ELEMENTS, element.name) - .exclude(PolySymbolModifier.ABSTRACT) - .run() + val elementScope = + element.takeIf { queryExecutor.allowResolve } + ?.descriptor?.asSafely()?.symbol?.queryScope + ?: queryExecutor.nameMatchQuery(HTML_ELEMENTS, element.name) + .exclude(PolySymbolModifier.ABSTRACT) + .run() + .flatMap { it.queryScope } elementScope.forEach(consumer) val attribute = context as? XmlAttribute ?: return attribute.takeIf { queryExecutor.allowResolve } - ?.descriptor?.asSafely()?.symbol?.let(consumer) + ?.descriptor + ?.asSafely() + ?.symbol + ?.queryScope + ?.forEach(consumer) ?: queryExecutor.nameMatchQuery(HTML_ATTRIBUTES, attribute.name) .additionalScope(elementScope) .exclude(PolySymbolModifier.ABSTRACT) .run() + .flatMap { it.queryScope } .forEach(consumer) } @@ -134,7 +142,7 @@ class PolySymbolsHtmlQueryConfigurator : PolySymbolsQueryConfigurator { qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams, scope: Stack, - ): List = + ): List = if (params.queryExecutor.allowResolve) { when (qualifiedKind) { HTML_ELEMENTS -> @@ -186,7 +194,9 @@ class PolySymbolsHtmlQueryConfigurator : PolySymbolsQueryConfigurator { } } - abstract class StandardHtmlSymbol : MdnDocumentedSymbol(), PsiSourcedPolySymbol { + abstract class StandardHtmlSymbol : MdnDocumentedSymbol(), PsiSourcedPolySymbol, PolySymbolsScope { + abstract val project: Project? + override fun getModificationCount(): Long = project?.let { PsiModificationTracker.getInstance(it).modificationCount } ?: 0 abstract override fun createPointer(): Pointer } @@ -195,6 +205,9 @@ class PolySymbolsHtmlQueryConfigurator : PolySymbolsQueryConfigurator { private val tag: XmlTag?, ) : PolySymbol, StandardHtmlSymbol() { + override val project: Project? + get() = tag?.project ?: descriptor.declaration?.project + override fun getMdnDocumentation(): MdnSymbolDocumentation? = getHtmlMdnTagDocumentation(getHtmlApiNamespace(descriptor.nsDescriptor?.name, tag, name), name) @@ -249,6 +262,9 @@ class PolySymbolsHtmlQueryConfigurator : PolySymbolsQueryConfigurator { getHtmlMdnAttributeDocumentation(getHtmlApiNamespace(tag?.namespace, tag, tagName), tagName, name) + override val project: Project? + get() = tag?.project ?: descriptor.declaration?.project + override val qualifiedKind: PolySymbolQualifiedKind get() = HTML_ATTRIBUTES @@ -295,7 +311,7 @@ class PolySymbolsHtmlQueryConfigurator : PolySymbolsQueryConfigurator { qualifiedKind: PolySymbolQualifiedKind, params: PolySymbolsListSymbolsQueryParams, scope: Stack, - ): List = + ): List = if (qualifiedKind == HTML_ATTRIBUTE_VALUES && descriptor.isEnumerated) descriptor.enumeratedValues?.map { HtmlAttributeValueSymbol(it) } ?: emptyList() else @@ -328,11 +344,14 @@ class PolySymbolsHtmlQueryConfigurator : PolySymbolsQueryConfigurator { } - private class HtmlEventDescriptorBasedSymbol(descriptor: XmlAttributeDescriptor) : PolySymbol, StandardHtmlSymbol() { + private class HtmlEventDescriptorBasedSymbol(private val descriptor: XmlAttributeDescriptor) : PolySymbol, StandardHtmlSymbol() { override fun getMdnDocumentation(): MdnSymbolDocumentation? = getDomEventDocumentation(name) + override val project: Project? + get() = descriptor.declaration?.project + override val qualifiedKind: PolySymbolQualifiedKind get() = JS_EVENTS diff --git a/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlQueryHelper.kt b/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlQueryHelper.kt index 1eb3ad9d7e7b..5dc3b988de87 100644 --- a/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlQueryHelper.kt +++ b/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlQueryHelper.kt @@ -7,11 +7,11 @@ import com.intellij.model.Pointer import com.intellij.model.Pointer.hardPointer import com.intellij.openapi.project.Project import com.intellij.openapi.util.ModificationTracker -import com.intellij.polySymbols.html.HTML_ATTRIBUTES -import com.intellij.polySymbols.html.HTML_ELEMENTS import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolQualifiedKind -import com.intellij.polySymbols.PolySymbolsScope +import com.intellij.polySymbols.html.HTML_ATTRIBUTES +import com.intellij.polySymbols.html.HTML_ELEMENTS +import com.intellij.polySymbols.query.PolySymbolsScope import com.intellij.polySymbols.utils.PolySymbolsScopeWithCache import org.jetbrains.annotations.ApiStatus diff --git a/xml/xml-psi-impl/src/com/intellij/html/polySymbols/attributes/impl/PolySymbolHtmlAttributeInfoImpl.kt b/xml/xml-psi-impl/src/com/intellij/html/polySymbols/attributes/impl/PolySymbolHtmlAttributeInfoImpl.kt index 73c85caa96d9..a40da72d095f 100644 --- a/xml/xml-psi-impl/src/com/intellij/html/polySymbols/attributes/impl/PolySymbolHtmlAttributeInfoImpl.kt +++ b/xml/xml-psi-impl/src/com/intellij/html/polySymbols/attributes/impl/PolySymbolHtmlAttributeInfoImpl.kt @@ -111,7 +111,7 @@ internal data class PolySymbolHtmlAttributeInfoImpl( val valuesSymbols = queryExecutor.codeCompletionQuery( HTML_ATTRIBUTE_VALUES, "", 0) .exclude(PolySymbolModifier.VIRTUAL, PolySymbolModifier.ABSTRACT) - .additionalScope(symbol) + .additionalScope(symbol.queryScope) .run() typeSupport.createEnumType(symbol, valuesSymbols) } @@ -141,7 +141,7 @@ internal data class PolySymbolHtmlAttributeInfoImpl( PolySymbolHtmlAttributeValue.Type.ENUM -> { queryExecutor.codeCompletionQuery(HTML_ATTRIBUTE_VALUES, "", 0) .exclude(PolySymbolModifier.ABSTRACT) - .additionalScope(symbol) + .additionalScope(symbol.queryScope) .run() .filter { !it.completeAfterInsert } } diff --git a/xml/xml-psi-impl/src/com/intellij/html/polySymbols/elements/PolySymbolElementDescriptor.kt b/xml/xml-psi-impl/src/com/intellij/html/polySymbols/elements/PolySymbolElementDescriptor.kt index e1858f63a1ba..2639781eda95 100644 --- a/xml/xml-psi-impl/src/com/intellij/html/polySymbols/elements/PolySymbolElementDescriptor.kt +++ b/xml/xml-psi-impl/src/com/intellij/html/polySymbols/elements/PolySymbolElementDescriptor.kt @@ -7,13 +7,6 @@ import com.intellij.html.polySymbols.PolySymbolsFrameworkHtmlSupport import com.intellij.html.polySymbols.PolySymbolsHtmlQueryConfigurator.HtmlElementDescriptorBasedSymbol import com.intellij.html.polySymbols.PolySymbolsHtmlQueryConfigurator.StandardHtmlSymbol import com.intellij.html.polySymbols.hasOnlyStandardHtmlSymbolsOrExtensions -import com.intellij.psi.PsiElement -import com.intellij.psi.impl.source.html.dtd.HtmlNSDescriptorImpl -import com.intellij.psi.impl.source.xml.XmlDescriptorUtil -import com.intellij.psi.impl.source.xml.XmlDescriptorUtil.wrapInDelegating -import com.intellij.psi.xml.XmlAttribute -import com.intellij.psi.xml.XmlTag -import com.intellij.util.asSafely import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolModifier import com.intellij.polySymbols.PolySymbolQualifiedKind @@ -21,15 +14,23 @@ import com.intellij.polySymbols.PolySymbolQualifiedName import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.query.PolySymbolsQueryExecutorFactory import com.intellij.polySymbols.utils.nameSegments +import com.intellij.psi.PsiElement +import com.intellij.psi.impl.source.html.dtd.HtmlNSDescriptorImpl +import com.intellij.psi.impl.source.xml.XmlDescriptorUtil +import com.intellij.psi.impl.source.xml.XmlDescriptorUtil.wrapInDelegating +import com.intellij.psi.xml.XmlAttribute +import com.intellij.psi.xml.XmlTag +import com.intellij.util.asSafely import com.intellij.xml.* import com.intellij.xml.impl.XmlElementDescriptorEx import com.intellij.xml.impl.schema.AnyXmlElementDescriptor import org.jetbrains.annotations.NonNls -open class PolySymbolElementDescriptor private constructor(private val tag: XmlTag, - private val name: String, - val symbol: PolySymbol) - : XmlElementDescriptorEx, XmlElementDescriptorAwareAboutChildren, XmlCustomElementDescriptor { +open class PolySymbolElementDescriptor private constructor( + private val tag: XmlTag, + private val name: String, + val symbol: PolySymbol, +) : XmlElementDescriptorEx, XmlElementDescriptorAwareAboutChildren, XmlCustomElementDescriptor { constructor(info: PolySymbolHtmlElementInfo, tag: XmlTag) : this(tag, info.name, info.symbol) @@ -37,41 +38,47 @@ open class PolySymbolElementDescriptor private constructor(private val tag: XmlT } - fun runNameMatchQuery(qualifiedName: PolySymbolQualifiedName, - virtualSymbols: Boolean = true, - abstractSymbols: Boolean = false, - strictScope: Boolean = false): List = + fun runNameMatchQuery( + qualifiedName: PolySymbolQualifiedName, + virtualSymbols: Boolean = true, + abstractSymbols: Boolean = false, + strictScope: Boolean = false, + ): List = PolySymbolsQueryExecutorFactory.create(tag) .nameMatchQuery(listOf(qualifiedName)) { strictScope(strictScope) if (!virtualSymbols) exclude(PolySymbolModifier.VIRTUAL) if (!abstractSymbols) exclude(PolySymbolModifier.ABSTRACT) - additionalScope(symbol) + additionalScope(symbol.queryScope) } - fun runListSymbolsQuery(qualifiedKind: PolySymbolQualifiedKind, - expandPatterns: Boolean, - virtualSymbols: Boolean = true, - abstractSymbols: Boolean = false, - strictScope: Boolean = false): List = + fun runListSymbolsQuery( + qualifiedKind: PolySymbolQualifiedKind, + expandPatterns: Boolean, + virtualSymbols: Boolean = true, + abstractSymbols: Boolean = false, + strictScope: Boolean = false, + ): List = PolySymbolsQueryExecutorFactory.create(tag) .listSymbolsQuery(qualifiedKind, expandPatterns) { strictScope(strictScope) if (!virtualSymbols) exclude(PolySymbolModifier.VIRTUAL) if (!abstractSymbols) exclude(PolySymbolModifier.ABSTRACT) - additionalScope(symbol) + additionalScope(symbol.queryScope) } - fun runCodeCompletionQuery(qualifiedKind: PolySymbolQualifiedKind, - name: String, - /** Position to complete at in the last segment of the path **/ - position: Int, - virtualSymbols: Boolean = true): List = + fun runCodeCompletionQuery( + qualifiedKind: PolySymbolQualifiedKind, + name: String, + /** Position to complete at in the last segment of the path **/ + position: Int, + virtualSymbols: Boolean = true, + ): List = PolySymbolsQueryExecutorFactory.create(tag) .codeCompletionQuery(qualifiedKind, name, position) { if (!virtualSymbols) exclude(PolySymbolModifier.VIRTUAL) exclude(PolySymbolModifier.ABSTRACT) - additionalScope(symbol) + additionalScope(symbol.queryScope) } override fun getQualifiedName(): String {