[extract duplicates] fix: ignore overlapped duplicates

GitOrigin-RevId: d5f3a1f737ec3a4b362a5abc04d63f48f4303496
This commit is contained in:
Alexandr Suhinin
2021-08-11 16:54:23 +00:00
committed by intellij-monorepo-bot
parent 8e9330e280
commit 31c5102ca1
4 changed files with 40 additions and 9 deletions
@@ -22,40 +22,41 @@ class JavaDuplicatesFinder(pattern: List<PsiElement>, private val terminalNodes:
}
fun findDuplicates(scope: PsiElement): List<Duplicate> {
val ignoredElements = pattern.toSet()
val ignoredElements = HashSet<PsiElement>(pattern)
val duplicates = mutableListOf<Duplicate>()
val patternExpression = pattern.singleOrNull() as? PsiExpression
if (patternExpression != null) {
val expressionVisitor = object : JavaRecursiveElementWalkingVisitor(){
val visitor = if (patternExpression != null) {
object : JavaRecursiveElementWalkingVisitor(){
override fun visitExpression(expression: PsiExpression) {
if (expression in ignoredElements) return
val duplicate = createDuplicate(childrenOf(patternExpression), childrenOf(expression))
if (duplicate != null && ! isOvercomplicated(duplicate)) {
if (duplicate != null) {
duplicates += duplicate.copy(pattern = listOf(patternExpression), candidate = listOf(expression))
} else {
super.visitExpression(expression)
}
}
}
scope.accept(expressionVisitor)
} else {
val visitor = object: JavaRecursiveElementWalkingVisitor() {
object: JavaRecursiveElementWalkingVisitor() {
override fun visitStatement(statement: PsiStatement) {
if (statement in ignoredElements) return
val siblings = siblingsOf(statement).take(pattern.size).toList()
val duplicate = createDuplicate(pattern, siblings)
if (duplicate != null && ! isOvercomplicated(duplicate)) {
if (duplicate != null) {
duplicates += duplicate
ignoredElements += duplicate.candidate
} else {
super.visitStatement(statement)
}
}
}
scope.accept(visitor)
}
scope.accept(visitor)
return duplicates
return duplicates.filterNot(::isOvercomplicated)
}
private fun isNoise(it: PsiElement) = it is PsiWhiteSpace || it is PsiComment || it is PsiEmptyStatement
@@ -0,0 +1,12 @@
public class Test {
void test(){
<selection>System.out.println();
System.out.println();
System.out.println();</selection>
System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println();
}
}
@@ -0,0 +1,14 @@
public class Test {
void test(){
extracted();
extracted();
System.out.println();
System.out.println();
}
private void extracted() {
System.out.println();
System.out.println();
System.out.println();
}
}
@@ -123,6 +123,10 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() {
doTest()
}
fun testOverlappingRanges(){
doTest()
}
fun testRefactoringListener(){
templateTest {
configureByFile("$BASE_PATH/${getTestName(false)}.java")