Smart completion for generic class instantiation to not insert explicit type arguments (for they'll probably be inferred from the expected type)

This commit is contained in:
Valentin Kipyatkov
2015-09-03 19:35:19 +03:00
parent f470fec840
commit 40de063ebd
12 changed files with 20 additions and 23 deletions
@@ -146,19 +146,20 @@ class TypeInstantiationItems(
var lookupString = lookupElement.getLookupString()
var allLookupStrings = setOf(lookupString)
// drop "in" and "out" from type arguments - they cannot be used in constructor call
val typeArgsToUse = typeArgs.map { TypeProjectionImpl(Variance.INVARIANT, it.getType()) }
var itemText = lookupString + IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderTypeArguments(typeArgsToUse)
var itemText = lookupString
var signatureText: String? = null
var typeText = IdeDescriptorRenderers.SOURCE_CODE.renderClassifierName(classifier)
val insertHandler: InsertHandler<LookupElement>
val typeText = IdeDescriptorRenderers.SOURCE_CODE.renderClassifierName(classifier) + IdeDescriptorRenderers.SOURCE_CODE.renderTypeArguments(typeArgsToUse)
if (isAbstract) {
// drop "in" and "out" from type arguments - they cannot be used in constructor call
val typeArgsToUse = typeArgs.map { TypeProjectionImpl(Variance.INVARIANT, it.getType()) }
itemText += IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderTypeArguments(typeArgsToUse)
typeText += IdeDescriptorRenderers.SOURCE_CODE.renderTypeArguments(typeArgsToUse)
val constructorParenthesis = if (classifier.getKind() != ClassKind.INTERFACE) "()" else ""
itemText += constructorParenthesis
itemText = "object: " + itemText + "{...}"
itemText = "object: $itemText{...}"
lookupString = "object"
allLookupStrings = setOf(lookupString, lookupElement.getLookupString())
insertHandler = InsertHandler<LookupElement> { context, item ->
@@ -4,7 +4,7 @@ import java.util.List
fun foo(p: HashMap<String, List<Int>>){}
fun f(){
foo(HashMap<String, List<Int>>())
foo(HashMap(<caret>))
}
// ELEMENT: HashMap
@@ -1,11 +1,10 @@
import java.io.File
import java.util.HashMap
class X<T> {
fun foo(p: java.util.HashMap<java.io.File, T>){}
fun f(){
foo(HashMap<File, T>(<caret>))
foo(HashMap(<caret>))
}
}
@@ -1,12 +1,10 @@
import java.io.File
import java.util.AbstractMap
import java.util.HashMap
class X<T> {
fun foo(p: java.util.HashMap<T, java.util.AbstractMap<T, java.io.File>>){}
fun f(){
foo(HashMap<T, AbstractMap<T, File>>(<caret>))
foo(HashMap(<caret>))
}
}
@@ -5,5 +5,5 @@ trait `trait`
fun foo(p: `class`<`trait`>){}
fun f(){
foo(`class`<`trait`>())<caret>
foo(`class`())<caret>
}
@@ -2,4 +2,4 @@ import java.util.ArrayList
var a : ArrayList<String> = <caret>
// EXIST: { lookupString: "ArrayList", itemText: "ArrayList<String>", tailText: "(...) (java.util)" }
// EXIST: { lookupString: "ArrayList", itemText: "ArrayList", tailText: "(...) (java.util)" }
@@ -4,4 +4,4 @@ fun foo(p : Any){
var a : Foo<String> = <caret>
}
// EXIST: { lookupString:"Foo", itemText:"Foo<String>", tailText:"() (<root>)" }
// EXIST: { lookupString:"Foo", itemText:"Foo", tailText:"() (<root>)" }
+1 -1
View File
@@ -2,4 +2,4 @@ fun foo(): List<String> {
return <caret>
}
// EXIST: { lookupString: "ArrayList", itemText: "ArrayList<String>", tailText: "(...) (java.util)" }
// EXIST: { lookupString: "ArrayList", itemText: "ArrayList", tailText: "(...) (java.util)" }
@@ -5,11 +5,11 @@ fun foo(): KotlinTrait<I1, I2> {
}
// EXIST: { lookupString: "object", itemText: "object: KotlinTrait<I1, I2>{...}" }
// EXIST: { lookupString: "KotlinInheritor1", itemText: "KotlinInheritor1<I1>", tailText: "() (p)" }
// EXIST: { lookupString: "KotlinInheritor1", itemText: "KotlinInheritor1", tailText: "() (p)" }
// EXIST: { lookupString: "KotlinInheritor2", itemText: "KotlinInheritor2", tailText: "() (p)" }
// ABSENT: KotlinInheritor3
// EXIST: { lookupString: "object", itemText: "object: KotlinInheritor4<I1, I2>(){...}" }
// ABSENT: KotlinInheritor5
// EXIST: { lookupString: "KotlinInheritor6", itemText: "KotlinInheritor6<I1, Any?, I3>", tailText: "() (p)" }
// EXIST: { lookupString: "KotlinInheritor6", itemText: "KotlinInheritor6", tailText: "() (p)" }
// EXIST: { lookupString: "JavaInheritor1", itemText: "JavaInheritor1", tailText: "() (<root>)" }
// ABSENT: JavaInheritor2
@@ -5,4 +5,4 @@ fun foo(): KotlinTrait<I1, I1> {
}
// EXIST: { lookupString: "object", itemText: "object: KotlinTrait<I1, I1>{...}" }
// EXIST: { lookupString: "KotlinInheritor", itemText: "KotlinInheritor<I1>", tailText: "() (p)" }
// EXIST: { lookupString: "KotlinInheritor", itemText: "KotlinInheritor", tailText: "() (p)" }
@@ -5,4 +5,4 @@ fun foo(): KotlinTrait<I1<I2>> {
}
// EXIST: { lookupString: "object", itemText: "object: KotlinTrait<I1<I2>>{...}" }
// EXIST: { lookupString: "KotlinInheritor", itemText: "KotlinInheritor<I2>", tailText: "() (p)" }
// EXIST: { lookupString: "KotlinInheritor", itemText: "KotlinInheritor", tailText: "() (p)" }
@@ -6,7 +6,6 @@ fun bar() {
// EXIST: { lookupString: "object", itemText: "object: T2<X>{...}" }
// EXIST: { lookupString: "object", itemText: "object: T3<Y>{...}" }
// EXIST: { lookupString: "C1", itemText: "C1" }
// EXIST: { lookupString: "C2", itemText: "C2<X>" }
// EXIST: { lookupString: "C2", itemText: "C2<Y>" }
// EXIST: { lookupString: "C2", itemText: "C2" }
// EXIST: { lookupString: "C3", itemText: "C3" }
// NOTHING_ELSE