diff options
Diffstat (limited to 'platform/core-impl/src')
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(); + } } |