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 ee6436d038c7..4ee443d3c959 100644 --- a/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt +++ b/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt @@ -69,27 +69,23 @@ open class UElementPattern>(clazz: fun filter(filter: (T) -> Boolean): Self = filterWithContext { t, processingContext -> filter(t) } - fun inCall(callPattern: ElementPattern): Self = - filter { it.getUCallExpression()?.let { callPattern.accepts(it) } ?: false } + open fun inCall(callPattern: ElementPattern): Self = + throw UnsupportedOperationException("implemented only for UExpressionPatterns") - fun callParameter(parameterIndex: Int, callPattern: ElementPattern): Self = - filter { isCallExpressionParameter(it, parameterIndex, callPattern) } + open fun callParameter(parameterIndex: Int, callPattern: ElementPattern): Self = + throw UnsupportedOperationException("implemented only for UExpressionPatterns") - fun constructorParameter(parameterIndex: Int, classFQN: String): Self = callParameter(parameterIndex, callExpression().constructor(classFQN)) + open fun constructorParameter(parameterIndex: Int, classFQN: String): Self = throw UnsupportedOperationException( + "implemented only for UExpressionPatterns") - fun setterParameter(methodPattern: ElementPattern): Self = filter { - isPropertyAssignCall(it, methodPattern) || - isCallExpressionParameter(it, 0, callExpression().withAnyResolvedMethod(methodPattern)) - } + open fun setterParameter(methodPattern: ElementPattern): Self = throw UnsupportedOperationException( + "implemented only for UExpressionPatterns") - fun methodCallParameter(parameterIndex: Int, methodPattern: ElementPattern): Self = - callParameter(parameterIndex, callExpression().withAnyResolvedMethod(methodPattern)) + open fun methodCallParameter(parameterIndex: Int, methodPattern: ElementPattern): Self = + throw UnsupportedOperationException("implemented only for UExpressionPatterns") - fun arrayAccessParameterOf(receiverClassPattern: ElementPattern): Self = filter { self -> - val aae: UArrayAccessExpression = self.uastParent as? UArrayAccessExpression ?: return@filter false - val receiverClass = (aae.receiver.getExpressionType() as? PsiClassType)?.resolve() ?: return@filter false - receiverClassPattern.accepts(receiverClass) - } + open fun arrayAccessParameterOf(receiverClassPattern: ElementPattern): Self = throw UnsupportedOperationException( + "implemented only for UExpressionPatterns") fun withUastParent(parentPattern: ElementPattern): Self = filter { it.uastParent?.let { parentPattern.accepts(it) } ?: false } @@ -176,6 +172,29 @@ open class UExpressionPattern): Self = annotationParams(qualifiedNamePattern(StandardPatterns.string().equalTo(annotationQualifiedName)), parameterNames) + override fun inCall(callPattern: ElementPattern): Self = + filter { it.getUCallExpression()?.let { callPattern.accepts(it) } ?: false } + + override fun callParameter(parameterIndex: Int, callPattern: ElementPattern): Self = + filter { isCallExpressionParameter(it, parameterIndex, callPattern) } + + override fun constructorParameter(parameterIndex: Int, classFQN: String): Self = callParameter(parameterIndex, + callExpression().constructor(classFQN)) + + override fun setterParameter(methodPattern: ElementPattern): Self = filter { + isPropertyAssignCall(it, methodPattern) || + isCallExpressionParameter(it, 0, callExpression().withAnyResolvedMethod(methodPattern)) + } + + override fun methodCallParameter(parameterIndex: Int, methodPattern: ElementPattern): Self = + callParameter(parameterIndex, callExpression().withAnyResolvedMethod(methodPattern)) + + override fun arrayAccessParameterOf(receiverClassPattern: ElementPattern): Self = filter { self -> + val aae: UArrayAccessExpression = self.uastParent as? UArrayAccessExpression ?: return@filter false + val receiverClass = (aae.receiver.getExpressionType() as? PsiClassType)?.resolve() ?: return@filter false + receiverClassPattern.accepts(receiverClass) + } + open class Capture(clazz: Class) : UExpressionPattern>(clazz) }