@NotNull private MostlySingularMultiMap<String, AnnotationData> getDataFromFile( @NotNull final PsiFile file) { Pair<MostlySingularMultiMap<String, AnnotationData>, Long> cached = annotationFileToDataAndModStamp.get(file); final long fileModificationStamp = file.getModificationStamp(); if (cached != null && cached.getSecond() == fileModificationStamp) { return cached.getFirst(); } DataParsingSaxHandler handler = new DataParsingSaxHandler(file); try { SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); saxParser.parse(new InputSource(new StringReader(escapeAttributes(file.getText()))), handler); } catch (IOException e) { LOG.error(e); } catch (ParserConfigurationException e) { LOG.error(e); } catch (SAXException e) { LOG.error(e); } Pair<MostlySingularMultiMap<String, AnnotationData>, Long> pair = Pair.create(handler.getResult(), file.getModificationStamp()); annotationFileToDataAndModStamp.put(file, pair); return pair.first; }
public boolean isErrorAnalyzingFinished(PsiFile file) { if (myDisposed) return false; Document document = PsiDocumentManager.getInstance(myProject).getCachedDocument(file); return document != null && document.getModificationStamp() == file.getModificationStamp() && myFileStatusMap.getFileDirtyScope(document, Pass.UPDATE_ALL) == null; }
public boolean isAllAnalysisFinished(@NotNull PsiFile file) { if (myDisposed) return false; Document document = PsiDocumentManager.getInstance(myProject).getCachedDocument(file); return document != null && document.getModificationStamp() == file.getModificationStamp() && myFileStatusMap.allDirtyScopesAreNull(document); }
@Nullable("returns runnable to execute under write action in AWT to finish the commit") private Processor<Document> doCommit( @NotNull final Document document, @NotNull final PsiFile file, @NotNull ProgressIndicator indicator, final boolean synchronously, @NotNull PsiDocumentManager documentManager) { ((PsiDocumentManagerImpl) documentManager).clearTreeHardRef(document); final TextBlock textBlock = TextBlock.get(file); if (textBlock.isEmpty()) return null; final long startPsiModificationTimeStamp = file.getModificationStamp(); final long startDocModificationTimeStamp = document.getModificationStamp(); final FileElement myTreeElementBeingReparsedSoItWontBeCollected = ((PsiFileImpl) file).calcTreeElement(); if (textBlock.isEmpty()) return null; // if tree was just loaded above textBlock will be cleared by contentsLoaded final CharSequence chars = document.getCharsSequence(); final 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); } final String oldPsiText = ApplicationManagerEx.getApplicationEx().isInternal() && !ApplicationManagerEx.getApplicationEx().isUnitTestMode() ? myTreeElementBeingReparsedSoItWontBeCollected.getText() : null; int startOffset; int endOffset; int lengthShift; if (file.getViewProvider().supportsIncrementalReparse(file.getLanguage())) { startOffset = textBlock.getStartOffset(); int psiEndOffset = textBlock.getPsiEndOffset(); endOffset = psiEndOffset; lengthShift = textBlock.getTextEndOffset() - psiEndOffset; } else { startOffset = 0; endOffset = document.getTextLength(); lengthShift = document.getTextLength() - myTreeElementBeingReparsedSoItWontBeCollected.getTextLength(); } assertBeforeCommit( document, file, textBlock, chars, oldPsiText, myTreeElementBeingReparsedSoItWontBeCollected); BlockSupport blockSupport = BlockSupport.getInstance(file.getProject()); final DiffLog diffLog = blockSupport.reparseRange(file, startOffset, endOffset, lengthShift, chars, indicator); return new Processor<Document>() { @Override public boolean process(Document document) { ApplicationManager.getApplication().assertWriteAccessAllowed(); log( "Finishing", document, synchronously, document.getModificationStamp(), startDocModificationTimeStamp); // if (file.getModificationStamp() != startPsiModificationTimeStamp) return; // optimistic // locking failed if (document.getModificationStamp() != startDocModificationTimeStamp) { return false; // optimistic locking failed } try { textBlock.performAtomically( new Runnable() { @Override public void run() { CodeStyleManager.getInstance(file.getProject()) .performActionWithFormatterDisabled( new Runnable() { @Override public void run() { synchronized (PsiLock.LOCK) { doActualPsiChange(file, diffLog); } } }); } }); assertAfterCommit( document, file, oldPsiText, myTreeElementBeingReparsedSoItWontBeCollected); } finally { textBlock.clear(); SmartPointerManagerImpl.synchronizePointers(file); } return true; } }; }