Minor: Drop Match class. Move range to UnificationResult.Matched
This commit is contained in:
+7
-7
@@ -35,8 +35,8 @@ import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.OutputVa
|
|||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
import org.jetbrains.kotlin.idea.util.ShortenReferences
|
import org.jetbrains.kotlin.idea.util.ShortenReferences
|
||||||
import org.jetbrains.kotlin.idea.util.psi.patternMatching.KotlinPsiRange
|
import org.jetbrains.kotlin.idea.util.psi.patternMatching.KotlinPsiRange
|
||||||
import org.jetbrains.kotlin.idea.util.psi.patternMatching.KotlinPsiRange.Match
|
|
||||||
import org.jetbrains.kotlin.idea.util.psi.patternMatching.KotlinPsiUnifier
|
import org.jetbrains.kotlin.idea.util.psi.patternMatching.KotlinPsiUnifier
|
||||||
|
import org.jetbrains.kotlin.idea.util.psi.patternMatching.UnificationResult
|
||||||
import org.jetbrains.kotlin.idea.util.psi.patternMatching.UnificationResult.StronglyMatched
|
import org.jetbrains.kotlin.idea.util.psi.patternMatching.UnificationResult.StronglyMatched
|
||||||
import org.jetbrains.kotlin.idea.util.psi.patternMatching.UnificationResult.WeaklyMatched
|
import org.jetbrains.kotlin.idea.util.psi.patternMatching.UnificationResult.WeaklyMatched
|
||||||
import org.jetbrains.kotlin.idea.util.psi.patternMatching.UnifierParameter
|
import org.jetbrains.kotlin.idea.util.psi.patternMatching.UnifierParameter
|
||||||
@@ -154,10 +154,10 @@ class DuplicateInfo(
|
|||||||
)
|
)
|
||||||
|
|
||||||
fun ExtractableCodeDescriptor.findDuplicates(): List<DuplicateInfo> {
|
fun ExtractableCodeDescriptor.findDuplicates(): List<DuplicateInfo> {
|
||||||
fun processWeakMatch(match: Match, newControlFlow: ControlFlow): Boolean {
|
fun processWeakMatch(match: UnificationResult.WeaklyMatched, newControlFlow: ControlFlow): Boolean {
|
||||||
val valueCount = controlFlow.outputValues.size
|
val valueCount = controlFlow.outputValues.size
|
||||||
|
|
||||||
val weakMatches = HashMap((match.result as WeaklyMatched).weakMatches)
|
val weakMatches = HashMap(match.weakMatches)
|
||||||
val currentValuesToNew = HashMap<OutputValue, OutputValue>()
|
val currentValuesToNew = HashMap<OutputValue, OutputValue>()
|
||||||
|
|
||||||
fun matchValues(currentValue: OutputValue, newValue: OutputValue): Boolean {
|
fun matchValues(currentValue: OutputValue, newValue: OutputValue): Boolean {
|
||||||
@@ -184,7 +184,7 @@ fun ExtractableCodeDescriptor.findDuplicates(): List<DuplicateInfo> {
|
|||||||
return currentValuesToNew.size == valueCount && weakMatches.isEmpty()
|
return currentValuesToNew.size == valueCount && weakMatches.isEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getControlFlowIfMatched(match: Match): ControlFlow? {
|
fun getControlFlowIfMatched(match: UnificationResult.Matched): ControlFlow? {
|
||||||
val analysisResult = extractionData.copy(originalRange = match.range).performAnalysis()
|
val analysisResult = extractionData.copy(originalRange = match.range).performAnalysis()
|
||||||
if (analysisResult.status != AnalysisResult.Status.SUCCESS) return null
|
if (analysisResult.status != AnalysisResult.Status.SUCCESS) return null
|
||||||
|
|
||||||
@@ -192,10 +192,10 @@ fun ExtractableCodeDescriptor.findDuplicates(): List<DuplicateInfo> {
|
|||||||
if (newControlFlow.outputValues.isEmpty()) return newControlFlow
|
if (newControlFlow.outputValues.isEmpty()) return newControlFlow
|
||||||
if (controlFlow.outputValues.size != newControlFlow.outputValues.size) return null
|
if (controlFlow.outputValues.size != newControlFlow.outputValues.size) return null
|
||||||
|
|
||||||
val matched = when (match.result) {
|
val matched = when (match) {
|
||||||
is StronglyMatched -> true
|
is StronglyMatched -> true
|
||||||
is WeaklyMatched -> processWeakMatch(match, newControlFlow)
|
is WeaklyMatched -> processWeakMatch(match, newControlFlow)
|
||||||
else -> throw AssertionError("Unexpected unification result: ${match.result}")
|
else -> throw AssertionError("Unexpected unification result: $match")
|
||||||
}
|
}
|
||||||
|
|
||||||
return if (matched) newControlFlow else null
|
return if (matched) newControlFlow else null
|
||||||
@@ -214,7 +214,7 @@ fun ExtractableCodeDescriptor.findDuplicates(): List<DuplicateInfo> {
|
|||||||
.filter { !(it.range.getTextRange() intersects originalTextRange) }
|
.filter { !(it.range.getTextRange() intersects originalTextRange) }
|
||||||
.mapNotNull { match ->
|
.mapNotNull { match ->
|
||||||
val controlFlow = getControlFlowIfMatched(match)
|
val controlFlow = getControlFlowIfMatched(match)
|
||||||
controlFlow?.let { DuplicateInfo(match.range, it, unifierParameters.map { match.result.substitution[it]!!.text!! }) }
|
controlFlow?.let { DuplicateInfo(match.range, it, unifierParameters.map { match.substitution[it]!!.text!! }) }
|
||||||
}
|
}
|
||||||
.toList()
|
.toList()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,8 +47,6 @@ public interface KotlinPsiRange {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Match(val range: KotlinPsiRange, val result: UnificationResult.Matched)
|
|
||||||
|
|
||||||
val elements: List<PsiElement>
|
val elements: List<PsiElement>
|
||||||
|
|
||||||
fun getTextRange(): TextRange
|
fun getTextRange(): TextRange
|
||||||
@@ -59,11 +57,11 @@ public interface KotlinPsiRange {
|
|||||||
|
|
||||||
fun contains(element: PsiElement): Boolean = getTextRange().contains(element.getTextRange() ?: TextRange.EMPTY_RANGE)
|
fun contains(element: PsiElement): Boolean = getTextRange().contains(element.getTextRange() ?: TextRange.EMPTY_RANGE)
|
||||||
|
|
||||||
fun match(scope: PsiElement, unifier: KotlinPsiUnifier): List<Match> {
|
fun match(scope: PsiElement, unifier: KotlinPsiUnifier): List<UnificationResult.Matched> {
|
||||||
val elements = elements.filter(SIGNIFICANT_FILTER)
|
val elements = elements.filter(SIGNIFICANT_FILTER)
|
||||||
if (elements.isEmpty()) return Collections.emptyList()
|
if (elements.isEmpty()) return Collections.emptyList()
|
||||||
|
|
||||||
val matches = ArrayList<Match>()
|
val matches = ArrayList<UnificationResult.Matched>()
|
||||||
scope.accept(
|
scope.accept(
|
||||||
object: KtTreeVisitorVoid() {
|
object: KtTreeVisitorVoid() {
|
||||||
override fun visitKtElement(element: KtElement) {
|
override fun visitKtElement(element: KtElement) {
|
||||||
@@ -77,13 +75,13 @@ public interface KotlinPsiRange {
|
|||||||
val result = unifier.unify(range, this@KotlinPsiRange)
|
val result = unifier.unify(range, this@KotlinPsiRange)
|
||||||
|
|
||||||
if (result is UnificationResult.StronglyMatched) {
|
if (result is UnificationResult.StronglyMatched) {
|
||||||
matches.add(Match(range, result))
|
matches.add(result)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
val matchCountSoFar = matches.size()
|
val matchCountSoFar = matches.size()
|
||||||
super.visitKtElement(element)
|
super.visitKtElement(element)
|
||||||
if (result is UnificationResult.WeaklyMatched && matches.size() == matchCountSoFar) {
|
if (result is UnificationResult.WeaklyMatched && matches.size() == matchCountSoFar) {
|
||||||
matches.add(Match(range, result))
|
matches.add(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,13 +68,18 @@ public interface UnificationResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface Matched: UnificationResult {
|
interface Matched: UnificationResult {
|
||||||
|
val range: KotlinPsiRange
|
||||||
val substitution: Map<UnifierParameter, KtExpression>
|
val substitution: Map<UnifierParameter, KtExpression>
|
||||||
override val status: Status get() = MATCHED
|
override val status: Status get() = MATCHED
|
||||||
}
|
}
|
||||||
|
|
||||||
class StronglyMatched(override val substitution: Map<UnifierParameter, KtExpression>): Matched
|
class StronglyMatched(
|
||||||
|
override val range: KotlinPsiRange,
|
||||||
|
override val substitution: Map<UnifierParameter, KtExpression>
|
||||||
|
): Matched
|
||||||
|
|
||||||
class WeaklyMatched(
|
class WeaklyMatched(
|
||||||
|
override val range: KotlinPsiRange,
|
||||||
override val substitution: Map<UnifierParameter, KtExpression>,
|
override val substitution: Map<UnifierParameter, KtExpression>,
|
||||||
val weakMatches: Map<KtElement, KtElement>
|
val weakMatches: Map<KtElement, KtElement>
|
||||||
): Matched
|
): Matched
|
||||||
@@ -824,7 +829,7 @@ public class KotlinPsiUnifier(
|
|||||||
substitution.size() != descriptorToParameter.size() ->
|
substitution.size() != descriptorToParameter.size() ->
|
||||||
Unmatched
|
Unmatched
|
||||||
status == MATCHED ->
|
status == MATCHED ->
|
||||||
if (weakMatches.isEmpty()) StronglyMatched(substitution) else WeaklyMatched(substitution, weakMatches)
|
if (weakMatches.isEmpty()) StronglyMatched(target, substitution) else WeaklyMatched(target, substitution, weakMatches)
|
||||||
else ->
|
else ->
|
||||||
Unmatched
|
Unmatched
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user