From 255eb802ca94762084701ade1aec546e33c51fa2 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 20 Nov 2017 14:48:25 +0100 Subject: [PATCH] [java] expands search scope for exports/opens module references (IDEA-179277) --- .../psi/impl/source/PsiJavaModuleImpl.java | 8 +++ .../impl/source/PsiJavaModuleReference.java | 10 ++-- .../codeInsight/daemon/ModuleRenameTest.kt | 51 ++++++++++--------- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaModuleImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaModuleImpl.java index 55a74af8f004..6eb60aa328e2 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaModuleImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaModuleImpl.java @@ -10,6 +10,8 @@ import com.intellij.psi.impl.java.stubs.JavaStubElementTypes; import com.intellij.psi.impl.java.stubs.PsiJavaModuleStub; import com.intellij.psi.impl.source.tree.JavaElementType; import com.intellij.psi.javadoc.PsiDocComment; +import com.intellij.psi.search.ProjectScope; +import com.intellij.psi.search.SearchScope; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; @@ -159,6 +161,12 @@ public class PsiJavaModuleImpl extends JavaStubPsiElement imp } } + @NotNull + @Override + public SearchScope getUseScope() { + return ProjectScope.getProjectScope(getProject()); + } + @Override public String toString() { return "PsiJavaModule:" + getName(); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaModuleReference.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaModuleReference.java index 2cb70cb14536..b354144d2c3d 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaModuleReference.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaModuleReference.java @@ -66,7 +66,8 @@ public class PsiJavaModuleReference extends PsiReferenceBase.Poly modules = findModules(file, moduleName, incompleteCode); + boolean global = incompleteCode || refElement.getParent() instanceof PsiPackageAccessibilityStatement; + Collection modules = findModules(file, moduleName, global); if (!modules.isEmpty()) { ResolveResult[] result = new ResolveResult[modules.size()]; int i = 0; @@ -88,9 +90,9 @@ public class PsiJavaModuleReference extends PsiReferenceBase.Poly findModules(PsiFile file, String moduleName, boolean incompleteCode) { + private static Collection findModules(PsiFile file, String moduleName, boolean global) { Project project = file.getProject(); - GlobalSearchScope scope = incompleteCode ? GlobalSearchScope.allScope(project) : file.getResolveScope(); + GlobalSearchScope scope = global ? GlobalSearchScope.allScope(project) : file.getResolveScope(); return JavaFileManager.getInstance(project).findModules(moduleName, scope); } } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleRenameTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleRenameTest.kt index f3166f8489ad..5b57bfd894d1 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleRenameTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ModuleRenameTest.kt @@ -1,36 +1,37 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.java.codeInsight.daemon +import com.intellij.java.testFramework.fixtures.LightJava9ModulesCodeInsightFixtureTestCase +import com.intellij.java.testFramework.fixtures.MultiModuleJava9ProjectDescriptor.ModuleDescriptor.M2 +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiJavaModule import com.intellij.psi.impl.file.impl.JavaFileManager import com.intellij.psi.search.GlobalSearchScope import com.intellij.refactoring.rename.RenameProcessor -import com.intellij.java.testFramework.fixtures.LightJava9ModulesCodeInsightFixtureTestCase -import com.intellij.java.testFramework.fixtures.MultiModuleJava9ProjectDescriptor.ModuleDescriptor.M2 +import org.assertj.core.api.Assertions.assertThat class ModuleRenameTest : LightJava9ModulesCodeInsightFixtureTestCase() { - override fun setUp() { - super.setUp() - addFile("module-info.java", "module M2 { }", M2) + fun testRename() { + val file = addFile("module-info.java", "module M2 { }", M2) + myFixture.configureByText("module-info.java", "module M { requires M2; }") + RenameProcessor(project, findModule("M2"), "M2.bis", false, false).run() + myFixture.checkResult("module M { requires M2.bis; }") + assertEquals("module M2.bis { }", fileText(file)) } - fun testRename() { - myFixture.configureByText("module-info.java", "module M { requires M2; }") - val module = JavaFileManager.getInstance(project).findModules("M2", GlobalSearchScope.allScope(project)).first() - RenameProcessor(project, module, "M2.bis", false, false).run() - myFixture.checkResult("module M { requires M2.bis; }") + fun testRenameIndirectReference() { + val file = addFile("module-info.java", "module M2 { exports pkg.m2 to M.main; opens pkg.m2.impl to M.main; }", M2) + myFixture.configureByText("module-info.java", "module M.main { requires M2; }") + RenameProcessor(project, findModule("M.main"), "M.other", false, false).run() + myFixture.checkResult("module M.other { requires M2; }") + assertEquals("module M2 { exports pkg.m2 to M.other; opens pkg.m2.impl to M.other; }", fileText(file)) } + + private fun findModule(name: String): PsiJavaModule { + val modules = JavaFileManager.getInstance(project).findModules(name, GlobalSearchScope.projectScope(project)) + assertThat(modules).hasSize(1) + return modules.first() + } + + private fun fileText(file: VirtualFile) = myFixture.psiManager.findFile(file)!!.text } \ No newline at end of file