mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
make DummyHolderViewProvider extend AbstractFileViewProvider like others do
This commit is contained in:
@@ -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);
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user