From a51296b783fd0809ed241a88d6b95ad7fcf7e662 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 12 Jul 2011 19:17:55 +0200 Subject: [PATCH] explicit imports should have priority over implicit groovy.util (IDEA-71943) --- .../groovy/lang/psi/impl/GroovyFileImpl.java | 34 ++++++++++++------- .../lang/resolve/ResolveClassTest.groovy | 5 +++ .../class/preferImportsToImplicit/A.groovy | 3 ++ 3 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 plugins/groovy/testdata/resolve/class/preferImportsToImplicit/A.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java index 44b4e50c2f5a..87db68c15ce1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java @@ -147,15 +147,17 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile { return isImplicitlyImported(element, expectedName) || super.execute(element, state); } }; + final JavaPsiFacade facade = JavaPsiFacade.getInstance(getProject()); GrImportStatement[] importStatements = getImportStatements(); if (!processImports(state, lastParent, place, importProcessor, importStatements, false)) return false; + if (!processDeclarationsInPackage(processor, state, lastParent, place, facade, getPackageName())) return false; + if (!processImports(state, lastParent, place, importProcessor, importStatements, true)) return false; if (processClasses && !processImplicitImports(processor, state, lastParent, place)) { return false; } if (classHint == null || classHint.shouldProcess(ClassHint.ResolveKind.PACKAGE)) { - final JavaPsiFacade facade = JavaPsiFacade.getInstance(getProject()); if (expectedName != null) { final PsiPackage pkg = facade.findPackage(expectedName); if (pkg != null && !processor.execute(pkg, state)) { @@ -172,8 +174,6 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile { } } - if (!processImports(state, lastParent, place, importProcessor, importStatements, true)) return false; - if (lastParent != null && !(lastParent instanceof GrTypeDefinition) && scriptClass != null) { if (!ResolveUtil.processElement(processor, getSyntheticArgsParameter(), state)) return false; } @@ -240,16 +240,7 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile { JavaPsiFacade facade = JavaPsiFacade.getInstance(getProject()); for (final String implicitlyImported : getImplicitlyImportedPackages()) { - PsiPackage aPackage = facade.findPackage(implicitlyImported); - if (aPackage != null && !aPackage.processDeclarations(new DelegatingScopeProcessor(processor) { - @Override - public boolean execute(PsiElement element, ResolveState state) { - if (element instanceof PsiPackage) return true; - return super.execute(element, state); - } - }, state, lastParent, place)) { - return false; - } + if (!processDeclarationsInPackage(processor, state, lastParent, place, facade, implicitlyImported)) return false; } for (String implicitlyImportedClass : IMPLICITLY_IMPORTED_CLASSES) { @@ -259,6 +250,23 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile { return true; } + private boolean processDeclarationsInPackage(final PsiScopeProcessor processor, + ResolveState state, + PsiElement lastParent, + PsiElement place, JavaPsiFacade facade, String implicitlyImported) { + PsiPackage aPackage = facade.findPackage(implicitlyImported); + if (aPackage != null && !aPackage.processDeclarations(new DelegatingScopeProcessor(processor) { + @Override + public boolean execute(PsiElement element, ResolveState state) { + if (element instanceof PsiPackage) return true; + return super.execute(element, state); + } + }, state, lastParent, place)) { + return false; + } + return true; + } + private boolean processChildrenScopes(PsiScopeProcessor processor, ResolveState state, PsiElement lastParent, PsiElement place) { final StubElement stub = getStub(); if (stub != null) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveClassTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveClassTest.groovy index 02b99f86ee38..d8ae27cceb77 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveClassTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveClassTest.groovy @@ -234,6 +234,11 @@ public class Test extends MyMap { assertEquals "C2", ((PsiClass) resolve("A.groovy")).name } + void testPreferImportsToImplicit() { + myFixture.addFileToProject "a/C1.groovy", "package a; class Factory{}" + assertEquals "a.Factory", ((PsiClass) resolve("A.groovy")).qualifiedName + } + void testPreferClassFromCurPackage() { myFixture.addFileToProject "a/Cl.groovy", "package a; class Cl{}" myFixture.addFileToProject "b/Cl.groovy", "package b; class Cl{}" diff --git a/plugins/groovy/testdata/resolve/class/preferImportsToImplicit/A.groovy b/plugins/groovy/testdata/resolve/class/preferImportsToImplicit/A.groovy new file mode 100644 index 000000000000..954f854b1aea --- /dev/null +++ b/plugins/groovy/testdata/resolve/class/preferImportsToImplicit/A.groovy @@ -0,0 +1,3 @@ +import a.* + +Factory f \ No newline at end of file