Platform: always allow writing module files (IDEA-123899)

This commit is contained in:
Anton Makeev
2014-04-23 11:05:39 +02:00
parent 3a294e97b0
commit a0125dc5cc
2 changed files with 49 additions and 2 deletions
@@ -19,6 +19,8 @@ import com.intellij.ProjectTopics;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.StorageScheme;
import com.intellij.openapi.components.impl.stores.IProjectStore;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ex.ProjectEx;
import com.intellij.openapi.roots.ModuleRootAdapter;
@@ -105,6 +107,8 @@ public class NonProjectFileWritingAccessProvider extends WritingAccessProvider {
}
private boolean isProjectFile(@NotNull VirtualFile file) {
if (ProjectFileIndex.SERVICE.getInstance(myProject).isInContent(file)) return true;
if (myProject instanceof ProjectEx) {
IProjectStore store = ((ProjectEx)myProject).getStateStore();
@@ -115,9 +119,12 @@ public class NonProjectFileWritingAccessProvider extends WritingAccessProvider {
}
if (file.equals(store.getWorkspaceFile()) || file.equals(store.getProjectFile())) return true;
for (Module each : ModuleManager.getInstance(myProject).getModules()) {
if (file.equals(each.getModuleFile())) return true;
}
}
return ProjectFileIndex.SERVICE.getInstance(myProject).isInContent(file);
return false;
}
@TestOnly
@@ -21,6 +21,7 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.application.impl.ApplicationImpl;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.components.impl.ComponentManagerImpl;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorActionManager;
@@ -29,6 +30,10 @@ import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl;
import com.intellij.openapi.fileEditor.impl.NonProjectFileNotificationPanel;
import com.intellij.openapi.fileEditor.impl.NonProjectFileWritingAccessProvider;
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider;
import com.intellij.openapi.module.EmptyModuleType;
import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ProjectFileIndex;
@@ -84,7 +89,7 @@ public class NonProjectFileAccessTest extends HeavyFileEditorManagerTestCase {
assertNull(getNotificationPanel(nonProjectFile));
}
public void testAccessToFilesUnderProjectRootAndDotIdea() throws Exception {
public void testAccessToProjectSystemFiles() throws Exception {
saveProject();
VirtualFile fileUnderProjectDir = new WriteAction<VirtualFile>() {
@Override
@@ -100,6 +105,41 @@ public class NonProjectFileAccessTest extends HeavyFileEditorManagerTestCase {
typeAndCheck(fileUnderProjectDir, false);
}
public void testAccessToModuleSystemFiles() throws Exception {
final Module moduleWithoutContentRoot = new WriteCommandAction<Module>(getProject()) {
@Override
protected void run(@NotNull Result<Module> result) throws Throwable {
String moduleName;
ModifiableModuleModel moduleModel = ModuleManager.getInstance(getProject()).getModifiableModel();
try {
VirtualFile moduleDir = getProject().getBaseDir().createChildDirectory(this, "moduleWithoutContentRoot");
moduleName = moduleModel.newModule(moduleDir + "/moduleWithoutContentRoot.iml", EmptyModuleType.EMPTY_MODULE).getName();
moduleModel.commit();
}
catch (Throwable t) {
moduleModel.dispose();
throw t;
}
result.setResult(ModuleManager.getInstance(getProject()).findModuleByName(moduleName));
}
}.execute().getResultObject();
saveProject();
VirtualFile fileUnderModuleDir = new WriteAction<VirtualFile>() {
@Override
protected void run(@NotNull Result<VirtualFile> result) throws Throwable {
result.setResult(moduleWithoutContentRoot.getModuleFile().getParent().createChildData(this, "fileUnderModuleDir.txt"));
}
}.execute().getResultObject();
assertFalse(ProjectFileIndex.SERVICE.getInstance(getProject()).isInContent(fileUnderModuleDir));
typeAndCheck(moduleWithoutContentRoot.getModuleFile(), true);
typeAndCheck(myModule.getModuleFile(), true);
typeAndCheck(fileUnderModuleDir, false);
}
private void saveProject() {
ApplicationImpl app = (ApplicationImpl)ApplicationManager.getApplication();
boolean save = app.isDoNotSave();