Skip to content

Commit

Permalink
Handle better Split Method refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
tsantalis committed Nov 6, 2024
1 parent f5d649e commit 452954c
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 3 deletions.
47 changes: 47 additions & 0 deletions src/main/java/org/codetracker/MethodTrackerChangeHistory.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -338,6 +339,17 @@ public Set<Method> analyseMethodRefactorings(Collection<Refactoring> 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()) {
Expand All @@ -347,6 +359,16 @@ public Set<Method> analyseMethodRefactorings(Collection<Refactoring> 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;
}
}
Expand Down Expand Up @@ -451,6 +473,31 @@ public Set<Method> analyseMethodRefactorings(Collection<Refactoring> refactoring
return leftMethodSet;
}

private boolean debatable(UMLOperationBodyMapper previous, UMLOperationBodyMapper current) {
Set<String> previousIntersection = parameterIntersection(previous);
Set<String> 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<String> previousIntersection = parameterIntersection(previous);
Set<String> 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<String> parameterIntersection(UMLOperationBodyMapper mapper) {
Set<String> 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;

Expand Down
2 changes: 1 addition & 1 deletion src/test/resources/blame/blameTestWithLocalRepo21.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions src/test/resources/blame/blameTestWithLocalRepo3.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
Expand Down

0 comments on commit 452954c

Please sign in to comment.