Code refactoring

This commit is contained in:
Valentin Kipyatkov
2016-08-10 10:59:14 +03:00
parent c9fa95927b
commit 9890cebfd9
@@ -160,29 +160,25 @@ object FindTransformationMatcher : TransformationMatcher {
} }
} }
private interface FindOperationGenerator { private abstract class FindOperationGenerator(
val functionName: String val functionName: String,
val hasFilter: Boolean,
val hasFilter: Boolean val chainCallCount: Int = 1
) {
constructor(other: FindOperationGenerator) : this(other.functionName, other.hasFilter, other.chainCallCount)
val presentation: String val presentation: String
get() = functionName + (if (hasFilter) "{}" else "()") get() = functionName + (if (hasFilter) "{}" else "()")
fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression abstract fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression
val chainCallCount: Int
get() = 1
} }
private class SimpleGenerator( private class SimpleGenerator(
override val functionName: String, functionName: String,
private val inputVariable: KtCallableDeclaration, private val inputVariable: KtCallableDeclaration,
private val filter: KtExpression?, private val filter: KtExpression?,
private val argument: KtExpression? = null private val argument: KtExpression? = null
) : FindOperationGenerator { ) : FindOperationGenerator(functionName, filter != null) {
override val hasFilter: Boolean
get() = filter != null
override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression { override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression {
return generateChainedCall(functionName, chainedCallGenerator, inputVariable, filter, argument) return generateChainedCall(functionName, chainedCallGenerator, inputVariable, filter, argument)
} }
@@ -257,7 +253,7 @@ object FindTransformationMatcher : TransformationMatcher {
// we cannot use ?: if found value can be null // we cannot use ?: if found value can be null
if (inputVariableCanHoldNull) return null if (inputVariableCanHoldNull) return null
return object: FindOperationGenerator by this { return object : FindOperationGenerator(this) {
override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression { override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression {
val generated = this@useElvisOperatorIfNeeded.generate(chainedCallGenerator) val generated = this@useElvisOperatorIfNeeded.generate(chainedCallGenerator)
return KtPsiFactory(generated).createExpressionByPattern("$0 ?: $1", generated, valueIfNotFound) return KtPsiFactory(generated).createExpressionByPattern("$0 ?: $1", generated, valueIfNotFound)
@@ -289,16 +285,7 @@ object FindTransformationMatcher : TransformationMatcher {
val receiver = qualifiedExpression.receiverExpression val receiver = qualifiedExpression.receiverExpression
val selector = qualifiedExpression.selectorExpression val selector = qualifiedExpression.selectorExpression
if (receiver.isVariableReference(inputVariable) && selector != null && !inputVariable.hasUsages(selector)) { if (receiver.isVariableReference(inputVariable) && selector != null && !inputVariable.hasUsages(selector)) {
return object: FindOperationGenerator { return object: FindOperationGenerator("firstOrNull", filter != null, chainCallCount = 2) {
override val functionName: String
get() = "firstOrNull"
override val hasFilter: Boolean
get() = filter != null
override val chainCallCount: Int
get() = 2
override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression { override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression {
val findFirstCall = generateChainedCall(functionName, chainedCallGenerator, inputVariable, filter) val findFirstCall = generateChainedCall(functionName, chainedCallGenerator, inputVariable, filter)
return chainedCallGenerator.generate("$0", selector, receiver = findFirstCall, safeCall = true) return chainedCallGenerator.generate("$0", selector, receiver = findFirstCall, safeCall = true)
@@ -310,16 +297,7 @@ object FindTransformationMatcher : TransformationMatcher {
// in case of nullable input variable we cannot distinguish by the result of "firstOrNull" whether nothing was found or 'null' was found // in case of nullable input variable we cannot distinguish by the result of "firstOrNull" whether nothing was found or 'null' was found
if (inputVariableCanHoldNull) return null if (inputVariableCanHoldNull) return null
return object: FindOperationGenerator { return object : FindOperationGenerator("firstOrNull", filter != null, chainCallCount = 2 /* also includes "let" */) {
override val functionName: String
get() = "firstOrNull"
override val hasFilter: Boolean
get() = filter != null
override val chainCallCount: Int
get() = 2 // also includes "let"
override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression { override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression {
val findFirstCall = generateChainedCall(functionName, chainedCallGenerator, inputVariable, filter) val findFirstCall = generateChainedCall(functionName, chainedCallGenerator, inputVariable, filter)
val letBody = generateLambda(inputVariable, valueIfFound) val letBody = generateLambda(inputVariable, valueIfFound)
@@ -330,7 +308,7 @@ object FindTransformationMatcher : TransformationMatcher {
else -> { else -> {
val generator = buildFoundFlagGenerator(loop, inputVariable, filter, negated = false) val generator = buildFoundFlagGenerator(loop, inputVariable, filter, negated = false)
return object: FindOperationGenerator by generator { return object : FindOperationGenerator(generator) {
override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression { override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression {
val chainedCall = generator.generate(chainedCallGenerator) val chainedCall = generator.generate(chainedCallGenerator)
return KtPsiFactory(chainedCall).createExpressionByPattern("if ($0) $1 else $2", chainedCall, valueIfFound, valueIfNotFound) return KtPsiFactory(chainedCall).createExpressionByPattern("if ($0) $1 else $2", chainedCall, valueIfFound, valueIfNotFound)
@@ -352,7 +330,7 @@ object FindTransformationMatcher : TransformationMatcher {
if (containsArgument != null) { if (containsArgument != null) {
val generator = SimpleGenerator("contains", inputVariable, null, containsArgument) val generator = SimpleGenerator("contains", inputVariable, null, containsArgument)
if (negated) { if (negated) {
return object: FindOperationGenerator by generator{ return object : FindOperationGenerator(generator) {
override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression { override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression {
return generator.generate(chainedCallGenerator).negate() return generator.generate(chainedCallGenerator).negate()
} }