InsertExplicitTypeArguments - minor code improvements
This commit is contained in:
@@ -317,8 +317,6 @@ replace.with.traditional.assignment.intention=Replace with traditional assignmen
|
|||||||
replace.with.traditional.assignment.intention.family=Replace with Traditional Assignment
|
replace.with.traditional.assignment.intention.family=Replace with Traditional Assignment
|
||||||
simplify.boolean.with.constants=Simplify boolean expression
|
simplify.boolean.with.constants=Simplify boolean expression
|
||||||
simplify.boolean.with.constants.family=Simplify Boolean Expression
|
simplify.boolean.with.constants.family=Simplify Boolean Expression
|
||||||
insert.explicit.type.arguments=Add explicit type arguments
|
|
||||||
insert.explicit.type.arguments.family=Add Explicit Type Arguments
|
|
||||||
remove.explicit.type.arguments=Remove explicit type arguments
|
remove.explicit.type.arguments=Remove explicit type arguments
|
||||||
remove.explicit.type.arguments.family=Remove Explicit Type Arguments
|
remove.explicit.type.arguments.family=Remove Explicit Type Arguments
|
||||||
convert.if.with.throw.to.assert=Replace 'if' with 'assert' statement
|
convert.if.with.throw.to.assert=Replace 'if' with 'assert' statement
|
||||||
|
|||||||
@@ -26,51 +26,36 @@ import org.jetbrains.kotlin.psi.JetTypeArgumentList
|
|||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
|
|
||||||
public class InsertExplicitTypeArguments : JetSelfTargetingIntention<JetCallExpression>(
|
public class InsertExplicitTypeArguments : JetSelfTargetingIntention<JetCallExpression>(javaClass(), "Add explicit type arguments") {
|
||||||
"insert.explicit.type.arguments", javaClass()) {
|
|
||||||
|
|
||||||
override fun isApplicableTo(element: JetCallExpression, caretOffset: Int): Boolean {
|
override fun isApplicableTo(element: JetCallExpression, caretOffset: Int): Boolean {
|
||||||
if (!element.getTypeArguments().isEmpty()) return false
|
if (!element.getTypeArguments().isEmpty()) return false
|
||||||
if (element.getText() == null) return false
|
val callee = element.getCalleeExpression() ?: return false
|
||||||
|
if (!callee.getTextRange().containsOffset(caretOffset)) return false
|
||||||
|
|
||||||
val textRange = element.getCalleeExpression()?.getTextRange()
|
val resolvedCall = element.getResolvedCall(element.analyze()) ?: return false
|
||||||
if (textRange == null || !textRange.contains(caretOffset)) return false
|
val typeArgs = resolvedCall.getTypeArguments()
|
||||||
|
return !typeArgs.isEmpty() && typeArgs.values().none { ErrorUtils.containsErrorType(it) }
|
||||||
val context = element.analyze()
|
|
||||||
val resolvedCall = element.getResolvedCall(context)
|
|
||||||
if (resolvedCall == null) return false
|
|
||||||
|
|
||||||
val types = resolvedCall.getTypeArguments()
|
|
||||||
return !types.isEmpty() && types.values().none { ErrorUtils.containsErrorType(it) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun applyTo(element: JetCallExpression, editor: Editor) {
|
override fun applyTo(element: JetCallExpression, editor: Editor) {
|
||||||
val argumentList = createTypeArguments(element)
|
val argumentList = createTypeArguments(element)!!
|
||||||
if (argumentList == null) return
|
|
||||||
|
|
||||||
val callee = element.getCalleeExpression()
|
val callee = element.getCalleeExpression()!!
|
||||||
if (callee == null) return
|
val newArgumentList = element.addAfter(argumentList, callee) as JetTypeArgumentList
|
||||||
|
|
||||||
element.addAfter(argumentList, callee)
|
ShortenReferences.DEFAULT.process(newArgumentList)
|
||||||
ShortenReferences.DEFAULT.process(element.getTypeArgumentList()!!)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun createTypeArguments(element: JetCallExpression): JetTypeArgumentList? {
|
public fun createTypeArguments(element: JetCallExpression): JetTypeArgumentList? {
|
||||||
val context = element.analyze()
|
val resolvedCall = element.getResolvedCall(element.analyze()) ?: return null
|
||||||
val resolvedCall = element.getResolvedCall(context)
|
|
||||||
if (resolvedCall == null) return null
|
|
||||||
|
|
||||||
val args = resolvedCall.getTypeArguments()
|
val args = resolvedCall.getTypeArguments()
|
||||||
val types = resolvedCall.getCandidateDescriptor().getTypeParameters()
|
val types = resolvedCall.getCandidateDescriptor().getTypeParameters()
|
||||||
|
|
||||||
val psiFactory = JetPsiFactory(element)
|
val text = types.map { IdeDescriptorRenderers.SOURCE_CODE.renderType(args[it]!!) }.joinToString(", ", "<", ">")
|
||||||
val typeArgs = types.map {
|
|
||||||
assert(args[it] != null, "there is a null in the type arguments to transform")
|
|
||||||
IdeDescriptorRenderers.SOURCE_CODE.renderType(args[it]!!)
|
|
||||||
}.joinToString(", ", "<", ">")
|
|
||||||
|
|
||||||
return psiFactory.createTypeArguments(typeArgs)
|
return JetPsiFactory(element).createTypeArguments(text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user