From 68d3d13cddc98e84f24b963ed209bbd7bd6d9d07 Mon Sep 17 00:00:00 2001 From: Fuyao Zhao Date: Wed, 22 Jul 2015 15:09:04 -0700 Subject: Add module dep quickfix will correctly consider the type of module. Don't generate source when doing gradle sync. Change-Id: I0076332bef7ce48cc1221b318a7445205847bd16 --- .../tests/gui/gradle/AddGradleDependencyTest.java | 32 ++++++++++++++++++ .../quickfix/AddGradleProjectDependencyFix.java | 39 ++++++++++++++++++++-- 2 files changed, 69 insertions(+), 2 deletions(-) (limited to 'android') diff --git a/android/guiTestSrc/com/android/tools/idea/tests/gui/gradle/AddGradleDependencyTest.java b/android/guiTestSrc/com/android/tools/idea/tests/gui/gradle/AddGradleDependencyTest.java index 964c264d3d2..d0e388912c5 100644 --- a/android/guiTestSrc/com/android/tools/idea/tests/gui/gradle/AddGradleDependencyTest.java +++ b/android/guiTestSrc/com/android/tools/idea/tests/gui/gradle/AddGradleDependencyTest.java @@ -30,6 +30,7 @@ import java.io.IOException; import static com.android.tools.idea.tests.gui.framework.TestGroup.PROJECT_SUPPORT; import static com.intellij.vcsUtil.VcsUtil.getFileContent; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; @BelongsToTestGroups({PROJECT_SUPPORT}) public class AddGradleDependencyTest extends GuiTestCase { @@ -57,6 +58,36 @@ public class AddGradleDependencyTest extends GuiTestCase { assertBuildFileContains(projectFrame, "app/build.gradle", "androidTestCompile project(':library3')"); } + @Test @IdeGuiTest + public void testNoModuleDependencyQuickfixFromJavaToAndroid() throws IOException { + IdeFrameFixture projectFrame = importProjectAndWaitForProjectSyncToFinish("MultiModule"); + EditorFixture editor = projectFrame.getEditor(); + editor.open("library3/src/main/java/com/example/MyLibrary.java"); + + try { + typeImportAndInvokeAction(projectFrame, "package com.example;\n^", "import com.android.multimodule.Main^Activity;", + "Add dependency on module"); + fail(); + } catch (AssertionError e) { + assertTrue(e.getMessage().startsWith("Did not find menu item with prefix")); + } + } + + @Test @IdeGuiTest + public void testNoModuleDependencyQuickfixFromAndroidLibToApplication() throws IOException { + IdeFrameFixture projectFrame = importProjectAndWaitForProjectSyncToFinish("MultiModule"); + EditorFixture editor = projectFrame.getEditor(); + editor.open("library/src/main/java/com/android/library/MainActivity.java"); + + try { + typeImportAndInvokeAction(projectFrame, "package com.android.mylibrary;\n^", "import com.android.multimodule.Main^Activity;", + "Add dependency on module"); + fail(); + } catch (AssertionError e) { + assertTrue(e.getMessage().startsWith("Did not find menu item with prefix")); + } + } + private static void typeImportAndInvokeAction(@NotNull IdeFrameFixture projectFrame, @NotNull String lineToType, @NotNull String testImportStatement, @NotNull String intention) { EditorFixture editor = projectFrame.getEditor(); @@ -71,6 +102,7 @@ public class AddGradleDependencyTest extends GuiTestCase { projectFrame.waitForGradleProjectSyncToFinish(); editor.waitForCodeAnalysisHighlightCount(HighlightSeverity.ERROR, 0); } + private static void assertBuildFileContains(@NotNull IdeFrameFixture projectFrame, @NotNull String relativePath, @NotNull String content) { String newBuildFileContent = getFileContent(new File(projectFrame.getProjectPath(), relativePath).getPath()); diff --git a/android/src/com/android/tools/idea/quickfix/AddGradleProjectDependencyFix.java b/android/src/com/android/tools/idea/quickfix/AddGradleProjectDependencyFix.java index d3722172a90..00583cb99e4 100644 --- a/android/src/com/android/tools/idea/quickfix/AddGradleProjectDependencyFix.java +++ b/android/src/com/android/tools/idea/quickfix/AddGradleProjectDependencyFix.java @@ -15,6 +15,7 @@ */ package com.android.tools.idea.quickfix; +import com.android.builder.model.AndroidProject; import com.android.tools.idea.gradle.parser.Dependency; import com.google.common.base.Function; import com.google.common.collect.Sets; @@ -42,6 +43,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import static com.android.tools.idea.gradle.util.GradleUtil.getAndroidProject; import static com.android.tools.idea.gradle.util.GradleUtil.getGradlePath; import static com.intellij.compiler.ModuleCompilerUtil.addingDependencyFormsCircularity; import static com.intellij.util.containers.ContainerUtil.getFirstItem; @@ -66,6 +68,7 @@ public class AddGradleProjectDependencyFix extends GradleDependencyFix { Project project = psiElement.getProject(); JavaPsiFacade facade = JavaPsiFacade.getInstance(project); ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + ModuleType currentModuleType = getModuleType(currentModule); for (PsiClass aClass : classes) { if (!facade.getResolveHelper().isAccessible(aClass, psiElement, aClass)) { @@ -79,9 +82,25 @@ public class AddGradleProjectDependencyFix extends GradleDependencyFix { if (virtualFile == null) { continue; } - final Module classModule = fileIndex.getModuleForFile(virtualFile); + Module classModule = fileIndex.getModuleForFile(virtualFile); if (classModule != null && classModule != currentModule && !ModuleRootManager.getInstance(currentModule).isDependsOn(classModule)) { - myModules.add(classModule); + ModuleType classModuleType = getModuleType(classModule); + boolean legalDependency = false; + switch (currentModuleType) { + case JAVA: + legalDependency = classModuleType == ModuleType.JAVA; + break; + case ANDROID_LIBRARY: + legalDependency = classModuleType == ModuleType.JAVA || classModuleType == ModuleType.ANDROID_LIBRARY; + break; + case ANDROID_APPLICATION: + legalDependency = classModuleType != ModuleType.ANDROID_APPLICATION; + break; + } + + if (legalDependency) { + myModules.add(classModule); + } } } myCurrentModule = currentModule; @@ -227,4 +246,20 @@ public class AddGradleProjectDependencyFix extends GradleDependencyFix { addDependency(from, dependency); } } + + private enum ModuleType { + JAVA, + ANDROID_LIBRARY, + ANDROID_APPLICATION + } + + @NotNull + private static ModuleType getModuleType(@NotNull Module module) { + AndroidProject androidProject = getAndroidProject(module); + if (androidProject == null) { + return ModuleType.JAVA; + } else { + return androidProject.isLibrary() ? ModuleType.ANDROID_LIBRARY : ModuleType.ANDROID_APPLICATION; + } + } } -- cgit v1.2.3