prefer expected type generics suggestions in java completion, overwrite existing type arguments (IDEA-145119)

This commit is contained in:
peter
2015-09-23 18:08:03 +02:00
parent 061d01c95b
commit ced18f2839
6 changed files with 33 additions and 4 deletions
@@ -150,6 +150,7 @@ public class PreferByKindWeigher extends LookupElementWeigher {
superMethodParameters,
field,
expectedTypeConstant,
expectedTypeArgument,
getter,
normal,
collectionFactory,
@@ -208,6 +209,9 @@ public class PreferByKindWeigher extends LookupElementWeigher {
if (expectedTypeMember != null) {
return expectedTypeMember ? (object instanceof PsiField ? MyResult.expectedTypeConstant : MyResult.expectedTypeMethod) : MyResult.classNameOrGlobalStatic;
}
if (item instanceof TypeArgumentCompletionProvider.TypeArgsLookupElement) {
return MyResult.expectedTypeArgument;
}
final JavaChainLookupElement chain = item.as(JavaChainLookupElement.CLASS_CONDITION_KEY);
if (chain != null) {
Object qualifier = chain.getQualifier().getObject();
@@ -94,7 +94,6 @@ class TypeArgumentCompletionProvider extends CompletionProvider<CompletionParame
final PsiClass expectedClass = expectedType.getElement();
if (!InheritanceUtil.isInheritorOrSelf(actualClass, expectedClass, true)) return;
assert expectedClass != null;
final PsiSubstitutor currentSubstitutor = TypeConversionUtil.getClassSubstitutor(expectedClass, actualClass, PsiSubstitutor.EMPTY);
assert currentSubstitutor != null;
@@ -246,7 +245,15 @@ class TypeArgumentCompletionProvider extends CompletionProvider<CompletionParame
@Override
public void handleInsert(InsertionContext context) {
context.getDocument().deleteString(context.getStartOffset(), context.getTailOffset());
context.commitDocument();
PsiReferenceParameterList list = PsiTreeUtil.findElementOfClassAtOffset(context.getFile(), context.getStartOffset(), PsiReferenceParameterList.class, false);
PsiTypeElement[] typeElements = list != null ? list.getTypeParameterElements() : PsiTypeElement.EMPTY_ARRAY;
if (typeElements.length == 0) {
return;
}
int listEnd = typeElements[typeElements.length - 1].getTextRange().getEndOffset();
context.setTailOffset(listEnd);
context.getDocument().deleteString(context.getStartOffset(), listEnd);
for (int i = 0; i < myTypeItems.size(); i++) {
PsiTypeLookupItem typeItem = myTypeItems.get(i);
CompletionUtil.emulateInsertion(context, context.getTailOffset(), typeItem);
@@ -0,0 +1,9 @@
import java.util.*;
class Foo {
void bar() {
Map<Integer, String> a = new HashMap<Integer, String>(<caret>);
}
}
@@ -0,0 +1,9 @@
import java.util.*;
class Foo {
void bar() {
Map<Integer, String> a = new HashMap<<caret>, String>();
}
}
@@ -1324,8 +1324,7 @@ class XInternalError {}
public void testSuggestAllTypeArguments() {
configure()
assert 'String, String' == lookup.items[1].lookupString
lookup.currentItem = lookup.items[1]
assert 'String, String' == lookup.items[0].lookupString
type '\n'
checkResult()
}
@@ -909,6 +909,7 @@ public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase {
public void testTypeArgs2() throws Exception {
doTest();
}
public void testTypeArgsOverwrite() { doTest(); }
public void testIfConditionExpectedType() throws Exception { doTest(); }