From cf5a8a46936c574080be2c6158cea5b02549cce9 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Fri, 5 Jun 2015 18:53:03 +0300 Subject: [PATCH] gradle: IDEA-129535 IDEA marks all classes inside buildSrc with "Class already exists in " --- .../gradle/config/GradleClassFinder.java | 16 ++++ .../importing/GradleClassFinderTest.java | 76 +++++++++++++++++++ .../importing/GradleImportingTestCase.java | 2 + .../builder/AbstractModelBuilderTest.java | 1 + 4 files changed, 95 insertions(+) create mode 100644 plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleClassFinderTest.java diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleClassFinder.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleClassFinder.java index 17c7add62437..b3f4e6d5f48c 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleClassFinder.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleClassFinder.java @@ -19,8 +19,12 @@ package org.jetbrains.plugins.gradle.config; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.openapi.externalSystem.psi.search.ExternalModuleBuildGlobalSearchScope; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.NonClasspathClassFinder; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiFile; +import com.intellij.psi.search.EverythingGlobalScope; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -61,4 +65,16 @@ public class GradleClassFinder extends NonClasspathClassFinder { } return myBuildClasspathManager.getAllClasspathEntries(); } + + @Override + public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { + PsiClass aClass = super.findClass(qualifiedName, scope); + if (aClass == null || scope instanceof ExternalModuleBuildGlobalSearchScope || scope instanceof EverythingGlobalScope) { + return aClass; + } + + PsiFile containingFile = aClass.getContainingFile(); + VirtualFile file = containingFile != null ? containingFile.getVirtualFile() : null; + return (file != null && !ProjectFileIndex.SERVICE.getInstance(myProject).isInContent(file)) ? aClass : null; + } } \ No newline at end of file diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleClassFinderTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleClassFinderTest.java new file mode 100644 index 000000000000..2fc5a625848f --- /dev/null +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleClassFinderTest.java @@ -0,0 +1,76 @@ +/* + * Copyright 2000-2015 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. + */ +package org.jetbrains.plugins.gradle.importing; + +import com.intellij.openapi.application.AccessToken; +import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.module.Module; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiClass; +import com.intellij.psi.search.GlobalSearchScope; +import org.junit.Test; +import org.junit.runners.Parameterized; + +import java.util.Arrays; +import java.util.Collection; + +/** + * @author Vladislav.Soroka + * @since 6/30/2014 + */ +@SuppressWarnings("JUnit4AnnotatedMethodInJUnit3TestCase") +public class GradleClassFinderTest extends GradleImportingTestCase { + + /** + * It's sufficient to run the test against one gradle version + */ + @SuppressWarnings("MethodOverridesStaticMethodOfSuperclass") + @Parameterized.Parameters(name = "with Gradle-{0}") + public static Collection data() throws Throwable { + return Arrays.asList(new Object[][]{{BASE_GRADLE_VERSION}}); + } + + @Test + public void testClassesFilter() throws Exception { + createProjectSubFile("settings.gradle", "rootProject.name = 'multiproject'\n" + + "include ':app'"); + + // app module files + createProjectSubFile("app/src/main/groovy/App.groovy", "class App {}"); + // buildSrc module files + createProjectSubFile("buildSrc/src/main/groovy/org/buildsrc/BuildSrcClass.groovy", "package org.buildsrc;\n" + + "import groovy.util.AntBuilder;\n" + + "public class BuildSrcClass {}"); + importProject("subprojects {\n" + + " apply plugin: 'groovy'\n" + + "}"); + assertModules("multiproject", "app", "buildSrc"); + Module buildSrcModule = getModule("buildSrc"); + assertNotNull(buildSrcModule); + final AccessToken accessToken = ReadAction.start(); + try { + PsiClass[] appClasses = JavaPsiFacade.getInstance(myProject).findClasses("App", GlobalSearchScope.allScope(myProject)); + assertEquals(1, appClasses.length); + + PsiClass[] buildSrcClasses = + JavaPsiFacade.getInstance(myProject).findClasses("org.buildsrc.BuildSrcClass", GlobalSearchScope.moduleScope(buildSrcModule)); + assertEquals(1, buildSrcClasses.length); + } + finally { + accessToken.finish(); + } + } +} diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java index 70ebb45add85..53ecff1ccb93 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleImportingTestCase.java @@ -47,6 +47,7 @@ import org.jetbrains.plugins.gradle.VersionMatcherRule; import org.jetbrains.plugins.gradle.settings.DistributionType; import org.jetbrains.plugins.gradle.settings.GradleProjectSettings; import org.jetbrains.plugins.gradle.settings.GradleSettings; +import org.jetbrains.plugins.gradle.tooling.builder.AbstractModelBuilderTest; import org.jetbrains.plugins.gradle.util.GradleConstants; import org.junit.Rule; import org.junit.rules.TestName; @@ -73,6 +74,7 @@ import static org.junit.Assume.assumeThat; */ @RunWith(value = Parameterized.class) public abstract class GradleImportingTestCase extends ExternalSystemImportingTestCase { + public static final String BASE_GRADLE_VERSION = AbstractModelBuilderTest.BASE_GRADLE_VERSION; private static final String GRADLE_JDK_NAME = "Gradle JDK"; private static final int GRADLE_DAEMON_TTL_MS = 10000; diff --git a/plugins/gradle/tooling-extension-impl/testSources/org/jetbrains/plugins/gradle/tooling/builder/AbstractModelBuilderTest.java b/plugins/gradle/tooling-extension-impl/testSources/org/jetbrains/plugins/gradle/tooling/builder/AbstractModelBuilderTest.java index 57b3644a6b3a..ecc7baafbe93 100644 --- a/plugins/gradle/tooling-extension-impl/testSources/org/jetbrains/plugins/gradle/tooling/builder/AbstractModelBuilderTest.java +++ b/plugins/gradle/tooling-extension-impl/testSources/org/jetbrains/plugins/gradle/tooling/builder/AbstractModelBuilderTest.java @@ -68,6 +68,7 @@ public abstract class AbstractModelBuilderTest { {"1.9"}, {"1.10"}, {"1.11"}, {"1.12"}, {"2.0"}, {"2.1"}, {"2.2"} , {"2.3"} }; + public static final String BASE_GRADLE_VERSION = String.valueOf(SUPPORTED_GRADLE_VERSIONS[SUPPORTED_GRADLE_VERSIONS.length - 1][0]); public static final Pattern TEST_METHOD_NAME_PATTERN = Pattern.compile("(.*)\\[(\\d*: with Gradle-.*)\\]");