// FILE: ObjectPattern.java import org.jetbrains.annotations.NotNull; public abstract class ObjectPattern> { protected ObjectPattern(@NotNull Class aClass) { } public static class Capture extends ObjectPattern> { public Capture(@NotNull Class aClass) { super(aClass); } } } // FILE: UastPatterns.kt interface UElement interface UExpression : UElement interface UReferenceExpression : UExpression fun injectionHostOrReferenceExpression(): UExpressionPattern.Capture = uExpression().filter { it is UReferenceExpression } fun uExpression(): UExpressionPattern.Capture = expressionCapture(UExpression::class.java) fun expressionCapture(clazz: Class): UExpressionPattern.Capture = UExpressionPattern.Capture(clazz) open class UElementPattern>(clazz: Class) : ObjectPattern(clazz) { fun filter(filter: (T) -> Boolean): Self = this as Self } open class UExpressionPattern>(clazz: Class) : UElementPattern(clazz) { open class Capture(clazz: Class) : UExpressionPattern>(clazz) }