diff --git a/src/main/java/gr/uom/java/xmi/decomposition/AbstractCodeMapping.java b/src/main/java/gr/uom/java/xmi/decomposition/AbstractCodeMapping.java index a18f3e19bc..1d17abfca4 100644 --- a/src/main/java/gr/uom/java/xmi/decomposition/AbstractCodeMapping.java +++ b/src/main/java/gr/uom/java/xmi/decomposition/AbstractCodeMapping.java @@ -452,7 +452,7 @@ else if(replacement.getBefore().equals(rightHandSide)) { } public void temporaryVariableAssignment(AbstractCodeFragment statement, - List nonMappedLeavesT2, UMLAbstractClassDiff classDiff, boolean insideExtractedOrInlinedMethod) { + List nonMappedLeavesT2, UMLAbstractClassDiff classDiff, boolean insideExtractedOrInlinedMethod, Set currentMappings) { for(VariableDeclaration declaration : statement.getVariableDeclarations()) { String variableName = declaration.getVariableName(); AbstractExpression initializer = declaration.getInitializer(); @@ -659,21 +659,31 @@ else if(stringConcatMatch(initializer, before)) { List variableDeclarations = operation2.getVariableDeclarationsInScope(fragment2.getLocationInfo()); for(VariableDeclaration declaration : variableDeclarations) { if(declaration.getVariableName().equals(variable)) { - ExtractVariableRefactoring ref = new ExtractVariableRefactoring(declaration, operation1, operation2, insideExtractedOrInlinedMethod); - List subExpressions = getFragment1().findExpression(replacement.getBefore()); - for(LeafExpression subExpression : subExpressions) { - List 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 subExpressions = getFragment1().findExpression(replacement.getBefore()); + for(LeafExpression subExpression : subExpressions) { + List 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; } } } diff --git a/src/main/java/gr/uom/java/xmi/decomposition/UMLOperationBodyMapper.java b/src/main/java/gr/uom/java/xmi/decomposition/UMLOperationBodyMapper.java index 6568397465..feb4b5117f 100644 --- a/src/main/java/gr/uom/java/xmi/decomposition/UMLOperationBodyMapper.java +++ b/src/main/java/gr/uom/java/xmi/decomposition/UMLOperationBodyMapper.java @@ -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)) { @@ -2913,7 +2913,7 @@ private void temporaryVariableAssignment(AbstractCodeFragment statement, List lambdas1 = mapping.getFragment1().getLambdas(); List lambdas2 = leaf.getLambdas(); @@ -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 lambdas1 = mapping.getFragment1().getLambdas(); List lambdas2 = leaf.getLambdas(); @@ -5857,7 +5857,7 @@ private void extractInlineVariableAnalysis(List if(leaf.equals(leaf2)) { break; } - mapping.temporaryVariableAssignment(leaf, leaves2, classDiff, parentMapper != null); + mapping.temporaryVariableAssignment(leaf, leaves2, classDiff, parentMapper != null, mappings); if(mapping.isIdenticalWithExtractedVariable()) { List lambdas1 = mapping.getFragment1().getLambdas(); List lambdas2 = leaf.getLambdas(); diff --git a/src/test/java/org/refactoringminer/test/TestAllRefactorings.java b/src/test/java/org/refactoringminer/test/TestAllRefactorings.java index a65707ac15..1eff9af597 100644 --- a/src/test/java/org/refactoringminer/test/TestAllRefactorings.java +++ b/src/test/java/org/refactoringminer/test/TestAllRefactorings.java @@ -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); } } diff --git a/src/test/resources/oracle/data.json b/src/test/resources/oracle/data.json index 4628ed87f1..eb61b399c0 100644 --- a/src/test/resources/oracle/data.json +++ b/src/test/resources/oracle/data.json @@ -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", diff --git a/src/test/resources/oracle/expected.txt b/src/test/resources/oracle/expected.txt index 80a8c7554c..98b434dc6d 100644 --- a/src/test/resources/oracle/expected.txt +++ b/src/test/resources/oracle/expected.txt @@ -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