From a0125dc5cc57ed05d0b9804221f68662016363ba Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Wed, 23 Apr 2014 10:52:20 +0200 Subject: [PATCH] Platform: always allow writing module files (IDEA-123899) --- .../NonProjectFileWritingAccessProvider.java | 9 +++- .../fileEditor/NonProjectFileAccessTest.java | 42 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/NonProjectFileWritingAccessProvider.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/NonProjectFileWritingAccessProvider.java index d83caa3c0c84..2c781984fb76 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/NonProjectFileWritingAccessProvider.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/NonProjectFileWritingAccessProvider.java @@ -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 diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/NonProjectFileAccessTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/NonProjectFileAccessTest.java index 2c5106353696..fd6dd2edb0a9 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/NonProjectFileAccessTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/fileEditor/NonProjectFileAccessTest.java @@ -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() { @Override @@ -100,6 +105,41 @@ public class NonProjectFileAccessTest extends HeavyFileEditorManagerTestCase { typeAndCheck(fileUnderProjectDir, false); } + public void testAccessToModuleSystemFiles() throws Exception { + final Module moduleWithoutContentRoot = new WriteCommandAction(getProject()) { + @Override + protected void run(@NotNull Result 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() { + @Override + protected void run(@NotNull Result 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();