Minor refactoring

This commit is contained in:
Valentin Kipyatkov
2016-10-19 21:31:11 +03:00
parent 02f4b883f9
commit f2b32f6d90
3 changed files with 22 additions and 20 deletions
@@ -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))
} }
@@ -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(
@@ -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
} }
} }