diff --git a/platform/core-impl/src/com/intellij/psi/DummyHolderViewProvider.java b/platform/core-impl/src/com/intellij/psi/DummyHolderViewProvider.java index 44e09b559978..32bc8e76c8ff 100644 --- a/platform/core-impl/src/com/intellij/psi/DummyHolderViewProvider.java +++ b/platform/core-impl/src/com/intellij/psi/DummyHolderViewProvider.java @@ -16,15 +16,11 @@ package com.intellij.psi; import com.intellij.lang.Language; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.util.UserDataHolderBase; +import com.intellij.openapi.fileTypes.UnknownFileType; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.SharedPsiElementImplUtil; import com.intellij.psi.impl.source.DummyHolder; -import com.intellij.psi.impl.source.PsiFileImpl; +import com.intellij.psi.impl.source.tree.FileElement; import com.intellij.psi.impl.source.tree.LeafElement; import com.intellij.testFramework.LightVirtualFile; import com.intellij.util.LocalTimeCounter; @@ -35,41 +31,21 @@ import java.util.Collections; import java.util.List; import java.util.Set; -public class DummyHolderViewProvider extends UserDataHolderBase implements FileViewProvider{ +public class DummyHolderViewProvider extends AbstractFileViewProvider { private DummyHolder myHolder; - private final PsiManager myManager; private final long myModificationStamp; - private final LightVirtualFile myLightVirtualFile = new LightVirtualFile("DummyHolder"); public DummyHolderViewProvider(@NotNull PsiManager manager) { - myManager = manager; + super(manager, new LightVirtualFile("DummyHolder"), false, UnknownFileType.INSTANCE); myModificationStamp = LocalTimeCounter.currentTime(); } - @Override - @NotNull - public PsiManager getManager() { - return myManager; - } - - @Override - @Nullable - public Document getDocument() { - return FileDocumentManager.getInstance().getDocument(getVirtualFile()); - } - @Override @NotNull public CharSequence getContents() { return myHolder != null ? myHolder.getNode().getText() : ""; } - @Override - @NotNull - public VirtualFile getVirtualFile() { - return myLightVirtualFile; - } - @Override @NotNull public Language getBaseLanguage() { @@ -82,32 +58,33 @@ public class DummyHolderViewProvider extends UserDataHolderBase implements FileV return Collections.singleton(getBaseLanguage()); } + @Nullable @Override - public PsiFile getPsi(@NotNull Language target) { - ((PsiManagerEx)myManager).getFileManager().setViewProvider(getVirtualFile(), this); + protected PsiFile getPsiInner(Language target) { + return getCachedPsi(target); + } + + @Override + public PsiFile getCachedPsi(@NotNull Language target) { + getManager().getFileManager().setViewProvider(getVirtualFile(), this); return target == getBaseLanguage() ? myHolder : null; } + @Override + public List getCachedPsiFiles() { + return Collections.singletonList(myHolder); + } + + @NotNull + @Override + public List getKnownTreeRoots() { + return Collections.singletonList(myHolder.getTreeElement()); + } + @Override @NotNull public List getAllFiles() { - return Collections.singletonList(getPsi(getBaseLanguage())); - } - - @Override - public void beforeContentsSynchronized() {} - - @Override - public void contentsSynchronized() {} - - @Override - public boolean isEventSystemEnabled() { - return false; - } - - @Override - public boolean isPhysical() { - return false; + return getCachedPsiFiles(); } @Override @@ -115,23 +92,9 @@ public class DummyHolderViewProvider extends UserDataHolderBase implements FileV return myModificationStamp; } - @Override - public boolean supportsIncrementalReparse(@NotNull final Language rootLanguage) { - return true; - } - - @Override - public void rootChanged(@NotNull PsiFile psiFile) { - } - public void setDummyHolder(@NotNull DummyHolder dummyHolder) { myHolder = dummyHolder; - myLightVirtualFile.setFileType(dummyHolder.getFileType()); - } - - @Override - public FileViewProvider clone(){ - throw new RuntimeException("Clone is not supported for DummyHolderProviders. Use DummyHolder clone directly."); + ((LightVirtualFile)getVirtualFile()).setFileType(dummyHolder.getFileType()); } @Override @@ -139,45 +102,21 @@ public class DummyHolderViewProvider extends UserDataHolderBase implements FileV return SharedPsiElementImplUtil.findReferenceAt(getPsi(getBaseLanguage()), offset); } - @Override - @Nullable - public PsiElement findElementAt(final int offset, @NotNull final Language language) { - return language == getBaseLanguage() ? findElementAt(offset) : null; - } - - @Override public PsiElement findElementAt(int offset, @NotNull Class lang) { if (!lang.isAssignableFrom(getBaseLanguage().getClass())) return null; return findElementAt(offset); } - @Override - public PsiReference findReferenceAt(final int offsetInElement, @NotNull final Language language) { - return language == getBaseLanguage() ? findReferenceAt(offsetInElement) : null; - } - @NotNull @Override public FileViewProvider createCopy(@NotNull final VirtualFile copy) { throw new RuntimeException("Clone is not supported for DummyHolderProviders. Use DummyHolder clone directly."); } - @NotNull - @Override - public PsiFile getStubBindingRoot() { - return getPsi(getBaseLanguage()); - } - - @NotNull - @Override - public FileType getFileType() { - return myLightVirtualFile.getFileType(); - } - @Override public PsiElement findElementAt(final int offset) { - final LeafElement element = ((PsiFileImpl)getPsi(getBaseLanguage())).calcTreeElement().findLeafElementAt(offset); + final LeafElement element = myHolder.calcTreeElement().findLeafElementAt(offset); return element != null ? element.getPsi() : null; } } diff --git a/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java b/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java index ca070a4cd889..f025b73abd88 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java +++ b/platform/core-impl/src/com/intellij/psi/impl/PsiDocumentManagerBase.java @@ -427,7 +427,7 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen } void forceReload(VirtualFile virtualFile, @Nullable FileViewProvider viewProvider) { - if (viewProvider instanceof AbstractFileViewProvider) { + if (viewProvider != null) { ((AbstractFileViewProvider)viewProvider).markInvalidated(); } if (virtualFile != null) { @@ -900,12 +900,7 @@ public abstract class PsiDocumentManagerBase extends PsiDocumentManager implemen ApplicationManager.getApplication().runWriteAction(new ExternalChangeAction() { @Override public void run() { - FileViewProvider viewProvider = psiFile.getViewProvider(); - if (viewProvider instanceof AbstractFileViewProvider) { - ((AbstractFileViewProvider)viewProvider).onContentReload(); - } else { - LOG.error("Invalid view provider: " + viewProvider + " of " + viewProvider.getClass()); - } + ((AbstractFileViewProvider)psiFile.getViewProvider()).onContentReload(); } }); } 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 ca615bf74b62..c5c495daad3d 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 @@ -91,9 +91,7 @@ public class FileManagerImpl implements FileManager { } public static void clearPsiCaches(@NotNull FileViewProvider provider) { - List psiFiles = provider instanceof AbstractFileViewProvider? ((AbstractFileViewProvider)provider).getCachedPsiFiles() - : provider.getAllFiles(); - psiFiles.forEach(PsiFile::clearCaches); + ((AbstractFileViewProvider)provider).getCachedPsiFiles().forEach(PsiFile::clearCaches); } public void forceReload(@NotNull VirtualFile vFile) { @@ -438,9 +436,7 @@ public class FileManagerImpl implements FileManager { } private void markInvalidated(@NotNull FileViewProvider viewProvider) { - if (viewProvider instanceof AbstractFileViewProvider) { - ((AbstractFileViewProvider)viewProvider).markInvalidated(); - } + ((AbstractFileViewProvider)viewProvider).markInvalidated(); VirtualFile virtualFile = viewProvider.getVirtualFile(); Document document = FileDocumentManager.getInstance().getCachedDocument(virtualFile); if (document != null) { @@ -453,8 +449,7 @@ public class FileManagerImpl implements FileManager { PsiFile getCachedPsiFileInner(@NotNull VirtualFile file) { FileViewProvider fileViewProvider = myVFileToViewProviderMap.get(file); if (fileViewProvider == null) fileViewProvider = file.getUserData(myPsiHardRefKey); - return fileViewProvider instanceof AbstractFileViewProvider - ? ((AbstractFileViewProvider)fileViewProvider).getCachedPsi(fileViewProvider.getBaseLanguage()) : null; + return fileViewProvider != null ? ((AbstractFileViewProvider)fileViewProvider).getCachedPsi(fileViewProvider.getBaseLanguage()) : null; } @NotNull @@ -462,9 +457,7 @@ public class FileManagerImpl implements FileManager { public List getAllCachedFiles() { List files = new ArrayList<>(); for (FileViewProvider provider : myVFileToViewProviderMap.values()) { - if (provider instanceof AbstractFileViewProvider) { - ContainerUtil.addIfNotNull(files, ((AbstractFileViewProvider)provider).getCachedPsi(provider.getBaseLanguage())); - } + ContainerUtil.addIfNotNull(files, ((AbstractFileViewProvider)provider).getCachedPsi(provider.getBaseLanguage())); } return files; } @@ -588,11 +581,6 @@ public class FileManagerImpl implements FileManager { return; } - FileViewProvider viewProvider = file.getViewProvider(); - if (viewProvider instanceof AbstractFileViewProvider) { - ((AbstractFileViewProvider)viewProvider).onContentReload(); - } else { - LOG.error("Invalid view provider: " + viewProvider + " of " + viewProvider.getClass()); - } + ((AbstractFileViewProvider)file.getViewProvider()).onContentReload(); } } 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 d8e3cda6163b..cdb0f5218fcf 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 @@ -545,9 +545,7 @@ public abstract class PsiFileImpl extends ElementBase implements PsiFileEx, PsiF myOriginalFile = originalFile.getOriginalFile(); FileViewProvider original = myOriginalFile.getViewProvider(); - if (myViewProvider instanceof AbstractFileViewProvider && original instanceof AbstractFileViewProvider) { - ((AbstractFileViewProvider)original).registerAsCopy((AbstractFileViewProvider)myViewProvider); - } + ((AbstractFileViewProvider)original).registerAsCopy((AbstractFileViewProvider)myViewProvider); } @Override diff --git a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java index 4c56c16ce754..d5806ef782dc 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java @@ -375,14 +375,8 @@ public class PsiVFSListener implements VirtualFileListener { final String propertyName = event.getPropertyName(); final VirtualFile vFile = event.getFile(); - final FileViewProvider oldFileViewProvider = myFileManager.findCachedViewProvider(vFile); - final PsiFile oldPsiFile; - if (oldFileViewProvider instanceof AbstractFileViewProvider) { - oldPsiFile = ((AbstractFileViewProvider)oldFileViewProvider).getCachedPsi(oldFileViewProvider.getBaseLanguage()); - } - else { - oldPsiFile = null; - } + FileViewProvider oldFileViewProvider = myFileManager.findCachedViewProvider(vFile); + PsiFile oldPsiFile = myFileManager.getCachedPsiFile(vFile); VirtualFile parent = vFile.getParent(); final PsiDirectory parentDir = oldPsiFile != null && parent != null ? myFileManager.findDirectory(parent) : getCachedDirectory(parent); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java index 7efe4564eb36..e2bbb18e2fa0 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java @@ -470,7 +470,7 @@ public class InjectedLanguageUtil { if (!delegate.isValid()) return; FileViewProvider viewProvider = psiManagerEx.getFileManager().findCachedViewProvider(delegate); - if (!(viewProvider instanceof AbstractFileViewProvider)) return; + if (viewProvider == null) return; for (PsiFile hostFile : ((AbstractFileViewProvider)viewProvider).getCachedPsiFiles()) { // modification of cachedInjectedDocuments must be under PsiLock