diff --git a/colorSchemes/src/colorSchemes/Darcula.xml b/colorSchemes/src/colorSchemes/Darcula.xml new file mode 100644 index 000000000000..7ff967fbbc9c --- /dev/null +++ b/colorSchemes/src/colorSchemes/Darcula.xml @@ -0,0 +1,2509 @@ + + + + diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java b/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java index a4bd0d23b8d2..d1e14e6d7c36 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java @@ -158,9 +158,11 @@ public class AllClassesGetter { }).forEach(new Processor() { public boolean process(PsiClass psiClass) { assert psiClass != null; - if (isSuitable(context, packagePrefix, qnames, psiClass, filterByScope, pkgContext)) { - qnames.add(psiClass.getQualifiedName()); - consumer.consume(psiClass); + if (isAcceptableInContext(context, psiClass, filterByScope, pkgContext)) { + String qName = psiClass.getQualifiedName(); + if (qName != null && qName.startsWith(packagePrefix) && qnames.add(qName)) { + consumer.consume(psiClass); + } } return true; } @@ -181,9 +183,9 @@ public class AllClassesGetter { return j > 0 ? prefix.substring(0, j) : ""; } - private static boolean isSuitable(@NotNull final PsiElement context, final String packagePrefix, final Set qnames, - @NotNull final PsiClass psiClass, - final boolean filterByScope, final boolean pkgContext) { + public static boolean isAcceptableInContext(@NotNull final PsiElement context, + @NotNull final PsiClass psiClass, + final boolean filterByScope, final boolean pkgContext) { ProgressManager.checkCanceled(); if (!context.isValid() || !psiClass.isValid()) return false; @@ -191,9 +193,7 @@ public class AllClassesGetter { if (JavaCompletionUtil.isInExcludedPackage(psiClass, false)) return false; final String qualifiedName = psiClass.getQualifiedName(); - if (qualifiedName == null || !qualifiedName.startsWith(packagePrefix)) return false; - - if (qnames.contains(qualifiedName)) return false; + if (qualifiedName == null) return false; if (!filterByScope && !(psiClass instanceof PsiCompiledElement)) return true; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java b/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java index 63d7105dda62..dccdf8b18d76 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/InheritorsHolder.java @@ -44,9 +44,7 @@ public class InheritorsHolder implements Consumer { public void consume(LookupElement lookupElement) { final Object object = lookupElement.getObject(); if (object instanceof PsiClass) { - final PsiClass psiClass = (PsiClass)object; - if (JavaCompletionUtil.hasAccessibleInnerClass(psiClass, myPosition)) return; - registerClass(psiClass); + registerClass((PsiClass)object); } myResult.addElement(AutoCompletionPolicy.NEVER_AUTOCOMPLETE.applyPolicy(lookupElement)); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java index 9015b4cb13c6..056b13af0a89 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java @@ -19,12 +19,12 @@ import com.intellij.codeInsight.ExpectedTypeInfo; import com.intellij.codeInsight.ExpectedTypesProvider; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.lang.LangBundle; -import com.intellij.lang.StdLanguages; +import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.patterns.PsiJavaElementPattern; -import com.intellij.patterns.PsiJavaPatterns; import com.intellij.psi.*; import com.intellij.psi.filters.ClassFilter; import com.intellij.psi.filters.ElementFilter; @@ -35,15 +35,18 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.Consumer; import com.intellij.util.ProcessingContext; +import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; +import java.util.List; + import static com.intellij.patterns.PsiJavaPatterns.psiElement; /** * @author peter */ public class JavaClassNameCompletionContributor extends CompletionContributor { - private static final PsiJavaElementPattern.Capture AFTER_NEW = psiElement().afterLeaf(PsiKeyword.NEW); + public static final PsiJavaElementPattern.Capture AFTER_NEW = psiElement().afterLeaf(PsiKeyword.NEW); private static final PsiJavaElementPattern.Capture IN_TYPE_PARAMETER = psiElement().afterLeaf(PsiKeyword.EXTENDS, PsiKeyword.SUPER, "&").withParent( psiElement(PsiReferenceList.class).withParent(PsiTypeParameter.class)); @@ -92,7 +95,8 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { } final boolean inJavaContext = parameters.getPosition() instanceof PsiIdentifier; - if (AFTER_NEW.accepts(insertedElement)) { + final boolean afterNew = AFTER_NEW.accepts(insertedElement); + if (afterNew) { final PsiExpression expr = PsiTreeUtil.getContextOfType(insertedElement, PsiExpression.class, true); for (final ExpectedTypeInfo info : ExpectedTypesProvider.getExpectedTypes(expr, true)) { final PsiType type = info.getType(); @@ -104,20 +108,34 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { if (!defaultType.equals(type)) { final PsiClass defClass = PsiUtil.resolveClassInType(defaultType); if (defClass != null) { - consumer.consume(createClassLookupItem(defClass, inJavaContext)); + consumer.consume(createClassLookupItem(defClass, true)); } } } } - final boolean lookingForAnnotations = PsiJavaPatterns.psiElement().afterLeaf("@").accepts(insertedElement); + final boolean lookingForAnnotations = psiElement().afterLeaf("@").accepts(insertedElement); + final boolean pkgContext = JavaCompletionUtil.inSomePackage(insertedElement); AllClassesGetter.processJavaClasses(parameters, matcher, filterByScope, new Consumer() { @Override public void consume(PsiClass psiClass) { if (lookingForAnnotations && !psiClass.isAnnotationType()) return; if (filter.isAcceptable(psiClass, insertedElement)) { - consumer.consume(createClassLookupItem(psiClass, inJavaContext)); + if (!inJavaContext) { + consumer.consume(AllClassesGetter.createLookupItem(psiClass, AllClassesGetter.TRY_SHORTENING)); + } else { + for (JavaPsiClassReferenceElement element : createClassLookupItems(psiClass, afterNew, + JavaClassNameInsertHandler.JAVA_CLASS_INSERT_HANDLER, new Condition() { + @Override + public boolean value(PsiClass psiClass) { + return filter.isAcceptable(psiClass, insertedElement) && + AllClassesGetter.isAcceptableInContext(insertedElement, psiClass, filterByScope, pkgContext); + } + })) { + consumer.consume(element); + } + } } } }); @@ -128,6 +146,31 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { : AllClassesGetter.TRY_SHORTENING); } + public static List createClassLookupItems(final PsiClass psiClass, + boolean withInners, + InsertHandler insertHandler, + Condition condition) { + List result = new SmartList(); + if (condition.value(psiClass)) { + result.add(AllClassesGetter.createLookupItem(psiClass, insertHandler)); + } + String name = psiClass.getName(); + if (withInners && name != null) { + for (PsiClass inner : psiClass.getInnerClasses()) { + if (inner.hasModifierProperty(PsiModifier.STATIC)) { + for (JavaPsiClassReferenceElement lookupInner : createClassLookupItems(inner, withInners, insertHandler, condition)) { + String forced = lookupInner.getForcedPresentableName(); + lookupInner.setForcedPresentableName(name + "." + (forced != null ? forced : inner.getName())); + result.add(lookupInner); + } + } + } + } + return result; + } + + + @Override public String handleEmptyLookup(@NotNull final CompletionParameters parameters, final Editor editor) { if (!(parameters.getOriginalFile() instanceof PsiJavaFile)) return null; @@ -145,6 +188,6 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { private static boolean shouldShowSecondSmartCompletionHint(final CompletionParameters parameters) { return parameters.getCompletionType() == CompletionType.CLASS_NAME && parameters.getInvocationCount() == 1 && - parameters.getOriginalFile().getLanguage() == StdLanguages.JAVA; + parameters.getOriginalFile().getLanguage().isKindOf(JavaLanguage.INSTANCE); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java index 0cb4dbe86e39..0a56c5aa0f38 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameInsertHandler.java @@ -32,9 +32,6 @@ import com.intellij.psi.filters.FilterPositionUtil; import com.intellij.psi.javadoc.PsiDocTag; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; -import com.intellij.util.containers.hash.HashSet; - -import java.util.Set; /** * @author peter @@ -91,8 +88,9 @@ class JavaClassNameInsertHandler implements InsertHandler expectedTypes = new HashSet(); for (ExpectedTypeInfo info : ExpectedTypesProvider.getExpectedTypes((PsiExpression)prevElement.getParent(), true)) { - expectedTypes.add(info.getType()); + if (info.getType() instanceof PsiArrayType) { + return false; + } } - return JavaCompletionUtil.isDefinitelyExpected(psiClass, expectedTypes, position); + return true; } return false; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index f090725bc856..6e0274599cf1 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -31,6 +31,7 @@ import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.patterns.ElementPattern; @@ -282,12 +283,14 @@ public class JavaCompletionContributor extends CompletionContributor { final Set usedWords = new HashSet(); final PsiElement position = parameters.getPosition(); final boolean checkAccess = parameters.getInvocationCount() <= 1; + final boolean isSwitchLabel = SWITCH_LABEL.accepts(position); + final boolean isAfterNew = JavaClassNameCompletionContributor.AFTER_NEW.accepts(position); + final boolean pkgContext = JavaCompletionUtil.inSomePackage(position); LegacyCompletionContributor.processReferences(parameters, result, new PairConsumer() { public void consume(final PsiReference reference, final CompletionResultSet result) { if (reference instanceof PsiJavaReference) { final ElementFilter filter = getReferenceFilter(position); if (filter != null) { - final boolean isSwitchLabel = SWITCH_LABEL.accepts(position); final PsiFile originalFile = parameters.getOriginalFile(); for (LookupElement element : JavaCompletionUtil.processJavaReference(position, (PsiJavaReference)reference, @@ -332,11 +335,17 @@ public class JavaCompletionContributor extends CompletionContributor { result.addElement((LookupElement)completion); } else if (completion instanceof PsiClass) { - if (!inheritors.alreadyProcessed((PsiClass)completion)) { - JavaPsiClassReferenceElement item = JavaClassNameCompletionContributor.createClassLookupItem((PsiClass)completion, true); + for (JavaPsiClassReferenceElement item : JavaClassNameCompletionContributor.createClassLookupItems((PsiClass)completion, isAfterNew, + JavaClassNameInsertHandler.JAVA_CLASS_INSERT_HANDLER, new Condition() { + @Override + public boolean value(PsiClass psiClass) { + return !inheritors.alreadyProcessed(psiClass) && JavaCompletionUtil.isSourceLevelAccessible(position, psiClass, pkgContext); + } + })) { usedWords.add(item.getLookupString()); result.addElement(item); } + } else { LookupElement element = LookupItemUtil.objectToLookupItem(completion); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 791f298c74a0..04243dab1710 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -69,10 +69,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import static com.intellij.patterns.PlatformPatterns.psiElement; @@ -419,9 +416,9 @@ public class JavaCompletionUtil { } public static Set processJavaReference(PsiElement element, PsiJavaReference javaReference, ElementFilter elementFilter, - final boolean checkAccess, boolean filterStaticAfterInstance, @Nullable final PrefixMatcher matcher, CompletionParameters parameters) { + final boolean checkAccess, boolean filterStaticAfterInstance, final PrefixMatcher matcher, CompletionParameters parameters) { final THashSet set = new THashSet(); - final Condition nameCondition = matcher == null ? null : new Condition() { + final Condition nameCondition = new Condition() { public boolean value(String s) { return matcher.prefixMatches(s); } @@ -450,8 +447,7 @@ public class JavaCompletionUtil { final Set mentioned = new THashSet(); for (CompletionElement completionElement : processor.getResults()) { - LookupElement item = createLookupElement(completionElement, javaReference); - if (item != null) { + for (LookupElement item : createLookupElements(completionElement, javaReference)) { item.putUserData(QUALIFIER_TYPE_ATTR, qualifierType); final Object o = item.getObject(); if (o instanceof PsiClass && !isSourceLevelAccessible(element, (PsiClass)o, pkgContext)) { @@ -604,25 +600,33 @@ public class JavaCompletionUtil { }), 1); } - private static LookupElement createLookupElement(CompletionElement completionElement, PsiJavaReference reference) { + private static List createLookupElements(CompletionElement completionElement, PsiJavaReference reference) { Object completion = completionElement.getElement(); assert !(completion instanceof LookupElement); - if (completion instanceof PsiMethod && - reference instanceof PsiJavaCodeReferenceElement && - ((PsiJavaCodeReferenceElement)reference).getParent() instanceof PsiImportStaticStatement) { - return JavaLookupElementBuilder.forMethod((PsiMethod)completion, PsiSubstitutor.EMPTY); + if (reference instanceof PsiJavaCodeReferenceElement) { + if (completion instanceof PsiMethod && + ((PsiJavaCodeReferenceElement)reference).getParent() instanceof PsiImportStaticStatement) { + return Arrays.asList(JavaLookupElementBuilder.forMethod((PsiMethod)completion, PsiSubstitutor.EMPTY)); + } + + if (completion instanceof PsiClass) { + return JavaClassNameCompletionContributor.createClassLookupItems((PsiClass)completion, + JavaClassNameCompletionContributor.AFTER_NEW.accepts(reference), + JavaClassNameInsertHandler.JAVA_CLASS_INSERT_HANDLER, + Condition.TRUE); + } } LookupElement _ret = LookupItemUtil.objectToLookupItem(completion); - if (_ret == null || !(_ret instanceof LookupItem)) return null; + if (_ret == null || !(_ret instanceof LookupItem)) return Collections.emptyList(); final PsiSubstitutor substitutor = completionElement.getSubstitutor(); if (substitutor != null) { ((LookupItem)_ret).setAttribute(LookupItem.SUBSTITUTOR, substitutor); } - return _ret; + return Arrays.asList(_ret); } public static boolean hasAccessibleConstructor(PsiType type) { @@ -878,19 +882,6 @@ public class JavaCompletionUtil { } } - public static boolean hasAccessibleInnerClass(@NotNull PsiClass psiClass, @NotNull PsiElement position) { - final PsiClass[] inners = psiClass.getInnerClasses(); - if (inners.length > 0) { - PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(position.getProject()).getResolveHelper(); - for (PsiClass inner : inners) { - if (inner.hasModifierProperty(PsiModifier.STATIC) && resolveHelper.isAccessible(inner, position, null)) { - return true; - } - } - } - return false; - } - public static boolean inSomePackage(PsiElement context) { PsiFile contextFile = context.getContainingFile(); return contextFile instanceof PsiClassOwner && StringUtil.isNotEmpty(((PsiClassOwner)contextFile).getPackageName()); @@ -914,19 +905,6 @@ public class JavaCompletionUtil { return true; } - public static boolean isDefinitelyExpected(PsiClass psiClass, Set expectedTypes, PsiElement position) { - final PsiClassType classType = JavaPsiFacade.getElementFactory(psiClass.getProject()).createType(psiClass); - for (PsiType expectedType : expectedTypes) { - if (expectedType instanceof PsiArrayType) return false; - } - for (PsiType type : expectedTypes) { - if (type instanceof PsiClassType && ((PsiClassType)type).rawType().isAssignableFrom(classType)) { - return true; - } - } - return !hasAccessibleInnerClass(psiClass, position); - } - public static boolean promptTypeArgs(InsertionContext context, int offset) { if (offset < 0) { return false; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaPsiClassReferenceElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaPsiClassReferenceElement.java index 4fe52cfc4f73..c4156d3f4d51 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaPsiClassReferenceElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaPsiClassReferenceElement.java @@ -31,6 +31,9 @@ import com.intellij.util.Function; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collections; +import java.util.Set; + /** * @author peter */ @@ -38,6 +41,7 @@ public class JavaPsiClassReferenceElement extends LookupItem { public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(JavaPsiClassReferenceElement.class); private final Object myClass; private final String myQualifiedName; + private String myForcedPresentableName; public JavaPsiClassReferenceElement(PsiClass psiClass) { super(psiClass.getName(), psiClass.getName()); @@ -48,6 +52,32 @@ public class JavaPsiClassReferenceElement extends LookupItem { setTailType(TailType.NONE); } + public String getForcedPresentableName() { + return myForcedPresentableName; + } + + @NotNull + @Override + public String getLookupString() { + if (myForcedPresentableName != null) { + return myForcedPresentableName; + } + return super.getLookupString(); + } + + @Override + public Set getAllLookupStrings() { + if (myForcedPresentableName != null) { + return Collections.singleton(myForcedPresentableName); + } + + return super.getAllLookupStrings(); + } + + public void setForcedPresentableName(String forcedPresentableName) { + myForcedPresentableName = forcedPresentableName; + } + @NotNull @Override public PsiClass getObject() { @@ -126,6 +156,13 @@ public class JavaPsiClassReferenceElement extends LookupItem { } private static String getName(final PsiClass psiClass, final LookupItem item, boolean diamond) { + if (item instanceof JavaPsiClassReferenceElement) { + String forced = ((JavaPsiClassReferenceElement)item).getForcedPresentableName(); + if (forced != null) { + return forced; + } + } + String name = PsiUtilCore.getName(psiClass); if (item.getAttribute(LookupItem.FORCE_QUALIFY) != null) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java index ec24f053c783..fc292da6fb7d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java @@ -388,7 +388,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor { final ElementFilter filter, final boolean acceptClasses, final boolean acceptMembers, - CompletionParameters parameters, @Nullable final PrefixMatcher matcher) { + CompletionParameters parameters, final PrefixMatcher matcher) { if (reference instanceof PsiMultiReference) { reference = ContainerUtil.findInstance(((PsiMultiReference) reference).getReferences(), PsiJavaReference.class); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java index b164555b8576..d64e68ced8dc 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java @@ -138,7 +138,7 @@ public class ReferenceExpressionCompletionContributor { final boolean secondTime = parameters.getParameters().getInvocationCount() >= 2; final Set base = - JavaSmartCompletionContributor.completeReference(element, reference, filter, false, true, parameters.getParameters(), null); + JavaSmartCompletionContributor.completeReference(element, reference, filter, false, true, parameters.getParameters(), PrefixMatcher.ALWAYS_TRUE); for (final LookupElement item : new LinkedHashSet(base)) { ExpressionLookupItem access = getSingleArrayElementAccess(element, item); if (access != null) { @@ -200,7 +200,7 @@ public class ReferenceExpressionCompletionContributor { public boolean isClassAcceptable(Class hintClass) { return true; } - }), false, true, parameters.getParameters(), null); + }), false, true, parameters.getParameters(), PrefixMatcher.ALWAYS_TRUE); for (LookupElement lookupElement : elements) { if (lookupElement.getObject() instanceof PsiMethod) { final JavaMethodCallElement item = lookupElement.as(JavaMethodCallElement.CLASS_CONDITION_KEY); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java b/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java index 753615e2b0d7..212561c4bc7b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/StaticMemberProcessor.java @@ -122,18 +122,18 @@ public abstract class StaticMemberProcessor { } } - public List processMembersOfRegisteredClasses(@Nullable final PrefixMatcher matcher, PairConsumer consumer) { + public List processMembersOfRegisteredClasses(final PrefixMatcher matcher, PairConsumer consumer) { final ArrayList result = CollectionFactory.arrayList(); for (final PsiClass psiClass : myStaticImportedClasses) { for (final PsiMethod method : psiClass.getAllMethods()) { - if (matcher == null || matcher.prefixMatches(method.getName())) { + if (matcher.prefixMatches(method.getName())) { if (isStaticallyImportable(method)) { consumer.consume(method, psiClass); } } } for (final PsiField field : psiClass.getAllFields()) { - if (matcher == null || matcher.prefixMatches(field. getName())) { + if (matcher.prefixMatches(field. getName())) { if (isStaticallyImportable(field)) { consumer.consume(field, psiClass); } diff --git a/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java b/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java index 8923ff7ba34a..6c2ad8706f2a 100644 --- a/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java +++ b/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java @@ -18,6 +18,7 @@ package com.intellij.psi.filters.getters; import com.intellij.codeInsight.CodeInsightUtil; import com.intellij.codeInsight.completion.CompletionUtil; import com.intellij.codeInsight.completion.JavaCompletionUtil; +import com.intellij.codeInsight.completion.PrefixMatcher; import com.intellij.codeInsight.completion.StaticMemberProcessor; import com.intellij.codeInsight.lookup.AutoCompletionPolicy; import com.intellij.codeInsight.lookup.LookupElement; @@ -61,7 +62,7 @@ public abstract class MembersGetter { } final Set importedStatically = new HashSet(); - processor.processMembersOfRegisteredClasses(null, new PairConsumer() { + processor.processMembersOfRegisteredClasses(PrefixMatcher.ALWAYS_TRUE, new PairConsumer() { @Override public void consume(PsiMember member, PsiClass psiClass) { importedStatically.add(member); diff --git a/java/java-tests/testData/codeInsight/completion/className/importAfterNew/after2.java b/java/java-tests/testData/codeInsight/completion/className/importAfterNew/after2.java index 95d797874ffc..1c7cb6f6f2dc 100644 --- a/java/java-tests/testData/codeInsight/completion/className/importAfterNew/after2.java +++ b/java/java-tests/testData/codeInsight/completion/className/importAfterNew/after2.java @@ -2,6 +2,6 @@ import pack.WithInnerAClass; public class Test1 { public void foo() { - new WithInnerAClass + new WithInnerAClass() } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normal/ClassNameWithInner_after.java b/java/java-tests/testData/codeInsight/completion/normal/ClassNameWithInner_after.java index 607f6135e5fc..1170812a5513 100644 --- a/java/java-tests/testData/codeInsight/completion/normal/ClassNameWithInner_after.java +++ b/java/java-tests/testData/codeInsight/completion/normal/ClassNameWithInner_after.java @@ -1,6 +1,11 @@ class Foo { { - Zzoo l = new Zzoo() + Zzoo l = new Zzoo() { + @Override + public void run() { + //To change body of implemented methods use File | Settings | File Templates. + } + } } } diff --git a/java/java-tests/testData/codeInsight/completion/normal/ClassNameWithInnersTab_after.java b/java/java-tests/testData/codeInsight/completion/normal/ClassNameWithInnersTab_after.java index 240707bdbf6d..868142c0653f 100644 --- a/java/java-tests/testData/codeInsight/completion/normal/ClassNameWithInnersTab_after.java +++ b/java/java-tests/testData/codeInsight/completion/normal/ClassNameWithInnersTab_after.java @@ -2,7 +2,7 @@ public class TestClass { public TestClass create() { final int value = 1; - return new Xxx(value); + return new Xxx(value); } } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/ClassNameCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/ClassNameCompletionTest.java index 39c4f1b0cda1..3b52a10ed130 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/ClassNameCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/ClassNameCompletionTest.java @@ -64,6 +64,7 @@ public class ClassNameCompletionTest extends CompletionTestCase { checkResultByFile(path + "/after1.java"); configureByFile(path + "/before2.java"); + selectItem(myItems[0]); checkResultByFile(path + "/after2.java"); } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index 5272c49a0e1b..cc56df142398 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -24,7 +24,6 @@ import com.intellij.codeInsight.lookup.LookupElementPresentation import com.intellij.codeInsight.lookup.LookupManager import com.intellij.lang.java.JavaLanguage import com.intellij.openapi.actionSystem.IdeActions -import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.fileTypes.StdFileTypes import com.intellij.psi.codeStyle.CodeStyleSettingsManager import com.intellij.psi.codeStyle.CommonCodeStyleSettings @@ -695,21 +694,15 @@ public class ListUtils { public void _testClassBeforeCast() throws Throwable { doTest '\n' } public void testNoAllClassesOnQualifiedReference() throws Throwable { - configureByFile(getTestName(false) + ".java"); - assertEmpty(myItems); - checkResultByFile(getTestName(false) + ".java"); + doAntiTest() } public void testFinishClassNameWithDot() throws Throwable { - configureByFile(getTestName(false) + ".java"); - type('.'); - checkResult() + doTest('.') } public void testFinishClassNameWithLParen() throws Throwable { - configureByFile(getTestName(false) + ".java"); - type('('); - checkResult() + doTest('(') } public void testSelectNoParameterSignature() throws Throwable { @@ -722,12 +715,7 @@ public class ListUtils { public void testCompletionInsideClassLiteral() throws Throwable { configureByFile(getTestName(false) + ".java"); - new WriteCommandAction.Simple(getProject(), new PsiFile[0]) { - @Override - protected void run() throws Throwable { - getLookup().finishLookup(Lookup.NORMAL_SELECT_CHAR); - } - }.execute().throwException(); + type('\n') checkResult() } @@ -797,18 +785,19 @@ public class ListUtils { } public void testClassNameGenerics() throws Throwable { - configure() - type '\n' - checkResult(); + doTest('\n') } public void testClassNameAnonymous() throws Throwable { - configure() - type '\n' - checkResult(); + doTest('\n') } - public void testClassNameWithInner() throws Throwable { doTest() } + public void testClassNameWithInner() throws Throwable { + configure() + assertStringItems 'Zzoo', 'Zzoo.Impl' + type '\n' + checkResult() + } public void testClassNameWithInner2() throws Throwable { doTest() } public void testClassNameWithInstanceInner() throws Throwable { doTest('\n') } @@ -987,7 +976,7 @@ public class ListUtils { public void testPrimitiveMethodParameter() throws Throwable { doTest(); } - public void testNewExpectedClassParens() throws Throwable { doTest(); } + public void testNewExpectedClassParens() throws Throwable { doTest('\n'); } public void testQualifyInnerMembers() throws Throwable { doTest('\n') } diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/PrefixMatcher.java b/platform/lang-api/src/com/intellij/codeInsight/completion/PrefixMatcher.java index 15c27b6628b2..218c8927f1fb 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/PrefixMatcher.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/PrefixMatcher.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.NotNull; * @author peter */ public abstract class PrefixMatcher { + public static final PrefixMatcher ALWAYS_TRUE = new PlainPrefixMatcher(""); protected final String myPrefix; protected PrefixMatcher(String prefix) { diff --git a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementBuilder.java b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementBuilder.java index eb4171a1f038..36fe492e78f9 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementBuilder.java +++ b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementBuilder.java @@ -41,9 +41,9 @@ public final class LookupElementBuilder extends LookupElement { @Nullable private final LookupElementPresentation myHardcodedPresentation; @NotNull private final Set myAllLookupStrings; - private LookupElementBuilder(String lookupString, Object object, InsertHandler insertHandler, - LookupElementRenderer renderer, - LookupElementPresentation hardcodedPresentation, + private LookupElementBuilder(String lookupString, Object object, @Nullable InsertHandler insertHandler, + @Nullable LookupElementRenderer renderer, + @Nullable LookupElementPresentation hardcodedPresentation, Set allLookupStrings, boolean caseSensitive) { myLookupString = lookupString; @@ -55,10 +55,6 @@ public final class LookupElementBuilder extends LookupElement { myCaseSensitive = caseSensitive; } - private LookupElementBuilder(LookupElementBuilder other) { - this(other.myLookupString, other.myObject, other.myInsertHandler, other.myRenderer, other.myHardcodedPresentation, other.myAllLookupStrings, other.myCaseSensitive); - } - private LookupElementBuilder(@NotNull String lookupString, @NotNull Object object) { this(lookupString, object, null, null, null, Collections.singleton(lookupString), true); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java b/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java index bd7753874d63..a067f7a45b44 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java @@ -145,7 +145,7 @@ public class AutoPopupController implements Disposable { myAlarm.cancelAllRequests(); } - public void autoPopupParameterInfo(final Editor editor, final PsiElement highlightedMethod){ + public void autoPopupParameterInfo(final Editor editor, @Nullable final PsiElement highlightedMethod){ if (ApplicationManager.getApplication().isUnitTestMode()) return; if (DumbService.isDumb(myProject)) return; @@ -168,7 +168,7 @@ public class AutoPopupController implements Disposable { documentManager.commitAllDocuments(); int lbraceOffset = editor.getCaretModel().getOffset() - 1; try { - new ShowParameterInfoHandler().invoke(myProject, editor, file1, lbraceOffset, highlightedMethod); + ShowParameterInfoHandler.invoke(myProject, editor, file1, lbraceOffset, highlightedMethod); } catch (IndexNotReadyException ignored) { //anything can happen on alarm } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java index a1b26f55b199..0c9ef1050a0b 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java @@ -45,8 +45,10 @@ import java.util.Map; * @author Konstantin Bulenkov */ public class LookupCellRenderer implements ListCellRenderer { + //TODO[kb]: move all these awesome constants to Editor's Fonts & Colors settings private static final int AFTER_TAIL = 10; private static final int AFTER_TYPE = 6; + public static final Color BACKGROUND_COLOR_DARK_VARIANT = new Color(47, 67, 96); private Icon myEmptyIcon = EmptyIcon.create(5); private final Font myNormalFont; private final Font myBoldFont; @@ -120,8 +122,9 @@ public class LookupCellRenderer implements ListCellRenderer { } final LookupElement item = (LookupElement)value; - final Color foreground = isSelected ? SELECTED_FOREGROUND_COLOR : FOREGROUND_COLOR; - final Color background = isSelected ? SELECTED_BACKGROUND_COLOR : BACKGROUND_COLOR; + final boolean dark = UIUtil.isUnderDarcula(); + final Color foreground = getForegroundColor(isSelected); + final Color background = isSelected ? SELECTED_BACKGROUND_COLOR : dark ? BACKGROUND_COLOR_DARK_VARIANT : BACKGROUND_COLOR; int allowedWidth = list.getWidth() - AFTER_TAIL - AFTER_TYPE - getIconIndent(); final LookupElementPresentation presentation = new RealLookupElementPresentation(isSelected ? getMaxWidth() : allowedWidth, myNormalMetrics, myBoldMetrics, myLookup); @@ -175,6 +178,10 @@ public class LookupCellRenderer implements ListCellRenderer { return myPanel; } + private static Color getForegroundColor(boolean isSelected) { + return UIUtil.isUnderDarcula() ? Gray._230 : isSelected ? SELECTED_FOREGROUND_COLOR : FOREGROUND_COLOR; + } + private int getMaxWidth() { if (myMaxWidth < 0) { final Point p = myLookup.getComponent().getLocationOnScreen(); @@ -246,7 +253,7 @@ public class LookupCellRenderer implements ListCellRenderer { } public static Color getGrayedForeground(boolean isSelected) { - return isSelected ? SELECTED_GRAYED_FOREGROUND_COLOR : GRAYED_FOREGROUND_COLOR; + return UIUtil.isUnderDarcula() ? Gray._230 : isSelected ? SELECTED_GRAYED_FOREGROUND_COLOR : GRAYED_FOREGROUND_COLOR; } private int setItemTextLabel(LookupElement item, final Color foreground, final boolean selected, LookupElementPresentation presentation, int allowedWidth) { @@ -323,7 +330,7 @@ public class LookupCellRenderer implements ListCellRenderer { } myTypeLabel.setBackground(sampleBackground); - myTypeLabel.setForeground(presentation.isTypeGrayed() ? getGrayedForeground(selected) : item instanceof EmptyLookupItem ? EMPTY_ITEM_FOREGROUND_COLOR : foreground); + myTypeLabel.setForeground(presentation.isTypeGrayed() ? getGrayedForeground(selected) : item instanceof EmptyLookupItem ? UIUtil.isUnderDarcula() ? Gray._230 : EMPTY_ITEM_FOREGROUND_COLOR : foreground); return used; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java index 1c5a55681ae7..eda7893855a9 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java @@ -177,7 +177,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable myList.setFixedCellWidth(50); myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - myList.setBackground(LookupCellRenderer.BACKGROUND_COLOR); + myList.setBackground(UIUtil.isUnderDarcula() ? LookupCellRenderer.BACKGROUND_COLOR_DARK_VARIANT : LookupCellRenderer.BACKGROUND_COLOR); myList.getExpandableItemsHandler(); diff --git a/platform/platform-api/src/com/intellij/openapi/wm/StatusBarWidget.java b/platform/platform-api/src/com/intellij/openapi/wm/StatusBarWidget.java index a28445fe0792..90d0fddd5347 100644 --- a/platform/platform-api/src/com/intellij/openapi/wm/StatusBarWidget.java +++ b/platform/platform-api/src/com/intellij/openapi/wm/StatusBarWidget.java @@ -98,6 +98,7 @@ public interface StatusBarWidget extends Disposable { private static final Color SEPARATOR_COLOR = UIUtil.getPanelBackground().darker(); public void paintBorder(final Component c, final Graphics g, final int x, final int y, final int width, final int height) { + if (UIUtil.isUnderDarcula()) return; final Graphics2D g2 = (Graphics2D)g.create(); if (SystemInfo.isMac) { final Window window = SwingUtilities.getWindowAncestor(c); diff --git a/platform/platform-impl/src/com/intellij/featureStatistics/actions/ShowFeatureUsageStatisticsDialog.java b/platform/platform-impl/src/com/intellij/featureStatistics/actions/ShowFeatureUsageStatisticsDialog.java index 8588c27bb0e2..d9968b85459e 100644 --- a/platform/platform-impl/src/com/intellij/featureStatistics/actions/ShowFeatureUsageStatisticsDialog.java +++ b/platform/platform-impl/src/com/intellij/featureStatistics/actions/ShowFeatureUsageStatisticsDialog.java @@ -166,10 +166,17 @@ public class ShowFeatureUsageStatisticsDialog extends DialogWrapper { Date completionDate = FeatureUsageTracker.getInstance().getCompletionStatisticsStartDate(); if (completionDate != null) { int spared = FeatureUsageTracker.getInstance().getCharactersSparedByCompletion(); - long dayCount = Math.min(1, DateFormatUtil.getDifferenceInDays(completionDate, new Date())); - labelText += "
Code completion has saved you from typing at least " + - spared + " characters since " + DateFormatUtil.formatDate(completionDate) + - "; that's approximately " + (spared / dayCount) + " per day"; + String total = spared > 1024 * 1024 ? (spared / 1024 / 1024) + "MB code" : + spared > 1024 ? (spared / 1024) + "KB code" : + spared + " characters"; + + long perDayCount = spared / Math.max(1, DateFormatUtil.getDifferenceInDays(completionDate, new Date()) + 1); + String perDay = perDayCount > 1024 * 1024 ? (perDayCount / 1024 / 1024) + "MB" : + perDayCount > 1024 ? (perDayCount / 1024) + "KB" : + perDayCount + " characters"; + + labelText += "
Code completion has saved you from typing at least " + total + " since " + DateFormatUtil.formatDate(completionDate) + + " (\u2245 " + perDay + " per day)"; } controlsPanel.add(new JLabel("" + labelText + ""), BorderLayout.NORTH); diff --git a/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java b/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java index a8618979b92c..414ddc1014d1 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java @@ -16,9 +16,14 @@ package com.intellij.ide.ui; import com.intellij.ide.IdeBundle; +import com.intellij.ide.ui.laf.IdeaDarkLookAndFeelInfo; +import com.intellij.openapi.application.ex.ApplicationManagerEx; +import com.intellij.openapi.editor.colors.EditorColorsManager; +import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.options.BaseConfigurable; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.ui.ComboBox; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.wm.ex.WindowManagerEx; import com.intellij.ui.ListCellRendererWrapper; @@ -154,10 +159,27 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab settings.SHOW_ICONS_IN_QUICK_NAVIGATION = myComponent.myHideIconsInQuickNavigation.isSelected(); if (!Comparing.equal(myComponent.myLafComboBox.getSelectedItem(), lafManager.getCurrentLookAndFeel())) { - UIManager.LookAndFeelInfo lafInfo = (UIManager.LookAndFeelInfo)myComponent.myLafComboBox.getSelectedItem(); + final UIManager.LookAndFeelInfo lafInfo = (UIManager.LookAndFeelInfo)myComponent.myLafComboBox.getSelectedItem(); if (lafManager.checkLookAndFeel(lafInfo)) { update = shouldUpdateUI = true; lafManager.setCurrentLookAndFeel(lafInfo); + if (lafInfo instanceof IdeaDarkLookAndFeelInfo && !lafInfo.getName().equals( + EditorColorsManager.getInstance().getGlobalScheme().getName())) { + final EditorColorsScheme scheme = EditorColorsManager.getInstance().getScheme(lafInfo.getName()); + + if (scheme != null) { + final int answer = Messages.showOkCancelDialog("Set " + lafInfo.getName() + " editor scheme as well?", + "Setup Editor Color Scheme", + Messages.getQuestionIcon()); + if (answer == Messages.OK) { + EditorColorsManager.getInstance().setGlobalScheme(scheme); + if (Messages.showOkCancelDialog("Restart now?", "Restart", Messages.getQuestionIcon()) == Messages.OK) { + ApplicationManagerEx.getApplicationEx().restart(); + } + } + + } + } } } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/IdeaDarkLaf.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/IdeaDarkLaf.java index d4cee0d5c0a9..271ccbbc235e 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/IdeaDarkLaf.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/IdeaDarkLaf.java @@ -103,7 +103,6 @@ final class IdeaDarkLaf extends BasicLookAndFeel { static void initIdeaDefaults(UIDefaults defaults) { loadDefaults(defaults, null); //load defaults loadDefaults(defaults, SystemInfo.isMac ? "mac" : SystemInfo.isWindows ? "windows" : "linux"); // load OS customization - defaults.put("Table.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[] { "ctrl C", "copy", "ctrl V", "paste", diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.java index da7ceb250f72..50c26c32c82f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.java @@ -507,7 +507,7 @@ public class IdeStatusBarImpl extends JComponent implements StatusBarEx { setUI((StatusBarUI)UIManager.getUI(this)); } else { - setUI(SystemInfo.isMac ? new MacStatusBarUI() : new StatusBarUI()); + setUI(SystemInfo.isMac && !UIUtil.isUnderDarcula() ? new MacStatusBarUI() : new StatusBarUI()); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/StatusBarUI.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/StatusBarUI.java index 8b7bb7f0d6d3..019bcfd90187 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/StatusBarUI.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/StatusBarUI.java @@ -85,13 +85,15 @@ public class StatusBarUI extends ComponentUI { g2d.setColor(background); g2d.fillRect(0, 0, width, height); - g2d.setColor(BORDER_TOP_COLOR); + g2d.setColor(UIUtil.isUnderDarcula() ? BORDER_TOP_COLOR.darker().darker() : BORDER_TOP_COLOR); g2d.drawLine(0, 0, width, 0); - g2d.setColor(BORDER2_TOP_COLOR); - g2d.drawLine(0, 1, width, 1); + if (!UIUtil.isUnderDarcula()) { + g2d.setColor(BORDER2_TOP_COLOR); + g2d.drawLine(0, 1, width, 1); + } - g2d.setColor(BORDER_BOTTOM_COLOR); + g2d.setColor(UIUtil.isUnderDarcula() ? BORDER_BOTTOM_COLOR.darker().darker() : BORDER_BOTTOM_COLOR); g2d.drawLine(0, height, width, height); g2d.dispose(); diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/TextPanel.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/TextPanel.java index 52193c5018a1..3d6b4f92d014 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/TextPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/TextPanel.java @@ -61,8 +61,12 @@ public class TextPanel extends JComponent { @Override protected void paintComponent(final Graphics g) { String s = getText(); - if (s == null) return; final Rectangle bounds = getBounds(); + if (UIUtil.isUnderDarcula()) { + g.setColor(UIUtil.getPanelBackground()); + g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height); + } + if (s == null) return; final Insets insets = getInsets(); final Graphics2D g2 = (Graphics2D)g; @@ -92,7 +96,7 @@ public class TextPanel extends JComponent { } final int y = UIUtil.getStringY(s, bounds, g2); - if (SystemInfo.isMac && myDecorate) { + if (SystemInfo.isMac && !UIUtil.isUnderDarcula() && myDecorate) { g2.setColor(Gray._215); g2.drawString(s, x, y + 1); } diff --git a/platform/testFramework/testSrc/com/intellij/testFramework/vcs/AbstractJunitVcsTestCase.java b/platform/testFramework/testSrc/com/intellij/testFramework/vcs/AbstractJunitVcsTestCase.java index 30a32b2a16c8..43e4666bf569 100644 --- a/platform/testFramework/testSrc/com/intellij/testFramework/vcs/AbstractJunitVcsTestCase.java +++ b/platform/testFramework/testSrc/com/intellij/testFramework/vcs/AbstractJunitVcsTestCase.java @@ -20,12 +20,11 @@ import org.junit.rules.TestName; import org.junit.runner.Description; public abstract class AbstractJunitVcsTestCase extends AbstractVcsTestCase { - private boolean succeeded = true; @Rule public TestName name= new TestName(){ @Override protected void failed(Throwable e, Description description) { - succeeded = false; + AbstractJunitVcsTestCase.this.failed(e, description); } }; @@ -33,7 +32,6 @@ public abstract class AbstractJunitVcsTestCase extends AbstractVcsTestCase { return name.getMethodName(); } - public boolean isSucceeded() { - return succeeded; + protected void failed(Throwable e, Description description) { } } diff --git a/platform/util/src/com/intellij/util/ui/tree/MacTreeUI.java b/platform/util/src/com/intellij/util/ui/tree/MacTreeUI.java index dc37fb8d4e35..6e48b613f1bc 100644 --- a/platform/util/src/com/intellij/util/ui/tree/MacTreeUI.java +++ b/platform/util/src/com/intellij/util/ui/tree/MacTreeUI.java @@ -256,7 +256,7 @@ public class MacTreeUI extends BasicTreeUI { Color background = tree.getBackground(); if ((row % 2) == 0 && Boolean.TRUE.equals(tree.getClientProperty(STRIPED_CLIENT_PROPERTY))) { - background = DECORATED_ROW_BG_COLOR; + background = UIUtil.getDecoratedRowColor(); } if (sourceList != null && (Boolean)sourceList) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java index da54363c1d5f..7cc08d423f3b 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java @@ -1442,9 +1442,10 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec @TestOnly public static void printLog() { System.out.println(log); + System.out.flush(); } @TestOnly public static void log(Object o) { - log.append(o+"\n"); + log.append(o).append("\n"); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java index bb8ee2be533a..c13b8aecec70 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyClassNameInsertHandler.java @@ -18,11 +18,9 @@ package org.jetbrains.plugins.groovy.lang.completion; import com.intellij.codeInsight.completion.*; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; +import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; @@ -62,7 +60,7 @@ public class GroovyClassNameInsertHandler implements InsertHandler() { - @Override - public void consume(PsiClass psiClass) { - if (!inheritors.alreadyProcessed(psiClass) && filter.isAcceptable(psiClass, position)) { - consumer.consume(GroovyCompletionUtil.createClassLookupItem(psiClass)); - } - } - }); + final boolean afterNew = JavaClassNameCompletionContributor.AFTER_NEW.accepts(position); + AllClassesGetter.processJavaClasses(parameters, matcher, parameters.getInvocationCount() <= 1, new Consumer() { + @Override + public void consume(PsiClass psiClass) { + for (JavaPsiClassReferenceElement element : JavaClassNameCompletionContributor + .createClassLookupItems(psiClass, afterNew, new GroovyClassNameInsertHandler(), new Condition() { + @Override + public boolean value(PsiClass psiClass) { + return !inheritors.alreadyProcessed(psiClass) && filter.isAcceptable(psiClass, position); + } + })) { + consumer.consume(element); + } + } + }); } private static ElementFilter getClassFilter(PsiElement position) { @@ -435,7 +442,7 @@ public class GroovyCompletionContributor extends CompletionContributor { if (reference instanceof GrReferenceExpression && (qualifier instanceof GrExpression || qualifier == null)) { unresolvedProps = CompleteReferenceExpression.getVariantsWithSameQualifier(matcher, (GrExpression)qualifier, (GrReferenceExpression)reference); for (String string : unresolvedProps) { - result.add(GroovyCompletionUtil.getLookupElement(string)); + result.add(LookupElementBuilder.create(string).withItemTextUnderlined(true)); } if (parameters.getInvocationCount() < 2 && qualifier != null && qualifierType == null && !(qualifier instanceof GrReferenceExpression && ((GrReferenceExpression)qualifier).resolve() instanceof PsiPackage)) { @@ -452,27 +459,17 @@ public class GroovyCompletionContributor extends CompletionContributor { final ElementFilter classFilter = getClassFilter(position); final List items = arrayList(); - reference.processVariants(matcher, parameters, new Consumer() { - public void consume(Object element) { - if (element instanceof PsiClass && inheritorsHolder.alreadyProcessed((PsiClass)element)) { - return; - } - if (element instanceof LookupElement && inheritorsHolder.alreadyProcessed((LookupElement)element)) { - return; - } - - if (element instanceof LookupElement && ((LookupElement)element).getObject() instanceof PsiClass) { - element = ((LookupElement)element).getObject(); - } - - LookupElement lookupElement = element instanceof PsiClass - ? GroovyCompletionUtil.createClassLookupItem(CompletionUtil.getOriginalOrSelf((PsiClass)element)) - : GroovyCompletionUtil.getLookupElement(element); + reference.processVariants(matcher, parameters, new Consumer() { + public void consume(LookupElement lookupElement) { Object object = lookupElement.getObject(); if (object instanceof GroovyResolveResult) { object = ((GroovyResolveResult)object).getElement(); } + if (!(lookupElement instanceof LookupElementBuilder) && inheritorsHolder.alreadyProcessed(lookupElement)) { + return; + } + if (object instanceof GrReferenceExpression && unresolvedProps.contains(((GrReferenceExpression)object).getName())) { return; } @@ -501,7 +498,7 @@ public class GroovyCompletionContributor extends CompletionContributor { }); if (qualifier == null) { - completeStaticMembers(parameters).processMembersOfRegisteredClasses(null, new PairConsumer() { + completeStaticMembers(parameters).processMembersOfRegisteredClasses(PrefixMatcher.ALWAYS_TRUE, new PairConsumer() { @Override public void consume(PsiMember member, PsiClass psiClass) { if (member instanceof GrAccessorMethod) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java index 288f33e0077f..6605553c6aec 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionUtil.java @@ -19,7 +19,9 @@ package org.jetbrains.plugins.groovy.lang.completion; import com.intellij.codeInsight.CodeInsightUtilBase; import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.completion.AllClassesGetter; +import com.intellij.codeInsight.completion.JavaClassNameCompletionContributor; import com.intellij.codeInsight.completion.JavaCompletionUtil; +import com.intellij.codeInsight.completion.PrefixMatcher; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.codeInsight.lookup.LookupItem; @@ -30,6 +32,7 @@ import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Iconable; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -40,7 +43,6 @@ import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiFormatUtilBase; import com.intellij.psi.util.TypeConversionUtil; -import com.intellij.util.ArrayUtil; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.CollectionFactory; @@ -74,8 +76,7 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil; import org.jetbrains.plugins.groovy.lang.psi.util.GdkMethodUtil; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; -import java.util.List; -import java.util.Set; +import java.util.*; import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; import static org.jetbrains.plugins.groovy.lang.lexer.TokenSets.WHITE_SPACES_OR_COMMENTS; @@ -213,28 +214,36 @@ public class GroovyCompletionUtil { } - public static List getCompletionVariants(GroovyResolveResult[] candidates) { - List result = CollectionFactory.arrayList(); + public static List getCompletionVariants(GroovyResolveResult[] candidates, boolean afterNew, PrefixMatcher matcher) { + List result = CollectionFactory.arrayList(); for (GroovyResolveResult candidate : candidates) { - result.add(createCompletionVariant(candidate)); + result.addAll(createLookupElements(candidate, afterNew, matcher)); ProgressManager.checkCanceled(); } return result; } - public static Object createCompletionVariant(GroovyResolveResult candidate) { + public static List createLookupElements(GroovyResolveResult candidate, boolean afterNew, PrefixMatcher matcher) { final PsiElement element = candidate.getElement(); final PsiElement context = candidate.getCurrentFileResolveContext(); if (context instanceof GrImportStatement && element != null) { + if (element instanceof PsiPackage) { + return Collections.emptyList(); + } + final String importedName = ((GrImportStatement)context).getImportedName(); if (importedName != null) { + if (!matcher.prefixMatches(importedName)) { + return Collections.emptyList(); + } + final GrCodeReferenceElement importReference = ((GrImportStatement)context).getImportReference(); if (importReference != null) { boolean alias = ((GrImportStatement)context).isAliasedImport(); for (GroovyResolveResult r : importReference.multiResolve(false)) { final PsiElement resolved = r.getElement(); - if (context.getManager().areElementsEquivalent(resolved, element)) { + if (context.getManager().areElementsEquivalent(resolved, element) && (alias || !(element instanceof PsiClass))) { return generateLookupForImportedElement(candidate, importedName, alias); } else { @@ -246,18 +255,19 @@ public class GroovyCompletionUtil { } } } - else if (element instanceof PsiMethod) { - return setupLookupBuilder(element, candidate.getSubstitutor(), LookupElementBuilder.create(candidate, ((PsiMethod)element).getName())); - } - if (element instanceof PsiClass) { - return createClassLookupItem((PsiClass)element); + + String name = element instanceof PsiNamedElement ? ((PsiNamedElement)element).getName() : element.getText(); + if (name == null || !matcher.prefixMatches(name)) { + return Collections.emptyList(); } - if (element instanceof PsiNamedElement) { - return setupLookupBuilder(element, candidate.getSubstitutor(), - LookupElementBuilder.create(candidate, ((PsiNamedElement)element).getName())); + if (element instanceof PsiClass) { + return JavaClassNameCompletionContributor + .createClassLookupItems((PsiClass)element, afterNew, new GroovyClassNameInsertHandler(), Condition.TRUE); } - return candidate; + + LookupElementBuilder builder = LookupElementBuilder.create(element instanceof PsiPackage ? element : candidate, name); + return Arrays.asList(setupLookupBuilder(element, candidate.getSubstitutor(), builder)); } public static LookupElement createClassLookupItem(PsiClass psiClass) { @@ -265,26 +275,16 @@ public class GroovyCompletionUtil { return AllClassesGetter.createLookupItem(psiClass, new GroovyClassNameInsertHandler()); } - private static LookupElement generateLookupForImportedElement(GroovyResolveResult resolveResult, String importedName, boolean alias) { + private static List generateLookupForImportedElement(GroovyResolveResult resolveResult, String importedName, boolean alias) { final PsiElement element = resolveResult.getElement(); assert element != null; - if (!alias && element instanceof PsiClass) { - return createClassLookupItem((PsiClass)element); - } - final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); LookupElementBuilder builder = LookupElementBuilder.create(resolveResult, importedName).withPresentableText(importedName); - return setupLookupBuilder(element, substitutor, builder); + return Arrays.asList(setupLookupBuilder(element, substitutor, builder)); } - public static LookupElement getLookupElement(Object o) { - if (o instanceof LookupElement) return (LookupElement)o; - if (o instanceof PsiNamedElement) return generateLookupElement((PsiNamedElement)o); - if (o instanceof PsiElement) return setupLookupBuilder((PsiElement)o, PsiSubstitutor.EMPTY, LookupElementBuilder.create(o, ((PsiElement)o).getText())); - return LookupElementBuilder.create(o, o.toString()).withItemTextUnderlined(true); - } - private static LookupElementBuilder generateLookupElement(PsiNamedElement element) { - return setupLookupBuilder(element, PsiSubstitutor.EMPTY, LookupElementBuilder.create(element)); + public static LookupElement createLookupElement(PsiNamedElement o) { + return setupLookupBuilder(o, PsiSubstitutor.EMPTY, LookupElementBuilder.create(o, o.getName())); } private static LookupElementBuilder setupLookupBuilder(PsiElement element, PsiSubstitutor substitutor, LookupElementBuilder builder) { @@ -498,20 +498,19 @@ public class GroovyCompletionUtil { return t == mLT || t == mCOMMA; } - public static Object[] getAnnotationCompletionResults(GrAnnotation anno) { + public static List getAnnotationCompletionResults(GrAnnotation anno, PrefixMatcher matcher) { if (anno != null) { GrCodeReferenceElement ref = anno.getClassReference(); PsiElement resolved = ref.resolve(); if (resolved instanceof PsiClass && ((PsiClass)resolved).isAnnotationType()) { - PsiMethod[] methods = ((PsiClass)resolved).getMethods(); - Object[] result = new Object[methods.length]; - for (int i = 0; i < methods.length; i++) { - result[i] = createCompletionVariant(new GroovyResolveResultImpl(methods[i], true)); + List result = new ArrayList(); + for (PsiMethod method : ((PsiClass)resolved).getMethods()) { + result.addAll(createLookupElements(new GroovyResolveResultImpl(method, true), false, matcher)); } return result; } } - return ArrayUtil.EMPTY_OBJECT_ARRAY; + return Collections.emptyList(); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyDocCompletionProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyDocCompletionProvider.java index 9ea37ad44345..bbfd532a944b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyDocCompletionProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyDocCompletionProvider.java @@ -19,10 +19,7 @@ import com.intellij.codeInsight.completion.*; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.patterns.PsiJavaPatterns; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.ResolveState; +import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; @@ -76,7 +73,7 @@ public class GroovyDocCompletionProvider extends CompletionProvider() { - public void consume(Object variant) { + ((GrReferenceElement)reference).processVariants(result.getPrefixMatcher(), params, new Consumer() { + public void consume(LookupElement variant) { PsiType type = null; - Object o; - if (variant instanceof LookupElement) { - o = ((LookupElement)variant).getObject(); - } - else { - o = variant; - } + Object o = variant.getObject(); if (o instanceof GroovyResolveResult) { if (!((GroovyResolveResult)o).isAccessible()) return; o = ((GroovyResolveResult)o).getElement(); @@ -122,9 +116,7 @@ public class GroovySmartCompletionContributor extends CompletionContributor { if (type == null) return; for (TypeConstraint info : infos) { if (info.satisfied(type, position.getManager(), GlobalSearchScope.allScope(position.getProject()))) { - final LookupElement lookupElement = - variant instanceof LookupElement ? (LookupElement)variant : GroovyCompletionUtil.getLookupElement(o); - result.addElement(lookupElement); + result.addElement(variant); break; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GrReferenceElement.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GrReferenceElement.java index 261909bc2cc9..d4a076087611 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GrReferenceElement.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GrReferenceElement.java @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.lang.psi; import com.intellij.codeInsight.completion.CompletionParameters; import com.intellij.codeInsight.completion.PrefixMatcher; +import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPolyVariantReference; import com.intellij.psi.PsiType; @@ -47,7 +48,7 @@ public interface GrReferenceElement extends GroovyPsiEleme @Nullable GrTypeArgumentList getTypeArgumentList(); - void processVariants(PrefixMatcher matcher, CompletionParameters parameters, Consumer consumer); + void processVariants(PrefixMatcher matcher, CompletionParameters parameters, Consumer consumer); @Nullable String getClassNameText(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/annotation/GrAnnotationNameValuePairImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/annotation/GrAnnotationNameValuePairImpl.java index 07ceea770b65..68676a66fc91 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/annotation/GrAnnotationNameValuePairImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/auxiliary/annotation/GrAnnotationNameValuePairImpl.java @@ -16,6 +16,7 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.auxiliary.annotation; +import com.intellij.codeInsight.completion.PrefixMatcher; import com.intellij.lang.ASTNode; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; @@ -150,7 +151,7 @@ public class GrAnnotationNameValuePairImpl extends GroovyPsiElementImpl implemen @NotNull public Object[] getVariants() { - return GroovyCompletionUtil.getAnnotationCompletionResults(getAnnotation()); + return GroovyCompletionUtil.getAnnotationCompletionResults(getAnnotation(), PrefixMatcher.ALWAYS_TRUE).toArray(); } public boolean isSoft() { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/CompleteReferenceExpression.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/CompleteReferenceExpression.java index 052d3c261548..18a89e6ec8ca 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/CompleteReferenceExpression.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/CompleteReferenceExpression.java @@ -17,8 +17,11 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions; import com.intellij.codeInsight.PsiEquivalenceUtil; import com.intellij.codeInsight.completion.CompletionParameters; +import com.intellij.codeInsight.completion.JavaClassNameCompletionContributor; import com.intellij.codeInsight.completion.PrefixMatcher; +import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; @@ -67,25 +70,25 @@ public class CompleteReferenceExpression { private CompleteReferenceExpression() { } - public static void processVariants(PrefixMatcher matcher, Consumer consumer, GrReferenceExpressionImpl refExpr, CompletionParameters parameters) { - processRefInAnnotation(consumer, refExpr); + public static void processVariants(PrefixMatcher matcher, Consumer consumer, GrReferenceExpressionImpl refExpr, CompletionParameters parameters) { + processRefInAnnotation(consumer, refExpr, matcher); final CompleteReferenceProcessor processor = new CompleteReferenceProcessor(refExpr, consumer, matcher, parameters); getVariantsImpl(refExpr, processor); final GroovyResolveResult[] candidates = processor.getCandidates(); - for (Object o : GroovyCompletionUtil.getCompletionVariants(candidates)) { + for (LookupElement o : GroovyCompletionUtil.getCompletionVariants(candidates, JavaClassNameCompletionContributor.AFTER_NEW.accepts(refExpr), matcher)) { consumer.consume(o); } } - private static void processRefInAnnotation(Consumer consumer, GrReferenceExpressionImpl refExpr) { + private static void processRefInAnnotation(Consumer consumer, GrReferenceExpressionImpl refExpr, PrefixMatcher matcher) { if (refExpr.getParent() instanceof GrAnnotationNameValuePair) { PsiElement parent = refExpr.getParent().getParent(); if (!(parent instanceof GrAnnotation)) { parent = parent.getParent(); } if (parent instanceof GrAnnotation) { - for (Object result : GroovyCompletionUtil.getAnnotationCompletionResults((GrAnnotation)parent)) { + for (LookupElement result : GroovyCompletionUtil.getAnnotationCompletionResults((GrAnnotation)parent, matcher)) { consumer.consume(result); } } @@ -357,7 +360,9 @@ public class CompleteReferenceExpression { } private static class CompleteReferenceProcessor extends ResolverProcessor implements Consumer { - private final Consumer myConsumer; + private static final Logger LOG = Logger.getInstance( + "#org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.CompleteReferenceExpression.CompleteReferenceProcessor"); + private final Consumer myConsumer; private final PrefixMatcher myMatcher; private final CompletionParameters myParameters; private Collection myPreferredFieldNames; @@ -371,7 +376,7 @@ public class CompleteReferenceExpression { private final boolean myIsMap; private Set myNonDeclaredVars = new com.intellij.util.containers.HashSet(); - protected CompleteReferenceProcessor(GrReferenceExpression place, Consumer consumer, @NotNull PrefixMatcher matcher, CompletionParameters parameters) { + protected CompleteReferenceProcessor(GrReferenceExpression place, Consumer consumer, @NotNull PrefixMatcher matcher, CompletionParameters parameters) { super(null, EnumSet.allOf(ResolveKind.class), place, PsiType.EMPTY_ARRAY); myConsumer = consumer; myMatcher = matcher; @@ -416,7 +421,7 @@ public class CompleteReferenceExpression { public void consume(Object o) { if (!(o instanceof GroovyResolveResult)) { - myConsumer.consume(o); + LOG.error(o); return; } @@ -469,7 +474,10 @@ public class CompleteReferenceExpression { private void processPropertyFromField(GrField field, GroovyResolveResult resolveResult) { if (field.getGetters().length != 0 || field.getSetter() != null || !myPropertyNames.add(field.getName()) || myIsMap) return; - myConsumer.consume(((LookupElementBuilder)GroovyCompletionUtil.createCompletionVariant(resolveResult)).withIcon(GroovyIcons.PROPERTY)); + for (LookupElement element : GroovyCompletionUtil.createLookupElements(resolveResult, false, myMatcher)) { + myConsumer.consume(((LookupElementBuilder)element).withIcon(GroovyIcons.PROPERTY)); + } + } private void processProperty(PsiMethod method, GroovyResolveResult resolveResult) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java index a5703a96069b..82df78da6ce1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/GrReferenceExpressionImpl.java @@ -18,6 +18,7 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions; import com.intellij.codeInsight.completion.CompletionParameters; import com.intellij.codeInsight.completion.PrefixMatcher; +import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.lang.ASTNode; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Pair; @@ -776,7 +777,7 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl consumer) { + public void processVariants(PrefixMatcher matcher, CompletionParameters parameters, Consumer consumer) { CompleteReferenceExpression.processVariants(matcher, consumer, this, parameters); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightClassReferenceElement.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightClassReferenceElement.java index 612ccb801c55..021c08d6e8fd 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightClassReferenceElement.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrLightClassReferenceElement.java @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.synthetic; import com.intellij.codeInsight.completion.CompletionParameters; import com.intellij.codeInsight.completion.PrefixMatcher; +import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -95,7 +96,7 @@ public class GrLightClassReferenceElement extends LightElement implements GrCode } @Override - public void processVariants(PrefixMatcher matcher, CompletionParameters parameters, Consumer consumer) { + public void processVariants(PrefixMatcher matcher, CompletionParameters parameters, Consumer consumer) { } @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrCodeReferenceElementImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrCodeReferenceElementImpl.java index 2e56f8cba5fb..df98e7949b9b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrCodeReferenceElementImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/types/GrCodeReferenceElementImpl.java @@ -17,9 +17,12 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.types; import com.intellij.codeInsight.completion.CompletionParameters; +import com.intellij.codeInsight.completion.JavaClassNameCompletionContributor; import com.intellij.codeInsight.completion.PrefixMatcher; +import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.ResolveCache; import com.intellij.psi.search.GlobalSearchScope; @@ -251,7 +254,14 @@ public class GrCodeReferenceElementImpl extends GrReferenceElementImpl consumer) { + private static void feedLookupElements(PsiNamedElement psi, boolean afterNew, Consumer consumer, PrefixMatcher matcher) { + for (LookupElement element : GroovyCompletionUtil.createLookupElements(new GroovyResolveResultImpl(psi, true), afterNew, matcher)) { + consumer.consume(element); + } + } + + private void processVariantsImpl(ReferenceKind kind, Consumer consumer, PrefixMatcher matcher) { + boolean afterNew = JavaClassNameCompletionContributor.AFTER_NEW.accepts(this); switch (kind) { case STATIC_MEMBER_FQ: { final GrCodeReferenceElement qualifier = getQualifier(); @@ -262,26 +272,26 @@ public class GrCodeReferenceElementImpl extends GrReferenceElementImpl 0 ? refText.substring(0, lastDot) : ""; + String parentPackageFQName = StringUtil.getPackageName(refText); final PsiPackage parentPackage = JavaPsiFacade.getInstance(getProject()).findPackage(parentPackageFQName); if (parentPackage != null) { final GlobalSearchScope scope = getResolveScope(); if (kind == PACKAGE_FQ) { for (PsiPackage aPackage : parentPackage.getSubPackages(scope)) { - consumer.consume(aPackage); + feedLookupElements(aPackage, afterNew, consumer, matcher); } return; - } else { - if (kind == CLASS_FQ) { - for (PsiClass aClass : parentPackage.getClasses(scope)) { - consumer.consume(aClass); - } - return; - } else { - final PsiPackage[] subpackages = parentPackage.getSubPackages(scope); - final PsiClass[] classes = parentPackage.getClasses(scope); - for (PsiPackage aPackage : subpackages) { - consumer.consume(aPackage); - } - for (PsiClass aClass : classes) { - consumer.consume(aClass); - } - return; - } } + + if (kind == CLASS_FQ) { + for (PsiClass aClass : parentPackage.getClasses(scope)) { + feedLookupElements(aClass, afterNew, consumer, matcher); + } + return; + } + + for (PsiPackage aPackage : parentPackage.getSubPackages(scope)) { + feedLookupElements(aPackage, afterNew, consumer, matcher); + } + for (PsiClass aClass : parentPackage.getClasses(scope)) { + feedLookupElements(aClass, afterNew, consumer, matcher); + } + return; } } @@ -328,27 +336,25 @@ public class GrCodeReferenceElementImpl extends GrReferenceElementImpl consumer) { - processVariantsImpl(getKind(true), consumer); + public void processVariants(PrefixMatcher matcher, CompletionParameters parameters, Consumer consumer) { + processVariantsImpl(getKind(true), consumer, matcher); } @NotNull @@ -574,10 +580,10 @@ public class GrCodeReferenceElementImpl extends GrReferenceElementImpl" myFixture.completeBasic() + myFixture.type '\n' myFixture.checkResult "Zzoo l = new Zzoo()" } @@ -738,6 +739,8 @@ format()""" myFixture.addClass "class Fooooo { interface Bar {} }" myFixture.configureByText "a.groovy", "Fooooo f = new Foo" myFixture.completeBasic() + assert myFixture.lookupElementStrings == ['Fooooo', 'Fooooo.Bar'] + myFixture.type '\n' myFixture.checkResult "Fooooo f = new Fooooo()" } @@ -745,7 +748,9 @@ format()""" myFixture.addClass "class Fooooo { interface Bar {} }" myFixture.configureByText "a.groovy", "Fooooo.Bar f = new Foo" myFixture.completeBasic() - myFixture.checkResult "Fooooo.Bar f = new Fooooo" + assert myFixture.lookupElementStrings == ['Fooooo', 'Fooooo.Bar'] + myFixture.type '\n' + myFixture.checkResult "Fooooo.Bar f = new Fooooo()" } public void testOnlyExceptionsInCatch() { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTestBase.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTestBase.groovy index a8c0e23cb23d..668a28b5619d 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTestBase.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTestBase.groovy @@ -60,7 +60,7 @@ abstract public class GroovyCompletionTestBase extends LightCodeInsightFixtureTe public void checkSingleItemCompletion(String before, String after) { myFixture.configureByText("a.groovy", before); - myFixture.completeBasic(); + assert !myFixture.completeBasic(); myFixture.checkResult(after); } diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/var13.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/var13.test index 72f1e3bece98..58151b4ec46d 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/var13.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/var13.test @@ -11,6 +11,7 @@ class A { } ----- +META-INF abstract boolean byte @@ -23,8 +24,11 @@ final float int interface +java +javax long native +org private protected public diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/var6.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/var6.test index 923580443c31..53edfa257c61 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/var6.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/var6.test @@ -10,6 +10,7 @@ class A { } } ----- +META-INF abstract boolean byte @@ -22,8 +23,11 @@ final float int interface +java +javax long native +org private protected public