Minor refactoring
This commit is contained in:
+10
-11
@@ -20,28 +20,28 @@ import org.jetbrains.kotlin.idea.core.replaced
|
|||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis
|
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis
|
||||||
|
|
||||||
interface CallKindHandler {
|
interface CallKindHandler<TCallElement : KtElement> {
|
||||||
val elementToReplace: KtElement
|
fun elementToReplace(callElement: TCallElement): KtElement
|
||||||
|
|
||||||
fun precheckReplacementPattern(pattern: ReplacementExpression): Boolean
|
fun precheckReplacementPattern(pattern: ReplacementExpression): Boolean
|
||||||
|
|
||||||
fun wrapGeneratedExpression(expression: KtExpression): KtElement
|
fun wrapGeneratedExpression(expression: KtExpression): TCallElement
|
||||||
|
|
||||||
fun unwrapResult(result: KtElement): KtElement
|
fun unwrapResult(result: TCallElement): TCallElement
|
||||||
}
|
}
|
||||||
|
|
||||||
class CallExpressionHandler(callElement: KtExpression) : CallKindHandler {
|
object CallExpressionHandler : CallKindHandler<KtExpression> {
|
||||||
override val elementToReplace = callElement.getQualifiedExpressionForSelectorOrThis()
|
override fun elementToReplace(callElement: KtExpression) = callElement.getQualifiedExpressionForSelectorOrThis()
|
||||||
|
|
||||||
override fun precheckReplacementPattern(pattern: ReplacementExpression) = true
|
override fun precheckReplacementPattern(pattern: ReplacementExpression) = true
|
||||||
|
|
||||||
override fun wrapGeneratedExpression(expression: KtExpression) = expression
|
override fun wrapGeneratedExpression(expression: KtExpression) = expression
|
||||||
|
|
||||||
override fun unwrapResult(result: KtElement) = result
|
override fun unwrapResult(result: KtExpression) = result
|
||||||
}
|
}
|
||||||
|
|
||||||
class AnnotationEntryHandler(annotationEntry: KtAnnotationEntry) : CallKindHandler {
|
object AnnotationEntryHandler : CallKindHandler<KtAnnotationEntry> {
|
||||||
override val elementToReplace = annotationEntry
|
override fun elementToReplace(callElement: KtAnnotationEntry) = callElement
|
||||||
|
|
||||||
override fun precheckReplacementPattern(pattern: ReplacementExpression): Boolean {
|
override fun precheckReplacementPattern(pattern: ReplacementExpression): Boolean {
|
||||||
//TODO
|
//TODO
|
||||||
@@ -54,8 +54,7 @@ class AnnotationEntryHandler(annotationEntry: KtAnnotationEntry) : CallKindHandl
|
|||||||
return createByPattern("@Dummy($0)", expression) { KtPsiFactory(expression).createAnnotationEntry(it) }
|
return createByPattern("@Dummy($0)", expression) { KtPsiFactory(expression).createAnnotationEntry(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun unwrapResult(result: KtElement): KtAnnotationEntry {
|
override fun unwrapResult(result: KtAnnotationEntry): KtAnnotationEntry {
|
||||||
result as KtAnnotationEntry
|
|
||||||
val text = result.valueArguments.single().getArgumentExpression()!!.text
|
val text = result.valueArguments.single().getArgumentExpression()!!.text
|
||||||
return result.replaced(KtPsiFactory(result).createAnnotationEntry("@" + text))
|
return result.replaced(KtPsiFactory(result).createAnnotationEntry("@" + text))
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -53,12 +53,12 @@ import org.jetbrains.kotlin.utils.addIfNotNull
|
|||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
object ReplacementEngine {
|
object ReplacementEngine {
|
||||||
fun performCallReplacement(
|
fun <TCallElement : KtElement> performCallReplacement(
|
||||||
element: KtSimpleNameExpression,
|
element: KtSimpleNameExpression,
|
||||||
bindingContext: BindingContext,
|
bindingContext: BindingContext,
|
||||||
resolvedCall: ResolvedCall<out CallableDescriptor>,
|
resolvedCall: ResolvedCall<out CallableDescriptor>,
|
||||||
callElement: KtElement,
|
callElement: TCallElement,
|
||||||
callKindHandler: CallKindHandler,
|
callKindHandler: CallKindHandler<TCallElement>,
|
||||||
replacement: ReplacementExpression
|
replacement: ReplacementExpression
|
||||||
): KtElement {
|
): KtElement {
|
||||||
val project = element.project
|
val project = element.project
|
||||||
@@ -66,7 +66,7 @@ object ReplacementEngine {
|
|||||||
val descriptor = resolvedCall.resultingDescriptor
|
val descriptor = resolvedCall.resultingDescriptor
|
||||||
|
|
||||||
val qualifiedExpression = callElement.getQualifiedExpressionForSelector()
|
val qualifiedExpression = callElement.getQualifiedExpressionForSelector()
|
||||||
val elementToBeReplaced = callKindHandler.elementToReplace
|
val elementToBeReplaced = callKindHandler.elementToReplace(callElement)
|
||||||
|
|
||||||
val commentSaver = CommentSaver(elementToBeReplaced, saveLineBreaks = true)
|
val commentSaver = CommentSaver(elementToBeReplaced, saveLineBreaks = true)
|
||||||
|
|
||||||
@@ -142,7 +142,7 @@ object ReplacementEngine {
|
|||||||
commentSaver.restore(resultRange)
|
commentSaver.restore(resultRange)
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
return callKindHandler.unwrapResult(resultRange.last as KtElement)
|
return callKindHandler.unwrapResult(resultRange.last as TCallElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun ConstructedExpressionWrapper.processValueParameterUsages(
|
private fun ConstructedExpressionWrapper.processValueParameterUsages(
|
||||||
|
|||||||
+7
-4
@@ -46,15 +46,18 @@ class CallableUsageReplacementStrategy(
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// copy replacement expression because it is modified by performCallReplacement
|
// copy replacement expression because it is modified by performCallReplacement
|
||||||
ReplacementEngine.performCallReplacement(usage, bindingContext, resolvedCall, callElement, callTypeHandler, replacement.copy())
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
ReplacementEngine.performCallReplacement(usage, bindingContext, resolvedCall, callElement,
|
||||||
|
callTypeHandler as CallKindHandler<KtElement>,
|
||||||
|
replacement.copy())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun callTypeHandler(callElement: KtElement): CallKindHandler? {
|
private fun callTypeHandler(callElement: KtElement): CallKindHandler<*>? {
|
||||||
return when (callElement) {
|
return when (callElement) {
|
||||||
is KtExpression -> CallExpressionHandler(callElement)
|
is KtExpression -> CallExpressionHandler
|
||||||
is KtAnnotationEntry -> AnnotationEntryHandler(callElement)
|
is KtAnnotationEntry -> AnnotationEntryHandler
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user