don't consider groovy code in lib sources in findClass (IDEA-148368)

This commit is contained in:
peter
2015-12-03 14:38:27 +01:00
parent 00cadce090
commit 83d6452030
6 changed files with 42 additions and 18 deletions
@@ -40,14 +40,14 @@ public class GroovyClassFinder extends PsiElementFinder {
@Override
@Nullable
public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) {
final List<PsiClass> classes = myCache.getScriptClassesByFQName(qualifiedName, scope, true);
final List<PsiClass> classes = myCache.getClassesByFQName(qualifiedName, scope, true);
return classes.isEmpty() ? null : classes.get(0);
}
@Override
@NotNull
public PsiClass[] findClasses(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) {
final Collection<PsiClass> classes = myCache.getScriptClassesByFQName(qualifiedName, scope, true);
final Collection<PsiClass> classes = myCache.getClassesByFQName(qualifiedName, scope, true);
return classes.isEmpty() ? PsiClass.EMPTY_ARRAY : classes.toArray(new PsiClass[classes.size()]);
}
@@ -62,7 +62,7 @@ public class GrStubFileElementType extends IStubFileElementType<GrFileStub> {
@Override
public int getStubVersion() {
return super.getStubVersion() + 24;
return super.getStubVersion() + 25;
}
@Override
@@ -106,7 +106,6 @@ public abstract class GrTypeDefinitionElementType<TypeDef extends GrTypeDefiniti
final String fqn = stub.getQualifiedName();
if (fqn != null) {
sink.occurrence(GrFullClassNameIndex.KEY, fqn.hashCode());
sink.occurrence(JavaStubIndexKeys.CLASS_FQN, fqn.hashCode());
}
}
@@ -87,19 +87,8 @@ public class GroovyShortNamesCache extends PsiShortNamesCache {
}
@NotNull
public List<PsiClass> getClassesByFQName(@NotNull @NonNls String name, @NotNull GlobalSearchScope scope) {
final List<PsiClass> result = addClasses(name, scope, true);
if (result.isEmpty()) {
result.addAll(addClasses(name, scope, false));
}
if (result.isEmpty()) {
result.addAll(addClasses(name, GlobalSearchScope.projectScope(myProject), false));
}
return result;
}
private List<PsiClass> addClasses(String name, GlobalSearchScope scope, boolean inSource) {
final List<PsiClass> result = new ArrayList<PsiClass>(getScriptClassesByFQName(name, scope, inSource));
public List<PsiClass> getClassesByFQName(String name, GlobalSearchScope scope, boolean inSource) {
final List<PsiClass> result = ContainerUtil.newArrayList();
for (PsiElement psiClass : StubIndex.getElements(GrFullClassNameIndex.KEY, name.hashCode(), myProject,
inSource ? new GrSourceFilterScope(scope) : scope, PsiClass.class)) {
@@ -108,6 +97,7 @@ public class GroovyShortNamesCache extends PsiShortNamesCache {
result.add((PsiClass)psiClass);
}
}
result.addAll(getScriptClassesByFQName(name, scope, inSource));
return result;
}
@@ -251,8 +251,15 @@ public class GroovyPositionManager implements PositionManager {
String qName = getOriginalQualifiedName(refType, runtimeName);
GlobalSearchScope searchScope = addModuleContent(myDebugProcess.getSearchScope());
GroovyShortNamesCache cache = GroovyShortNamesCache.getGroovyShortNamesCache(project);
try {
final List<PsiClass> classes = GroovyShortNamesCache.getGroovyShortNamesCache(project).getClassesByFQName(qName, searchScope);
List<PsiClass> classes = cache.getClassesByFQName(qName, searchScope, true);
if (classes.isEmpty()) {
classes = cache.getClassesByFQName(qName, searchScope, false);
}
if (classes.isEmpty()) {
classes = cache.getClassesByFQName(qName, GlobalSearchScope.projectScope(project), false);
}
PsiClass clazz = classes.size() == 1 ? classes.get(0) : null;
if (clazz != null) return clazz.getContainingFile();
}
@@ -44,8 +44,10 @@ import com.intellij.openapi.util.Computable
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiFile
import com.intellij.psi.impl.DebugUtil
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.testFramework.PsiTestUtil
import com.intellij.testFramework.TestLoggerFactory
import com.intellij.testFramework.builders.JavaModuleFixtureBuilder
@@ -319,6 +321,32 @@ cl.parseClass('''$mcText''', 'MyClass.groovy').foo(2)
}
}
public void "test groovy source named java in lib source"() {
def tempDir = new TempDirTestFixtureImpl()
edt {
tempDir.setUp()
disposeOnTearDown({ tempDir.tearDown() } as Disposable)
tempDir.createFile("pkg/java.groovy", "class java {}")
PsiTestUtil.addLibrary(myModule, 'lib', tempDir.getFile('').path, [] as String[], [''] as String[])
}
def facade = JavaPsiFacade.getInstance(project)
assert !facade.findClass('java', GlobalSearchScope.allScope(project))
assert !facade.findPackage('').findClassByShortName('java', GlobalSearchScope.allScope(project))
def file = myFixture.addFileToProject("Foo.groovy", """\
int a = 42
int b = 3 //1
""")
addBreakpoint(file.virtualFile, 1)
runDebugger file, {
waitForBreakpoint()
eval 'a', '42'
}
}
private SourcePosition getSourcePosition() {
managed {
EvaluationContextImpl context = evaluationContext()