boolean (@NotNull PsiExpression qualifier, @NotNull PsiElement reference, @NotNull MatchContext context) { final PsiElement target = reference instanceof PsiMethodCallExpression ? ((PsiMethodCallExpression)reference).resolveMethod() : ((PsiReference)reference).resolve(); if (target instanceof PsiMember && qualifier instanceof PsiThisExpression) { return !((PsiMember)target).hasModifierProperty(PsiModifier.STATIC) && (target instanceof PsiField || target instanceof PsiMethod); } final SubstitutionHandler handler = ObjectUtils.tryCast(context.getPattern().getHandler(qualifier), SubstitutionHandler.class); if (handler == null) { return false; } if (target instanceof PsiModifierListOwner && ((PsiModifierListOwner)target).hasModifierProperty(PsiModifier.STATIC)) { final PsiClass containingClass = target instanceof PsiMember ? PsiTreeUtil.getParentOfType(target, PsiClass.class) : ((PsiMember)target).getContainingClass(); return handler.isSubtype() || handler.isStrictSubtype() ? matchWithinHierarchy(null, containingClass, handler) : handler.validate(containingClass, context); } else { final PsiElementFactory factory = JavaPsiFacade.getElementFactory(reference.getProject()); final PsiExpression implicitReference = factory.createExpressionFromText("this", reference); return handler.validate(implicitReference, context); } }