WEB-70567 WebSymbols: properly support standard HTML attributes with enumerated values

(cherry picked from commit 1dd2997721d943b7a1c1d461a80a0eab6d68c4aa)

IJ-CR-150932

GitOrigin-RevId: e3a549d20ecdbdfd1d738c91decc16464be91e2e
This commit is contained in:
Piotr Tomiak
2024-12-04 09:09:17 +01:00
committed by intellij-monorepo-bot
parent 972970502f
commit c2121af7a3

View File

@@ -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<WebSymbolsScope>,
): List<WebSymbolsScope> =
if (qualifiedKind == HTML_ATTRIBUTE_VALUES && descriptor.isEnumerated)
descriptor.enumeratedValues?.map { HtmlAttributeValueSymbol(it) } ?: emptyList()
else
emptyList()
override fun createPointer(): Pointer<HtmlAttributeDescriptorBasedSymbol> {
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<HtmlAttributeValueSymbol> =
Pointer.hardPointer(this)
}
}