Skip to content

Commit

Permalink
Fixed wrong Extract Variable reported in
Browse files Browse the repository at this point in the history
method
protected GenericConverter getConverter(TypeDescriptor sourceType, TypeDescriptor targetType)
declared in file
org.springframework.core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java
in commit
spring-projects/spring-framework@bf03d0d
  • Loading branch information
tsantalis committed Mar 27, 2024
1 parent 0fd74d6 commit ca0d560
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,7 @@ else if(replacement.getBefore().equals(rightHandSide)) {
}

public void temporaryVariableAssignment(AbstractCodeFragment statement,
List<? extends AbstractCodeFragment> nonMappedLeavesT2, UMLAbstractClassDiff classDiff, boolean insideExtractedOrInlinedMethod) {
List<? extends AbstractCodeFragment> nonMappedLeavesT2, UMLAbstractClassDiff classDiff, boolean insideExtractedOrInlinedMethod, Set<AbstractCodeMapping> currentMappings) {
for(VariableDeclaration declaration : statement.getVariableDeclarations()) {
String variableName = declaration.getVariableName();
AbstractExpression initializer = declaration.getInitializer();
Expand Down Expand Up @@ -659,21 +659,31 @@ else if(stringConcatMatch(initializer, before)) {
List<VariableDeclaration> variableDeclarations = operation2.getVariableDeclarationsInScope(fragment2.getLocationInfo());
for(VariableDeclaration declaration : variableDeclarations) {
if(declaration.getVariableName().equals(variable)) {
ExtractVariableRefactoring ref = new ExtractVariableRefactoring(declaration, operation1, operation2, insideExtractedOrInlinedMethod);
List<LeafExpression> subExpressions = getFragment1().findExpression(replacement.getBefore());
for(LeafExpression subExpression : subExpressions) {
List<LeafExpression> initializerSubExpressions = statement.findExpression(initializer);
if(initializerSubExpressions.size() > 0) {
LeafMapping leafMapping = new LeafMapping(subExpression, initializerSubExpressions.get(0), operation1, operation2);
ref.addSubExpressionMapping(leafMapping);
boolean declarationMappingFound = false;
for(AbstractCodeMapping currentMapping : currentMappings) {
if(currentMapping.getFragment2().getVariableDeclarations().contains(declaration) &&
currentMapping.getFragment1().getVariableDeclaration(variable) != null) {
declarationMappingFound = true;
break;
}
}
processExtractVariableRefactoring(ref, refactorings);
checkForNestedExtractVariable(ref, refactorings, nonMappedLeavesT2, insideExtractedOrInlinedMethod);
if(identical()) {
identicalWithExtractedVariable = true;
if(!declarationMappingFound) {
ExtractVariableRefactoring ref = new ExtractVariableRefactoring(declaration, operation1, operation2, insideExtractedOrInlinedMethod);
List<LeafExpression> subExpressions = getFragment1().findExpression(replacement.getBefore());
for(LeafExpression subExpression : subExpressions) {
List<LeafExpression> initializerSubExpressions = statement.findExpression(initializer);
if(initializerSubExpressions.size() > 0) {
LeafMapping leafMapping = new LeafMapping(subExpression, initializerSubExpressions.get(0), operation1, operation2);
ref.addSubExpressionMapping(leafMapping);
}
}
processExtractVariableRefactoring(ref, refactorings);
checkForNestedExtractVariable(ref, refactorings, nonMappedLeavesT2, insideExtractedOrInlinedMethod);
if(identical()) {
identicalWithExtractedVariable = true;
}
return;
}
return;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1786,7 +1786,7 @@ public void addChildMapper(UMLOperationBodyMapper mapper) {
for(AbstractCodeFragment statement : getNonMappedLeavesT2()) {
for(AbstractCodeMapping mapping : mapper.getMappings()) {
int refactoringCount = mapping.getRefactorings().size();
mapping.temporaryVariableAssignment(statement, nonMappedLeavesT2, classDiff, parentMapper != null);
mapping.temporaryVariableAssignment(statement, nonMappedLeavesT2, classDiff, parentMapper != null, mappings);
if(refactoringCount < mapping.getRefactorings().size()) {
for(Refactoring newRefactoring : mapping.getRefactorings()) {
if(!this.refactorings.contains(newRefactoring)) {
Expand Down Expand Up @@ -2913,7 +2913,7 @@ private void temporaryVariableAssignment(AbstractCodeFragment statement, List<Ab
UMLAbstractClassDiff classDiff = this.classDiff != null ? this.classDiff : parentMapper != null ? parentMapper.classDiff : null;
for(AbstractCodeMapping mapping : getMappings()) {
int refactoringCount = mapping.getRefactorings().size();
mapping.temporaryVariableAssignment(statement, nonMappedLeavesT2, classDiff, parentMapper != null);
mapping.temporaryVariableAssignment(statement, nonMappedLeavesT2, classDiff, parentMapper != null, mappings);
if(refactoringCount < mapping.getRefactorings().size()) {
for(Refactoring newRefactoring : mapping.getRefactorings()) {
if(!this.refactorings.contains(newRefactoring)) {
Expand Down Expand Up @@ -3857,7 +3857,7 @@ else if(statement1.getLocationInfo().getCodeElementType().equals(CodeElementType
UMLAbstractClassDiff classDiff = this.classDiff != null ? this.classDiff : parentMapper != null ? parentMapper.classDiff : null;
for(AbstractCodeFragment leaf : leaves2) {
if(leaf.getLocationInfo().before(mapping.getFragment2().getLocationInfo())) {
mapping.temporaryVariableAssignment(leaf, leaves2, classDiff, parentMapper != null);
mapping.temporaryVariableAssignment(leaf, leaves2, classDiff, parentMapper != null, mappings);
if(mapping.isIdenticalWithExtractedVariable()) {
List<LambdaExpressionObject> lambdas1 = mapping.getFragment1().getLambdas();
List<LambdaExpressionObject> lambdas2 = leaf.getLambdas();
Expand Down Expand Up @@ -4200,7 +4200,7 @@ else if(statement1.getLocationInfo().getCodeElementType().equals(CodeElementType
UMLAbstractClassDiff classDiff = this.classDiff != null ? this.classDiff : parentMapper != null ? parentMapper.classDiff : null;
for(AbstractCodeFragment leaf : leaves2) {
if(leaf.getLocationInfo().before(mapping.getFragment2().getLocationInfo())) {
mapping.temporaryVariableAssignment(leaf, leaves2, classDiff, parentMapper != null);
mapping.temporaryVariableAssignment(leaf, leaves2, classDiff, parentMapper != null, mappings);
if(mapping.isIdenticalWithExtractedVariable()) {
List<LambdaExpressionObject> lambdas1 = mapping.getFragment1().getLambdas();
List<LambdaExpressionObject> lambdas2 = leaf.getLambdas();
Expand Down Expand Up @@ -5857,7 +5857,7 @@ private void extractInlineVariableAnalysis(List<? extends AbstractCodeFragment>
if(leaf.equals(leaf2)) {
break;
}
mapping.temporaryVariableAssignment(leaf, leaves2, classDiff, parentMapper != null);
mapping.temporaryVariableAssignment(leaf, leaves2, classDiff, parentMapper != null, mappings);
if(mapping.isIdenticalWithExtractedVariable()) {
List<LambdaExpressionObject> lambdas1 = mapping.getFragment1().getLambdas();
List<LambdaExpressionObject> lambdas2 = leaf.getLambdas();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ public void testAllRefactorings() throws Exception {
GitHistoryRefactoringMinerImpl detector = new GitHistoryRefactoringMinerImpl();
TestBuilder test = new TestBuilder(detector, REPOS, Refactorings.All.getValue());
RefactoringPopulator.feedRefactoringsInstances(Refactorings.All.getValue(), Systems.FSE.getValue(), test);
test.assertExpectationsWithGitHubAPI(12152, 20, 240);
test.assertExpectationsWithGitHubAPI(12150, 20, 240);
}
}
14 changes: 0 additions & 14 deletions src/test/resources/oracle/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -43846,20 +43846,6 @@
"validation": "FP",
"detectionTools": "GumTreeDiff",
"validators": null
}, {
"type": "Extract Variable",
"description": "Extract Variable query : String in method public memoryLeaksWhenCancelled() : void from class org.apache.drill.exec.server.TestDrillbitResilience",
"comment": null,
"validation": "TP",
"detectionTools": "RefactoringMiner",
"validators": null
}, {
"type": "Extract Variable",
"description": "Extract Variable query : String in method public memoryLeaksWhenFailed() : void from class org.apache.drill.exec.server.TestDrillbitResilience",
"comment": null,
"validation": "TP",
"detectionTools": "RefactoringMiner",
"validators": null
}, {
"type": "Change Attribute Type",
"description": "Change Attribute Type logger : Logger to REPEAT_RULE : TestRule in class org.apache.drill.test.DrillTest",
Expand Down
2 changes: 1 addition & 1 deletion src/test/resources/oracle/expected.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ ffae1691c0cd526ed1095fbabbc0855d016790d7, 52, 0, 0
8815eb7d947be6d2a0281c15a3a60d8ba040db95, 15, 0, 0
b2bbd9941be6b132a83d27c0ae02c935e1dec5dd, 33, 0, 2
f1b8ae1c44e6ba46118c2f66eae1725259acdccc, 7, 0, 0
00aa01fb90f3210d1e3027d7f759fb1085b814bd, 62, 0, 5
00aa01fb90f3210d1e3027d7f759fb1085b814bd, 60, 0, 5
658a918eebcbdeb4f920c2947ca8d0e79ad86d89, 1, 0, 0
c1b847acdc8cb90a1498b236b3bb5c81ca75c044, 74, 0, 3
35893c115ba23bd62a7036a33390420f074ce660, 19, 0, 0
Expand Down

0 comments on commit ca0d560

Please sign in to comment.