summaryrefslogtreecommitdiff
path: root/java/java-impl/src/com/intellij/codeInsight/completion
diff options
context:
space:
mode:
Diffstat (limited to 'java/java-impl/src/com/intellij/codeInsight/completion')
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java15
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java25
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java57
-rw-r--r--java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java4
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()]);