diff --git a/src/main/java/gr/uom/java/xmi/decomposition/AbstractCall.java b/src/main/java/gr/uom/java/xmi/decomposition/AbstractCall.java index c495cb1ed8..b7210d0a66 100644 --- a/src/main/java/gr/uom/java/xmi/decomposition/AbstractCall.java +++ b/src/main/java/gr/uom/java/xmi/decomposition/AbstractCall.java @@ -723,11 +723,11 @@ public boolean methodNameContainsArgumentName() { return false; } - private boolean onlyArgumentsChanged(AbstractCall call, Set replacements, Map parameterToArgumentMap) { + private boolean onlyArgumentsChanged(AbstractCall call, Set replacements, Map parameterToArgumentMap, boolean varArgsParameter) { return identicalExpression(call, replacements, parameterToArgumentMap) && identicalName(call) && !equalArguments(call) && - arguments().size() != call.arguments().size(); + (arguments().size() != call.arguments().size() || varArgsParameter); } public boolean identicalWithOnlyChangesInAnonymousClassArguments(AbstractCall call, Set replacements, Map parameterToArgumentMap) { @@ -737,8 +737,8 @@ public boolean identicalWithOnlyChangesInAnonymousClassArguments(AbstractCall ca equalArgumentsExceptForAnonymousClassArguments(call); } - public boolean identicalWithMergedArguments(AbstractCall call, Set replacements, Map parameterToArgumentMap) { - if(onlyArgumentsChanged(call, replacements, parameterToArgumentMap)) { + public boolean identicalWithMergedArguments(AbstractCall call, Set replacements, Map parameterToArgumentMap, boolean varArgsParameter) { + if(onlyArgumentsChanged(call, replacements, parameterToArgumentMap, varArgsParameter)) { List updatedArguments1 = new ArrayList(this.arguments); Map> commonVariableReplacementMap = new LinkedHashMap>(); for(Replacement replacement : replacements) { @@ -782,8 +782,8 @@ public boolean identicalWithMergedArguments(AbstractCall call, Set return false; } - public boolean identicalWithDifferentNumberOfArguments(AbstractCall call, Set replacements, Map parameterToArgumentMap) { - if(onlyArgumentsChanged(call, replacements, parameterToArgumentMap)) { + public boolean identicalWithDifferentNumberOfArguments(AbstractCall call, Set replacements, Map parameterToArgumentMap, boolean varArgsParameter) { + if(onlyArgumentsChanged(call, replacements, parameterToArgumentMap, varArgsParameter)) { int argumentIntersectionSize = argumentIntersectionSize(call, replacements, parameterToArgumentMap); if(argumentIntersectionSize > 0 || arguments().size() == 0 || call.arguments().size() == 0) { return true; diff --git a/src/main/java/gr/uom/java/xmi/decomposition/ReplacementAlgorithm.java b/src/main/java/gr/uom/java/xmi/decomposition/ReplacementAlgorithm.java index f0f8dd4c25..75780bff59 100644 --- a/src/main/java/gr/uom/java/xmi/decomposition/ReplacementAlgorithm.java +++ b/src/main/java/gr/uom/java/xmi/decomposition/ReplacementAlgorithm.java @@ -2151,11 +2151,12 @@ else if(!variableDeclarations1.get(0).getVariableName().equals(variableDeclarati } } //method invocation has only changes in the arguments (different number of arguments) + boolean varArgsParameter = container1.hasVarargsParameter() || container2.hasVarargsParameter(); if(invocationCoveringTheEntireStatement1 != null && invocationCoveringTheEntireStatement2 != null) { - if(invocationCoveringTheEntireStatement1.identicalWithMergedArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap)) { + if(invocationCoveringTheEntireStatement1.identicalWithMergedArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap, varArgsParameter)) { return replacementInfo.getReplacements(); } - else if(invocationCoveringTheEntireStatement1.identicalWithDifferentNumberOfArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap)) { + else if(invocationCoveringTheEntireStatement1.identicalWithDifferentNumberOfArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap, varArgsParameter)) { Replacement replacement = new MethodInvocationReplacement(invocationCoveringTheEntireStatement1.actualString(), invocationCoveringTheEntireStatement2.actualString(), invocationCoveringTheEntireStatement1, invocationCoveringTheEntireStatement2, ReplacementType.METHOD_INVOCATION_ARGUMENT); replacementInfo.addReplacement(replacement); @@ -2179,10 +2180,10 @@ else if(invocationCoveringTheEntireStatement1.inlinedStatementBecomesAdditionalA if(!methodInvocations1.isEmpty() && invocationCoveringTheEntireStatement2 != null) { for(String methodInvocation1 : methodInvocations1) { for(AbstractCall operationInvocation1 : methodInvocationMap1.get(methodInvocation1)) { - if(operationInvocation1.identicalWithMergedArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap)) { + if(operationInvocation1.identicalWithMergedArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap, varArgsParameter)) { return replacementInfo.getReplacements(); } - else if(operationInvocation1.identicalWithDifferentNumberOfArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap)) { + else if(operationInvocation1.identicalWithDifferentNumberOfArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap, varArgsParameter)) { Replacement replacement = new MethodInvocationReplacement(operationInvocation1.actualString(), invocationCoveringTheEntireStatement2.actualString(), operationInvocation1, invocationCoveringTheEntireStatement2, ReplacementType.METHOD_INVOCATION_ARGUMENT); replacementInfo.addReplacement(replacement); @@ -2724,7 +2725,7 @@ else if(invocationCoveringTheEntireStatement2.getExpression() != null && invocat } //object creation has only changes in the arguments if(creationCoveringTheEntireStatement1 != null && creationCoveringTheEntireStatement2 != null) { - if(creationCoveringTheEntireStatement1.identicalWithMergedArguments(creationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap)) { + if(creationCoveringTheEntireStatement1.identicalWithMergedArguments(creationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap, varArgsParameter)) { return replacementInfo.getReplacements(); } else if(creationCoveringTheEntireStatement1.reorderedArguments(creationCoveringTheEntireStatement2)) { @@ -2733,7 +2734,7 @@ else if(creationCoveringTheEntireStatement1.reorderedArguments(creationCoveringT replacementInfo.addReplacement(replacement); return replacementInfo.getReplacements(); } - else if(creationCoveringTheEntireStatement1.identicalWithDifferentNumberOfArguments(creationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap)) { + else if(creationCoveringTheEntireStatement1.identicalWithDifferentNumberOfArguments(creationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap, varArgsParameter)) { Replacement replacement = new ObjectCreationReplacement(creationCoveringTheEntireStatement1.actualString(), creationCoveringTheEntireStatement2.actualString(), creationCoveringTheEntireStatement1, creationCoveringTheEntireStatement2, ReplacementType.CLASS_INSTANCE_CREATION_ARGUMENT); replacementInfo.addReplacement(replacement); @@ -2795,7 +2796,7 @@ else if(creationCoveringTheEntireStatement1.inlinedStatementBecomesAdditionalArg if(!creations1.isEmpty() && creationCoveringTheEntireStatement2 != null) { for(String creation1 : creations1) { for(AbstractCall objectCreation1 : creationMap1.get(creation1)) { - if(objectCreation1.identicalWithMergedArguments(creationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap)) { + if(objectCreation1.identicalWithMergedArguments(creationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap, varArgsParameter)) { return replacementInfo.getReplacements(); } else if(objectCreation1.reorderedArguments(creationCoveringTheEntireStatement2)) { @@ -2804,7 +2805,7 @@ else if(objectCreation1.reorderedArguments(creationCoveringTheEntireStatement2)) replacementInfo.addReplacement(replacement); return replacementInfo.getReplacements(); } - else if(objectCreation1.identicalWithDifferentNumberOfArguments(creationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap)) { + else if(objectCreation1.identicalWithDifferentNumberOfArguments(creationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap, varArgsParameter)) { Replacement replacement = new ObjectCreationReplacement(objectCreation1.actualString(), creationCoveringTheEntireStatement2.actualString(), (ObjectCreation)objectCreation1, creationCoveringTheEntireStatement2, ReplacementType.CLASS_INSTANCE_CREATION_ARGUMENT); replacementInfo.addReplacement(replacement); @@ -4899,6 +4900,7 @@ private static boolean processAnonymous(AbstractCodeFragment statement1, Abstrac UMLOperationBodyMapper operationBodyMapper) throws RefactoringMinerTimedOutException { VariableDeclarationContainer container1 = operationBodyMapper.getContainer1(); VariableDeclarationContainer container2 = operationBodyMapper.getContainer2(); + boolean varArgsParameter = container1.hasVarargsParameter() || container2.hasVarargsParameter(); UMLAbstractClassDiff classDiff = operationBodyMapper.getClassDiff(); UMLModelDiff modelDiff = operationBodyMapper.getModelDiff(); UMLOperationBodyMapper parentMapper = operationBodyMapper.getParentMapper(); @@ -4911,8 +4913,8 @@ private static boolean processAnonymous(AbstractCodeFragment statement1, Abstrac (onlyDifferentInvoker(statementWithoutAnonymous1, statementWithoutAnonymous2, invocationCoveringTheEntireStatement1, invocationCoveringTheEntireStatement2) || invocationCoveringTheEntireStatement1.identical(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap, lambdaMappers) || invocationCoveringTheEntireStatement1.identicalWithOnlyChangesInAnonymousClassArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap) || - invocationCoveringTheEntireStatement1.identicalWithMergedArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap) || - invocationCoveringTheEntireStatement1.identicalWithDifferentNumberOfArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap) || + invocationCoveringTheEntireStatement1.identicalWithMergedArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap, varArgsParameter) || + invocationCoveringTheEntireStatement1.identicalWithDifferentNumberOfArguments(invocationCoveringTheEntireStatement2, replacementInfo.getReplacements(), parameterToArgumentMap, varArgsParameter) || invocationCoveringTheEntireStatement1.makeReplacementForReturnedArgument(replacementInfo.getArgumentizedString2()) != null || (invocationCoveringTheEntireStatement1 instanceof ObjectCreation && invocationCoveringTheEntireStatement2 instanceof ObjectCreation && invocationCoveringTheEntireStatement1.identicalName(invocationCoveringTheEntireStatement2))))) { UMLAnonymousClass anonymousClass1 = operationBodyMapper.findAnonymousClass1(anonymousClassDeclaration1);