diff options
Diffstat (limited to 'platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java')
-rw-r--r-- | platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java | 28 |
1 files changed, 22 insertions, 6 deletions
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 ce3bc9559769..7b4e9ec210ac 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,12 +26,15 @@ 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; import com.intellij.openapi.roots.FileIndexFacade; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.LowMemoryWatcher; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileVisitor; @@ -55,6 +58,7 @@ import java.util.concurrent.ConcurrentMap; public class FileManagerImpl implements FileManager { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.file.impl.FileManagerImpl"); + private final Key<FileViewProvider> myPsiHardRefKey = Key.create("HARD_REFERENCE_TO_PSI"); //non-static! private final PsiManagerImpl myManager; private final FileIndexFacade myFileIndex; @@ -166,7 +170,7 @@ public class FileManagerImpl implements FileManager { @NotNull public FileViewProvider findViewProvider(@NotNull final VirtualFile file) { assert !file.isDirectory(); - FileViewProvider viewProvider = getFromInjected(file); + FileViewProvider viewProvider = findCachedViewProvider(file); if (viewProvider != null) return viewProvider; viewProvider = myVFileToViewProviderMap.get(file); if(viewProvider == null) { @@ -178,8 +182,9 @@ public class FileManagerImpl implements FileManager { @Override public FileViewProvider findCachedViewProvider(@NotNull final VirtualFile file) { FileViewProvider viewProvider = getFromInjected(file); - if (viewProvider != null) return viewProvider; - return myVFileToViewProviderMap.get(file); + if (viewProvider == null) viewProvider = myVFileToViewProviderMap.get(file); + if (viewProvider == null) viewProvider = file.getUserData(myPsiHardRefKey); + return viewProvider; } @Nullable @@ -214,9 +219,14 @@ public class FileManagerImpl implements FileManager { if (document != null) { PsiDocumentManagerBase.cachePsi(document, null); } + virtualFile.putUserData(myPsiHardRefKey, null); } else { - myVFileToViewProviderMap.put(virtualFile, fileViewProvider); + if (virtualFile instanceof LightVirtualFile) { + virtualFile.putUserData(myPsiHardRefKey, fileViewProvider); + } else { + myVFileToViewProviderMap.put(virtualFile, fileViewProvider); + } } } } @@ -398,7 +408,12 @@ public class FileManagerImpl implements FileManager { PsiDirectory psiDir = myVFileToPsiDirMap.get(vFile); if (psiDir != null) return psiDir; - if (myFileIndex.isExcludedFile(vFile)) return null; + if (Registry.is("ide.hide.excluded.files")) { + if (myFileIndex.isExcludedFile(vFile)) return null; + } + else { + if (FileTypeRegistry.getInstance().isFileIgnored(vFile)) return null; + } VirtualFile parent = vFile.getParent(); if (parent != null) { //? @@ -430,7 +445,8 @@ public class FileManagerImpl implements FileManager { @Nullable PsiFile getCachedPsiFileInner(@NotNull VirtualFile file) { - final FileViewProvider fileViewProvider = myVFileToViewProviderMap.get(file); + FileViewProvider fileViewProvider = myVFileToViewProviderMap.get(file); + if (fileViewProvider == null) fileViewProvider = file.getUserData(myPsiHardRefKey); return fileViewProvider instanceof SingleRootFileViewProvider ? ((SingleRootFileViewProvider)fileViewProvider).getCachedPsi(fileViewProvider.getBaseLanguage()) : null; } |