IDEA-CR-62296 IDEA-235191 UAST: speed up reference contributors

GitOrigin-RevId: 2a4041f508a2d81f4725446875d108280b82103b
This commit is contained in:
Yuriy Artamonov
2020-05-05 16:26:40 +00:00
committed by intellij-monorepo-bot
parent 3e854219fb
commit 3335fdde2c
4 changed files with 21 additions and 20 deletions
@@ -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
}
@@ -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
}
/**