mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-CR-62296 IDEA-235191 UAST: speed up reference contributors
GitOrigin-RevId: 2a4041f508a2d81f4725446875d108280b82103b
This commit is contained in:
committed by
intellij-monorepo-bot
parent
3e854219fb
commit
3335fdde2c
@@ -60,8 +60,11 @@ open class UElementPattern<T : UElement, Self : UElementPattern<T, Self>>(clazz:
|
||||
})
|
||||
|
||||
fun sourcePsiFilter(filter: (PsiElement) -> Boolean): Self =
|
||||
withSourcePsiCondition(object : PatternCondition<PsiElement>("sourcePsiFilter") {
|
||||
override fun accepts(t: PsiElement, context: ProcessingContext?): Boolean = filter(t)
|
||||
this.with(object : PatternCondition<T>("sourcePsiFilter") {
|
||||
override fun accepts(t: T, context: ProcessingContext?): Boolean {
|
||||
val sourcePsiElement = t.sourcePsiElement ?: return false
|
||||
return filter(sourcePsiElement)
|
||||
}
|
||||
})
|
||||
|
||||
fun filterWithContext(filter: (T, ProcessingContext) -> Boolean): Self =
|
||||
@@ -90,8 +93,8 @@ private fun isCallExpressionParameter(argumentExpression: UExpression,
|
||||
parameterIndex: Int,
|
||||
callPattern: ElementPattern<UCallExpression>, context: ProcessingContext): Boolean {
|
||||
val sharedContext = context.sharedContext
|
||||
val existingResult = sharedContext.get(IS_UAST_CALL_EXPRESSION_PARAMETER, argumentExpression)
|
||||
if (existingResult == java.lang.Boolean.FALSE) {
|
||||
val isCallParameter = sharedContext.get(IS_UAST_CALL_EXPRESSION_PARAMETER, argumentExpression)
|
||||
if (isCallParameter == java.lang.Boolean.FALSE) {
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
+7
-6
@@ -8,24 +8,25 @@ import com.intellij.patterns.InitialPatternCondition
|
||||
import com.intellij.util.ProcessingContext
|
||||
import org.jetbrains.uast.UElement
|
||||
|
||||
internal class UElementTypePatternAdapter(private val supportedUElementTypes: List<Class<out UElement>>) : ElementPattern<PsiElement> {
|
||||
internal class UastPatternAdapter(private val pattern: (UElement, ProcessingContext) -> Boolean,
|
||||
private val supportedUElementTypes: List<Class<out UElement>>) : ElementPattern<PsiElement> {
|
||||
override fun accepts(o: Any?): Boolean = accepts(o, null)
|
||||
|
||||
override fun accepts(o: Any?, context: ProcessingContext?): Boolean {
|
||||
if (o !is PsiElement) return false
|
||||
if (context == null) {
|
||||
logger<UElementTypePatternAdapter>().error("UElementTypePatternAdapter should not be called with null context")
|
||||
logger<UastPatternAdapter>().error("UastPatternAdapter should not be called with null context")
|
||||
return false
|
||||
}
|
||||
|
||||
if (getOrCreateCachedElement(o, context, supportedUElementTypes) == null) return false
|
||||
|
||||
val uElement = getOrCreateCachedElement(o, context, supportedUElementTypes) ?: return false
|
||||
context.put(REQUESTED_PSI_ELEMENT, o)
|
||||
return true
|
||||
|
||||
return pattern(uElement, context)
|
||||
}
|
||||
|
||||
private val condition = ElementPatternCondition(object : InitialPatternCondition<PsiElement>(PsiElement::class.java) {
|
||||
override fun accepts(o: Any?, context: ProcessingContext?): Boolean = this@UElementTypePatternAdapter.accepts(o, context)
|
||||
override fun accepts(o: Any?, context: ProcessingContext?): Boolean = this@UastPatternAdapter.accepts(o, context)
|
||||
})
|
||||
|
||||
override fun getCondition(): ElementPatternCondition<PsiElement> = condition
|
||||
@@ -5,14 +5,10 @@ import com.intellij.util.ProcessingContext
|
||||
import org.jetbrains.uast.UElement
|
||||
|
||||
internal class UastReferenceProviderAdapter(private val supportedUElementTypes: List<Class<out UElement>>,
|
||||
private val pattern: (UElement, ProcessingContext) -> Boolean,
|
||||
private val provider: UastReferenceProvider) : PsiReferenceProvider() {
|
||||
|
||||
override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<PsiReference> {
|
||||
val uElement = getOrCreateCachedElement(element, context, supportedUElementTypes) ?: return PsiReference.EMPTY_ARRAY
|
||||
|
||||
if (!pattern.invoke(uElement, context)) return PsiReference.EMPTY_ARRAY
|
||||
|
||||
return provider.getReferencesByElement(uElement, context)
|
||||
}
|
||||
|
||||
|
||||
@@ -22,8 +22,8 @@ import java.util.*
|
||||
fun PsiReferenceRegistrar.registerUastReferenceProvider(pattern: (UElement, ProcessingContext) -> Boolean,
|
||||
provider: UastReferenceProvider,
|
||||
priority: Double = PsiReferenceRegistrar.DEFAULT_PRIORITY) {
|
||||
val adapter = UastReferenceProviderAdapter(provider.supportedUElementTypes, pattern, provider)
|
||||
this.registerReferenceProvider(uastTypePattern(provider.supportedUElementTypes), adapter, priority)
|
||||
val adapter = UastReferenceProviderAdapter(provider.supportedUElementTypes, provider)
|
||||
this.registerReferenceProvider(adaptPattern(pattern, provider.supportedUElementTypes), adapter, priority)
|
||||
}
|
||||
|
||||
fun PsiReferenceRegistrar.registerUastReferenceProvider(pattern: ElementPattern<out UElement>,
|
||||
@@ -90,15 +90,16 @@ private fun <T : UElement> getCachedUElement(context: ProcessingContext,
|
||||
return newUElement
|
||||
}
|
||||
|
||||
internal fun uastTypePattern(supportedUElementTypes: List<Class<out UElement>>): ElementPattern<out PsiElement> {
|
||||
val uastTypePattern = UElementTypePatternAdapter(supportedUElementTypes)
|
||||
private fun adaptPattern(pattern: (UElement, ProcessingContext) -> Boolean,
|
||||
supportedUElementTypes: List<Class<out UElement>>): ElementPattern<out PsiElement> {
|
||||
val uastPatternAdapter = UastPatternAdapter(pattern, supportedUElementTypes)
|
||||
|
||||
// optimisation until IDEA-211738 is implemented
|
||||
if (supportedUElementTypes.size == 1 && supportedUElementTypes[0] == UInjectionHost::class.java) {
|
||||
return StandardPatterns.instanceOf(PsiLanguageInjectionHost::class.java).and(uastTypePattern)
|
||||
return StandardPatterns.instanceOf(PsiLanguageInjectionHost::class.java).and(uastPatternAdapter)
|
||||
}
|
||||
|
||||
return uastTypePattern
|
||||
return uastPatternAdapter
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user