diff options
Diffstat (limited to 'platform/core-impl/src/com/intellij/psi')
7 files changed, 57 insertions, 33 deletions
diff --git a/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java b/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java index 9dbd8ee9ea07..bed56c25292d 100644 --- a/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java +++ b/platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java @@ -383,7 +383,7 @@ public class SingleRootFileViewProvider extends UserDataHolderBase implements Fi @Override public PsiReference findReferenceAt(final int offset) { - final PsiFileImpl psiFile = (PsiFileImpl)getPsi(getBaseLanguage()); + final PsiFile psiFile = getPsi(getBaseLanguage()); return findReferenceAt(psiFile, offset); } diff --git a/platform/core-impl/src/com/intellij/psi/impl/PsiToDocumentSynchronizer.java b/platform/core-impl/src/com/intellij/psi/impl/PsiToDocumentSynchronizer.java index 13c43571decb..60bae75fbe23 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/PsiToDocumentSynchronizer.java +++ b/platform/core-impl/src/com/intellij/psi/impl/PsiToDocumentSynchronizer.java @@ -69,12 +69,14 @@ public class PsiToDocumentSynchronizer extends PsiTreeChangeAdapter { void syncDocument(@NotNull Document document, @NotNull PsiTreeChangeEventImpl event); } - private void checkPsiModificationAllowed(@NotNull final PsiTreeChangeEvent event, boolean force) { + private void checkPsiModificationAllowed(@NotNull final PsiTreeChangeEvent event) { if (!toProcessPsiEvent()) return; final PsiFile psiFile = event.getFile(); if (psiFile == null || psiFile.getNode() == null) return; - final Document document = myPsiDocumentManager.getCachedDocument(psiFile); + boolean forceDocument = !psiFile.getViewProvider().isPhysical(); + final Document document = forceDocument ? myPsiDocumentManager.getDocument(psiFile) + : myPsiDocumentManager.getCachedDocument(psiFile); if (document != null && myPsiDocumentManager.isUncommited(document)) { throw new IllegalStateException("Attempt to modify PSI for non-committed Document!"); } @@ -132,22 +134,22 @@ public class PsiToDocumentSynchronizer extends PsiTreeChangeAdapter { @Override public void beforeChildAddition(@NotNull PsiTreeChangeEvent event) { - checkPsiModificationAllowed(event, false); + checkPsiModificationAllowed(event); } @Override public void beforeChildRemoval(@NotNull PsiTreeChangeEvent event) { - checkPsiModificationAllowed(event, false); + checkPsiModificationAllowed(event); } @Override public void beforeChildReplacement(@NotNull PsiTreeChangeEvent event) { - checkPsiModificationAllowed(event, false); + checkPsiModificationAllowed(event); } @Override public void beforeChildrenChange(@NotNull PsiTreeChangeEvent event) { - checkPsiModificationAllowed(event, false); + checkPsiModificationAllowed(event); } @Override @@ -255,7 +257,7 @@ public class PsiToDocumentSynchronizer extends PsiTreeChangeAdapter { final PsiTreeChangeEventImpl fakeEvent = new PsiTreeChangeEventImpl(changeScope.getManager()); fakeEvent.setParent(changeScope); fakeEvent.setFile(changeScope.getContainingFile()); - checkPsiModificationAllowed(fakeEvent, true); + checkPsiModificationAllowed(fakeEvent); doSync(fakeEvent, true, new DocSyncAction() { @Override public void syncDocument(@NotNull Document document, @NotNull PsiTreeChangeEventImpl event) { diff --git a/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java b/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java index 7b4e9ec210ac..6b2877d83351 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java @@ -26,7 +26,6 @@ import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.ContentBasedFileSubstitutor; import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.fileTypes.FileTypeRegistry; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; @@ -71,13 +70,6 @@ public class FileManagerImpl implements FileManager { private final FileDocumentManager myFileDocumentManager; private final MessageBusConnection myConnection; - @SuppressWarnings("UnusedDeclaration") - private final LowMemoryWatcher myLowMemoryWatcher = LowMemoryWatcher.register(new Runnable() { - @Override - public void run() { - processQueue(); - } - }); public FileManagerImpl(PsiManagerImpl manager, FileDocumentManager fileDocumentManager, FileIndexFacade fileIndex) { myManager = manager; @@ -98,6 +90,12 @@ public class FileManagerImpl implements FileManager { } }); Disposer.register(manager.getProject(), this); + LowMemoryWatcher.register(new Runnable() { + @Override + public void run() { + processQueue(); + } + }, this); } private static final VirtualFile NULL = new LightVirtualFile(); @@ -412,7 +410,7 @@ public class FileManagerImpl implements FileManager { if (myFileIndex.isExcludedFile(vFile)) return null; } else { - if (FileTypeRegistry.getInstance().isFileIgnored(vFile)) return null; + if (myFileIndex.isUnderIgnored(vFile)) return null; } VirtualFile parent = vFile.getParent(); @@ -538,7 +536,13 @@ public class FileManagerImpl implements FileManager { if (document != null && !ignoreDocument){ fileDocumentManager.reloadFromDisk(document); } - else{ + else { + FileViewProvider latestProvider = createFileViewProvider(vFile, false); + if (latestProvider.getPsi(latestProvider.getBaseLanguage()) instanceof PsiBinaryFile) { + forceReload(vFile); + return; + } + PsiTreeChangeEventImpl event = new PsiTreeChangeEventImpl(myManager); event.setParent(file); event.setFile(file); diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java index 1d96d820328a..dabb45cd7667 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java @@ -74,7 +74,6 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF protected PsiFile myOriginalFile = null; private final FileViewProvider myViewProvider; - private static final Key<Document> HARD_REFERENCE_TO_DOCUMENT = new Key<Document>("HARD_REFERENCE_TO_DOCUMENT"); private volatile Reference<StubTree> myStub; protected final PsiManagerEx myManager; private volatile Getter<FileElement> myTreeElementPointer; // SoftReference/WeakReference to ASTNode or a strong reference to a tree if the file is a DummyHolder @@ -188,11 +187,7 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF Document cachedDocument = FileDocumentManager.getInstance().getCachedDocument(getViewProvider().getVirtualFile()); - final Document document = viewProvider.isEventSystemEnabled() ? viewProvider.getDocument() : null; FileElement treeElement = createFileElement(viewProvider.getContents()); - if (document != null) { - treeElement.putUserData(HARD_REFERENCE_TO_DOCUMENT, document); - } treeElement.setPsi(this); List<Pair<StubBasedPsiElementBase, CompositeElement>> bindings = calcStubAstBindings(treeElement, cachedDocument); @@ -375,12 +370,22 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF public void unloadContent() { ApplicationManager.getApplication().assertWriteAccessAllowed(); - LOG.assertTrue(getTreeElement() != null); clearCaches(); myViewProvider.beforeContentsSynchronized(); synchronized (PsiLock.LOCK) { - myTreeElementPointer = null; - clearStub("unloadContent"); + FileElement treeElement = derefTreeElement(); + DebugUtil.startPsiModification("unloadContent"); + try { + if (treeElement != null) { + myTreeElementPointer = null; + treeElement.detachFromFile(); + DebugUtil.onInvalidated(treeElement); + } + clearStub("unloadContent"); + } + finally { + DebugUtil.finishPsiModification(); + } } } diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java index f00c15220d57..c73d0bd485ce 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java @@ -771,8 +771,7 @@ public class CompositeElement extends TreeElement { } @Override - @Nullable - public <T extends PsiElement> T getPsi(Class<T> clazz) { + public <T extends PsiElement> T getPsi(@NotNull Class<T> clazz) { return LeafElement.getPsi(clazz, getPsi(), LOG); } @@ -797,6 +796,10 @@ public class CompositeElement extends TreeElement { myWrapper = psi; } + protected void clearPsi() { + myWrapper = null; + } + public final void rawAddChildren(@NotNull TreeElement first) { rawAddChildrenWithoutNotifications(first); diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java index f025de75b820..76d5c421094d 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java @@ -19,6 +19,7 @@ package com.intellij.psi.impl.source.tree; import com.intellij.lang.ASTNode; import com.intellij.lang.FileASTNode; import com.intellij.openapi.util.Getter; +import com.intellij.psi.PsiElement; import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.source.CharTableImpl; import com.intellij.psi.impl.source.PsiFileImpl; @@ -28,6 +29,17 @@ import org.jetbrains.annotations.NotNull; public class FileElement extends LazyParseableElement implements FileASTNode, Getter<FileElement> { private volatile CharTable myCharTable = new CharTableImpl(); + private volatile boolean myDetached; + + @Override + protected PsiElement createPsiNoLock() { + return myDetached ? null : super.createPsiNoLock(); + } + + public void detachFromFile() { + myDetached = true; + clearPsi(); + } @Override @NotNull diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java index 929737177052..011cad8a8450 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java @@ -290,16 +290,14 @@ public abstract class LeafElement extends TreeElement { } @Override - @Nullable - public <T extends PsiElement> T getPsi(Class<T> clazz) { + public <T extends PsiElement> T getPsi(@NotNull Class<T> clazz) { return getPsi(clazz, getPsi(), LOG); } - @Nullable - static <T extends PsiElement> T getPsi(Class<T> clazz, PsiElement element, Logger log) { + static <T extends PsiElement> T getPsi(@NotNull Class<T> clazz, PsiElement element, Logger log) { log.assertTrue(clazz.isInstance(element), "unexpected psi class. expected: " + clazz + " got: " + (element == null ? null : element.getClass())); + //noinspection unchecked return (T)element; } - } |