adapt various tests to psi invalidation on root change

This commit is contained in:
peter
2017-09-28 16:03:14 +02:00
parent c61cba1e1e
commit f7367a4a64
11 changed files with 64 additions and 51 deletions
@@ -23,7 +23,6 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.FileIndexFacade;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
@@ -81,23 +80,17 @@ public class MultipleJdksHighlightingTest extends UsefulTestCase {
builders[2].addJdk(IdeaTestUtil.getMockJdk18Path().getPath());
myFixture.setUp();
VirtualFile java3Root = myFixture.getTempDirFixture().findOrCreateDir("java3");
VirtualFile java7Root = myFixture.getTempDirFixture().findOrCreateDir("java7");
VirtualFile java8Root = myFixture.getTempDirFixture().findOrCreateDir("java8");
myJava3Module = builders[0].getFixture().getModule();
myJava7Module = builders[1].getFixture().getModule();
myJava8Module = builders[2].getFixture().getModule();
ModuleRootModificationUtil.updateModel(myJava3Module, model -> {
String contentUrl = VfsUtilCore.pathToUrl(myFixture.getTempDirPath()) + "/java3";
model.addContentEntry(contentUrl).addSourceFolder(contentUrl, false);
});
ModuleRootModificationUtil.updateModel(myJava7Module, model -> {
String contentUrl = VfsUtilCore.pathToUrl(myFixture.getTempDirPath()) + "/java7";
model.addContentEntry(contentUrl).addSourceFolder(contentUrl, false);
});
ModuleRootModificationUtil.updateModel(myJava8Module, model -> {
String contentUrl = VfsUtilCore.pathToUrl(myFixture.getTempDirPath()) + "/java8";
model.addContentEntry(contentUrl).addSourceFolder(contentUrl, false);
});
ModuleRootModificationUtil.updateModel(myJava3Module, model -> model.addContentEntry(java3Root).addSourceFolder(java3Root, false));
ModuleRootModificationUtil.updateModel(myJava7Module, model -> model.addContentEntry(java7Root).addSourceFolder(java7Root, false));
ModuleRootModificationUtil.updateModel(myJava8Module, model -> model.addContentEntry(java8Root).addSourceFolder(java8Root, false));
}
private void addDependencies_37_78() {
@@ -234,6 +227,7 @@ public class MultipleJdksHighlightingTest extends UsefulTestCase {
PsiClass usage7 = ((PsiJavaFile) myFixture.addFileToProject("java7/a.java", "class A extends java.util.ArrayList {}")).getClasses()[0];
PsiClass usage8 = ((PsiJavaFile) myFixture.addFileToProject("java8/a.java", "class A extends java.util.ArrayList {}")).getClasses()[0];
PsiUtilCore.ensureValid(usage7);
PsiClass abstractList7 = myFixture.getJavaFacade().findClass(AbstractList.class.getName(), usage7.getResolveScope());
PsiClass abstractList8 = myFixture.getJavaFacade().findClass(AbstractList.class.getName(), usage8.getResolveScope());
@@ -2149,8 +2149,8 @@ public class DaemonRespondToChangesTest extends DaemonAnalyzerTestCase {
}
public void testModificationInExcludedFileDoesNotCauseRehighlight() {
final PsiFile excluded = configureByText(JavaFileType.INSTANCE, "class EEE { void f(){} }");
PsiTestUtil.addExcludedRoot(myModule, excluded.getVirtualFile().getParent());
VirtualFile excluded = configureByText(JavaFileType.INSTANCE, "class EEE { void f(){} }").getVirtualFile();
PsiTestUtil.addExcludedRoot(myModule, excluded.getParent());
configureByText(JavaFileType.INSTANCE, "class X { <caret> }");
List<HighlightInfo> errors = highlightErrors();
@@ -2159,7 +2159,7 @@ public class DaemonRespondToChangesTest extends DaemonAnalyzerTestCase {
TextRange scope = me.getFileDirtyScope(getEditor().getDocument(), Pass.UPDATE_ALL);
assertNull(scope);
WriteCommandAction.runWriteCommandAction(getProject(), () -> ((PsiJavaFile)excluded).getClasses()[0].getMethods()[0].delete());
WriteCommandAction.runWriteCommandAction(getProject(), () -> ((PsiJavaFile)PsiManager.getInstance(myProject).findFile(excluded)).getClasses()[0].getMethods()[0].delete());
UIUtil.dispatchAllInvocationEvents();
scope = me.getFileDirtyScope(getEditor().getDocument(), Pass.UPDATE_ALL);
@@ -183,22 +183,26 @@ public class ResolveClassTest extends ResolveTestCase {
}
public void testModuleSourceAsLibrarySource() throws Exception {
final PsiReference ref = configure();
VirtualFile dir = createTempVfsDirectory();
ModuleRootModificationUtil.addModuleLibrary(myModule, "lib", Collections.emptyList(), Collections.singletonList(dir.getUrl()));
final PsiReference ref = configureByFile("class/" + getTestName(false) + ".java", dir);
final VirtualFile file = ref.getElement().getContainingFile().getVirtualFile();
assertNotNull(file);
createFile(myModule, file.getParent(), "ModuleSourceAsLibrarySourceDep.java", loadFile("class/ModuleSourceAsLibrarySourceDep.java"));
ModuleRootModificationUtil.addModuleLibrary(myModule, "lib", Collections.emptyList(), Collections.singletonList(file.getParent().getUrl()));
assertInstanceOf(ref.resolve(), PsiClass.class);
}
public void testModuleSourceAsLibraryClasses() throws Exception {
final PsiReference ref = configure();
VirtualFile dir = createTempVfsDirectory();
ModuleRootModificationUtil.addModuleLibrary(myModule, "lib", Collections.singletonList(dir.getUrl()), Collections.emptyList());
PsiReference ref = configureByFile("class/" + getTestName(false) + ".java", dir);
PsiFile psiFile = ref.getElement().getContainingFile();
final VirtualFile file = psiFile.getVirtualFile();
assertNotNull(file);
createFile(myModule, file.getParent(), "ModuleSourceAsLibraryClassesDep.java", loadFile("class/ModuleSourceAsLibraryClassesDep.java"));
ModuleRootModificationUtil.addModuleLibrary(myModule, "lib", Collections.singletonList(file.getParent().getUrl()), Collections.emptyList());
createFile(myModule, dir, "ModuleSourceAsLibraryClassesDep.java", loadFile("class/ModuleSourceAsLibraryClassesDep.java"));
//need this to ensure that PsiJavaFileBaseImpl.myResolveCache is filled to reproduce IDEA-91309
DependenciesBuilder.analyzeFileDependencies(psiFile, new DependenciesBuilder.DependencyProcessor() {
@Override
@@ -231,7 +235,9 @@ public class ResolveClassTest extends ResolveTestCase {
public void testStaticImportNetworkPerformance() throws Exception {
warmUpResolve();
PsiReference ref = configure();
VirtualFile dir = createTempVfsDirectory();
PsiReference ref = configureByFile("class/" + getTestName(false) + ".java", dir);
int count = 15;
String imports = "";
@@ -240,7 +246,7 @@ public class ResolveClassTest extends ResolveTestCase {
}
for (int i = 0; i < count; i++) {
createFile(myModule, "Foo" + i + ".java", imports + "class Foo" + i + " extends Bar1, Bar2, Bar3 {}");
createFile(myModule, dir, "Foo" + i + ".java", imports + "class Foo" + i + " extends Bar1, Bar2, Bar3 {}");
}
ensureIndexUpToDate();
@@ -84,11 +84,17 @@ public abstract class PsiTestCase extends ModuleTestCase {
@NotNull
protected PsiFile createFile(@NotNull Module module, @NotNull String fileName, @NotNull String text) throws Exception {
VirtualFile vDir = createTempVfsDirectory();
return createFile(module, vDir, fileName, text);
}
@NotNull
protected VirtualFile createTempVfsDirectory() throws IOException {
File dir = createTempDirectory();
VirtualFile vDir = LocalFileSystem.getInstance().refreshAndFindFileByPath(dir.getCanonicalPath().replace(File.separatorChar, '/'));
assert vDir != null : dir;
return createFile(module, vDir, fileName, text);
return vDir;
}
@NotNull
@@ -61,6 +61,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.CommonProcessors;
import com.intellij.util.ObjectUtils;
import com.intellij.util.Processor;
@@ -305,7 +306,7 @@ public class ShowIntentionsPass extends TextEditorHighlightingPass {
@NotNull final IntentionsInfo intentions,
int passIdToShowIntentionsFor) {
final PsiElement psiElement = hostFile.findElementAt(hostEditor.getCaretModel().getOffset());
LOG.assertTrue(psiElement == null || psiElement.isValid(), psiElement);
if (psiElement != null) PsiUtilCore.ensureValid(psiElement);
int offset = hostEditor.getCaretModel().getOffset();
final Project project = hostFile.getProject();
@@ -1004,16 +1004,15 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
}
protected PsiFile addFileToProject(@NotNull final String rootPath, @NotNull final String relativePath, @NotNull final String fileText) {
return new WriteCommandAction<PsiFile>(getProject()) {
VirtualFile file = new WriteCommandAction<VirtualFile>(getProject()) {
@Override
protected void run(@NotNull Result<PsiFile> result) throws Throwable {
protected void run(@NotNull Result<VirtualFile> result) {
try {
if (myTempDirFixture instanceof LightTempDirTestFixtureImpl) {
final VirtualFile file = myTempDirFixture.createFile(relativePath, fileText);
result.setResult(PsiManager.getInstance(getProject()).findFile(file));
result.setResult(myTempDirFixture.createFile(relativePath, fileText));
}
else {
result.setResult(((HeavyIdeaTestFixture)myProjectFixture).addFileToProject(rootPath, relativePath, fileText));
result.setResult(((HeavyIdeaTestFixture)myProjectFixture).addFileToProject(rootPath, relativePath, fileText).getViewProvider().getVirtualFile());
}
}
catch (IOException e) {
@@ -1024,6 +1023,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
}
}
}.execute().getResultObject();
return ReadAction.compute(() -> PsiManager.getInstance(getProject()).findFile(file));
}
public <T> void registerExtension(final ExtensionsArea area, final ExtensionPointName<T> epName, final T extension) {
@@ -480,11 +480,12 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase {
myFixture.copyDirectoryToProject("bothForeignAndSourceRootImportResultsReturned", "");
VirtualFile vf = myFixture.findFileInTempDir("ext/m1.py");
final PsiFile extSource = myFixture.getPsiManager().findFile(vf);
PyImportResolver foreignResolver = (name, context, withRoots) -> name.toString().equals("m1") ? extSource : null;
PlatformTestUtil.registerExtension(PyImportResolver.EP_NAME, foreignResolver, getTestRootDisposable());
withSourceRoots(Lists.newArrayList(myFixture.findFileInTempDir("root")), () -> {
final PsiFile extSource = myFixture.getPsiManager().findFile(vf);
PyImportResolver foreignResolver = (name, context, withRoots) -> name.toString().equals("m1") ? extSource : null;
PlatformTestUtil.registerExtension(PyImportResolver.EP_NAME, foreignResolver, getTestRootDisposable());
final PsiFile psiFile = myFixture.configureByFile("a.py");
final PsiReference ref = PyResolveTestCase.findReferenceByMarker(psiFile);
assertInstanceOf(ref, PsiPolyVariantReference.class);
@@ -68,12 +68,12 @@ public class Py3UnresolvedReferencesInspectionTest extends PyInspectionTestCase
protected void doMultiFileTest(@NotNull String filename, @NotNull List<String> sourceRoots) {
runWithLanguageLevel(LanguageLevel.PYTHON36, () -> {
myFixture.copyDirectoryToProject(getTestDirectoryPath(), "");
final PsiFile currentFile = myFixture.configureFromTempProjectFile(filename);
final Module module = myFixture.getModule();
for (String root : sourceRoots) {
PsiTestUtil.addSourceRoot(module, myFixture.findFileInTempDir(root));
}
try {
final PsiFile currentFile = myFixture.configureFromTempProjectFile(filename);
myFixture.enableInspections(getInspectionClass());
myFixture.checkHighlighting(isWarning(), isInfo(), isWeakWarning());
assertProjectFilesNotParsed(currentFile);
@@ -284,7 +284,7 @@ public final class DomManagerImpl extends DomManager {
public final <T extends DomElement> DomFileElementImpl<T> getFileElement(final XmlFile file, final Class<T> aClass, String rootTagName) {
//noinspection unchecked
if (file.getUserData(MOCK_DESCRIPTION) == null) {
file.putUserData(MOCK_DESCRIPTION, new MockDomFileDescription<>(aClass, rootTagName, file));
file.putUserData(MOCK_DESCRIPTION, new MockDomFileDescription<>(aClass, rootTagName, file.getViewProvider().getVirtualFile()));
mySemService.clearCache();
}
final DomFileElementImpl<T> fileElement = getFileElement(file);
@@ -15,25 +15,27 @@
*/
package com.intellij.util.xml.impl;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.xml.DomFileDescription;
import com.intellij.openapi.module.Module;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author peter
*/
public class MockDomFileDescription<T> extends DomFileDescription<T> {
private final XmlFile myFile;
private final VirtualFile myFile;
public MockDomFileDescription(final Class<T> aClass, final String rootTagName, final XmlFile file) {
public MockDomFileDescription(final Class<T> aClass, final String rootTagName, @Nullable VirtualFile file) {
super(aClass, rootTagName);
myFile = file;
}
@Override
public boolean isMyFile(@NotNull final XmlFile xmlFile, final Module module) {
return myFile == xmlFile;
return xmlFile.getViewProvider().getVirtualFile().equals(myFile);
}
@Override
@@ -20,9 +20,12 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.xml.XmlFile;
import com.intellij.util.xml.impl.DomFileElementImpl;
import com.intellij.util.xml.impl.MockDomFileDescription;
@@ -36,24 +39,24 @@ import java.util.Set;
* @author peter
*/
public class DomFileDescriptionTest extends DomHardCoreTestCase {
private XmlFile myFooElementFile;
private XmlFile myBarElementFile;
private VirtualFile myFooElementFile;
private VirtualFile myBarElementFile;
private Disposable myDisposable = Disposer.newDisposable();
@Override
protected void setUp() throws Exception {
super.setUp();
myFooElementFile = (XmlFile)createFile("a.xml", "<a/>");
myFooElementFile = createFile("a.xml", "<a/>").getVirtualFile();
getDomManager().registerFileDescription(new MockDomFileDescription<>(FooElement.class, "a", myFooElementFile), myDisposable);
myBarElementFile = (XmlFile)createFile("b.xml", "<b/>");
myBarElementFile = createFile("b.xml", "<b/>").getVirtualFile();
getDomManager().registerFileDescription(new DomFileDescription<BarElement>(BarElement.class, "b") {
@Override
public boolean isMyFile(@NotNull final XmlFile file, final Module module) {
String text = myFooElementFile.getText();
String text = LoadTextUtil.loadText(myFooElementFile).toString();
return text.contains("239");
}
@Override
@@ -79,8 +82,8 @@ public class DomFileDescriptionTest extends DomHardCoreTestCase {
}
public void testNoInitialDomnessInB() {
assertFalse(getDomManager().isDomFile(myBarElementFile));
assertNull(getDomManager().getFileElement(myBarElementFile));
assertFalse(getDomManager().isDomFile(PsiManager.getInstance(myProject).findFile(myBarElementFile)));
assertNull(getDomManager().getFileElement((XmlFile)PsiManager.getInstance(myProject).findFile(myBarElementFile)));
}
public void testIsDomValue() throws Throwable {
@@ -125,7 +128,7 @@ public class DomFileDescriptionTest extends DomHardCoreTestCase {
public void testCopyFileDescriptionFromOriginalFile() throws Throwable {
final XmlFile file = (XmlFile)createFile("a.xml", "<b>42</b>");
getDomManager().registerFileDescription(new MockDomFileDescription<>(MyElement.class, "b", file), myDisposable);
getDomManager().registerFileDescription(new MockDomFileDescription<>(MyElement.class, "b", file.getVirtualFile()), myDisposable);
ApplicationManager.getApplication().runWriteAction(() -> {
file.setName("b.xml");
});
@@ -139,9 +142,9 @@ public class DomFileDescriptionTest extends DomHardCoreTestCase {
public void testDependantFileDescriptionCauseStackOverflow() throws Throwable {
final XmlFile interestingFile = (XmlFile)createFile("a.xml", "<b>42</b>");
getDomManager().registerFileDescription(new MockDomFileDescription<>(MyElement.class, "b", (XmlFile)null), myDisposable);
getDomManager().registerFileDescription(new MockDomFileDescription<>(MyElement.class, "b", null), myDisposable);
for (int i = 0; i < 239; i++) {
getDomManager().registerFileDescription(new MockDomFileDescription<AbstractElement>(AbstractElement.class, "b", (XmlFile)null) {
getDomManager().registerFileDescription(new MockDomFileDescription<AbstractElement>(AbstractElement.class, "b", null) {
@Override
@NotNull
public Set getDependencyItems(final XmlFile file) {