Skip to content

Commit 1eb2183

Browse files
committed
Fix for issue tsantalis#855
1 parent b6cd2ae commit 1eb2183

File tree

17 files changed

+4072
-2
lines changed

17 files changed

+4072
-2
lines changed

src/main/java/gr/uom/java/xmi/UMLAttribute.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ public AbstractCall isDelegate() {
9292
return null;
9393
}
9494

95+
@Override
96+
public AbstractCall singleStatementCallingMethod() {
97+
return null;
98+
}
99+
95100
public boolean isRecursive() {
96101
return false;
97102
}

src/main/java/gr/uom/java/xmi/UMLInitializer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ public AbstractCall isDelegate() {
134134
return null;
135135
}
136136

137+
@Override
138+
public AbstractCall singleStatementCallingMethod() {
139+
return null;
140+
}
141+
137142
public Optional<UMLAnonymousClass> getAnonymousClassContainer() {
138143
return anonymousClassContainer;
139144
}

src/main/java/gr/uom/java/xmi/UMLOperation.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,17 @@ public boolean hasVarargsParameter() {
620620
return false;
621621
}
622622

623+
public AbstractCall singleStatementCallingMethod() {
624+
if(getBody() != null) {
625+
List<AbstractStatement> statements = getBody().getCompositeStatement().getStatements();
626+
if(statements.size() == 1 && statements.get(0) instanceof StatementObject) {
627+
StatementObject statement = (StatementObject)statements.get(0);
628+
return statement.invocationCoveringEntireFragment();
629+
}
630+
}
631+
return null;
632+
}
633+
623634
public AbstractCall isDelegate() {
624635
if(getBody() != null) {
625636
List<AbstractStatement> statements = getBody().getCompositeStatement().getStatements();

src/main/java/gr/uom/java/xmi/VariableDeclarationContainer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ default boolean identicalTextFixture(VariableDeclarationContainer operation) {
126126
boolean isSetter();
127127
boolean isConstructor();
128128
AbstractCall isDelegate();
129+
AbstractCall singleStatementCallingMethod();
129130
boolean isRecursive();
130131
boolean isMain();
131132
boolean isStatic();

src/main/java/gr/uom/java/xmi/decomposition/LambdaExpressionObject.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,11 @@ public AbstractCall isDelegate() {
440440
return null;
441441
}
442442

443+
@Override
444+
public AbstractCall singleStatementCallingMethod() {
445+
return null;
446+
}
447+
443448
@Override
444449
public boolean isRecursive() {
445450
return false;

src/main/java/gr/uom/java/xmi/decomposition/UMLOperationBodyMapper.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10307,9 +10307,33 @@ else if(!thisCommonJavadoc && otherCommonJavadoc) {
1030710307
return Integer.compare(thisEditDistance, otherEditDistance);
1030810308
}
1030910309
else {
10310+
AbstractCall thisDelegate = this.getContainer2().singleStatementCallingMethod();
10311+
AbstractCall otherDelegate = operationBodyMapper.getContainer2().singleStatementCallingMethod();
10312+
boolean delegateArgumentInMethodName = false;
10313+
if(thisDelegate != null && otherDelegate != null) {
10314+
boolean thisMatch = false;
10315+
for(String arg : thisDelegate.arguments()) {
10316+
if(arg.startsWith("\"") && arg.endsWith("\""))
10317+
arg = arg.substring(1, arg.length()-1);
10318+
if(this.getContainer2().getName().toLowerCase().contains(arg)) {
10319+
thisMatch = true;
10320+
break;
10321+
}
10322+
}
10323+
boolean otherMatch = false;
10324+
for(String arg : otherDelegate.arguments()) {
10325+
if(arg.startsWith("\"") && arg.endsWith("\""))
10326+
arg = arg.substring(1, arg.length()-1);
10327+
if(operationBodyMapper.getContainer2().getName().toLowerCase().contains(arg)) {
10328+
otherMatch = true;
10329+
break;
10330+
}
10331+
}
10332+
delegateArgumentInMethodName = thisMatch && otherMatch;
10333+
}
1031010334
int thisOperationNameEditDistance = this.operationNameEditDistance();
1031110335
int otherOperationNameEditDistance = operationBodyMapper.operationNameEditDistance();
10312-
if(thisOperationNameEditDistance != otherOperationNameEditDistance) {
10336+
if(thisOperationNameEditDistance != otherOperationNameEditDistance && !delegateArgumentInMethodName) {
1031310337
return Integer.compare(thisOperationNameEditDistance, otherOperationNameEditDistance);
1031410338
}
1031510339
if(this.container1.getClassName().equals(this.container2.getClassName()) && operationBodyMapper.container1.getClassName().equals(operationBodyMapper.container2.getClassName())) {

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2267,6 +2267,15 @@ else if(allStatementsMappedOrParameterized(operationBodyMapper)) {
22672267
mapperSet.add(operationBodyMapper);
22682268
}
22692269
}
2270+
if (mappings == 0 && isPartOfMethodExtracted(removedOperation, addedOperation) && removedOperation.hasTestAnnotation() && addedOperation.hasTestAnnotation()) {
2271+
int absoluteDifferenceInPosition = computeAbsoluteDifferenceInPositionWithinClass(removedOperation, addedOperation);
2272+
if(removedOperation.isConstructor() == addedOperation.isConstructor() &&
2273+
mappedElementsMoreThanNonMappedT2(mappings, operationBodyMapper) &&
2274+
absoluteDifferenceInPosition <= differenceInPosition &&
2275+
removedOperation.testMethodCheck(addedOperation)) {
2276+
mapperSet.add(operationBodyMapper);
2277+
}
2278+
}
22702279
}
22712280

22722281
private void updateMapperSet(TreeSet<UMLOperationBodyMapper> mapperSet, UMLOperation removedOperation, UMLOperation operationInsideAnonymousClass, UMLOperation addedOperation, int differenceInPosition) throws RefactoringMinerTimedOutException {

src/test/java/org/refactoringminer/test/TestStatementMappings.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,8 @@ public void handle(String commitId, List<Refactoring> refactorings) {
580580
"https://github.com/eclipse-jgit/jgit.git, 7ff6eb584cf8b83f83a3b5edf897feb53dbf42c0, jgit-7ff6eb584cf8b83f83a3b5edf897feb53dbf42c0.txt",
581581
"https://github.com/jenkinsci/git-client-plugin.git, 6d261108e7471db380146f945bb228b5fc8c44cc, git-client-plugin-6d261108e7471db380146f945bb228b5fc8c44cc.txt",
582582
"https://github.com/javaparser/javaparser.git, 548fb9c5a72776ec009c5f2f92b1a4c480a05030, javaparser-548fb9c5a72776ec009c5f2f92b1a4c480a05030.txt",
583-
"https://github.com/apache/ant.git, 52926715b4f4f53da4b63cf660a14f357d7a9b6e, ant-52926715b4f4f53da4b63cf660a14f357d7a9b6e.txt"
583+
"https://github.com/apache/ant.git, 52926715b4f4f53da4b63cf660a14f357d7a9b6e, ant-52926715b4f4f53da4b63cf660a14f357d7a9b6e.txt",
584+
"https://github.com/apache/cassandra.git, ab51b794735bd5731357d6fd4cb92cf0059a7ad1, cassandra-ab51b794735bd5731357d6fd4cb92cf0059a7ad1.txt"
584585
})
585586
public void testExtractMethodStatementMappings(String url, String commit, String testResultFileName) throws Exception {
586587
GitHistoryRefactoringMinerImpl miner = new GitHistoryRefactoringMinerImpl();

src/test/java/org/refactoringminer/test/TestStatementMappingsJunit4.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1740,6 +1740,36 @@ public void handle(String commitId, List<Refactoring> refactorings) {
17401740
Assert.assertTrue(expected.size() == actual.size() && expected.containsAll(actual) && actual.containsAll(expected));
17411741
}
17421742

1743+
@Test
1744+
public void testExtractMethodStatementMappings32() throws Exception {
1745+
GitHistoryRefactoringMinerImpl miner = new GitHistoryRefactoringMinerImpl();
1746+
final List<String> actual = new ArrayList<>();
1747+
miner.detectAtCommitWithGitHubAPI("https://github.com/apache/cassandra.git", "ab51b794735bd5731357d6fd4cb92cf0059a7ad1", new File(REPOS), new RefactoringHandler() {
1748+
@Override
1749+
public void handle(String commitId, List<Refactoring> refactorings) {
1750+
List<UMLOperationBodyMapper> parentMappers = new ArrayList<>();
1751+
for (Refactoring ref : refactorings) {
1752+
if(ref instanceof ExtractOperationRefactoring) {
1753+
ExtractOperationRefactoring ex = (ExtractOperationRefactoring)ref;
1754+
UMLOperationBodyMapper bodyMapper = ex.getBodyMapper();
1755+
if(!bodyMapper.isNested()) {
1756+
if(!parentMappers.contains(bodyMapper.getParentMapper())) {
1757+
parentMappers.add(bodyMapper.getParentMapper());
1758+
}
1759+
}
1760+
mapperInfo(bodyMapper, actual);
1761+
}
1762+
}
1763+
for(UMLOperationBodyMapper parentMapper : parentMappers) {
1764+
mapperInfo(parentMapper, actual);
1765+
}
1766+
}
1767+
});
1768+
1769+
List<String> expected = IOUtils.readLines(new FileReader(EXPECTED_PATH + "cassandra-ab51b794735bd5731357d6fd4cb92cf0059a7ad1.txt"));
1770+
Assert.assertTrue(expected.size() == actual.size() && expected.containsAll(actual) && actual.containsAll(expected));
1771+
}
1772+
17431773
@Test
17441774
public void testSlidedStatementMappings() throws Exception {
17451775
GitHistoryRefactoringMinerImpl miner = new GitHistoryRefactoringMinerImpl();
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
public copyFile(cfDir File, file File) : void -> public copyFile(cfDir File, file File, target File) : void
2+
line range:695-695==line range:806-806
3+
line range:699-699==line range:809-809
4+
line range:703-703==line range:814-814
5+
line range:702-703==line range:813-814
6+
line range:700-704==line range:810-815
7+
line range:696-705==line range:807-816
8+
line range:697-705==line range:808-816
9+
line range:698-698==line range:801-801
10+
public testVerifyOldSSTables() : void -> private verifyOldSSTables(tableSuffix String) : void
11+
line range:349-349==line range:414-414
12+
line range:351-351==line range:416-416
13+
line range:361-361==line range:426-426
14+
line range:365-365==line range:430-430
15+
line range:342-342==line range:407-407
16+
line range:343-343==line range:408-408
17+
line range:350-351==line range:415-416
18+
line range:347-354==line range:412-419
19+
line range:353-354==line range:418-419
20+
line range:345-355==line range:410-420
21+
line range:359-366==line range:424-431
22+
line range:363-366==line range:428-431
23+
line range:357-367==line range:422-432
24+
line range:340-368==line range:405-433
25+
line range:346-355==line range:411-420
26+
line range:358-367==line range:423-432
27+
line range:341-368==line range:406-433
28+
public copySstablesFromTestData(table String, ksDir File, ks String) : void -> public copySstablesFromTestData(legacyVersion Version, tablePattern String, ksDir File, ks String) : void
29+
line range:666-666==line range:771-771
30+
line range:667-667==line range:772-772
31+
line range:673-673==line range:781-781
32+
line range:671-674==line range:776-782
33+
line range:669-675==line range:774-783
34+
line range:672-674==line range:777-782
35+
line range:670-675==line range:775-783
36+
public copyFile(cfDir File, file File) : void -> public copyFile(cfDir File, file File) : void
37+
line range:698-698==line range:801-801
38+
public testVerifyOldSSTables() : void -> public testVerifyOldSimpleSSTables() : void
39+
public copySstablesFromTestData(table String, ksDir File, ks String) : void -> public copySstablesFromTestData(legacyVersion Version, tablePattern String, ksDir File) : void

0 commit comments

Comments
 (0)