gradle: IDEA-129535 IDEA marks all classes inside buildSrc with "Class <name> already exists in <package>"

This commit is contained in:
Vladislav.Soroka
2015-06-08 10:59:34 +03:00
parent 016c797cd5
commit cf5a8a4693
4 changed files with 95 additions and 0 deletions
@@ -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;
}
}
@@ -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<Object[]> 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();
}
}
}
@@ -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;
@@ -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-.*)\\]");