From c2121af7a3a2b6735a141848a70e9cae4429cfbb Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Wed, 4 Dec 2024 09:09:17 +0100 Subject: [PATCH] WEB-70567 WebSymbols: properly support standard HTML attributes with enumerated values (cherry picked from commit 1dd2997721d943b7a1c1d461a80a0eab6d68c4aa) IJ-CR-150932 GitOrigin-RevId: e3a549d20ecdbdfd1d738c91decc16464be91e2e --- .../WebSymbolsHtmlQueryConfigurator.kt | 39 ++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/xml/xml-psi-impl/src/com/intellij/html/webSymbols/WebSymbolsHtmlQueryConfigurator.kt b/xml/xml-psi-impl/src/com/intellij/html/webSymbols/WebSymbolsHtmlQueryConfigurator.kt index e22642dcc064..601d53562d28 100644 --- a/xml/xml-psi-impl/src/com/intellij/html/webSymbols/WebSymbolsHtmlQueryConfigurator.kt +++ b/xml/xml-psi-impl/src/com/intellij/html/webSymbols/WebSymbolsHtmlQueryConfigurator.kt @@ -6,6 +6,7 @@ import com.intellij.html.webSymbols.attributes.WebSymbolAttributeDescriptor import com.intellij.html.webSymbols.elements.WebSymbolElementDescriptor import com.intellij.model.Pointer import com.intellij.openapi.project.Project +import com.intellij.openapi.util.NlsSafe import com.intellij.psi.PsiElement import com.intellij.psi.SmartPointerManager import com.intellij.psi.createSmartPointer @@ -17,6 +18,7 @@ import com.intellij.psi.xml.XmlTag import com.intellij.util.asSafely import com.intellij.util.containers.Stack import com.intellij.webSymbols.* +import com.intellij.webSymbols.WebSymbol.Companion.HTML_ATTRIBUTE_VALUES import com.intellij.webSymbols.completion.WebSymbolCodeCompletionItem import com.intellij.webSymbols.completion.WebSymbolCodeCompletionItemCustomizer import com.intellij.webSymbols.context.WebSymbolsContext @@ -257,20 +259,30 @@ class WebSymbolsHtmlQueryConfigurator : WebSymbolsQueryConfigurator { override val attributeValue: WebSymbolHtmlAttributeValue get() { val isBooleanAttribute = HtmlUtil.isBooleanAttribute(descriptor, null) + val isEnumerated = descriptor.isEnumerated return WebSymbolHtmlAttributeValue.create( null, - if (isBooleanAttribute) { - WebSymbolHtmlAttributeValue.Type.BOOLEAN - } - else { - WebSymbolHtmlAttributeValue.Type.STRING + when { + isBooleanAttribute -> WebSymbolHtmlAttributeValue.Type.BOOLEAN + isEnumerated -> WebSymbolHtmlAttributeValue.Type.ENUM + else -> WebSymbolHtmlAttributeValue.Type.STRING }, !isBooleanAttribute, descriptor.defaultValue, - null + null, ) } + override fun getSymbols( + qualifiedKind: WebSymbolQualifiedKind, + params: WebSymbolsListSymbolsQueryParams, + scope: Stack, + ): List = + if (qualifiedKind == HTML_ATTRIBUTE_VALUES && descriptor.isEnumerated) + descriptor.enumeratedValues?.map { HtmlAttributeValueSymbol(it) } ?: emptyList() + else + emptyList() + override fun createPointer(): Pointer { val descriptor = this.descriptor val tagPtr = tag?.createSmartPointer() @@ -316,5 +328,20 @@ class WebSymbolsHtmlQueryConfigurator : WebSymbolsQueryConfigurator { Pointer.hardPointer(this) } + + private class HtmlAttributeValueSymbol(override val name: @NlsSafe String) : WebSymbol { + override val origin: WebSymbolOrigin + get() = WebSymbolOrigin.empty() + + override val namespace: @NlsSafe SymbolNamespace + get() = WebSymbol.NAMESPACE_HTML + + override val kind: @NlsSafe SymbolKind + get() = WebSymbol.KIND_HTML_ATTRIBUTE_VALUES + + override fun createPointer(): Pointer = + Pointer.hardPointer(this) + + } }