make DummyHolderViewProvider extend AbstractFileViewProvider like others do

This commit is contained in:
peter
2017-09-06 09:16:31 +02:00
parent 2fc090d5cc
commit ee172fe592
6 changed files with 37 additions and 123 deletions
@@ -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<PsiFile> getCachedPsiFiles() {
return Collections.singletonList(myHolder);
}
@NotNull
@Override
public List<FileElement> getKnownTreeRoots() {
return Collections.singletonList(myHolder.getTreeElement());
}
@Override
@NotNull
public List<PsiFile> 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<? extends Language> 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;
}
}
@@ -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();
}
});
}
@@ -91,9 +91,7 @@ public class FileManagerImpl implements FileManager {
}
public static void clearPsiCaches(@NotNull FileViewProvider provider) {
List<PsiFile> 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<PsiFile> getAllCachedFiles() {
List<PsiFile> 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();
}
}
@@ -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
@@ -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);
@@ -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