Create from Usage: Implement "Create type parameter" quickfix
#KT-11525 Fixed
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user