Create from Usage: Implement "Create type parameter" quickfix

#KT-11525 Fixed
This commit is contained in:
Alexey Sedunov
2016-08-24 11:49:05 +03:00
parent 6a2edabbd4
commit 63092f6985
43 changed files with 693 additions and 49 deletions
@@ -18,18 +18,21 @@ package org.jetbrains.kotlin.psi
import com.intellij.psi.PsiComment
import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.lexer.KtToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.psiUtil.siblings
object EditCommaSeparatedListHelper {
fun <TItem: KtElement> addItem(list: KtElement, allItems: List<TItem>, item: TItem): TItem {
return addItemBefore(list, allItems, item, null)
@JvmOverloads
fun <TItem: KtElement> addItem(list: KtElement, allItems: List<TItem>, item: TItem, prefix: KtToken = KtTokens.LPAR): TItem {
return addItemBefore(list, allItems, item, null, prefix)
}
fun <TItem: KtElement> addItemAfter(list: KtElement, allItems: List<TItem>, item: TItem, anchor: TItem?): TItem {
@JvmOverloads
fun <TItem: KtElement> addItemAfter(list: KtElement, allItems: List<TItem>, item: TItem, anchor: TItem?, prefix: KtToken = KtTokens.LPAR): TItem {
assert(anchor == null || anchor.parent == list)
if (allItems.isEmpty()) {
if (list.firstChild.node.elementType == KtTokens.LPAR) {
if (list.firstChild.node.elementType == prefix) {
return list.addAfter(item, list.firstChild) as TItem
}
else {
@@ -49,7 +52,8 @@ object EditCommaSeparatedListHelper {
}
}
fun <TItem: KtElement> addItemBefore(list: KtElement, allItems: List<TItem>, item: TItem, anchor: TItem?): TItem {
@JvmOverloads
fun <TItem: KtElement> addItemBefore(list: KtElement, allItems: List<TItem>, item: TItem, anchor: TItem?, prefix: KtToken = KtTokens.LPAR): TItem {
val anchorAfter: TItem?
if (allItems.isEmpty()) {
assert(anchor == null)
@@ -65,7 +69,7 @@ object EditCommaSeparatedListHelper {
anchorAfter = allItems.get(allItems.size - 1)
}
}
return addItemAfter(list, allItems, item, anchorAfter)
return addItemAfter(list, allItems, item, anchorAfter, prefix)
}
fun <TItem: KtElement> removeItem(item: TItem) {
@@ -90,6 +90,8 @@ class KtPsiFactory(private val project: Project) {
return (property.getInitializer() as KtCallExpression).typeArgumentList!!
}
fun createTypeArgument(text: String) = createTypeArguments("<$text>").arguments.first()
fun createType(type: String): KtTypeReference {
val typeReference = createTypeIfPossible(type)
if (typeReference == null || typeReference.text != type) {
@@ -316,6 +318,10 @@ class KtPsiFactory(private val project: Project) {
return createFunction("fun foo$text{}").getValueParameterList()!!
}
fun createTypeParameterList(text: String) = createClass("class Foo$text").typeParameterList!!
fun createTypeParameter(text: String) = createTypeParameterList("<$text>").parameters.first()!!
fun createFunctionLiteralParameterList(text: String): KtParameterList {
return (createExpression("{ $text -> 0}") as KtLambdaExpression).functionLiteral.valueParameterList!!
}
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.psi;
import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.lexer.KtTokens;
import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub;
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes;
@@ -43,7 +44,7 @@ public class KtTypeArgumentList extends KtElementImplStub<KotlinPlaceHolderStub<
}
@NotNull
public KtTypeProjection addArgument(@NotNull KtTypeProjection argument) {
return EditCommaSeparatedListHelper.INSTANCE.addItem(this, getArguments(), argument);
public KtTypeProjection addArgument(@NotNull KtTypeProjection typeArgument) {
return EditCommaSeparatedListHelper.INSTANCE.addItem(this, getArguments(), typeArgument, KtTokens.LT);
}
}
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.psi;
import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.lexer.KtTokens;
import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub;
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes;
@@ -37,6 +38,11 @@ public class KtTypeParameterList extends KtElementImplStub<KotlinPlaceHolderStub
return getStubOrPsiChildrenAsList(KtStubElementTypes.TYPE_PARAMETER);
}
@NotNull
public KtTypeParameter addParameter(@NotNull KtTypeParameter typeParameter) {
return EditCommaSeparatedListHelper.INSTANCE.addItem(this, getParameters(), typeParameter, KtTokens.LT);
}
@Override
public <R, D> R accept(@NotNull KtVisitor<R, D> visitor, D data) {
return visitor.visitTypeParameterList(this, data);