Skip to content

Commit ec588bf

Browse files
committed
Fix Rename Class detection in commit
checkstyle/checkstyle@7ddc532
1 parent 3dc2bef commit ec588bf

File tree

4 files changed

+34
-7
lines changed

4 files changed

+34
-7
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -508,9 +508,9 @@ As of **November 11, 2025** the precision and recall of RefactoringMiner on this
508508

509509
| Refactoring Type | TP | FP | FN | Precision | Recall |
510510
|:-----------------------|-----------:|--------:|--------:|--------:|--------:|
511-
|**Total**|3431 | 49 | 95 | 0.986 | 0.973|
511+
|**Total**|3432 | 48 | 92 | 0.986 | 0.974|
512512
|Extract Method|371 | 1 | 4 | 0.997 | 0.989|
513-
|Rename Class|232 | 1 | 2 | 0.996 | 0.991|
513+
|Rename Class|233 | 0 | 1 | 1.000 | 0.996|
514514
|Move Attribute|72 | 0 | 7 | 1.000 | 0.911|
515515
|Move And Rename Attribute| 7 | 0 | 1 | 1.000 | 0.875|
516516
|Rename Method|299 | 7 | 6 | 0.977 | 0.980|
@@ -530,11 +530,11 @@ As of **November 11, 2025** the precision and recall of RefactoringMiner on this
530530
|Extract And Move Method|123 | 2 | 5 | 0.984 | 0.961|
531531
|Move And Inline Method|29 | 1 | 6 | 0.967 | 0.829|
532532
|Replace Anonymous With Class| 5 | 0 | 0 | 1.000 | 1.000|
533-
|Extract Variable|290 | 1 | 10 | 0.997 | 0.967|
533+
|Extract Variable|290 | 1 | 9 | 0.997 | 0.970|
534534
|Extract Attribute| 3 | 0 | 0 | 1.000 | 1.000|
535535
|Inline Variable|127 | 0 | 12 | 1.000 | 0.914|
536536
|Rename Variable|304 | 6 | 8 | 0.981 | 0.974|
537-
|Rename Attribute|107 | 4 | 9 | 0.964 | 0.922|
537+
|Rename Attribute|107 | 4 | 8 | 0.964 | 0.930|
538538
|Replace Variable With Attribute|11 | 0 | 0 | 1.000 | 1.000|
539539
|Replace Attribute With Variable|30 | 0 | 0 | 1.000 | 1.000|
540540
|Change Return Type|166 | 2 | 7 | 0.988 | 0.960|

src/main/java/gr/uom/java/xmi/diff/UMLModelDiff.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1590,6 +1590,12 @@ public void inferClassRenameBasedOnReferencesInStringLiterals() throws Refactori
15901590
for(UMLClass addedClass : addedClasses) {
15911591
addedClassNameMap.put(addedClass.getNonQualifiedName(), addedClass);
15921592
}
1593+
Map<String, UMLClass> renamedRemovedClassMap = new LinkedHashMap<>();
1594+
Map<String, UMLClass> renamedAddedClassMap = new LinkedHashMap<>();
1595+
for(UMLClassRenameDiff classRenameDiff : classRenameDiffList) {
1596+
renamedRemovedClassMap.put(classRenameDiff.getOriginalClass().getNonQualifiedName(), classRenameDiff.getOriginalClass());
1597+
renamedAddedClassMap.put(classRenameDiff.getNextClass().getNonQualifiedName(), classRenameDiff.getNextClass());
1598+
}
15931599
Set<String> removedClassNames = removedClassNameMap.keySet();
15941600
Set<String> addedClassNames = addedClassNameMap.keySet();
15951601
Map<Pair<String, String>, Integer> countMap = new LinkedHashMap<>();
@@ -1599,6 +1605,9 @@ public void inferClassRenameBasedOnReferencesInStringLiterals() throws Refactori
15991605
for(Replacement r : mapping.getReplacements()) {
16001606
if(!r.getBefore().contains("{\n") && !r.getAfter().contains("{\n")) {
16011607
String matchingClassNameBefore = matches(r.getBefore(), removedClassNames, mapping.getFragment1());
1608+
if(matchingClassNameBefore == null) {
1609+
matchingClassNameBefore = matches(r.getBefore(), renamedRemovedClassMap.keySet(), mapping.getFragment1());
1610+
}
16021611
String matchingClassNameAfter = matches(r.getAfter(), addedClassNames, mapping.getFragment2());
16031612
if(condition(matchingClassNameBefore, matchingClassNameAfter, r)) {
16041613
Pair<String, String> pair = Pair.of(matchingClassNameBefore, matchingClassNameAfter);
@@ -1633,12 +1642,18 @@ public void inferClassRenameBasedOnReferencesInStringLiterals() throws Refactori
16331642
}
16341643
}
16351644
Set<UMLClassRenameDiff> diffsToBeAdded = new LinkedHashSet<UMLClassRenameDiff>();
1645+
Set<UMLClassRenameDiff> diffsToBeRemoved = new LinkedHashSet<UMLClassRenameDiff>();
16361646
Set<UMLClass> addedClassesToBeRemoved = new LinkedHashSet<UMLClass>();
16371647
Set<UMLClass> removedClassesToBeRemoved = new LinkedHashSet<UMLClass>();
16381648
UMLClassMatcher matcher = new UMLClassMatcher.RelaxedRename();
16391649
for(Pair<String, String> pair : countMap.keySet()) {
16401650
if(!conflictingPair(pair, countMap.keySet())) {
16411651
UMLClass removedClass = removedClassNameMap.get(pair.getLeft());
1652+
UMLClassRenameDiff oldClassRenameDiff = null;
1653+
if(removedClass == null) {
1654+
removedClass = renamedRemovedClassMap.get(pair.getLeft());
1655+
oldClassRenameDiff = (UMLClassRenameDiff) getUMLClassDiff(removedClass.getName());
1656+
}
16421657
UMLClass addedClass = addedClassNameMap.get(pair.getRight());
16431658
MatchResult matchResult = matcher.match(removedClass, addedClass);
16441659
int removedClassConstants = 0;
@@ -1654,15 +1669,27 @@ public void inferClassRenameBasedOnReferencesInStringLiterals() throws Refactori
16541669
}
16551670
}
16561671
boolean skip = removedClass.getAttributes().size() - removedClassConstants > 0 && addedClass.getAttributes().size() - addedClassConstants > 0 && matchResult.getMatchedAttributes() == 0;
1672+
if(oldClassRenameDiff != null) {
1673+
MatchResult oldMatchResult = matcher.match(oldClassRenameDiff.getOriginalClass(), oldClassRenameDiff.getNextClass());
1674+
if(oldMatchResult.isMatch() && !matchResult.isMatch()) {
1675+
skip = true;
1676+
}
1677+
else if(oldMatchResult.isMatch() && matchResult.isMatch() && oldMatchResult.getMatchedOperations() + oldMatchResult.getMatchedAttributes() > matchResult.getMatchedOperations() + matchResult.getMatchedAttributes()) {
1678+
skip = true;
1679+
}
1680+
}
16571681
if(!skip) {
16581682
UMLClassRenameDiff newClassRenameDiff = new UMLClassRenameDiff(removedClass, addedClass, this, matchResult);
16591683
newClassRenameDiff.process();
16601684
diffsToBeAdded.add(newClassRenameDiff);
16611685
addedClassesToBeRemoved.add(addedClass);
16621686
removedClassesToBeRemoved.add(removedClass);
1687+
if(oldClassRenameDiff != null)
1688+
diffsToBeRemoved.add(oldClassRenameDiff);
16631689
}
16641690
}
16651691
}
1692+
classRenameDiffList.removeAll(diffsToBeRemoved);
16661693
classRenameDiffList.addAll(diffsToBeAdded);
16671694
removedClasses.removeAll(removedClassesToBeRemoved);
16681695
addedClasses.removeAll(addedClassesToBeRemoved);

src/test/java/org/refactoringminer/test/TestNewDatasetRefactorings.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,6 @@ public void testAllRefactorings() throws Exception {
5151
.or(Refactorings.MoveCode.getValue());
5252
TestBuilder test = new TestBuilder(detector, REPOS, types);
5353
RefactoringPopulator.feedTSERefactoringInstances(test);
54-
test.assertExpectationsWithGitHubAPI(3431, 49, 95);
54+
test.assertExpectationsWithGitHubAPI(3432, 48, 92);
5555
}
5656
}

src/test/resources/oracle/tse-dataset/hibernate-search.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2859,7 +2859,7 @@
28592859
{
28602860
"type": "RENAME_ATTRIBUTE",
28612861
"description": "Rename Attribute\tallByNonInterfaceSuperType : Map<PojoRawTypeIdentifier<?>,Set<AbstractPojoTypeManager<?,?>>> to bySuperType : Map<PojoRawTypeIdentifier<?>,Set<AbstractPojoTypeManager<?,?>>> in class org.hibernate.search.mapper.pojo.mapping.impl.PojoTypeManagerContainer.Builder",
2862-
"validation": true
2862+
"validation": false
28632863
},
28642864
{
28652865
"type": "MOVE_AND_RENAME_OPERATION",
@@ -2929,7 +2929,7 @@
29292929
{
29302930
"type": "EXTRACT_VARIABLE",
29312931
"description": "Extract Variable\tindexedBySuperTypeContent : Map<PojoRawTypeIdentifier<?>,Set<PojoIndexedTypeManager<?,?>>> in method private PojoTypeManagerContainer(builder Builder) from class org.hibernate.search.mapper.pojo.mapping.impl.PojoTypeManagerContainer",
2932-
"validation": true
2932+
"validation": false
29332933
},
29342934
{
29352935
"type": "EXTRACT_VARIABLE",

0 commit comments

Comments
 (0)