Match (@NotNull PsiElement candidate, boolean ignoreParameterTypesAndPostVariableUsages) { if (isSelf(candidate)) return null; PsiElement sibling = candidate; ArrayList<PsiElement> candidates = new ArrayList<>(); for (final PsiElement element : myPattern) { if (sibling == null) return null; if (!canBeEquivalent(element, sibling) || isSelf(sibling)) return null; candidates.add(sibling); sibling = PsiTreeUtil.skipSiblingsForward(sibling, PsiWhiteSpace.class, PsiComment.class, PsiEmptyStatement.class); } LOG.assertTrue(myPattern.length == candidates.size()); if (myPattern.length == 1 && myPattern[0] instanceof PsiExpression) { if (candidates.get(0) instanceof PsiExpression candidateExpression) { if (PsiUtil.isAccessedForWriting(candidateExpression)) return null; final PsiType patternType = ((PsiExpression)myPattern[0]).getType(); final PsiType candidateType = candidateExpression.getType(); PsiSubstitutor substitutor = PsiSubstitutor.EMPTY; final PsiMethod method = PsiTreeUtil.getContextOfType(myPattern[0], PsiMethod.class); if (method != null) { final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(candidate.getProject()).getResolveHelper(); substitutor = resolveHelper.inferTypeArguments(method.getTypeParameters(), new PsiType[]{patternType}, new PsiType[]{candidateType}, PsiUtil.getLanguageLevel(method)); } if (!canTypesBeEquivalent(substitutor.substitute(patternType), candidateType)) return null; } else { return null; } } final Match match = new Match(candidates.get(0), candidates.get(candidates.size() - 1), ignoreParameterTypesAndPostVariableUsages); for (int i = 0; i < myPattern.length; i++) { if (!matchPattern(myPattern[i], candidates.get(i), candidates, match)) return null; } if (!ignoreParameterTypesAndPostVariableUsages && checkPostVariableUsages(candidates, match)) return null; return match; }