WEB-63554 Web Symbols: refactor WebSymbolCodeCompletionItemCustomizer#customize and WebSymbolsCompletionProviderBase to use qualified kinds

GitOrigin-RevId: 8a6f6947c61b11fcd95d709cc37e2f9992590866
This commit is contained in:
Piotr Tomiak
2023-10-25 14:16:06 +02:00
committed by intellij-monorepo-bot
parent 4ab89a4bb0
commit 6951a6944b
9 changed files with 37 additions and 47 deletions

View File

@@ -4,15 +4,13 @@ package com.intellij.webSymbols.completion
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.psi.PsiElement
import com.intellij.webSymbols.FrameworkId
import com.intellij.webSymbols.SymbolKind
import com.intellij.webSymbols.SymbolNamespace
import com.intellij.webSymbols.WebSymbolQualifiedKind
interface WebSymbolCodeCompletionItemCustomizer {
fun customize(item: WebSymbolCodeCompletionItem,
framework: FrameworkId?,
namespace: SymbolNamespace,
kind: SymbolKind,
qualifiedKind: WebSymbolQualifiedKind,
location: PsiElement): WebSymbolCodeCompletionItem?
companion object {
@@ -21,8 +19,7 @@ interface WebSymbolCodeCompletionItemCustomizer {
internal fun Sequence<WebSymbolCodeCompletionItem>.customizeItems(
framework: FrameworkId?,
namespace: SymbolNamespace,
kind: SymbolKind,
qualifiedKind: WebSymbolQualifiedKind,
location: PsiElement
): Sequence<WebSymbolCodeCompletionItem> {
val customizers = EP_NAME.extensionList
@@ -31,7 +28,7 @@ interface WebSymbolCodeCompletionItemCustomizer {
customizers.foldRight(item) { customizer, acc: WebSymbolCodeCompletionItem? ->
if (acc == null)
null
else customizer.customize(acc, framework, namespace, kind, location)
else customizer.customize(acc, framework, qualifiedKind, location)
}
}
else this

View File

@@ -12,8 +12,7 @@ import com.intellij.psi.PsiElement
import com.intellij.refactoring.suggested.startOffset
import com.intellij.util.ProcessingContext
import com.intellij.webSymbols.FrameworkId
import com.intellij.webSymbols.SymbolKind
import com.intellij.webSymbols.SymbolNamespace
import com.intellij.webSymbols.WebSymbolQualifiedKind
import com.intellij.webSymbols.WebSymbolsScope
import com.intellij.webSymbols.completion.WebSymbolCodeCompletionItemCustomizer.Companion.customizeItems
import com.intellij.webSymbols.query.WebSymbolsQueryExecutor
@@ -58,8 +57,7 @@ abstract class WebSymbolsCompletionProviderBase<T : PsiElement> : CompletionProv
@JvmStatic
fun processCompletionQueryResults(queryExecutor: WebSymbolsQueryExecutor,
result: CompletionResultSet,
namespace: SymbolNamespace,
kind: SymbolKind,
qualifiedKind: WebSymbolQualifiedKind,
name: String,
position: Int,
location: PsiElement,
@@ -68,16 +66,15 @@ abstract class WebSymbolsCompletionProviderBase<T : PsiElement> : CompletionProv
filter: ((WebSymbolCodeCompletionItem) -> Boolean)? = null,
consumer: (WebSymbolCodeCompletionItem) -> Unit) {
processWebSymbolCodeCompletionItems(
queryExecutor.runCodeCompletionQuery(namespace, kind, name, position, scope = queryContext),
result, namespace, kind, name, queryExecutor.framework, location, providedNames, filter, consumer
queryExecutor.runCodeCompletionQuery(qualifiedKind, name, position, scope = queryContext),
result, qualifiedKind, name, queryExecutor.framework, location, providedNames, filter, consumer
)
}
@JvmStatic
fun processWebSymbolCodeCompletionItems(symbols: List<WebSymbolCodeCompletionItem>,
result: CompletionResultSet,
namespace: SymbolNamespace,
kind: SymbolKind,
qualifiedKind: WebSymbolQualifiedKind,
name: String,
framework: FrameworkId?,
location: PsiElement,
@@ -89,7 +86,7 @@ abstract class WebSymbolsCompletionProviderBase<T : PsiElement> : CompletionProv
symbols
.asSequence()
.distinctBy { Triple(it.offset, it.name, it.completeAfterInsert) }
.customizeItems(framework, namespace, kind, location)
.customizeItems(framework, qualifiedKind, location)
.filter { item ->
(filter == null || filter(item))
&& item.offset <= prefixLength

View File

@@ -80,12 +80,13 @@ interface WebSymbolsQueryExecutor : ModificationTracker {
scope: List<WebSymbolsScope> = emptyList()): List<WebSymbolCodeCompletionItem> =
runCodeCompletionQuery(listOf(WebSymbolQualifiedName(namespace, kind, name)), position, virtualSymbols, scope)
fun runCodeCompletionQuery(qualifiedName: WebSymbolQualifiedName,
fun runCodeCompletionQuery(qualifiedKind: WebSymbolQualifiedKind,
name: String,
/** Position to complete at in the last segment of the path **/
position: Int,
virtualSymbols: Boolean = true,
scope: List<WebSymbolsScope> = emptyList()): List<WebSymbolCodeCompletionItem> =
runCodeCompletionQuery(listOf(qualifiedName), position, virtualSymbols, scope)
runCodeCompletionQuery(listOf(qualifiedKind.withName(name)), position, virtualSymbols, scope)
fun runCodeCompletionQuery(path: List<WebSymbolQualifiedName>,
/** Position to complete at in the last segment of the path **/

View File

@@ -14,13 +14,14 @@ import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.xml.XmlAttribute
import com.intellij.psi.xml.XmlElement
import com.intellij.psi.xml.XmlTag
import com.intellij.webSymbols.WebSymbol.Companion.HTML_ATTRIBUTES
import com.intellij.webSymbols.WebSymbol.Companion.KIND_HTML_ATTRIBUTES
import com.intellij.webSymbols.WebSymbol.Companion.KIND_HTML_ELEMENTS
import com.intellij.webSymbols.WebSymbol.Companion.NAMESPACE_HTML
import com.intellij.webSymbols.query.WebSymbolsQueryExecutor
import com.intellij.webSymbols.query.WebSymbolsQueryExecutorFactory
import com.intellij.webSymbols.completion.AsteriskAwarePrefixMatcher
import com.intellij.webSymbols.completion.WebSymbolsCompletionProviderBase
import com.intellij.webSymbols.query.WebSymbolsQueryExecutor
import com.intellij.webSymbols.query.WebSymbolsQueryExecutorFactory
import com.intellij.webSymbols.utils.asSingleSymbol
class WebSymbolAttributeNameCompletionProvider : WebSymbolsCompletionProviderBase<XmlElement>() {
@@ -52,8 +53,7 @@ class WebSymbolAttributeNameCompletionProvider : WebSymbolsCompletionProviderBas
processCompletionQueryResults(
queryExecutor,
patchedResultSet,
NAMESPACE_HTML,
KIND_HTML_ATTRIBUTES,
HTML_ATTRIBUTES,
name,
position,
context,
@@ -81,7 +81,7 @@ class WebSymbolAttributeNameCompletionProvider : WebSymbolsCompletionProviderBas
val fullName = name.substring(0, item.offset) + item.name
val match = freshRegistry.runNameMatchQuery(NAMESPACE_HTML, KIND_HTML_ATTRIBUTES, fullName, scope = symbols)
.asSingleSymbol() ?: return@withInsertHandlerAdded
.asSingleSymbol() ?: return@withInsertHandlerAdded
val info = WebSymbolHtmlAttributeInfo.create(fullName, freshRegistry, match)
if (info.acceptsValue && !info.acceptsNoValue) {
XmlAttributeInsertHandler.INSTANCE.handleInsert(insertionContext, lookupItem)

View File

@@ -10,11 +10,10 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.html.HtmlTag
import com.intellij.psi.impl.source.xml.TagNameReference
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.webSymbols.WebSymbol.Companion.KIND_HTML_ELEMENTS
import com.intellij.webSymbols.WebSymbol.Companion.NAMESPACE_HTML
import com.intellij.webSymbols.WebSymbol.Companion.HTML_ELEMENTS
import com.intellij.webSymbols.completion.WebSymbolCodeCompletionItem
import com.intellij.webSymbols.query.WebSymbolsQueryExecutor
import com.intellij.webSymbols.completion.WebSymbolsCompletionProviderBase
import com.intellij.webSymbols.query.WebSymbolsQueryExecutor
class WebSymbolElementNameCompletionProvider : WebSymbolsCompletionProviderBase<HtmlTag>() {
@@ -34,7 +33,7 @@ class WebSymbolElementNameCompletionProvider : WebSymbolsCompletionProviderBase<
if (endTag) return
val patchedResultSet = result.withPrefixMatcher(result.prefixMatcher.cloneWithPrefix(name))
processCompletionQueryResults(queryExecutor, patchedResultSet, NAMESPACE_HTML, KIND_HTML_ELEMENTS, name,
processCompletionQueryResults(queryExecutor, patchedResultSet, HTML_ELEMENTS, name,
position, context, filter = Companion::filterStandardHtmlSymbols) {
it.withInsertHandlerAdded(XmlTagInsertHandler.INSTANCE)
.addToResult(parameters, patchedResultSet)

View File

@@ -11,10 +11,9 @@ import com.intellij.psi.xml.XmlDocument
import com.intellij.psi.xml.XmlElement
import com.intellij.psi.xml.XmlText
import com.intellij.util.asSafely
import com.intellij.webSymbols.WebSymbol.Companion.KIND_HTML_ELEMENTS
import com.intellij.webSymbols.WebSymbol.Companion.NAMESPACE_HTML
import com.intellij.webSymbols.query.WebSymbolsQueryExecutor
import com.intellij.webSymbols.WebSymbol.Companion.HTML_ELEMENTS
import com.intellij.webSymbols.completion.WebSymbolsCompletionProviderBase
import com.intellij.webSymbols.query.WebSymbolsQueryExecutor
class WebSymbolElementNameInTextCompletionProvider : WebSymbolsCompletionProviderBase<XmlElement>() {
@@ -33,7 +32,7 @@ class WebSymbolElementNameInTextCompletionProvider : WebSymbolsCompletionProvide
val patchedResultSet = patchResultSetForHtmlElementInTextCompletion(
result.withPrefixMatcher(result.prefixMatcher.cloneWithPrefix(name)), parameters)
processCompletionQueryResults(queryExecutor, patchedResultSet, NAMESPACE_HTML, KIND_HTML_ELEMENTS,
processCompletionQueryResults(queryExecutor, patchedResultSet, HTML_ELEMENTS,
name, position, context,
filter = WebSymbolElementNameCompletionProvider.Companion::filterStandardHtmlSymbols) {
it.withInsertHandlerAdded(XmlTagInsertHandler.INSTANCE)

View File

@@ -118,17 +118,12 @@ class WebSymbolsHtmlQueryConfigurator : WebSymbolsQueryConfigurator {
class HtmlSymbolsCodeCompletionItemCustomizer : WebSymbolCodeCompletionItemCustomizer {
override fun customize(item: WebSymbolCodeCompletionItem,
framework: FrameworkId?,
namespace: SymbolNamespace,
kind: SymbolKind,
qualifiedKind: WebSymbolQualifiedKind,
location: PsiElement): WebSymbolCodeCompletionItem =
item.let {
if (namespace == WebSymbol.NAMESPACE_HTML)
when (kind) {
WebSymbol.KIND_HTML_ELEMENTS -> it.withTypeText(it.symbol?.origin?.library)
WebSymbol.KIND_HTML_ATTRIBUTES -> it // TODO - we can figure out the actual type with full match provided
else -> it
}
else it
when (qualifiedKind) {
WebSymbol.HTML_ELEMENTS -> item.withTypeText(item.symbol?.origin?.library)
WebSymbol.HTML_ATTRIBUTES -> item // TODO - we can figure out the actual type with full match provided
else -> item
}
}

View File

@@ -32,14 +32,15 @@ class WebSymbolHtmlAttributeValueCompletionProvider : WebSymbolsCompletionProvid
val providedNames = mutableSetOf(context.name)
if (type == Type.ENUM) {
processCompletionQueryResults(queryExecutor, patchedResultSet, WebSymbol.NAMESPACE_HTML,
WebSymbol.KIND_HTML_ATTRIBUTE_VALUES, name, position, context, queryScope, providedNames) {
processCompletionQueryResults(queryExecutor, patchedResultSet, WebSymbol.HTML_ATTRIBUTE_VALUES, name,
position, context, queryScope, providedNames) {
if (!it.completeAfterInsert) {
it.addToResult(parameters, patchedResultSet)
}
}
} else {
processCompletionQueryResults(queryExecutor, patchedResultSet, WebSymbol.NAMESPACE_HTML, WebSymbol.KIND_HTML_ATTRIBUTE_VALUES, name,
}
else {
processCompletionQueryResults(queryExecutor, patchedResultSet, WebSymbol.HTML_ATTRIBUTE_VALUES, name,
position, context, queryScope, providedNames) {
it.addToResult(parameters, patchedResultSet)
}

View File

@@ -52,12 +52,13 @@ open class WebSymbolElementDescriptor private constructor(private val tag: XmlTa
WebSymbolsQueryExecutorFactory.create(tag)
.runListSymbolsQuery(qualifiedKind, expandPatterns, virtualSymbols, abstractSymbols, strictScope, listOf(symbol))
fun runCodeCompletionQuery(qualifiedName: WebSymbolQualifiedName,
fun runCodeCompletionQuery(qualifiedKind: WebSymbolQualifiedKind,
name: String,
/** Position to complete at in the last segment of the path **/
position: Int,
virtualSymbols: Boolean = true): List<WebSymbolCodeCompletionItem> =
WebSymbolsQueryExecutorFactory.create(tag)
.runCodeCompletionQuery(qualifiedName, position, virtualSymbols, listOf(symbol))
.runCodeCompletionQuery(qualifiedKind, name, position, virtualSymbols, listOf(symbol))
override fun getQualifiedName(): String {
return name