diff --git a/java/java-tests/testSrc/com/intellij/java/find/impl/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/java/find/impl/FindManagerTest.java index 62a4bfd07567..72aabdd6b84a 100644 --- a/java/java-tests/testSrc/com/intellij/java/find/impl/FindManagerTest.java +++ b/java/java-tests/testSrc/com/intellij/java/find/impl/FindManagerTest.java @@ -23,6 +23,8 @@ import com.intellij.find.impl.FindResultImpl; import com.intellij.find.replaceInProject.ReplaceInProjectManager; import com.intellij.lang.properties.IProperty; import com.intellij.lang.properties.psi.PropertiesFile; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.Result; import com.intellij.openapi.application.ex.PathManagerEx; @@ -31,10 +33,13 @@ import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.fileTypes.PlainTextFileType; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.util.ProgressIndicatorBase; import com.intellij.openapi.project.DumbServiceImpl; +import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.ProperTextRange; @@ -49,14 +54,12 @@ import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.GlobalSearchScopesCore; import com.intellij.psi.search.LocalSearchScope; +import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.scope.packageSet.NamedScope; import com.intellij.psi.search.scope.packageSet.PackageSet; import com.intellij.psi.search.scope.packageSet.PackageSetFactory; import com.intellij.psi.search.scope.packageSet.ParsingException; -import com.intellij.testFramework.IdeaTestUtil; -import com.intellij.testFramework.LightVirtualFile; -import com.intellij.testFramework.PlatformTestUtil; -import com.intellij.testFramework.PsiTestUtil; +import com.intellij.testFramework.*; import com.intellij.testFramework.fixtures.TempDirTestFixture; import com.intellij.testFramework.fixtures.impl.LightTempDirTestFixtureImpl; import com.intellij.testFramework.fixtures.impl.TempDirTestFixtureImpl; @@ -1041,4 +1044,41 @@ public class FindManagerTest extends DaemonAnalyzerTestCase { assertTrue(FindUtil.replace(myProject, myEditor, 0, model)); assertEquals(expectedResult, myEditor.getDocument().getText()); } + + public void testDataContextProcessing() { + initProject("findInPath", "src"); + VirtualFile directory = mySourceDirs[0].findFileByRelativePath("x"); + VirtualFile file = directory.findChild("dd.properties"); + assertNotNull(file); + SearchScope scope = GlobalSearchScope.filesScope(myProject, ContainerUtil.list(directory)); + Module module = ModuleManager.getInstance(myProject).getModules()[0]; + String moduleName = module.getName(); + String dirName = directory.getPresentableUrl(); + + FindModel model = new FindModel(); + model.setDirectoryName("initialDirectoryName"); + model.setModuleName("initialModuleName"); + model.setProjectScope(false); + model.setCustomScopeName("initialScopeName"); + + checkContext(model, myProject, directory, module, false, null, moduleName, false); + checkContext(model, myProject, directory, null, false, dirName, moduleName, false);//prev module state + checkContext(model, myProject, null, null, true, dirName, moduleName, false);//prev module and dir state + model.setCustomScope(scope); + model.setCustomScope(true); + checkContext(model, myProject, null, null, false, dirName, moduleName, true);//prev module and dir state + } + + private static void checkContext(FindModel model, Project project, VirtualFile directory, Module module, + boolean shouldBeProjectScope, String expectedDirectoryName, String expectedModuleName, boolean shouldBeCustomScope) { + MapDataContext dataContext = new MapDataContext(); + dataContext.put(CommonDataKeys.PROJECT, project); + dataContext.put(CommonDataKeys.VIRTUAL_FILE, directory); + dataContext.put(LangDataKeys.MODULE_CONTEXT, module); + FindInProjectUtil.setDirectoryName(model, dataContext); + assertEquals(shouldBeProjectScope, model.isProjectScope()); + assertEquals(expectedDirectoryName, model.getDirectoryName()); + assertEquals(expectedModuleName, model.getModuleName()); + assertEquals(shouldBeCustomScope, model.isCustomScope()); + } } diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java index dd75314ad78d..515503da9df4 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java @@ -113,6 +113,9 @@ public class FindInProjectUtil { // apply explicit settings from context if (module != null) { model.setModuleName(module.getName()); + directoryName = null;// Explicit 'module' scope is more specific than 'module directory' scope + model.setCustomScope(false); + model.setDirectoryName(null); } Editor editor = CommonDataKeys.EDITOR.getData(dataContext); @@ -124,7 +127,7 @@ public class FindInProjectUtil { } // set project scope if we have no other settings - model.setProjectScope(model.getDirectoryName() == null && model.getModuleName() == null && !model.isCustomScope()); + model.setProjectScope(directoryName == null && module == null && !model.isCustomScope()); } /**