mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-15 02:59:33 +07:00
WEB-63554 Web Symbols: refactor WebSymbolCodeCompletionItemCustomizer#customize and WebSymbolsCompletionProviderBase to use qualified kinds
GitOrigin-RevId: 8a6f6947c61b11fcd95d709cc37e2f9992590866
This commit is contained in:
committed by
intellij-monorepo-bot
parent
4ab89a4bb0
commit
6951a6944b
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 **/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user