From 452954cfd80cd3209fa5af1eb5f13334efdfb5f7 Mon Sep 17 00:00:00 2001 From: tsantalis Date: Wed, 6 Nov 2024 05:18:32 -0500 Subject: [PATCH] Handle better Split Method refactoring --- .../MethodTrackerChangeHistory.java | 47 +++++++++++++++++++ .../blame/blameTestWithLocalRepo21.txt | 2 +- .../blame/blameTestWithLocalRepo3.txt | 4 +- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/codetracker/MethodTrackerChangeHistory.java b/src/main/java/org/codetracker/MethodTrackerChangeHistory.java index dc40524d674..6d6964ca686 100644 --- a/src/main/java/org/codetracker/MethodTrackerChangeHistory.java +++ b/src/main/java/org/codetracker/MethodTrackerChangeHistory.java @@ -7,6 +7,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -338,6 +339,17 @@ public Set analyseMethodRefactorings(Collection refactoring } case SPLIT_OPERATION: { SplitOperationRefactoring splitOperationRefactoring = (SplitOperationRefactoring) refactoring; + UMLOperationBodyMapper mapperWithLessMappings = null; + boolean debatable = false; + for (UMLOperationBodyMapper mapper : splitOperationRefactoring.getMappers()) { + if (mapperWithLessMappings == null) { + mapperWithLessMappings = mapper; + } + else if (looserMapper(mapperWithLessMappings, mapper)) { + debatable = debatable(mapperWithLessMappings, mapper); + mapperWithLessMappings = mapper; + } + } operationBefore = splitOperationRefactoring.getOriginalMethodBeforeSplit(); Method originalOperationBefore = Method.of(operationBefore, parentVersion); for (VariableDeclarationContainer container : splitOperationRefactoring.getSplitMethods()) { @@ -347,6 +359,16 @@ public Set analyseMethodRefactorings(Collection refactoring changeType = Change.Type.METHOD_SPLIT; methodChangeHistory.addChange(originalOperationBefore, splitOperationAfter, ChangeFactory.forMethod(changeType).refactoring(refactoring)); methodChangeHistory.connectRelatedNodes(); + + if (!debatable && mapperWithLessMappings.getContainer2().equals(container)) { + Method splitOperationBefore = Method.of(container, parentVersion); + splitOperationBefore.setAdded(true); + methodChangeHistory.addChange(splitOperationBefore, splitOperationAfter, ChangeFactory.forMethod(Change.Type.INTRODUCED) + .refactoring(splitOperationRefactoring).codeElement(splitOperationAfter).hookedElement(Method.of(operationBefore, parentVersion))); + methodChangeHistory.connectRelatedNodes(); + Method sourceOperationBefore = Method.of(operationBefore, parentVersion); + setSourceOperation(sourceOperationBefore); + } return leftMethodSet; } } @@ -451,6 +473,31 @@ public Set analyseMethodRefactorings(Collection refactoring return leftMethodSet; } + private boolean debatable(UMLOperationBodyMapper previous, UMLOperationBodyMapper current) { + Set previousIntersection = parameterIntersection(previous); + Set currentIntersection = parameterIntersection(current); + return current.mappingsWithoutBlocks() < previous.mappingsWithoutBlocks() && + currentIntersection.size() < previousIntersection.size() && + current.getContainer1().getName().equals(current.getContainer2().getName()); + } + + private boolean looserMapper(UMLOperationBodyMapper previous, UMLOperationBodyMapper current) { + Set previousIntersection = parameterIntersection(previous); + Set currentIntersection = parameterIntersection(current); + if (current.mappingsWithoutBlocks() < previous.mappingsWithoutBlocks() && + currentIntersection.size() < previousIntersection.size()) { + return true; + } + return current.mappingsWithoutBlocks() < previous.mappingsWithoutBlocks() && + !current.getContainer1().getName().equals(current.getContainer2().getName()); + } + + private Set parameterIntersection(UMLOperationBodyMapper mapper) { + Set parameterTypeIntersection = new LinkedHashSet<>(mapper.getContainer1().getParameterNameList()); + parameterTypeIntersection.retainAll(mapper.getContainer2().getParameterNameList()); + return parameterTypeIntersection; + } + private static boolean checkOperationBodyChanged(OperationBody body1, OperationBody body2) { if (body1 == null && body2 == null) return false; diff --git a/src/test/resources/blame/blameTestWithLocalRepo21.txt b/src/test/resources/blame/blameTestWithLocalRepo21.txt index 600b3e95e81..36398535186 100644 --- a/src/test/resources/blame/blameTestWithLocalRepo21.txt +++ b/src/test/resources/blame/blameTestWithLocalRepo21.txt @@ -1446,7 +1446,7 @@ fbadbcbe5 pmd/src/net/sourceforge/pmd/typeresolution/ClassTypeResolver.java 8674cb4b1 pmd/src/net/sourceforge/pmd/typeresolution/ClassTypeResolver.java (Tom Copeland 2007-11-19 03:06:34 +0000 1446) } ccc144337 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/ClassTypeResolver.java (Clément Fournier 2018-03-19 13:25:00 +0000 1447) importedOnDemand.add(node.getPackageDeclaration().getPackageNameImage()); ccc144337 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/ClassTypeResolver.java (Clément Fournier 2018-03-19 13:25:00 +0000 1448) return classDecl.getQualifiedName().toString(); -6215d97b9 pmd/src/net/sourceforge/pmd/typeresolution/ClassTypeResolver.java (Allan Caplan 2006-10-26 02:35:38 +0000 1449) } +3bbc6575e pmd/src/net/sourceforge/pmd/typeresolution/ClassTypeResolver.java (Allan Caplan 2007-08-28 21:01:03 +0000 1449) } 1450) 6215d97b9 pmd/src/net/sourceforge/pmd/typeresolution/ClassTypeResolver.java (Allan Caplan 2006-10-26 02:35:38 +0000 1451) /** 0ebcac070 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/ClassTypeResolver.java (Andreas Dangel 2016-12-02 09:21:27 +0000 1452) * If the outer class wasn't found then we'll get in here diff --git a/src/test/resources/blame/blameTestWithLocalRepo3.txt b/src/test/resources/blame/blameTestWithLocalRepo3.txt index 5039ddebd86..a1dd3e11206 100644 --- a/src/test/resources/blame/blameTestWithLocalRepo3.txt +++ b/src/test/resources/blame/blameTestWithLocalRepo3.txt @@ -416,7 +416,7 @@ ce196814d src/main/java/com/puppycrawl/tools/checkstyle/Checker.java (Michal Ko f1afaf83f src/checkstyle/com/puppycrawl/tools/checkstyle/Checker.java (Oliver Burn 2007-12-15 08:14:40 +0000 416) @Override 35c607f16 src/main/java/com/puppycrawl/tools/checkstyle/Checker.java (rnveach 2017-12-13 02:52:11 +0000 417) protected void finishLocalSetup() throws CheckstyleException { b8ca6a585 src/main/java/com/puppycrawl/tools/checkstyle/Checker.java (alexkravin 2015-01-19 14:38:32 +0000 418) final Locale locale = new Locale(localeLanguage, localeCountry); -08d6efe49 src/checkstyle/com/puppycrawl/tools/checkstyle/Checker.java (Lars Kühne 2002-12-10 19:13:35 +0000 419) LocalizedMessage.setLocale(locale); +6ffc8dd26 src/checkstyle/com/puppycrawl/tools/checkstyle/Checker.java (Lars Kühne 2002-11-30 18:29:44 +0000 419) LocalizedMessage.setLocale(locale); 420) b8ca6a585 src/main/java/com/puppycrawl/tools/checkstyle/Checker.java (alexkravin 2015-01-19 14:38:32 +0000 421) if (moduleFactory == null) { b8ca6a585 src/main/java/com/puppycrawl/tools/checkstyle/Checker.java (alexkravin 2015-01-19 14:38:32 +0000 422) if (moduleClassLoader == null) { @@ -431,7 +431,7 @@ b8ca6a585 src/main/java/com/puppycrawl/tools/checkstyle/Checker.java (alexkravi b8ca6a585 src/main/java/com/puppycrawl/tools/checkstyle/Checker.java (alexkravin 2015-01-19 14:38:32 +0000 431) moduleClassLoader); 88e89a138 src/checkstyle/com/puppycrawl/tools/checkstyle/Checker.java (Lars Kühne 2002-12-16 06:26:46 +0000 432) } 433) -08d6efe49 src/checkstyle/com/puppycrawl/tools/checkstyle/Checker.java (Lars Kühne 2002-12-10 19:13:35 +0000 434) final DefaultContext context = new DefaultContext(); +16ba5b35f src/checkstyle/com/puppycrawl/tools/checkstyle/Checker.java (Rick Giles 2002-12-05 18:54:28 +0000 434) final DefaultContext context = new DefaultContext(); b8ca6a585 src/main/java/com/puppycrawl/tools/checkstyle/Checker.java (alexkravin 2015-01-19 14:38:32 +0000 435) context.add("charset", charset); 3bd699bd5 src/main/java/com/puppycrawl/tools/checkstyle/Checker.java (Ruslan Diachenko 2015-08-12 05:19:21 +0000 436) context.add("classLoader", classLoader); b8ca6a585 src/main/java/com/puppycrawl/tools/checkstyle/Checker.java (alexkravin 2015-01-19 14:38:32 +0000 437) context.add("moduleFactory", moduleFactory);