BooleanRunnable (@NotNull CommitTask task, @NotNull PsiFile file, @NotNull FileASTNode oldFileNode, @NotNull ProperTextRange changedPsiRange, @NotNull List<? super BooleanRunnable> outReparseInjectedProcessors, @NotNull PsiDocumentManagerBase documentManager) { Document document = task.document; CharSequence newDocumentText = document.getImmutableCharSequence(); Boolean data = document.getUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY); if (data != null) { document.putUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY, null); file.putUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY, data); } DiffLog diffLog; ProgressIndicator indicator = ProgressIndicatorProvider.getGlobalProgressIndicator(); if (indicator == null) indicator = new EmptyProgressIndicator(); try { BlockSupportImpl.ReparseResult result = BlockSupportImpl.reparse(file, oldFileNode, changedPsiRange, newDocumentText, indicator, task.myLastCommittedText); diffLog = result.log; List<BooleanRunnable> injectedRunnables = documentManager.reparseChangedInjectedFragments(document, file, changedPsiRange, indicator, result.oldRoot, result.newRoot); outReparseInjectedProcessors.addAll(injectedRunnables); } catch (ProcessCanceledException e) { throw e; } catch (Throwable e) { LOG.error(e); return () -> { documentManager.forceReload(file.getViewProvider().getVirtualFile(), file.getViewProvider()); return true; }; } return () -> { FileViewProvider viewProvider = file.getViewProvider(); if (!task.isStillValid() || documentManager.getCachedViewProvider(document) != viewProvider) { return false; // optimistic locking failed } if (!ApplicationManager.getApplication().isWriteAccessAllowed() && documentManager.isEventSystemEnabled(document)) { VirtualFile vFile = viewProvider.getVirtualFile(); LOG.error("Write action expected" + "; document=" + document + "; file=" + file + " of " + file.getClass() + "; file.valid=" + file.isValid() + "; file.eventSystemEnabled=" + viewProvider.isEventSystemEnabled() + "; viewProvider=" + viewProvider + " of " + viewProvider.getClass() + "; language=" + file.getLanguage() + "; vFile=" + vFile + " of " + vFile.getClass() + "; free-threaded=" + AbstractFileViewProvider.isFreeThreaded(viewProvider)); } diffLog.doActualPsiChange(file); assertAfterCommit(document, file, oldFileNode); ObjectUtilsRt.reachabilityFence(task.cachedViewProvider); // just to make an impression the field is used return true; }; }