summaryrefslogtreecommitdiff
path: root/platform/core-impl/src/com/intellij/psi/impl
diff options
context:
space:
mode:
Diffstat (limited to 'platform/core-impl/src/com/intellij/psi/impl')
-rw-r--r--platform/core-impl/src/com/intellij/psi/impl/PsiToDocumentSynchronizer.java16
-rw-r--r--platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java24
-rw-r--r--platform/core-impl/src/com/intellij/psi/impl/source/PsiFileImpl.java21
-rw-r--r--platform/core-impl/src/com/intellij/psi/impl/source/tree/CompositeElement.java7
-rw-r--r--platform/core-impl/src/com/intellij/psi/impl/source/tree/FileElement.java12
-rw-r--r--platform/core-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java8
6 files changed, 56 insertions, 32 deletions
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;
}
-
}