Boolean (PsiElement element, final int offset, final int patternEndOffset, final int[] varEndOffsets, final boolean strict) { final IntList errorOffsets = new IntArrayList(); final boolean[] containsErrorTail = {false}; final IntSet varEndOffsetsSet = new IntOpenHashSet(varEndOffsets); element.accept(new PsiRecursiveElementWalkingVisitor() { @Override public void visitErrorElement(@NotNull PsiErrorElement element) { super.visitErrorElement(element); final int startOffset = element.getTextRange().getStartOffset(); if ((strict || !varEndOffsetsSet.contains(startOffset)) && startOffset != patternEndOffset) { errorOffsets.add(startOffset); } if (startOffset == offset) { containsErrorTail[0] = true; } } }); for (int i = 0; i < errorOffsets.size(); i++) { final int errorOffset = errorOffsets.getInt(i); if (errorOffset <= offset) { return true; } } return containsErrorTail[0] ? null : false; }