diff --git a/idea/src/org/jetbrains/kotlin/idea/patterns/KotlinPatterns.kt b/idea/src/org/jetbrains/kotlin/idea/patterns/KotlinPatterns.kt index be788b3b699..f1a0302b59f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/patterns/KotlinPatterns.kt +++ b/idea/src/org/jetbrains/kotlin/idea/patterns/KotlinPatterns.kt @@ -17,9 +17,11 @@ package org.jetbrains.kotlin.idea.patterns import com.intellij.patterns.* +import com.intellij.psi.PsiElement import com.intellij.util.PairProcessor import com.intellij.util.ProcessingContext import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFunction @@ -87,14 +89,6 @@ open class KotlinFunctionPattern : PsiElementPattern Boolean): KotlinFunctionPattern { - return with(object: PatternCondition(debugName) { - override fun accepts(function: KtFunction, context: ProcessingContext?): Boolean { - return condition(function, context) - } - }) - } } // Methods in this class are used through reflection during pattern construction @@ -118,6 +112,18 @@ class KtParameterPattern : PsiElementPattern(Kt } }) } + + fun withAnnotation(fqName: String): KtParameterPattern { + return withPatternCondition("KtParameterPattern-withAnnotation") { ktParameter, context -> + if (ktParameter.annotationEntries.isEmpty()) return@withPatternCondition false + + val parameterDescriptor = ktParameter.resolveToDescriptorIfAny() as? ValueParameterDescriptor ?: return@withPatternCondition false + + parameterDescriptor.annotations.any { annotation -> + DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(annotation.type) == fqName + } + } + } } @Suppress("unused") @@ -138,3 +144,12 @@ class KotlinReceiverPattern : PsiElementPattern> PsiElementPattern.withPatternCondition( + debugName: String, condition: (T, ProcessingContext?) -> Boolean): Self { + return with(object: PatternCondition(debugName) { + override fun accepts(element: T, context: ProcessingContext?): Boolean { + return condition(element, context) + } + }) +} +