diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaMethodElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaMethodElementType.java index ea655e8f9457..7e32d336c625 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaMethodElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaMethodElementType.java @@ -157,9 +157,16 @@ public abstract class JavaMethodElementType extends JavaStubElementType stub) { StubElement type = stub.findChildStubByType(JavaStubElementTypes.MODIFIER_LIST); - if (type instanceof PsiModifierListStub) { - return ClsModifierListImpl.hasMaskModifierProperty(PsiModifier.STATIC, ((PsiModifierListStub)type).getModifiersMask()); + if (!(type instanceof PsiModifierListStub)) { + return false; } + + int mask = ((PsiModifierListStub)type).getModifiersMask(); + if (ClsModifierListImpl.hasMaskModifierProperty(PsiModifier.PRIVATE, mask) || + !ClsModifierListImpl.hasMaskModifierProperty(PsiModifier.STATIC, mask)) { + return false; + } + return true; } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaFileElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaFileElementType.java index 653579eafea5..fe7ac4b04022 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaFileElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaFileElementType.java @@ -37,7 +37,7 @@ import java.io.IOException; * @author max */ public class JavaFileElementType extends ILightStubFileElementType { - public static final int STUB_VERSION = 13; + public static final int STUB_VERSION = 14; public JavaFileElementType() { super("java.FILE", JavaLanguage.INSTANCE); diff --git a/java/java-tests/testData/codeInsight/completion/smartType/second/GlobalFactoryMethods.java b/java/java-tests/testData/codeInsight/completion/smartType/second/GlobalFactoryMethods.java index 4b8f4a7bdc85..a0d383a2369d 100644 --- a/java/java-tests/testData/codeInsight/completion/smartType/second/GlobalFactoryMethods.java +++ b/java/java-tests/testData/codeInsight/completion/smartType/second/GlobalFactoryMethods.java @@ -1,5 +1,3 @@ -import java.lang.Object; - class Super { } @@ -10,6 +8,10 @@ class SubInt extends Super { } class SubGeneric extends Super { } class SubRaw extends Super { } +interface Constants { + SubString SUBSTRING = null +} + class Factory { public static Object createObject() {} public static Super createExpected() {} @@ -21,7 +23,7 @@ class Factory { class Intermediate { - Super s = createx + Super s = } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SecondSmartTypeCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SecondSmartTypeCompletionTest.java index 6e880247754a..2b925ea454fc 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SecondSmartTypeCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SecondSmartTypeCompletionTest.java @@ -206,7 +206,7 @@ public class SecondSmartTypeCompletionTest extends LightFixtureCompletionTestCas public void testGlobalFactoryMethods() { configure(); - assertStringItems("createExpected", "createSubGeneric", "createSubRaw", "createSubString"); + assertStringItems("createExpected", "Constants.SUBSTRING", "createSubGeneric", "createSubRaw", "createSubString"); } public void testEmptyMapPresentation() { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyMembersGetter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyMembersGetter.java index a87b937bf614..8cc15d43cebb 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyMembersGetter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyMembersGetter.java @@ -17,11 +17,9 @@ package org.jetbrains.plugins.groovy.lang.completion; import com.intellij.codeInsight.completion.CompletionParameters; import com.intellij.codeInsight.completion.JavaCompletionUtil; +import com.intellij.codeInsight.completion.SmartCompletionDecorator; import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.psi.PsiClassType; -import com.intellij.psi.PsiField; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.PsiType; +import com.intellij.psi.*; import com.intellij.psi.filters.getters.MembersGetter; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Consumer; @@ -55,7 +53,8 @@ class GroovyMembersGetter extends MembersGetter { @Override protected LookupElement createMethodElement(PsiMethod method) { - PsiType type = method.getReturnType(); + PsiSubstitutor substitutor = SmartCompletionDecorator.calculateMethodReturnTypeSubstitutor(method, myExpectedType); + PsiType type = substitutor.substitute(method.getReturnType()); if (!isSuitableType(type)) { return null; } @@ -64,6 +63,6 @@ class GroovyMembersGetter extends MembersGetter { } private boolean isSuitableType(PsiType type) { - return type != null && TypesUtil.isAssignable(myExpectedType, type, (GroovyPsiElement)myPlace.getParent()); + return type != null && TypesUtil.isAssignable(myExpectedType, type, (GroovyPsiElement)myPlace.getParent(), false); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java index f6024e8ee8ac..35551ddd20be 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/GrStubUtils.java @@ -94,11 +94,26 @@ public class GrStubUtils { } public static boolean isGroovyStaticMemberStub(StubElement stub) { - StubElement type = stub.findChildStubByType(GroovyElementTypes.MODIFIERS); - if (type instanceof GrModifierListStub) { - return GrModifierListImpl.hasMaskExplicitModifier(PsiModifier.STATIC, ((GrModifierListStub)type).getModifiersFlags()); + StubElement modifierOwner = stub instanceof GrMethodStub ? stub : stub.getParentStub(); + StubElement type = modifierOwner.findChildStubByType(GroovyElementTypes.MODIFIERS); + if (!(type instanceof GrModifierListStub)) { + return false; } - return true; + int mask = ((GrModifierListStub)type).getModifiersFlags(); + if (GrModifierListImpl.hasMaskExplicitModifier(PsiModifier.PRIVATE, mask)) { + return false; + } + if (GrModifierListImpl.hasMaskExplicitModifier(PsiModifier.STATIC, mask)) { + return true; + } + + StubElement parent = modifierOwner.getParentStub(); + StubElement classStub = parent == null ? null : parent.getParentStub(); + if (classStub instanceof GrTypeDefinitionStub && + (((GrTypeDefinitionStub)classStub).isAnnotationType() || ((GrTypeDefinitionStub)classStub).isInterface())) { + return true; + } + return false; } @NotNull diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovySmartCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovySmartCompletionTest.groovy index de9fb90cb2e4..8064f72c023a 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovySmartCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovySmartCompletionTest.groovy @@ -87,6 +87,18 @@ public class GroovySmartCompletionTest extends GroovyCompletionTestBase { checkResult() } + public void testGlobalStaticMembers() { + myFixture.configureByFile(getTestName(false) + ".groovy"); + myFixture.complete(CompletionType.SMART, 2); + assertOrderedEquals(myFixture.lookupElementStrings, 'SUBSTRING', 'createExpected', 'createSubGeneric', 'SUB_RAW') + } + + public void testGlobalListCreators() { + myFixture.configureByFile(getTestName(false) + ".groovy"); + myFixture.complete(CompletionType.SMART, 2); + assertOrderedEquals(myFixture.lookupElementStrings, 'createGenericList', 'createStringList') + } + void testNativeList() {doSmartCompletion('a1', 'a2')}; public void testMembersImportStatically() { diff --git a/plugins/groovy/testdata/groovy/completion/smart/GlobalListCreators.groovy b/plugins/groovy/testdata/groovy/completion/smart/GlobalListCreators.groovy new file mode 100644 index 000000000000..13fa49bf05a2 --- /dev/null +++ b/plugins/groovy/testdata/groovy/completion/smart/GlobalListCreators.groovy @@ -0,0 +1,12 @@ +class Factory { + public static List createGenericList() {} + public static List createIntList() {} + public static List createStringList() {} +} + +class Intermediate { + + List s = create +} + + diff --git a/plugins/groovy/testdata/groovy/completion/smart/GlobalStaticMembers.groovy b/plugins/groovy/testdata/groovy/completion/smart/GlobalStaticMembers.groovy new file mode 100644 index 000000000000..5c7647f228d8 --- /dev/null +++ b/plugins/groovy/testdata/groovy/completion/smart/GlobalStaticMembers.groovy @@ -0,0 +1,27 @@ +class Super { } +class SubString extends Super { } +class SubInt extends Super { } +class SubGeneric extends Super { } +class SubRaw extends Super { } + +interface Constants { + SubString SUBSTRING = null +} + +class Factory { + public static Object createObject() {} + public static Super createExpected() {} + public static Super createSuperInt() {} + public static SubInt createSubInt() {} + public static SubGeneric createSubGeneric() {} + public static final SubRaw SUB_RAW = null + public static Super NON_FINAL + public final Super NON_STATIC +} + +class Intermediate { + + Super s = +} + +