diff --git a/uast/uast-common-ide/src/com/intellij/patterns/uast/UastPatterns.kt b/uast/uast-common-ide/src/com/intellij/patterns/uast/UastPatterns.kt index 302b33678eb0..b067a1e489c3 100644 --- a/uast/uast-common-ide/src/com/intellij/patterns/uast/UastPatterns.kt +++ b/uast/uast-common-ide/src/com/intellij/patterns/uast/UastPatterns.kt @@ -18,6 +18,7 @@ import com.intellij.util.containers.ContainerUtil import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NotNull import org.jetbrains.uast.* +import org.jetbrains.uast.expressions.UInjectionHost fun literalExpression(): ULiteralExpressionPattern = ULiteralExpressionPattern() @@ -90,6 +91,17 @@ open class UElementPattern>(clazz: parentPattern.accepts(it, context) || it.uastParent?.let { parentPattern.accepts(it, context) } ?: false } + fun withStringRoomExpressionOrSelf(parentPattern: ElementPattern): Self = filterWithContext { it, context -> + if (it !is UInjectionHost) return@filterWithContext false + + if (parentPattern.accepts(it, context)) return@filterWithContext true + + val room = it.getStringRoomExpression() + if (room === it) return@filterWithContext false + + parentPattern.accepts(room, context) + } + class Capture(clazz: Class) : UElementPattern>(clazz) }