diff options
Diffstat (limited to 'java/java-impl/src/com/intellij/codeInsight/completion')
4 files changed, 84 insertions, 17 deletions
diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java index ba8486b69c2a..a9167f297091 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java @@ -21,6 +21,7 @@ import com.intellij.codeInsight.TailTypes; import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupItem; +import com.intellij.codeInsight.lookup.PsiTypeLookupItem; import com.intellij.codeInsight.lookup.TailTypeDecorator; import com.intellij.patterns.ElementPattern; import com.intellij.patterns.PsiJavaElementPattern; @@ -612,6 +613,17 @@ public class JavaCompletionData extends JavaAwareCompletionData { return; } + boolean afterNew = psiElement().afterLeaf( + psiElement().withText(PsiKeyword.NEW).andNot(psiElement().afterLeaf(PsiKeyword.THROW, "."))).accepts(position); + if (afterNew) { + PsiElementFactory factory = JavaPsiFacade.getElementFactory(position.getProject()); + for (String primitiveType : PRIMITIVE_TYPES) { + result.addElement(PsiTypeLookupItem.createLookupItem(factory.createTypeFromText(primitiveType + "[]", null), null)); + } + result.addElement(PsiTypeLookupItem.createLookupItem(factory.createTypeFromText("void[]", null), null)); + return; + } + boolean inCast = psiElement() .afterLeaf(psiElement().withText("(").withParent(psiElement(PsiParenthesizedExpression.class, PsiTypeCastExpression.class))) .accepts(position); @@ -619,8 +631,6 @@ public class JavaCompletionData extends JavaAwareCompletionData { boolean typeFragment = position.getContainingFile() instanceof PsiTypeCodeFragment && PsiTreeUtil.prevVisibleLeaf(position) == null; boolean declaration = DECLARATION_START.accepts(position); boolean expressionPosition = isExpressionPosition(position); - boolean afterNew = psiElement().afterLeaf( - psiElement().withText(PsiKeyword.NEW).andNot(psiElement().afterLeaf(PsiKeyword.THROW, "."))).accepts(position); boolean inGenerics = PsiTreeUtil.getParentOfType(position, PsiReferenceParameterList.class) != null; if (START_FOR.accepts(position) || isInsideParameterList(position) || @@ -629,7 +639,6 @@ public class JavaCompletionData extends JavaAwareCompletionData { inCast || declaration || typeFragment || - afterNew || expressionPosition || isStatementPosition(position)) { for (String primitiveType : PRIMITIVE_TYPES) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java index ee6de0545115..1de9f59cc67a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java @@ -34,6 +34,7 @@ import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; @@ -260,7 +261,17 @@ public class JavaCompletionSorting { public PreferDefaultTypeWeigher(ExpectedTypeInfo[] expectedTypes, CompletionParameters parameters) { super("defaultType"); - myExpectedTypes = expectedTypes; + myExpectedTypes = expectedTypes == null ? null : ContainerUtil.map2Array(expectedTypes, ExpectedTypeInfo.class, new Function<ExpectedTypeInfo, ExpectedTypeInfo>() { + @Override + public ExpectedTypeInfo fun(ExpectedTypeInfo info) { + PsiType type = removeClassWildcard(info.getType()); + PsiType defaultType = removeClassWildcard(info.getDefaultType()); + if (type == info.getType() && defaultType == info.getDefaultType()) { + return info; + } + return new ExpectedTypeInfoImpl(type, info.getKind(), defaultType, info.getTailType()); + } + }); myParameters = parameters; final Pair<PsiClass,Integer> pair = TypeArgumentCompletionProvider.getTypeParameterInfo(parameters.getPosition()); @@ -293,7 +304,7 @@ public class JavaCompletionSorting { } for (final ExpectedTypeInfo expectedInfo : myExpectedTypes) { - final PsiType defaultType = expectedInfo.getDefaultType(); + final PsiType defaultType = expectedInfo.getDefaultType(); final PsiType expectedType = expectedInfo.getType(); if (!expectedType.isValid()) { return MyResult.normal; @@ -316,6 +327,16 @@ public class JavaCompletionSorting { return MyResult.normal; } + private static PsiType removeClassWildcard(PsiType type) { + if (type instanceof PsiClassType) { + final PsiClass psiClass = ((PsiClassType)type).resolve(); + if (psiClass != null && CommonClassNames.JAVA_LANG_CLASS.equals(psiClass.getQualifiedName())) { + return GenericsUtil.eliminateWildcards(type); + } + } + return type; + } + private enum MyResult { expectedNoSelect, exactlyDefault, diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java index 75dc0904af12..9e18f7bf8448 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java @@ -29,6 +29,7 @@ import com.intellij.openapi.editor.EditorModificationUtil; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.patterns.PsiJavaPatterns; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; import com.intellij.psi.*; @@ -38,10 +39,13 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.filters.TrueFilter; import com.intellij.psi.impl.JavaConstantExpressionEvaluator; import com.intellij.psi.javadoc.*; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.ProcessingContext; +import com.intellij.util.Processor; +import com.intellij.util.SystemProperties; import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -120,18 +124,19 @@ public class JavaDocCompletionContributor extends CompletionContributor { @Override protected void addCompletions(@NotNull final CompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result) { - List<String> ret = new ArrayList<String>(); + final List<String> ret = new ArrayList<String>(); final PsiElement position = parameters.getPosition(); final PsiDocComment comment = PsiTreeUtil.getParentOfType(position, PsiDocComment.class); + assert comment != null; final PsiElement parent = comment.getContext(); final boolean isInline = position.getContext() instanceof PsiInlineDocTag; - final JavadocManager manager = JavadocManager.SERVICE.getInstance(position.getProject()); - final JavadocTagInfo[] infos = manager.getTagInfos(parent); - for (JavadocTagInfo info : infos) { - if (info.getName().equals(SuppressionUtil.SUPPRESS_INSPECTIONS_TAG_NAME)) continue; - if (isInline != (info.isInline())) continue; - ret.add(info.getName()); + for (JavadocTagInfo info : JavadocManager.SERVICE.getInstance(position.getProject()).getTagInfos(parent)) { + String tagName = info.getName(); + if (tagName.equals(SuppressionUtil.SUPPRESS_INSPECTIONS_TAG_NAME)) continue; + if (isInline != info.isInline()) continue; + ret.add(tagName); + addSpecialTags(ret, comment, tagName); } InspectionProfile inspectionProfile = @@ -149,11 +154,43 @@ public class JavaDocCompletionContributor extends CompletionContributor { result.addElement(TailTypeDecorator.withTail(LookupElementBuilder.create(s), TailType.INSERT_SPACE)); } } + result.stopHere(); // no word completions at this point } - @SuppressWarnings({"HardCodedStringLiteral"}) - public String toString() { - return "javadoc-tag-chooser"; + private static void addSpecialTags(final List<String> result, PsiDocComment comment, String tagName) { + if ("author".equals(tagName)) { + result.add(tagName + " " + SystemProperties.getUserName()); + return; + } + + if ("param".equals(tagName)) { + PsiMethod psiMethod = PsiTreeUtil.getParentOfType(comment, PsiMethod.class); + if (psiMethod != null) { + PsiDocTag[] tags = comment.getTags(); + for (PsiParameter param : psiMethod.getParameterList().getParameters()) { + if (!JavaDocLocalInspection.isFound(tags, param)) { + result.add(tagName + " " + param.getName()); + } + } + } + return; + } + + if ("see".equals(tagName)) { + PsiMember member = PsiTreeUtil.getParentOfType(comment, PsiMember.class); + if (member instanceof PsiClass) { + InheritanceUtil.processSupers((PsiClass)member, false, new Processor<PsiClass>() { + @Override + public boolean process(PsiClass psiClass) { + String name = psiClass.getQualifiedName(); + if (StringUtil.isNotEmpty(name) && !CommonClassNames.JAVA_LANG_OBJECT.equals(name)) { + result.add("see " + name); + } + return true; + } + }); + } + } } } 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 ac7099363487..5e7af80e7d0d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java @@ -378,11 +378,11 @@ public class JavaSmartCompletionContributor extends CompletionContributor { final PsiClassType classType = factory .createTypeByFQClassName(CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION, position.getResolveScope()); final List<ExpectedTypeInfo> result = new SmartList<ExpectedTypeInfo>(); - result.add(new ExpectedTypeInfoImpl(classType, ExpectedTypeInfo.TYPE_OR_SUBTYPE, 0, classType, TailType.SEMICOLON)); + result.add(new ExpectedTypeInfoImpl(classType, ExpectedTypeInfo.TYPE_OR_SUBTYPE, classType, TailType.SEMICOLON)); final PsiMethod method = PsiTreeUtil.getContextOfType(position, PsiMethod.class, true); if (method != null) { for (final PsiClassType type : method.getThrowsList().getReferencedTypes()) { - result.add(new ExpectedTypeInfoImpl(type, ExpectedTypeInfo.TYPE_OR_SUBTYPE, 0, type, TailType.SEMICOLON)); + result.add(new ExpectedTypeInfoImpl(type, ExpectedTypeInfo.TYPE_OR_SUBTYPE, type, TailType.SEMICOLON)); } } return result.toArray(new ExpectedTypeInfo[result.size()]); |