reparse files on language level change

This commit is contained in:
peter
2014-04-30 09:48:04 +02:00
parent 29a7c80b4d
commit 9ebf7cacc6
7 changed files with 61 additions and 41 deletions
@@ -20,12 +20,10 @@ import com.intellij.openapi.module.LanguageLevelUtil;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.FileAttribute;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.io.DataInputOutputUtil;
import com.intellij.util.messages.MessageBus;
import org.jetbrains.annotations.NotNull;
@@ -106,7 +104,7 @@ public class JavaLanguageLevelPusher implements FilePropertyPusher<LanguageLevel
for (VirtualFile child : fileOrDir.getChildren()) {
if (!child.isDirectory() && StdFileTypes.JAVA.equals(child.getFileType())) {
FileBasedIndex.getInstance().requestReindex(child);
PushedFilePropertiesUpdater.filePropertiesChanged(child);
}
}
}
@@ -26,8 +26,6 @@ import com.intellij.psi.impl.JavaPsiFacadeEx;
* A TestCase for single PsiFile being opened in Editor conversion. See configureXXX and checkResultXXX method docs.
*/
public abstract class LightCodeInsightTestCase extends LightPlatformCodeInsightTestCase {
private LanguageLevel myOldLanguageLevel;
@SuppressWarnings("JUnitTestCaseWithNonTrivialConstructors")
protected LightCodeInsightTestCase() {
IdeaTestCase.initPlatformPrefix();
@@ -40,7 +38,6 @@ public abstract class LightCodeInsightTestCase extends LightPlatformCodeInsightT
@Override
protected void setUp() throws Exception {
super.setUp();
myOldLanguageLevel = LanguageLevelProjectExtension.getInstance(getProject()).getLanguageLevel();
setLanguageLevel(getLanguageLevel());
}
@@ -48,12 +45,6 @@ public abstract class LightCodeInsightTestCase extends LightPlatformCodeInsightT
return LanguageLevel.HIGHEST;
}
@Override
protected void tearDown() throws Exception {
setLanguageLevel(myOldLanguageLevel);
super.tearDown();
}
protected static void setLanguageLevel(final LanguageLevel level) {
LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(level);
}
@@ -31,6 +31,7 @@ import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.DumbModeTask;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.util.Computable;
@@ -38,9 +39,15 @@ import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.EmptyRunnable;
import com.intellij.openapi.vfs.*;
import com.intellij.openapi.vfs.impl.BulkVirtualFileListenerAdapter;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.file.impl.FileManagerImpl;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.TransferToEDTQueue;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.messages.MessageBus;
import com.intellij.util.messages.MessageBusConnection;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
@@ -286,4 +293,32 @@ public class PushedFilePropertiesUpdater {
}
}
}
public static void filePropertiesChanged(@NotNull final VirtualFile file) {
ApplicationManager.getApplication().assertReadAccessAllowed();
FileBasedIndex.getInstance().requestReindex(file);
for (final Project project : ProjectManager.getInstance().getOpenProjects()) {
reloadPsi(file, project);
}
}
private static void reloadPsi(final VirtualFile file, final Project project) {
final FileManagerImpl fileManager = (FileManagerImpl)((PsiManagerEx)PsiManager.getInstance(project)).getFileManager();
if (fileManager.findCachedViewProvider(file) != null) {
UIUtil.invokeLaterIfNeeded(new Runnable() {
@Override
public void run() {
if (project.isDisposed()) {
return;
}
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
fileManager.forceReload(file);
}
});
}
});
}
}
}
@@ -136,7 +136,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
};
private PsiManagerImpl myPsiManager;
private PsiFile myFile;
private VirtualFile myFile;
private Editor myEditor;
private String myTestDataPath;
private boolean myEmptyLookup;
@@ -380,7 +380,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
long elapsed = 0;
for (Trinity<PsiFile, Editor, ExpectedHighlightingData> trinity : datas) {
myEditor = trinity.second;
myFile = trinity.first;
myFile = trinity.first.getVirtualFile();
elapsed += collectAndCheckHighlighting(trinity.third);
}
return elapsed;
@@ -427,7 +427,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
@Override
public HighlightTestInfo doTest() {
configureByFiles(filePaths);
ExpectedHighlightingData data = new ExpectedHighlightingData(myEditor.getDocument(), checkWarnings, checkWeakWarnings, checkInfos, myFile);
ExpectedHighlightingData data = new ExpectedHighlightingData(myEditor.getDocument(), checkWarnings, checkWeakWarnings, checkInfos, getFile());
if (checkSymbolNames) data.checkSymbolNames();
data.init();
collectAndCheckHighlighting(data);
@@ -437,7 +437,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
}
public void openFileInEditor(@NotNull final VirtualFile file) {
myFile = myPsiManager.findFile(file);
myFile = file;
myEditor = createEditor(file);
}
@@ -680,7 +680,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
assert element != null : "element not found in file " + myFile.getName() +
" at caret position, offset " + myEditor.getCaretModel().getOffset() + "\"" +
" psi structure: " + DebugUtil.psiToString(myFile, true, true);
" psi structure: " + DebugUtil.psiToString(getFile(), true, true);
return element;
}
@@ -870,7 +870,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
assert file != null : "Directory " + to + " not found";
assert file.isDirectory() : to + " is not a directory";
final PsiDirectory directory = myPsiManager.findDirectory(file);
new MoveFilesOrDirectoriesProcessor(project, new PsiElement[]{myFile}, directory,
new MoveFilesOrDirectoriesProcessor(project, new PsiElement[]{getFile()}, directory,
false, false, null, null).run();
}
}.execute().throwException();
@@ -1029,7 +1029,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
@Nullable
protected Editor getCompletionEditor() {
return InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(myEditor, myFile);
return InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(myEditor, getFile());
}
@Override
@@ -1271,7 +1271,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
@Override
public PsiFile configureByFile(@NotNull final String file) {
configureByFilesInner(file);
return myFile;
return getFile();
}
@NotNull
@@ -1329,7 +1329,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
configureInner(vFile, SelectionAndCaretMarkupLoader.fromFile(vFile));
}
}.execute();
return myFile;
return getFile();
}
@Override
@@ -1373,7 +1373,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
catch (IOException e) {
throw new RuntimeException(e);
}
myFile = myPsiManager.findFile(copy);
myFile = copy;
myEditor = createEditor(copy);
assert myEditor != null : "Editor couldn't be created for file: " +
copy.getPath() +
@@ -1394,16 +1394,16 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
}.execute().throwException();
return myFile;
return getFile();
}
protected void prepareVirtualFile(@NotNull VirtualFile file) {
}
private void setupEditorForInjectedLanguage() {
Editor editor = InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(myEditor, myFile);
Editor editor = InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(myEditor, getFile());
if (editor instanceof EditorWindow) {
myFile = ((EditorWindow)editor).getInjectedFile();
myFile = ((EditorWindow)editor).getInjectedFile().getViewProvider().getVirtualFile();
myEditor = editor;
}
}
@@ -1438,7 +1438,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
}
private PsiFile getHostFile() {
return InjectedLanguageUtil.getTopLevelFile(myFile);
return InjectedLanguageUtil.getTopLevelFile(getFile());
}
private long collectAndCheckHighlighting(@NotNull ExpectedHighlightingData data) {
@@ -1580,7 +1580,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
@Override
public PsiFile getFile() {
return myFile;
return myFile == null ? null : PsiManager.getInstance(getProject()).findFile(myFile);
}
public static List<IntentionAction> getAvailableIntentions(@NotNull final Editor editor, @NotNull final PsiFile file) {
@@ -1858,13 +1858,10 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
public void testStructureView(@NotNull Consumer<StructureViewComponent> consumer) {
assert myFile != null : "configure first";
final VirtualFile vFile = myFile.getVirtualFile();
assert vFile != null : "no virtual file for " + myFile;
final FileEditor fileEditor = FileEditorManager.getInstance(getProject()).getSelectedEditor(myFile);
assert fileEditor != null : "editor not opened for " + myFile;
final FileEditor fileEditor = FileEditorManager.getInstance(getProject()).getSelectedEditor(vFile);
assert fileEditor != null : "editor not opened for " + vFile;
final StructureViewBuilder builder = LanguageStructureViewBuilder.INSTANCE.getStructureViewBuilder(myFile);
final StructureViewBuilder builder = LanguageStructureViewBuilder.INSTANCE.getStructureViewBuilder(getFile());
assert builder != null : "no builder for " + myFile;
StructureViewComponent component = null;
@@ -1891,7 +1888,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig
PsiDocumentManager.getInstance(getProject()).commitAllDocuments();
if (myEditor instanceof EditorWindow) {
Document document = ((DocumentWindow)myEditor.getDocument()).getDelegate();
myFile = PsiDocumentManager.getInstance(getProject()).getPsiFile(document);
myFile = FileDocumentManager.getInstance().getFile(document);
myEditor = ((EditorWindow)myEditor).getDelegate();
}
}
@@ -33,7 +33,6 @@ import com.intellij.openapi.vfs.newvfs.FileAttribute;
import com.intellij.psi.SingleRootFileViewProvider;
import com.intellij.util.FileContentUtil;
import com.intellij.util.containers.WeakHashMap;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.io.DataInputOutputUtil;
import com.intellij.util.messages.MessageBus;
import com.jetbrains.python.PythonFileType;
@@ -152,7 +151,7 @@ public class PythonLanguageLevelPusher implements FilePropertyPusher<LanguageLev
for (VirtualFile child : fileOrDir.getChildren()) {
if (!child.isDirectory() && PythonFileType.INSTANCE.equals(child.getFileType())) {
FileBasedIndex.getInstance().requestReindex(child);
PushedFilePropertiesUpdater.filePropertiesChanged(child);
}
}
}
@@ -175,9 +175,9 @@ public class PyQuickDocTest extends LightMarkedTestCase {
}
public void testPropNewSetter() {
PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), LanguageLevel.PYTHON26);
Map<String, PsiElement> marks = loadTest();
PsiElement ref_elt = marks.get("<the_ref>");
PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), LanguageLevel.PYTHON26);
try {
final PyDocStringOwner doc_owner = (PyDocStringOwner)((PyTargetExpression)(ref_elt.getParent())).getReference().resolve();
checkByHTML(myProvider.generateDoc(doc_owner, ref_elt));
@@ -188,9 +188,9 @@ public class PyQuickDocTest extends LightMarkedTestCase {
}
public void testPropNewDeleter() {
PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), LanguageLevel.PYTHON26);
Map<String, PsiElement> marks = loadTest();
PsiElement ref_elt = marks.get("<the_ref>");
PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), LanguageLevel.PYTHON26);
try {
final PyDocStringOwner doc_owner = (PyDocStringOwner)((PyReferenceExpression)(ref_elt.getParent())).getReference().resolve();
checkByHTML(myProvider.generateDoc(doc_owner, ref_elt));
@@ -58,12 +58,12 @@ public class PyStubsTest extends PyTestCase {
}
public void testStubStructure() {
final PyFile file = getTestFile();
// vfile is problematic, but we need an SDK to check builtins
final Project project = file.getProject();
final Project project = myFixture.getProject();
PythonLanguageLevelPusher.setForcedLanguageLevel(project, LanguageLevel.PYTHON26); // we need 2.6+ for @foo.setter
try {
PythonLanguageLevelPusher.setForcedLanguageLevel(project, LanguageLevel.PYTHON26); // we need 2.6+ for @foo.setter
final PyFile file = getTestFile();
final List<PyClass> classes = file.getTopLevelClasses();
assertEquals(3, classes.size());
PyClass pyClass = classes.get(0);