ReparseResult (@NotNull PsiFile file, @NotNull FileASTNode oldFileNode, @NotNull TextRange changedPsiRange, @NotNull CharSequence newFileText, @NotNull ProgressIndicator indicator, @NotNull CharSequence lastCommittedText) { PsiFileImpl fileImpl = (PsiFileImpl)file; Couple<ASTNode> reparseableRoots = findReparseableRoots(fileImpl, oldFileNode, changedPsiRange, newFileText); if (reparseableRoots == null) { return makeFullParse(fileImpl, oldFileNode, newFileText, indicator, lastCommittedText); } ASTNode oldRoot = reparseableRoots.first; ASTNode newRoot = reparseableRoots.second; DiffLog diffLog = mergeTrees(fileImpl, oldRoot, newRoot, indicator, lastCommittedText); return new ReparseResult(diffLog, oldRoot, newRoot); }