summaryrefslogtreecommitdiff
path: root/platform/core-impl/src
diff options
context:
space:
mode:
Diffstat (limited to 'platform/core-impl/src')
-rw-r--r--platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java27
-rw-r--r--platform/core-impl/src/com/intellij/mock/MockApplicationEx.java3
-rw-r--r--platform/core-impl/src/com/intellij/openapi/application/ex/ApplicationEx.java3
-rw-r--r--platform/core-impl/src/com/intellij/openapi/options/AbstractSchemesManager.java3
-rw-r--r--platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java4
-rw-r--r--platform/core-impl/src/com/intellij/psi/SingleRootFileViewProvider.java2
-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
-rw-r--r--platform/core-impl/src/com/intellij/util/DocumentUtil.java4
13 files changed, 86 insertions, 48 deletions
diff --git a/platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java b/platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java
index 5889dbf48c63..2a89f73f9704 100644
--- a/platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java
+++ b/platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -54,7 +54,7 @@ public class CoreProjectEnvironment {
protected final MockProject myProject;
protected final MessageBus myMessageBus;
- public CoreProjectEnvironment(Disposable parentDisposable, CoreApplicationEnvironment applicationEnvironment) {
+ public CoreProjectEnvironment(@NotNull Disposable parentDisposable, @NotNull CoreApplicationEnvironment applicationEnvironment) {
myParentDisposable = parentDisposable;
myEnvironment = applicationEnvironment;
myProject = createProject(myEnvironment.getApplication().getPicoContainer(), myParentDisposable);
@@ -87,10 +87,13 @@ public class CoreProjectEnvironment {
myProject.registerService(DumbService.class, new MockDumbService(myProject));
}
- protected MockProject createProject(PicoContainer parent, @NotNull Disposable parentDisposable) {
+ @SuppressWarnings("MethodMayBeStatic")
+ @NotNull
+ protected MockProject createProject(@NotNull PicoContainer parent, @NotNull Disposable parentDisposable) {
return new MockProject(parent, parentDisposable);
}
+ @NotNull
protected ProjectScopeBuilder createProjectScopeBuilder() {
return new CoreProjectScopeBuilder(myProject, myFileIndexFacade);
}
@@ -99,20 +102,23 @@ public class CoreProjectEnvironment {
}
+ @NotNull
protected FileIndexFacade createFileIndexFacade() {
return new MockFileIndexFacade(myProject);
}
- protected ResolveScopeManager createResolveScopeManager(PsiManager psiManager) {
- return new MockResolveScopeManager(myProject);
+ @SuppressWarnings("MethodMayBeStatic")
+ @NotNull
+ protected ResolveScopeManager createResolveScopeManager(@NotNull PsiManager psiManager) {
+ return new MockResolveScopeManager(psiManager.getProject());
}
- public <T> void registerProjectExtensionPoint(final ExtensionPointName<T> extensionPointName,
- final Class<? extends T> aClass) {
+ public <T> void registerProjectExtensionPoint(@NotNull ExtensionPointName<T> extensionPointName,
+ @NotNull Class<? extends T> aClass) {
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getArea(myProject), extensionPointName, aClass);
}
- public <T> void addProjectExtension(final ExtensionPointName<T> name, final T extension) {
+ public <T> void addProjectExtension(@NotNull ExtensionPointName<T> name, @NotNull final T extension) {
final ExtensionPoint<T> extensionPoint = Extensions.getArea(myProject).getExtensionPoint(name);
extensionPoint.registerExtension(extension);
Disposer.register(myParentDisposable, new Disposable() {
@@ -124,18 +130,21 @@ public class CoreProjectEnvironment {
}
- public <T> void registerProjectComponent(final Class<T> interfaceClass, final T implementation) {
+ public <T> void registerProjectComponent(@NotNull Class<T> interfaceClass, @NotNull T implementation) {
CoreApplicationEnvironment.registerComponentInstance(myProject.getPicoContainer(), interfaceClass, implementation);
}
+ @NotNull
public Disposable getParentDisposable() {
return myParentDisposable;
}
+ @NotNull
public CoreApplicationEnvironment getEnvironment() {
return myEnvironment;
}
+ @NotNull
public MockProject getProject() {
return myProject;
}
diff --git a/platform/core-impl/src/com/intellij/mock/MockApplicationEx.java b/platform/core-impl/src/com/intellij/mock/MockApplicationEx.java
index 7415e0d66fad..3a3ea6e8e0d7 100644
--- a/platform/core-impl/src/com/intellij/mock/MockApplicationEx.java
+++ b/platform/core-impl/src/com/intellij/mock/MockApplicationEx.java
@@ -20,7 +20,6 @@ import com.intellij.openapi.application.ex.ApplicationEx;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.InvalidDataException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -44,7 +43,7 @@ public class MockApplicationEx extends MockApplication implements ApplicationEx
}
@Override
- public void load(String path) throws IOException, InvalidDataException {
+ public void load(String path) throws IOException {
}
@Override
diff --git a/platform/core-impl/src/com/intellij/openapi/application/ex/ApplicationEx.java b/platform/core-impl/src/com/intellij/openapi/application/ex/ApplicationEx.java
index bf84725f7910..90506c071f35 100644
--- a/platform/core-impl/src/com/intellij/openapi/application/ex/ApplicationEx.java
+++ b/platform/core-impl/src/com/intellij/openapi/application/ex/ApplicationEx.java
@@ -38,7 +38,8 @@ public interface ApplicationEx extends Application {
* @throws IOException
* @throws InvalidDataException
*/
- void load(String optionsPath) throws IOException, InvalidDataException;
+ void load(@Nullable String optionsPath) throws IOException;
+
boolean isLoaded();
@NotNull
diff --git a/platform/core-impl/src/com/intellij/openapi/options/AbstractSchemesManager.java b/platform/core-impl/src/com/intellij/openapi/options/AbstractSchemesManager.java
index d1ed93f3a2be..ebb2896d2a8e 100644
--- a/platform/core-impl/src/com/intellij/openapi/options/AbstractSchemesManager.java
+++ b/platform/core-impl/src/com/intellij/openapi/options/AbstractSchemesManager.java
@@ -29,8 +29,7 @@ import java.util.*;
public abstract class AbstractSchemesManager<T extends Scheme, E extends ExternalizableScheme> implements SchemesManager<T,E> {
-
- private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.options.AbstractSchemesManager");
+ private static final Logger LOG = Logger.getInstance(AbstractSchemesManager.class);
protected final List<T> mySchemes = new ArrayList<T>();
private volatile T myCurrentScheme;
diff --git a/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java b/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java
index d548fd2412b2..132dd5b30ee4 100644
--- a/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java
+++ b/platform/core-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorBase.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@ import com.intellij.openapi.application.impl.ModalityStateEx;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.progress.ProgressIndicator;
+import com.intellij.openapi.progress.ProgressIndicatorProvider;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.util.containers.ConcurrentHashSet;
import com.intellij.util.containers.DoubleArrayList;
@@ -89,6 +90,7 @@ public class AbstractProgressIndicatorBase extends UserDataHolderBase implements
@Override
public void cancel() {
myCanceled = true;
+ ProgressIndicatorProvider.canceled();
}
@Override
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;
}
-
}
diff --git a/platform/core-impl/src/com/intellij/util/DocumentUtil.java b/platform/core-impl/src/com/intellij/util/DocumentUtil.java
index e2c78be69a3e..df9d26c6e690 100644
--- a/platform/core-impl/src/com/intellij/util/DocumentUtil.java
+++ b/platform/core-impl/src/com/intellij/util/DocumentUtil.java
@@ -82,4 +82,8 @@ public final class DocumentUtil {
}
return startOffset;
}
+
+ public static boolean isValidOffset(int offset, @NotNull Document document) {
+ return offset >= 0 && offset <= document.getTextLength();
+ }
}