diff --git a/platform/polySymbols/api-dump-experimental.txt b/platform/polySymbols/api-dump-experimental.txt index 2a9de22eaac4..32a02ef38b26 100644 --- a/platform/polySymbols/api-dump-experimental.txt +++ b/platform/polySymbols/api-dump-experimental.txt @@ -1174,6 +1174,7 @@ *:com.intellij.polySymbols.utils.PolySymbolTypeSupport - a:getTypeProperty():com.intellij.polySymbols.PolySymbolProperty - a:resolve(java.util.List):java.lang.Object +- a:withEvaluationLocation(com.intellij.psi.PsiElement,kotlin.jvm.functions.Function0):java.lang.Object *:com.intellij.polySymbols.utils.PolySymbolTypeSupport$TypeReference - *sf:Companion:com.intellij.polySymbols.utils.PolySymbolTypeSupport$TypeReference$Companion - a:getModule():java.lang.String diff --git a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbolTypeSupportFactory.kt b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbolTypeSupportFactory.kt index d5846b115ea3..6a034e7f77b1 100644 --- a/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbolTypeSupportFactory.kt +++ b/platform/polySymbols/src-web/com/intellij/polySymbols/webTypes/WebTypesSymbolTypeSupportFactory.kt @@ -8,6 +8,7 @@ import com.intellij.polySymbols.utils.PolySymbolTypeSupport import com.intellij.polySymbols.webTypes.impl.WebTypesSymbolTypeSupportFactoryEP import com.intellij.polySymbols.webTypes.json.WebTypes import com.intellij.polySymbols.webTypes.json.jsTypesSyntaxWithLegacy +import com.intellij.psi.PsiElement import org.jetbrains.annotations.ApiStatus import java.util.* @@ -35,6 +36,8 @@ interface WebTypesSymbolTypeSupportFactory { private object EmptySupport : PolySymbolTypeSupport { override val typeProperty: PolySymbolProperty<*>? get() = null override fun resolve(types: List): Any? = null + override fun withEvaluationLocation(location: PsiElement?, action: () -> T): T = + action() } } diff --git a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolTypeSupport.kt b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolTypeSupport.kt index 789b72083129..133f1dc65cb3 100644 --- a/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolTypeSupport.kt +++ b/platform/polySymbols/src/com/intellij/polySymbols/utils/PolySymbolTypeSupport.kt @@ -3,6 +3,7 @@ package com.intellij.polySymbols.utils import com.intellij.polySymbols.PolySymbolProperty import com.intellij.polySymbols.impl.PolySymbolTypeSupportTypeReferenceData +import com.intellij.psi.PsiElement interface PolySymbolTypeSupport { @@ -10,6 +11,8 @@ interface PolySymbolTypeSupport { fun resolve(types: List): Any? + fun withEvaluationLocation(location: PsiElement?, action: () -> T): T + interface TypeReference { val module: String? val name: String diff --git a/platform/polySymbols/testSrc/com/intellij/polySymbols/query/impl/PolySymbolsMockTypeSupport.kt b/platform/polySymbols/testSrc/com/intellij/polySymbols/query/impl/PolySymbolsMockTypeSupport.kt index 4083d59279e9..90e7697c4de3 100644 --- a/platform/polySymbols/testSrc/com/intellij/polySymbols/query/impl/PolySymbolsMockTypeSupport.kt +++ b/platform/polySymbols/testSrc/com/intellij/polySymbols/query/impl/PolySymbolsMockTypeSupport.kt @@ -3,6 +3,7 @@ package com.intellij.polySymbols.query.impl import com.intellij.polySymbols.PolySymbolProperty import com.intellij.polySymbols.utils.PolySymbolTypeSupport +import com.intellij.psi.PsiElement object PolySymbolsMockTypeSupport : PolySymbolTypeSupport { @@ -19,4 +20,8 @@ object PolySymbolsMockTypeSupport : PolySymbolTypeSupport { else -> it } } + + override fun withEvaluationLocation(location: PsiElement?, action: () -> T): T = + action() + } \ No newline at end of file diff --git a/xml/xml-psi-impl/src/com/intellij/polySymbols/html/attributes/HtmlAttributeValueSymbolTypeSupport.kt b/xml/xml-psi-impl/src/com/intellij/polySymbols/html/attributes/HtmlAttributeValueSymbolTypeSupport.kt index 00ed7852a21d..7d83713a72e9 100644 --- a/xml/xml-psi-impl/src/com/intellij/polySymbols/html/attributes/HtmlAttributeValueSymbolTypeSupport.kt +++ b/xml/xml-psi-impl/src/com/intellij/polySymbols/html/attributes/HtmlAttributeValueSymbolTypeSupport.kt @@ -1,7 +1,6 @@ // 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.html.attributes -import com.intellij.psi.PsiElement import com.intellij.util.ThreeState import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.utils.PolySymbolTypeSupport @@ -14,7 +13,7 @@ interface HtmlAttributeValueSymbolTypeSupport : PolySymbolTypeSupport { * [ThreeState.UNSURE] if the boolean is assignable to the type and * [ThreeState.NO] if boolean is not assignable to the type */ - fun isBoolean(symbol: PolySymbol, type: Any?, context: PsiElement): ThreeState + fun isBoolean(symbol: PolySymbol, type: Any?): ThreeState fun createStringType(symbol: PolySymbol): Any? diff --git a/xml/xml-psi-impl/src/com/intellij/polySymbols/html/attributes/impl/HtmlAttributeSymbolInfoImpl.kt b/xml/xml-psi-impl/src/com/intellij/polySymbols/html/attributes/impl/HtmlAttributeSymbolInfoImpl.kt index e5694a3d7e1d..c9a9d911371d 100644 --- a/xml/xml-psi-impl/src/com/intellij/polySymbols/html/attributes/impl/HtmlAttributeSymbolInfoImpl.kt +++ b/xml/xml-psi-impl/src/com/intellij/polySymbols/html/attributes/impl/HtmlAttributeSymbolInfoImpl.kt @@ -1,13 +1,13 @@ // 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.html.attributes.impl -import com.intellij.polySymbols.html.attributes.HtmlAttributeSymbolInfo -import com.intellij.polySymbols.html.attributes.HtmlAttributeValueSymbolTypeSupport import com.intellij.polySymbols.PolySymbol import com.intellij.polySymbols.PolySymbolModifier import com.intellij.polySymbols.completion.PolySymbolCodeCompletionItem import com.intellij.polySymbols.html.HTML_ATTRIBUTE_VALUES import com.intellij.polySymbols.html.PolySymbolHtmlAttributeValue +import com.intellij.polySymbols.html.attributes.HtmlAttributeSymbolInfo +import com.intellij.polySymbols.html.attributes.HtmlAttributeValueSymbolTypeSupport import com.intellij.polySymbols.html.htmlAttributeValue import com.intellij.polySymbols.query.PolySymbolQueryExecutor import com.intellij.psi.PsiElement @@ -102,7 +102,7 @@ internal data class HtmlAttributeSymbolInfoImpl( val priority = symbol.priority ?: PolySymbol.Priority.NORMAL val icon = symbol.icon val defaultValue = attrValue?.default - val langType = if (typeSupport != null) + val langType = typeSupport?.withEvaluationLocation(context) { when (type) { PolySymbolHtmlAttributeValue.Type.STRING -> typeSupport.createStringType(symbol) PolySymbolHtmlAttributeValue.Type.BOOLEAN -> typeSupport.createBooleanType(symbol) @@ -119,13 +119,15 @@ internal data class HtmlAttributeSymbolInfoImpl( PolySymbolHtmlAttributeValue.Type.OF_MATCH -> typeSupport.typeProperty?.let { symbol[it] } PolySymbolHtmlAttributeValue.Type.COMPLEX -> attrValue?.langType } - else null + } val isHtmlBoolean = if (kind == PolySymbolHtmlAttributeValue.Kind.PLAIN) if (type == PolySymbolHtmlAttributeValue.Type.BOOLEAN) ThreeState.YES else - typeSupport?.isBoolean(symbol, langType, context) ?: ThreeState.YES + typeSupport?.withEvaluationLocation(context) { + typeSupport.isBoolean(symbol, langType) + } ?: ThreeState.YES else ThreeState.NO val valueRequired = attrValue?.required != false && isHtmlBoolean == ThreeState.NO && kind != PolySymbolHtmlAttributeValue.Kind.NO_VALUE @@ -147,13 +149,18 @@ internal data class HtmlAttributeSymbolInfoImpl( } PolySymbolHtmlAttributeValue.Type.COMPLEX, PolySymbolHtmlAttributeValue.Type.OF_MATCH, - -> typeSupport?.getEnumValues(symbol, langType) + -> typeSupport?.withEvaluationLocation(context) { + typeSupport.getEnumValues(symbol, langType) + } else -> null } } else null - val strictEnumValues = type == PolySymbolHtmlAttributeValue.Type.ENUM || typeSupport?.strictEnumValues(symbol, langType) == true + val strictEnumValues = type == PolySymbolHtmlAttributeValue.Type.ENUM || + typeSupport?.withEvaluationLocation(context) { + typeSupport.strictEnumValues(symbol, langType) + } == true return HtmlAttributeSymbolInfoImpl(name, symbol, acceptsNoValue, acceptsValue, enumValues, strictEnumValues, langType, icon, isRequired,