mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
DomFileElement.createStableCopy should survive PsiFile invalidation (IDEA-185043)
This commit is contained in:
@@ -17,15 +17,16 @@ package com.intellij.util.xml.impl;
|
||||
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleUtil;
|
||||
import com.intellij.openapi.module.ModuleUtilCore;
|
||||
import com.intellij.openapi.util.Factory;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.xml.XmlDocument;
|
||||
import com.intellij.psi.xml.XmlElement;
|
||||
import com.intellij.psi.xml.XmlFile;
|
||||
import com.intellij.psi.xml.XmlTag;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import com.intellij.util.xml.*;
|
||||
import com.intellij.util.xml.reflect.*;
|
||||
import com.intellij.util.xml.stubs.FileStub;
|
||||
@@ -286,7 +287,10 @@ public class DomFileElementImpl<T extends DomElement> implements DomFileElement<
|
||||
|
||||
@Override
|
||||
public final <T extends DomElement> T createStableCopy() {
|
||||
return myManager.createStableValue(() -> (T)myManager.getFileElement(myFile));
|
||||
PsiManager psiManager = myFile.getManager();
|
||||
VirtualFile vFile = myFile.getViewProvider().getVirtualFile();
|
||||
//noinspection unchecked
|
||||
return myManager.createStableValue(() -> (T)myManager.getFileElement(ObjectUtils.tryCast(psiManager.findFile(vFile), XmlFile.class)));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -335,7 +335,7 @@ public final class DomManagerImpl extends DomManager {
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public final <T extends DomElement> DomFileElementImpl<T> getFileElement(XmlFile file) {
|
||||
public final <T extends DomElement> DomFileElementImpl<T> getFileElement(@Nullable XmlFile file) {
|
||||
if (file == null) return null;
|
||||
if (!(file.getFileType() instanceof DomSupportEnabled)) return null;
|
||||
final VirtualFile virtualFile = file.getVirtualFile();
|
||||
|
||||
@@ -15,11 +15,17 @@
|
||||
*/
|
||||
package com.intellij.util.xml;
|
||||
|
||||
import com.intellij.lang.xml.XMLLanguage;
|
||||
import com.intellij.mock.MockModule;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.Result;
|
||||
import com.intellij.openapi.command.WriteCommandAction;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiFileFactory;
|
||||
import com.intellij.psi.impl.PsiManagerEx;
|
||||
import com.intellij.psi.impl.file.impl.FileManagerImpl;
|
||||
import com.intellij.psi.xml.XmlFile;
|
||||
import com.intellij.psi.xml.XmlTag;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
@@ -534,6 +540,22 @@ public class DomBasicsTest extends DomTestCase {
|
||||
assertTrue(copy.isValid());
|
||||
}
|
||||
|
||||
public void testStableCopySurvivesPsiFileInvalidation() {
|
||||
XmlFile xmlFile = (XmlFile)PsiFileFactory.getInstance(getProject())
|
||||
.createFileFromText(XMLLanguage.INSTANCE, "<a><child-element/><child-element/></a>");
|
||||
VirtualFile file = xmlFile.getViewProvider().getVirtualFile();
|
||||
|
||||
getDomManager().registerFileDescription(new MockDomFileDescription<>(MyElement.class, "a", file), getTestRootDisposable());
|
||||
|
||||
MyElement element = getDomManager().getFileElement(xmlFile, MyElement.class).getRootElement().getChildElements().get(1);
|
||||
MyElement copy = element.createStableCopy();
|
||||
|
||||
ApplicationManager.getApplication().runWriteAction(() -> ((FileManagerImpl)PsiManagerEx.getInstanceEx(getProject()).getFileManager()).forceReload(file));
|
||||
|
||||
assertFalse(element.isValid());
|
||||
assertTrue(copy.isValid());
|
||||
}
|
||||
|
||||
@Implementation(Impl.class)
|
||||
public interface MyElement extends DomElement {
|
||||
GenericAttributeValue<String> getAttr();
|
||||
|
||||
Reference in New Issue
Block a user