diff --git a/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt b/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt index 015a58702ddb..00a3523ba90e 100644 --- a/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt +++ b/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt @@ -60,8 +60,11 @@ open class UElementPattern>(clazz: }) fun sourcePsiFilter(filter: (PsiElement) -> Boolean): Self = - withSourcePsiCondition(object : PatternCondition("sourcePsiFilter") { - override fun accepts(t: PsiElement, context: ProcessingContext?): Boolean = filter(t) + this.with(object : PatternCondition("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, 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 } diff --git a/uast/uast-common/src/com/intellij/psi/UElementTypePatternAdapter.kt b/uast/uast-common/src/com/intellij/psi/UastPatternAdapter.kt similarity index 65% rename from uast/uast-common/src/com/intellij/psi/UElementTypePatternAdapter.kt rename to uast/uast-common/src/com/intellij/psi/UastPatternAdapter.kt index da42af0f07ee..c5d85c549f90 100644 --- a/uast/uast-common/src/com/intellij/psi/UElementTypePatternAdapter.kt +++ b/uast/uast-common/src/com/intellij/psi/UastPatternAdapter.kt @@ -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>) : ElementPattern { +internal class UastPatternAdapter(private val pattern: (UElement, ProcessingContext) -> Boolean, + private val supportedUElementTypes: List>) : ElementPattern { 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().error("UElementTypePatternAdapter should not be called with null context") + logger().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::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 = condition diff --git a/uast/uast-common/src/com/intellij/psi/UastReferenceProviderAdapter.kt b/uast/uast-common/src/com/intellij/psi/UastReferenceProviderAdapter.kt index 64243c08ba07..54c370ca78cb 100644 --- a/uast/uast-common/src/com/intellij/psi/UastReferenceProviderAdapter.kt +++ b/uast/uast-common/src/com/intellij/psi/UastReferenceProviderAdapter.kt @@ -5,14 +5,10 @@ import com.intellij.util.ProcessingContext import org.jetbrains.uast.UElement internal class UastReferenceProviderAdapter(private val supportedUElementTypes: List>, - private val pattern: (UElement, ProcessingContext) -> Boolean, private val provider: UastReferenceProvider) : PsiReferenceProvider() { override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array { val uElement = getOrCreateCachedElement(element, context, supportedUElementTypes) ?: return PsiReference.EMPTY_ARRAY - - if (!pattern.invoke(uElement, context)) return PsiReference.EMPTY_ARRAY - return provider.getReferencesByElement(uElement, context) } diff --git a/uast/uast-common/src/com/intellij/psi/UastReferenceRegistrar.kt b/uast/uast-common/src/com/intellij/psi/UastReferenceRegistrar.kt index 2cf22beb368e..94091a4d562c 100644 --- a/uast/uast-common/src/com/intellij/psi/UastReferenceRegistrar.kt +++ b/uast/uast-common/src/com/intellij/psi/UastReferenceRegistrar.kt @@ -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, @@ -90,15 +90,16 @@ private fun getCachedUElement(context: ProcessingContext, return newUElement } -internal fun uastTypePattern(supportedUElementTypes: List>): ElementPattern { - val uastTypePattern = UElementTypePatternAdapter(supportedUElementTypes) +private fun adaptPattern(pattern: (UElement, ProcessingContext) -> Boolean, + supportedUElementTypes: List>): ElementPattern { + 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 } /**