From 8329017b59fbf431ec08e8a3ca8fbda00baf9dd6 Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Wed, 11 Jun 2025 16:07:38 +0200 Subject: [PATCH] [polySymbols] WEB-73289 PolySymbols: simplify PolySymbol interface - access properties through a get method instead of a Map GitOrigin-RevId: 4f38e76aef39b4d289347b5f7caf99100234f1f4 --- .../polySymbols/api-dump-experimental.txt | 40 +++++++------- .../WebTypesDocumentationCustomizer.kt | 4 +- .../polySymbols/webTypes/WebTypesSymbol.kt | 55 +++++++++++++++---- .../webTypes/WebTypesSymbolBase.kt | 8 ++- .../webTypes/json/WebTypesJsonUtils.kt | 26 ++++----- .../com/intellij/polySymbols/PolySymbol.kt | 55 +++++-------------- .../polySymbols/PolySymbolProperty.kt | 42 ++++++++++++++ .../impl/PolySymbolsHighlightingAnnotator.kt | 5 +- .../query/impl/PolySymbolMatchBase.kt | 12 ++-- .../PsiPolySymbolReferenceProviderImpl.kt | 43 +++++++-------- .../polySymbols/utils/PolySymbolDelegate.kt | 5 +- .../polySymbols/utils/PolySymbolUtils.kt | 3 +- .../query/PolySymbolsDebugOutputPrinter.kt | 20 ++++++- .../polySymbols/PolySymbolsTestUtil.kt | 9 +++ .../query/PolySymbolsCompletionQueryTest.kt | 9 +-- .../query/PolySymbolsListQueryTest.kt | 23 ++++---- .../query/PolySymbolsNameQueryTest.kt | 2 +- .../PolySymbolsHtmlTextInjector.kt | 2 - 18 files changed, 217 insertions(+), 146 deletions(-) create mode 100644 platform/polySymbols/src/com/intellij/polySymbols/PolySymbolProperty.kt diff --git a/platform/polySymbols/api-dump-experimental.txt b/platform/polySymbols/api-dump-experimental.txt index d5d6106c01e9..5a5213fb4a63 100644 --- a/platform/polySymbols/api-dump-experimental.txt +++ b/platform/polySymbols/api-dump-experimental.txt @@ -7,17 +7,13 @@ - com.intellij.polySymbols.PolySymbolsScope - com.intellij.polySymbols.utils.PolySymbolsPrioritizedScope - *sf:Companion:com.intellij.polySymbols.PolySymbol$Companion -- sf:PROP_ARGUMENTS:java.lang.String -- sf:PROP_DOC_HIDE_PATTERN:java.lang.String -- sf:PROP_HIDE_FROM_COMPLETION:java.lang.String -- sf:PROP_IJ_TEXT_ATTRIBUTES_KEY:java.lang.String -- sf:PROP_INJECT_LANGUAGE:java.lang.String -- sf:PROP_JS_SYMBOL_KIND:java.lang.String -- sf:PROP_KIND:java.lang.String -- sf:PROP_NO_DOC:java.lang.String -- sf:PROP_READ_ONLY:java.lang.String +- sf:PROP_DOC_HIDE_PATTERN:com.intellij.polySymbols.PolySymbolProperty +- sf:PROP_HIDE_FROM_COMPLETION:com.intellij.polySymbols.PolySymbolProperty +- sf:PROP_IJ_TEXT_ATTRIBUTES_KEY:com.intellij.polySymbols.PolySymbolProperty +- sf:PROP_INJECT_LANGUAGE:com.intellij.polySymbols.PolySymbolProperty - adjustNameForRefactoring(com.intellij.polySymbols.query.PolySymbolsQueryExecutor,java.lang.String,java.lang.String):java.lang.String - a:createPointer():com.intellij.model.Pointer +- get(com.intellij.polySymbols.PolySymbolProperty):java.lang.Object - getAccessModifier():com.intellij.polySymbols.PolySymbolAccessModifier - getApiStatus():com.intellij.polySymbols.PolySymbolApiStatus - getAttributeValue():com.intellij.polySymbols.html.PolySymbolHtmlAttributeValue @@ -31,7 +27,6 @@ - getPattern():com.intellij.polySymbols.patterns.PolySymbolsPattern - getPresentation():com.intellij.platform.backend.presentation.TargetPresentation - getPriority():com.intellij.polySymbols.PolySymbol$Priority -- getProperties():java.util.Map - getPsiContext():com.intellij.psi.PsiElement - a:getQualifiedKind():com.intellij.polySymbols.PolySymbolQualifiedKind - getQueryScope():java.util.List @@ -43,15 +38,6 @@ - isRequired():java.lang.Boolean - matchContext(com.intellij.polySymbols.context.PolyContext):Z *f:com.intellij.polySymbols.PolySymbol$Companion -- sf:PROP_ARGUMENTS:java.lang.String -- sf:PROP_DOC_HIDE_PATTERN:java.lang.String -- sf:PROP_HIDE_FROM_COMPLETION:java.lang.String -- sf:PROP_IJ_TEXT_ATTRIBUTES_KEY:java.lang.String -- sf:PROP_INJECT_LANGUAGE:java.lang.String -- sf:PROP_JS_SYMBOL_KIND:java.lang.String -- sf:PROP_KIND:java.lang.String -- sf:PROP_NO_DOC:java.lang.String -- sf:PROP_READ_ONLY:java.lang.String *:com.intellij.polySymbols.PolySymbol$Priority - java.lang.Comparable - *sf:Companion:com.intellij.polySymbols.PolySymbol$Priority$Companion @@ -236,6 +222,13 @@ - f:create(java.lang.String,java.lang.String,java.lang.String,javax.swing.Icon,com.intellij.polySymbols.utils.PolySymbolTypeSupport):com.intellij.polySymbols.PolySymbolOrigin - bs:create$default(com.intellij.polySymbols.PolySymbolOrigin$Companion,java.lang.String,java.lang.String,java.lang.String,javax.swing.Icon,com.intellij.polySymbols.utils.PolySymbolTypeSupport,I,java.lang.Object):com.intellij.polySymbols.PolySymbolOrigin - f:empty():com.intellij.polySymbols.PolySymbolOrigin +*:com.intellij.polySymbols.PolySymbolProperty +- *sf:Companion:com.intellij.polySymbols.PolySymbolProperty$Companion +- s:get(java.lang.String,java.lang.Class):com.intellij.polySymbols.PolySymbolProperty +- a:getName():java.lang.String +- a:tryCast(java.lang.Object):java.lang.Object +*f:com.intellij.polySymbols.PolySymbolProperty$Companion +- f:get(java.lang.String,java.lang.Class):com.intellij.polySymbols.PolySymbolProperty *:com.intellij.polySymbols.PolySymbolQualifiedKind - *sf:Companion:com.intellij.polySymbols.PolySymbolQualifiedKind$Companion - s:get(java.lang.String,java.lang.String):com.intellij.polySymbols.PolySymbolQualifiedKind @@ -1012,6 +1005,7 @@ *:com.intellij.polySymbols.utils.PolySymbolDelegate - com.intellij.polySymbols.PolySymbol - *sf:Companion:com.intellij.polySymbols.utils.PolySymbolDelegate$Companion +- get(com.intellij.polySymbols.PolySymbolProperty):java.lang.Object - getAccessModifier():com.intellij.polySymbols.PolySymbolAccessModifier - getApiStatus():com.intellij.polySymbols.PolySymbolApiStatus - getAttributeValue():com.intellij.polySymbols.html.PolySymbolHtmlAttributeValue @@ -1028,7 +1022,6 @@ - getOrigin():com.intellij.polySymbols.PolySymbolOrigin - getPattern():com.intellij.polySymbols.patterns.PolySymbolsPattern - getPriority():com.intellij.polySymbols.PolySymbol$Priority -- getProperties():java.util.Map - getPsiContext():com.intellij.psi.PsiElement - getQualifiedKind():com.intellij.polySymbols.PolySymbolQualifiedKind - getQueryScope():java.util.List @@ -1185,6 +1178,11 @@ - com.intellij.polySymbols.documentation.PolySymbolWithDocumentation - com.intellij.polySymbols.search.PsiSourcedPolySymbol - *sf:Companion:com.intellij.polySymbols.webTypes.WebTypesSymbol$Companion +- sf:PROP_ARGUMENTS:com.intellij.polySymbols.PolySymbolProperty +- sf:PROP_JS_SYMBOL_KIND:com.intellij.polySymbols.PolySymbolProperty +- sf:PROP_KIND:com.intellij.polySymbols.PolySymbolProperty +- sf:PROP_NO_DOC:com.intellij.polySymbols.PolySymbolProperty +- sf:PROP_READ_ONLY:com.intellij.polySymbols.PolySymbolProperty - a:createPointer():com.intellij.model.Pointer - getDocumentationTarget(com.intellij.psi.PsiElement):com.intellij.platform.backend.documentation.DocumentationTarget - a:getLocation():com.intellij.polySymbols.webTypes.WebTypesSymbol$Location @@ -1228,6 +1226,7 @@ - ():V - createPointer():com.intellij.model.Pointer - equals(java.lang.Object):Z +- get(com.intellij.polySymbols.PolySymbolProperty):java.lang.Object - f:getApiStatus():com.intellij.polySymbols.PolySymbolApiStatus - f:getAttributeValue():com.intellij.polySymbols.html.PolySymbolHtmlAttributeValue - f:getCodeCompletions(com.intellij.polySymbols.PolySymbolQualifiedName,com.intellij.polySymbols.query.PolySymbolsCodeCompletionQueryParams,com.intellij.util.containers.Stack):java.util.List @@ -1244,7 +1243,6 @@ - f:getOrigin():com.intellij.polySymbols.PolySymbolOrigin - f:getPattern():com.intellij.polySymbols.patterns.PolySymbolsPattern - f:getPriority():com.intellij.polySymbols.PolySymbol$Priority -- getProperties():java.util.Map - f:getQualifiedKind():com.intellij.polySymbols.PolySymbolQualifiedKind - pf:getQueryExecutor():com.intellij.polySymbols.query.PolySymbolsQueryExecutor - f:getQueryScope():java.util.List diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesDocumentationCustomizer.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesDocumentationCustomizer.kt index bda852ca2260..482e50a3d882 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesDocumentationCustomizer.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesDocumentationCustomizer.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.webTypes -import com.intellij.psi.PsiElement import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolsBundle import com.intellij.polySymbols.documentation.PolySymbolDocumentation import com.intellij.polySymbols.documentation.PolySymbolDocumentationCustomizer import com.intellij.polySymbols.patterns.impl.RegExpPattern +import com.intellij.psi.PsiElement import org.jetbrains.annotations.ApiStatus import org.jetbrains.annotations.NonNls @@ -14,7 +14,7 @@ import org.jetbrains.annotations.NonNls class WebTypesDocumentationCustomizer : PolySymbolDocumentationCustomizer { override fun customize(symbol: PolySymbol, location: PsiElement?, documentation: PolySymbolDocumentation): PolySymbolDocumentation { val pattern = symbol.pattern as? RegExpPattern - return if (pattern != null && symbol.properties[PolySymbol.PROP_DOC_HIDE_PATTERN] != true) { + return if (pattern != null && symbol[PolySymbol.PROP_DOC_HIDE_PATTERN] != true) { @NonNls val patternString: String = pattern.toString() documentation.withDescriptionSection(PolySymbolsBundle.message("mdn.documentation.section.pattern"), patternString) } 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 6ad6e6714ce6..4585c543837d 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbol.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbol.kt @@ -4,11 +4,12 @@ package com.intellij.polySymbols.webTypes import com.intellij.model.Pointer import com.intellij.openapi.vfs.VirtualFile import com.intellij.platform.backend.documentation.DocumentationTarget -import com.intellij.polySymbols.js.JS_STRING_LITERALS -import com.intellij.polySymbols.js.JS_PROPERTIES -import com.intellij.polySymbols.PolySymbol.Companion.PROP_NO_DOC +import com.intellij.polySymbols.PolySymbolProperty 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.js.JsSymbolSymbolKind import com.intellij.polySymbols.search.PsiSourcedPolySymbol import com.intellij.psi.PsiElement @@ -17,13 +18,49 @@ interface WebTypesSymbol : PsiSourcedPolySymbol, PolySymbolWithDocumentation { val location: Location? override fun getDocumentationTarget(location: PsiElement?): DocumentationTarget? = - if (properties[PROP_NO_DOC] != true) + if (this[PROP_NO_DOC] != true) PolySymbolDocumentationTargetImpl(this, location) else null override fun createPointer(): Pointer + companion object { + /** + * Don't provide documentation for the symbol + */ + @JvmField + val PROP_NO_DOC: PolySymbolProperty = PolySymbolProperty["ij-no-doc"] + + /** + * Name of boolean property used by `css/pseudo-elements` and `css/pseudo-classes` symbols + * to specify whether they require arguments. Defaults to false. + **/ + @JvmField + val PROP_ARGUMENTS: PolySymbolProperty = PolySymbolProperty["arguments"] + + /** + * Name of boolean property used by `js/properties` symbols to specify whether + * the property is read-only. Defaults to false. + **/ + @JvmField + val PROP_READ_ONLY: PolySymbolProperty = PolySymbolProperty["read-only"] + + /** + * Name of [JsSymbolSymbolKind] property used by `js/symbols` symbols to specify kind of the JS symbol. + * By default, JS symbol is treated as [JsSymbolSymbolKind.Variable]. + **/ + @JvmField + val PROP_KIND: PolySymbolProperty = PolySymbolProperty["kind"] + + /** + * Name of [JsSymbolSymbolKind] property used by other symbols to specify kind of the JS symbol. + * By default, JS symbol is treated as [JsSymbolSymbolKind.Variable]. + **/ + @JvmField + val PROP_JS_SYMBOL_KIND: PolySymbolProperty = PolySymbolProperty["js-symbol-kind"] + } + sealed interface Location sealed interface FileLocation { @@ -84,14 +121,12 @@ interface WebTypesSymbol : PsiSourcedPolySymbol, PolySymbolWithDocumentation { } } - companion object { - internal val WEB_TYPES_JS_FORBIDDEN_GLOBAL_KINDS = setOf( - JS_PROPERTIES.kind, JS_STRING_LITERALS.kind - ) - } - } +internal val WEB_TYPES_JS_FORBIDDEN_GLOBAL_KINDS = setOf( + JS_PROPERTIES.kind, JS_STRING_LITERALS.kind +) + private data class ModuleExportData( override val moduleName: String, override val symbolName: String, 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 8fd9ec67cf3b..dbdc44bc6854 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbolBase.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbolBase.kt @@ -39,8 +39,12 @@ open class WebTypesSymbolBase : WebTypesSymbol { ?.also { contributions -> _superContributions = contributions } ?: emptyList() - override val properties: Map - get() = base.contribution.genericProperties + private val contributionProperties by lazy { + base.contribution.genericProperties + } + + override fun get(property: PolySymbolProperty): T? = + property.tryCast(contributionProperties[property.name]) override fun isEquivalentTo(symbol: Symbol): Boolean = (symbol is WebTypesSymbolBase && symbol.base == this.base) 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 eb23d7a8e97c..f916dcf27ea1 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 @@ -4,11 +4,8 @@ package com.intellij.polySymbols.webTypes.json import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.util.text.StringUtil import com.intellij.polySymbols.* -import com.intellij.polySymbols.PolySymbol.Companion.PROP_ARGUMENTS import com.intellij.polySymbols.PolySymbol.Companion.PROP_DOC_HIDE_PATTERN import com.intellij.polySymbols.PolySymbol.Companion.PROP_HIDE_FROM_COMPLETION -import com.intellij.polySymbols.PolySymbol.Companion.PROP_KIND -import com.intellij.polySymbols.PolySymbol.Companion.PROP_READ_ONLY import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.context.PolyContext import com.intellij.polySymbols.context.PolyContext.Companion.PKG_MANAGER_NODE_PACKAGES @@ -30,8 +27,11 @@ import com.intellij.polySymbols.utils.NameCaseUtils import com.intellij.polySymbols.utils.PolySymbolTypeSupport import com.intellij.polySymbols.utils.lastPolySymbol import com.intellij.polySymbols.utils.namespace +import com.intellij.polySymbols.webTypes.WEB_TYPES_JS_FORBIDDEN_GLOBAL_KINDS import com.intellij.polySymbols.webTypes.WebTypesJsonOrigin -import com.intellij.polySymbols.webTypes.WebTypesSymbol +import com.intellij.polySymbols.webTypes.WebTypesSymbol.Companion.PROP_ARGUMENTS +import com.intellij.polySymbols.webTypes.WebTypesSymbol.Companion.PROP_KIND +import com.intellij.polySymbols.webTypes.WebTypesSymbol.Companion.PROP_READ_ONLY import com.intellij.polySymbols.webTypes.filters.PolySymbolsFilter import com.intellij.polySymbols.webTypes.json.NameConversionRulesSingle.NameConverter import com.intellij.util.applyIf @@ -126,7 +126,7 @@ private fun JsGlobal.collectDirectContributions(): Sequence !WebTypesSymbol.WEB_TYPES_JS_FORBIDDEN_GLOBAL_KINDS.contains(name) } + .filter { (name, _) -> !WEB_TYPES_JS_FORBIDDEN_GLOBAL_KINDS.contains(name) } .map { (name, list) -> Pair(PolySymbolQualifiedKind[NAMESPACE_JS, name], list?.mapNotNull { it?.value as? GenericContribution } ?: emptyList()) @@ -153,11 +153,11 @@ internal val GenericContributionsHost.genericProperties: Map } .plus( when (this) { - is CssPseudoClass -> sequenceOf(Pair(PROP_ARGUMENTS, this.arguments ?: false)) - is CssPseudoElement -> sequenceOf(Pair(PROP_ARGUMENTS, this.arguments ?: false)) - is JsProperty -> if (this.readOnly == true) sequenceOf(Pair(PROP_READ_ONLY, true)) else emptySequence() + is CssPseudoClass -> sequenceOf(Pair(PROP_ARGUMENTS.name, this.arguments ?: false)) + is CssPseudoElement -> sequenceOf(Pair(PROP_ARGUMENTS.name, this.arguments ?: false)) + is JsProperty -> if (this.readOnly == true) sequenceOf(Pair(PROP_READ_ONLY.name, true)) else emptySequence() is JsSymbol -> this.kind?.let { kind -> JsSymbolSymbolKind.entries.firstOrNull { it.name.equals(kind.value(), true) } } - ?.let { sequenceOf(Pair(PROP_KIND, it)) } + ?.let { sequenceOf(Pair(PROP_KIND.name, it)) } ?: emptySequence() else -> emptySequence() } @@ -346,7 +346,7 @@ internal fun DeprecatedHtmlAttributeVueArgument.toHtmlContribution(): BaseContri result.docUrl = this.docUrl result.pattern = this.pattern if (pattern.isMatchAllRegex) - result.additionalProperties[PROP_DOC_HIDE_PATTERN] = true.toGenericHtmlPropertyValue() + result.additionalProperties[PROP_DOC_HIDE_PATTERN.name] = true.toGenericHtmlPropertyValue() return result } @@ -357,7 +357,7 @@ internal fun DeprecatedHtmlAttributeVueModifier.toHtmlContribution(): BaseContri result.docUrl = this.docUrl result.pattern = this.pattern if (pattern.isMatchAllRegex) - result.additionalProperties[PROP_DOC_HIDE_PATTERN] = true.toGenericHtmlPropertyValue() + result.additionalProperties[PROP_DOC_HIDE_PATTERN.name] = true.toGenericHtmlPropertyValue() return result } @@ -447,8 +447,8 @@ private fun matchAllHtmlContribution(name: String): GenericContribution = contribution.pattern = NamePatternRoot().also { it.value = ".*" } - contribution.additionalProperties[PROP_DOC_HIDE_PATTERN] = true.toGenericHtmlPropertyValue() - contribution.additionalProperties[PROP_HIDE_FROM_COMPLETION] = true.toGenericHtmlPropertyValue() + contribution.additionalProperties[PROP_DOC_HIDE_PATTERN.name] = true.toGenericHtmlPropertyValue() + contribution.additionalProperties[PROP_HIDE_FROM_COMPLETION.name] = true.toGenericHtmlPropertyValue() } private val NamePatternRoot?.isMatchAllRegex diff --git a/platform/polySymbols/src/com/intellij/polySymbols/PolySymbol.kt b/platform/polySymbols/src/com/intellij/polySymbols/PolySymbol.kt index d013c2850dcb..f770d6a4c2a4 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/PolySymbol.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/PolySymbol.kt @@ -13,7 +13,6 @@ import com.intellij.platform.backend.navigation.NavigationTarget import com.intellij.platform.backend.presentation.TargetPresentation import com.intellij.polySymbols.context.PolyContext import com.intellij.polySymbols.html.PolySymbolHtmlAttributeValue -import com.intellij.polySymbols.js.JsSymbolSymbolKind import com.intellij.polySymbols.patterns.PolySymbolsPattern import com.intellij.polySymbols.query.PolySymbolMatch import com.intellij.polySymbols.query.PolySymbolsQueryExecutor @@ -163,13 +162,14 @@ interface PolySymbol : PolySymbolsScope, Symbol, NavigatableSymbol, PolySymbolsP get() = null /** - * Various symbol properties. There should be no assumption on the type of properties. - * Properties can be used by plugins to provide additional information on the symbol. - * All properties supported by IDEs are defined through `PROP_*` constants of [PolySymbol] interface. - * Check properties documentation for further reference. + * Accessor for various symbol properties. This is a convenience method which + * tries to cast the value to an expected type for the defined property. + * Plugins can use properties to provide additional information on the symbol. + * All properties supported by IDEs are defined through `PROP_*` constants of [PolySymbol] interface. + * Check their documentation for further reference. */ - val properties: Map - get() = emptyMap() + operator fun get(property: PolySymbolProperty): T? = + null /** * Returns [TargetPresentation] used by [SearchTarget] and [RenameTarget]. @@ -312,53 +312,28 @@ interface PolySymbol : PolySymbolsScope, Symbol, NavigatableSymbol, PolySymbolsP * Supported by `html/elements` and `html/attributes` symbols, * allows to inject the specified language into HTML element text or HTML attribute value. */ - const val PROP_INJECT_LANGUAGE: String = "inject-language" + @JvmField + val PROP_INJECT_LANGUAGE: PolySymbolProperty = PolySymbolProperty["inject-language"] /** * If a symbol uses a RegEx pattern, usually it will be displayed in a documentation * popup section "pattern". Setting this property to `true` hides that section. */ - const val PROP_DOC_HIDE_PATTERN: String = "doc-hide-pattern" + @JvmField + val PROP_DOC_HIDE_PATTERN: PolySymbolProperty = PolySymbolProperty["doc-hide-pattern"] /** * By default, all symbols show up in code completion. * Setting this property to true prevents a symbol from showing up in the code completion. */ - const val PROP_HIDE_FROM_COMPLETION: String = "hide-from-completion" - - /** - * Name of boolean property used by `css/pseudo-elements` and `css/pseudo-classes` symbols - * to specify whether they require arguments. Defaults to false. - **/ - const val PROP_ARGUMENTS: String = "arguments" - - /** - * Name of boolean property used by `js/properties` symbols to specify whether - * the property is read-only. Defaults to false. - **/ - const val PROP_READ_ONLY: String = "read-only" - - /** - * Name of [JsSymbolSymbolKind] property used by `js/symbols` symbols to specify kind of the JS symbol. - * By default, JS symbol is treated as [JsSymbolSymbolKind.Variable]. - **/ - const val PROP_KIND: String = "kind" - - /** - * Name of [JsSymbolSymbolKind] property used by other symbols to specify kind of the JS symbol. - * By default, JS symbol is treated as [JsSymbolSymbolKind.Variable]. - **/ - const val PROP_JS_SYMBOL_KIND: String = "js-symbol-kind" - - /** - * Don't provide documentation for the symbol - */ - const val PROP_NO_DOC: String = "ij-no-doc" + @JvmField + val PROP_HIDE_FROM_COMPLETION: PolySymbolProperty = PolySymbolProperty["hide-from-completion"] /** * Text attributes key of an IntelliJ ColorScheme. **/ - const val PROP_IJ_TEXT_ATTRIBUTES_KEY: String = "ij-text-attributes-key" + @JvmField + val PROP_IJ_TEXT_ATTRIBUTES_KEY: PolySymbolProperty = PolySymbolProperty["ij-text-attributes-key"] } } diff --git a/platform/polySymbols/src/com/intellij/polySymbols/PolySymbolProperty.kt b/platform/polySymbols/src/com/intellij/polySymbols/PolySymbolProperty.kt new file mode 100644 index 000000000000..ff3457040f77 --- /dev/null +++ b/platform/polySymbols/src/com/intellij/polySymbols/PolySymbolProperty.kt @@ -0,0 +1,42 @@ +// 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 + +import org.jetbrains.annotations.ApiStatus + +@ApiStatus.NonExtendable +interface PolySymbolProperty { + + val name: String + + fun tryCast(value: Any?): T? + + companion object { + @JvmStatic + inline operator fun get(name: String): PolySymbolProperty = + get(name, T::class.java) + + @JvmStatic + operator fun get(name: String, type: Class): PolySymbolProperty = + PolySymbolPropertyData(name, type) + } +} + +private class PolySymbolPropertyData(override val name: String, private val type: Class) : PolySymbolProperty { + override fun tryCast(value: Any?): T? = + if (value != null && this.type.isInstance(value)) this.type.cast(value) else null + + override fun equals(other: Any?): Boolean = + other === this || + other is PolySymbolPropertyData<*> + && other.name == name + && other.type == type + + override fun hashCode(): Int { + var result = name.hashCode() + result = 31 * result + type.hashCode() + return result + } + + override fun toString(): String = name + +} \ No newline at end of file diff --git a/platform/polySymbols/src/com/intellij/polySymbols/highlighting/impl/PolySymbolsHighlightingAnnotator.kt b/platform/polySymbols/src/com/intellij/polySymbols/highlighting/impl/PolySymbolsHighlightingAnnotator.kt index 5acf88c2867a..6e9cd7b223fb 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/highlighting/impl/PolySymbolsHighlightingAnnotator.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/highlighting/impl/PolySymbolsHighlightingAnnotator.kt @@ -47,7 +47,6 @@ import com.intellij.profile.codeInspection.InspectionProjectProfileManager import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.util.SmartList -import com.intellij.util.asSafely import com.intellij.util.containers.MultiMap import org.jetbrains.annotations.PropertyKey import java.util.* @@ -114,7 +113,7 @@ class PolySymbolsHighlightingAnnotator : Annotator { } continue } - if (symbols.any { it.properties[IJ_IGNORE_REFS] == true } + if (symbols.any { it[IJ_IGNORE_REFS] == true } || symbols.hasOnlyExtensions() ) continue @@ -125,7 +124,7 @@ class PolySymbolsHighlightingAnnotator : Annotator { PolySymbolHighlightingCustomizer.getSymbolTextAttributes(host, symbol, depth) ?.let { return@mapNotNull it } - symbol.properties[PolySymbol.PROP_IJ_TEXT_ATTRIBUTES_KEY]?.asSafely() + symbol[PolySymbol.PROP_IJ_TEXT_ATTRIBUTES_KEY] ?.let { TextAttributesKey.find(it) } ?.let { return@mapNotNull it } 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 1ccf079d2911..3f50ea19a31a 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolMatchBase.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/query/impl/PolySymbolMatchBase.kt @@ -229,13 +229,11 @@ private interface PolySymbolMatchMixin : PolySymbolMatch { override val icon: Icon? get() = reversedSegments().flatMap { it.symbols }.mapNotNull { it.icon }.firstOrNull() - override val properties: Map - get() = nameSegments.asSequence().flatMap { it.symbols } - .flatMap { it.properties.entries } - .filter { it.key != PolySymbol.PROP_HIDE_FROM_COMPLETION } - .plus(additionalProperties.entries) - .map { Pair(it.key, it.value) } - .toMap() + override fun get(property: PolySymbolProperty): T? = + property.tryCast(additionalProperties[property.name]) + ?: if (property != PolySymbol.PROP_HIDE_FROM_COMPLETION) + reversedSegments().flatMap { it.symbols }.mapNotNull { it[property] }.firstOrNull() + else null override fun getNavigationTargets(project: Project): Collection = if (nameSegments.size == 1) diff --git a/platform/polySymbols/src/com/intellij/polySymbols/references/impl/PsiPolySymbolReferenceProviderImpl.kt b/platform/polySymbols/src/com/intellij/polySymbols/references/impl/PsiPolySymbolReferenceProviderImpl.kt index 7de838cc0738..4f08bf8b91c9 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/references/impl/PsiPolySymbolReferenceProviderImpl.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/references/impl/PsiPolySymbolReferenceProviderImpl.kt @@ -12,34 +12,31 @@ import com.intellij.model.search.SearchRequest import com.intellij.openapi.project.Project import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.text.StringUtil +import com.intellij.polySymbols.* +import com.intellij.polySymbols.PolySymbolApiStatus.Companion.getMessage +import com.intellij.polySymbols.PolySymbolApiStatus.Companion.isDeprecatedOrObsolete +import com.intellij.polySymbols.highlighting.impl.getDefaultProblemMessage +import com.intellij.polySymbols.impl.removeZeroLengthSegmentsRecursively +import com.intellij.polySymbols.inspections.PolySymbolsProblemQuickFixProvider +import com.intellij.polySymbols.inspections.impl.PolySymbolsInspectionToolMappingEP +import com.intellij.polySymbols.references.PolySymbolReference +import com.intellij.polySymbols.references.PolySymbolReferenceProblem +import com.intellij.polySymbols.references.PolySymbolReferenceProblem.ProblemKind +import com.intellij.polySymbols.references.PsiPolySymbolReferenceProvider +import com.intellij.polySymbols.utils.asSingleSymbol +import com.intellij.polySymbols.utils.getProblemKind +import com.intellij.polySymbols.utils.hasOnlyExtensions +import com.intellij.polySymbols.utils.nameSegments import com.intellij.psi.PsiElement import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.PsiModificationTracker import com.intellij.util.SmartList import com.intellij.util.containers.MultiMap -import com.intellij.polySymbols.PolySymbol -import com.intellij.polySymbols.PolySymbolApiStatus -import com.intellij.polySymbols.PolySymbolApiStatus.Companion.getMessage -import com.intellij.polySymbols.PolySymbolApiStatus.Companion.isDeprecatedOrObsolete -import com.intellij.polySymbols.PolySymbolNameSegment -import com.intellij.polySymbols.PolySymbolsBundle -import com.intellij.polySymbols.highlighting.impl.getDefaultProblemMessage -import com.intellij.polySymbols.impl.removeZeroLengthSegmentsRecursively -import com.intellij.polySymbols.inspections.PolySymbolsProblemQuickFixProvider -import com.intellij.polySymbols.inspections.impl.PolySymbolsInspectionToolMappingEP -import com.intellij.polySymbols.references.PsiPolySymbolReferenceProvider -import com.intellij.polySymbols.references.PolySymbolReference -import com.intellij.polySymbols.references.PolySymbolReferenceProblem -import com.intellij.polySymbols.references.PolySymbolReferenceProblem.ProblemKind -import com.intellij.polySymbols.utils.asSingleSymbol -import com.intellij.polySymbols.utils.getProblemKind -import com.intellij.polySymbols.utils.hasOnlyExtensions -import com.intellij.polySymbols.utils.nameSegments import org.jetbrains.annotations.Nls import java.util.* -internal const val IJ_IGNORE_REFS = "ij-no-psi-refs" +internal val IJ_IGNORE_REFS: PolySymbolProperty = PolySymbolProperty["ij-no-psi-refs"] class PsiPolySymbolReferenceProviderImpl : PsiSymbolReferenceProvider { @@ -78,7 +75,7 @@ internal fun getReferences(element: PsiElement, symbolNameOffset: Int, symbol: P val (nameSegment, offset) = queue.removeFirst() val symbols = nameSegment.symbols val range = TextRange(nameSegment.start + offset, nameSegment.end + offset) - if (symbols.any { it.properties[IJ_IGNORE_REFS] == true }) continue + if (symbols.any { it[IJ_IGNORE_REFS] == true }) continue if (symbols.all { it.nameSegments.size == 1 }) { if (nameSegment.problem != null || symbols.let { it.isNotEmpty() && !it.hasOnlyExtensions() }) { result.putValue(range, nameSegment) @@ -121,7 +118,7 @@ internal fun getReferences(element: PsiElement, symbolNameOffset: Int, symbol: P ?.firstOrNull() }.takeIf { it.size == segments.size }?.firstOrNull() if (showProblems && (deprecation != null || problemOnly || segments.any { it.problem != null })) { - NameSegmentReferenceWithProblem(element, symbol, range.shiftRight(symbolNameOffset), segments, symbolNameOffset,deprecation, problemOnly) + NameSegmentReferenceWithProblem(element, symbol, range.shiftRight(symbolNameOffset), segments, symbolNameOffset, deprecation, problemOnly) } else if (!range.isEmpty && !problemOnly) { NameSegmentReference(element, range.shiftRight(symbolNameOffset), segments) @@ -217,10 +214,10 @@ private class NameSegmentReferenceWithProblem( ?: apiStatus?.since ?.let { PolySymbolsBundle.message(if (isDeprecated) "web.inspection.message.deprecated.symbol.since" - else "web.inspection.message.obsolete.symbol.since", it) + else "web.inspection.message.obsolete.symbol.since", it) } ?: PolySymbolsBundle.message(if (isDeprecated) "web.inspection.message.deprecated.symbol.message" - else "web.inspection.message.obsolete.symbol.message") + else "web.inspection.message.obsolete.symbol.message") PolySymbolReferenceProblem.create( symbolTypes, diff --git a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegate.kt b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegate.kt index 4d6f219a4fd6..d917f7cb33d0 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegate.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolDelegate.kt @@ -60,8 +60,9 @@ interface PolySymbolDelegate : PolySymbol { get() = delegate.attributeValue override val pattern: PolySymbolsPattern? get() = delegate.pattern - override val properties: Map - get() = delegate.properties + + override fun get(property: PolySymbolProperty): T? = + delegate[property] override fun getDocumentationTarget(location: PsiElement?): DocumentationTarget? = delegate.getDocumentationTarget(location) diff --git a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolUtils.kt b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolUtils.kt index 8bb049f03d00..e1f9a23d1f80 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolUtils.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolUtils.kt @@ -277,8 +277,7 @@ internal val PolySymbol.matchedNameOrName: String get() = (this as? PolySymbolMatch)?.matchedName ?: name val PolySymbol.hideFromCompletion: Boolean - get() = - properties[PolySymbol.PROP_HIDE_FROM_COMPLETION] == true + get() = this[PolySymbol.PROP_HIDE_FROM_COMPLETION] == true val (PolySymbolNameSegment.MatchProblem?).isCritical: Boolean get() = this == PolySymbolNameSegment.MatchProblem.MISSING_REQUIRED_PART || this == PolySymbolNameSegment.MatchProblem.UNKNOWN_SYMBOL diff --git a/platform/polySymbols/testFramework/com/intellij/polySymbols/testFramework/query/PolySymbolsDebugOutputPrinter.kt b/platform/polySymbols/testFramework/com/intellij/polySymbols/testFramework/query/PolySymbolsDebugOutputPrinter.kt index 29b0a0da0ba8..3e7f04da4617 100644 --- a/platform/polySymbols/testFramework/com/intellij/polySymbols/testFramework/query/PolySymbolsDebugOutputPrinter.kt +++ b/platform/polySymbols/testFramework/com/intellij/polySymbols/testFramework/query/PolySymbolsDebugOutputPrinter.kt @@ -4,14 +4,16 @@ package com.intellij.polySymbols.testFramework.query import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolApiStatus import com.intellij.polySymbols.PolySymbolNameSegment -import com.intellij.polySymbols.search.PsiSourcedPolySymbol +import com.intellij.polySymbols.PolySymbolProperty import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.documentation.PolySymbolWithDocumentation import com.intellij.polySymbols.html.PolySymbolHtmlAttributeValue +import com.intellij.polySymbols.search.PsiSourcedPolySymbol import com.intellij.polySymbols.testFramework.DebugOutputPrinter import com.intellij.polySymbols.utils.completeMatch import com.intellij.polySymbols.utils.nameSegments import com.intellij.polySymbols.utils.qualifiedName +import com.intellij.polySymbols.webTypes.WebTypesSymbol import com.intellij.util.applyIf import java.util.* @@ -19,6 +21,13 @@ open class PolySymbolsDebugOutputPrinter : DebugOutputPrinter() { private val parents = Stack() + protected open val propertiesToPrint: List> = + listOf( + PolySymbol.PROP_HIDE_FROM_COMPLETION, PolySymbol.PROP_DOC_HIDE_PATTERN, PolySymbol.PROP_INJECT_LANGUAGE, + WebTypesSymbol.PROP_ARGUMENTS, WebTypesSymbol.PROP_JS_SYMBOL_KIND, WebTypesSymbol.PROP_KIND, + WebTypesSymbol.PROP_NO_DOC, WebTypesSymbol.PROP_READ_ONLY + ) + override fun printValueImpl(builder: StringBuilder, level: Int, value: Any?): StringBuilder = when (value) { is PolySymbolCodeCompletionItem -> builder.printCodeCompletionItem(level, value) @@ -81,7 +90,14 @@ open class PolySymbolsDebugOutputPrinter : DebugOutputPrinter() { printProperty(level, "apiStatus", source.apiStatus.takeIf { it !is PolySymbolApiStatus.Stable || it.since != null }) printProperty(level, "priority", source.priority ?: PolySymbol.Priority.NORMAL) printProperty(level, "has-pattern", if (source.pattern != null) true else null) - printProperty(level, "properties", source.properties.takeIf { it.isNotEmpty() }) + printProperty( + level, "properties", + propertiesToPrint + .sortedBy { it.name } + .mapNotNull { prop -> source[prop]?.let { Pair(prop, it) } } + .toMap() + .takeIf { it.isNotEmpty() } + ) parents.push(source) printProperty(level, "segments", source.nameSegments) parents.pop() diff --git a/platform/polySymbols/testSrc/com/intellij/polySymbols/PolySymbolsTestUtil.kt b/platform/polySymbols/testSrc/com/intellij/polySymbols/PolySymbolsTestUtil.kt index a48af99d6395..23a998439b02 100644 --- a/platform/polySymbols/testSrc/com/intellij/polySymbols/PolySymbolsTestUtil.kt +++ b/platform/polySymbols/testSrc/com/intellij/polySymbols/PolySymbolsTestUtil.kt @@ -1,7 +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 +import com.intellij.polySymbols.testFramework.query.PolySymbolsDebugOutputPrinter import com.intellij.testFramework.PlatformTestUtil internal val polySymbolsTestsDataPath: String get() = "${PlatformTestUtil.getCommunityPath()}/platform/polySymbols/testData/" + +object PolySymbolsTestsDebugOutputPrinter : PolySymbolsDebugOutputPrinter() { + override val propertiesToPrint: List> + get() = super.propertiesToPrint + listOf>( + PolySymbolProperty["ng-binding-pattern"], PolySymbolProperty["source-file"], + PolySymbolProperty["custom-prop"], PolySymbolProperty["custom-prop-2"] + ) +} \ No newline at end of file diff --git a/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsCompletionQueryTest.kt b/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsCompletionQueryTest.kt index 08140f15a6fd..d95f0fc7a565 100644 --- a/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsCompletionQueryTest.kt +++ b/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsCompletionQueryTest.kt @@ -4,12 +4,9 @@ package com.intellij.polySymbols.query import com.intellij.model.Pointer import com.intellij.openapi.util.RecursionManager import com.intellij.openapi.util.StackOverflowPreventedException -import com.intellij.polySymbols.PolySymbolModifier -import com.intellij.polySymbols.html.HTML_ATTRIBUTES -import com.intellij.polySymbols.PolySymbolQualifiedName -import com.intellij.polySymbols.PolySymbolsScope +import com.intellij.polySymbols.* import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem -import com.intellij.polySymbols.polySymbolsTestsDataPath +import com.intellij.polySymbols.html.HTML_ATTRIBUTES import com.intellij.polySymbols.testFramework.query.doTest import com.intellij.polySymbols.testFramework.query.printCodeCompletionItems import com.intellij.polySymbols.webTypes.json.parseWebTypesPath @@ -355,7 +352,7 @@ class PolySymbolsCompletionQueryTest : PolySymbolsMockQueryExecutorTestBase() { .codeCompletionQuery(parseWebTypesPath(path, null), position) .exclude(PolySymbolModifier.ABSTRACT) .run() - printCodeCompletionItems(matches) + printCodeCompletionItems(matches, PolySymbolsTestsDebugOutputPrinter) } } diff --git a/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsListQueryTest.kt b/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsListQueryTest.kt index e6fecfefa27c..058f8bff4400 100644 --- a/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsListQueryTest.kt +++ b/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsListQueryTest.kt @@ -2,11 +2,12 @@ package com.intellij.polySymbols.query import com.intellij.polySymbols.PolySymbolModifier +import com.intellij.polySymbols.PolySymbolsTestsDebugOutputPrinter +import com.intellij.polySymbols.polySymbolsTestsDataPath import com.intellij.polySymbols.testFramework.query.doTest import com.intellij.polySymbols.testFramework.query.printMatches import com.intellij.polySymbols.utils.asSingleSymbol import com.intellij.polySymbols.utils.completeMatch -import com.intellij.polySymbols.polySymbolsTestsDataPath import com.intellij.polySymbols.webTypes.json.parseWebTypesPath class PolySymbolsListQueryTest : PolySymbolsMockQueryExecutorTestBase() { @@ -192,13 +193,15 @@ class PolySymbolsListQueryTest : PolySymbolsMockQueryExecutorTestBase() { doTest(path, framework, includeVirtual = includeVirtual, webTypes = webTypes.toList()) } - fun doTest(path: String, - framework: String? = null, - includeVirtual: Boolean = true, - expandPatterns: Boolean = false, - compareWithCompletionResults: Boolean = true, - webTypes: List = emptyList(), - customElementsManifests: List = emptyList()) { + fun doTest( + path: String, + framework: String? = null, + includeVirtual: Boolean = true, + expandPatterns: Boolean = false, + compareWithCompletionResults: Boolean = true, + webTypes: List = emptyList(), + customElementsManifests: List = emptyList(), + ) { registerFiles(framework, webTypes, customElementsManifests) val parsedPath = parseWebTypesPath(path, null) val queryExecutor = polySymbolsQueryExecutorFactory.create(null) @@ -227,7 +230,7 @@ class PolySymbolsListQueryTest : PolySymbolsMockQueryExecutorTestBase() { exclude(PolySymbolModifier.ABSTRACT) } .filter { !it.extension } - assertEquals(printMatches(codeCompletionResults), printMatches(results)) + assertEquals(printMatches(codeCompletionResults, PolySymbolsTestsDebugOutputPrinter), printMatches(results, PolySymbolsTestsDebugOutputPrinter)) } doTest(testPath) { @@ -236,7 +239,7 @@ class PolySymbolsListQueryTest : PolySymbolsMockQueryExecutorTestBase() { if (!includeVirtual) exclude(PolySymbolModifier.VIRTUAL) exclude(PolySymbolModifier.ABSTRACT) } - .let { printMatches(it) } + .let { printMatches(it, PolySymbolsTestsDebugOutputPrinter) } } } } \ No newline at end of file diff --git a/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsNameQueryTest.kt b/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsNameQueryTest.kt index 0c6b32b2db75..6dd70f9806a4 100644 --- a/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsNameQueryTest.kt +++ b/platform/polySymbols/testSrc/com/intellij/polySymbols/query/PolySymbolsNameQueryTest.kt @@ -442,7 +442,7 @@ class PolySymbolsNameQueryTest : PolySymbolsMockQueryExecutorTestBase() { if (!includeVirtual) exclude(PolySymbolModifier.VIRTUAL) exclude(PolySymbolModifier.ABSTRACT) } - printMatches(matches) + printMatches(matches, PolySymbolsTestsDebugOutputPrinter) } } diff --git a/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlTextInjector.kt b/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlTextInjector.kt index a9c2f0517327..973a9f7b50a1 100644 --- a/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlTextInjector.kt +++ b/xml/xml-psi-impl/src/com/intellij/html/polySymbols/PolySymbolsHtmlTextInjector.kt @@ -81,9 +81,7 @@ class PolySymbolsHtmlTextInjector : MultiHostInjector { private fun List.getLanguageToInject() = takeIf { it.isNotEmpty() && !it.hasOnlyStandardHtmlSymbols() } ?.asSingleSymbol() - ?.properties ?.get(PolySymbol.PROP_INJECT_LANGUAGE) - ?.asSafely() ?.lowercase(Locale.US) private fun findLanguages(scriptLang: String): Sequence =