FunctionDeclaration functionDec = ast.newFunctionDeclaration(ast.newIdentifier(fMethodName), computeArguments(ast), extractedMethodBody, false);
method.setModifier(fModifierAccessFlag);
method.setFunction(functionDec);
ASTRewrite rewriter = ASTRewrite.create(ast);
ListRewrite classListRewrite = rewriter.getListRewrite( fCoveringDeclarationFinder.getCoveringClassDeclaration().getBody(), Block.STATEMENTS_PROPERTY);
VariableBase dispatcher = ast.newVariable(THIS_VARIABLE_NAME);
FunctionInvocation calledExtractedMethod = ast.newFunctionInvocation(ast.newFunctionName(ast.newIdentifier(fMethodName)), computeParameters(ast));
MethodInvocation inlineMethodCall = ast.newMethodInvocation(dispatcher, calledExtractedMethod);
List<List<ASTNode>> Occurences = new ArrayList<List<ASTNode>>();
if(fReplaceDuplicates) {
for(Match replace : fDuplicates) {
Occurences.add(Arrays.asList(replace.getNodes()));
}
} else {
Occurences.add(fSelectedNodesFinder.getNodes());
}
boolean createdMethodBody = false;
TextEditGroup inlineReplacementEditGroup = inlineReplacementEdit;
for(List<ASTNode> selectedNodeOccurence : Occurences) {
// this is also an indicator, whether this loop was already gone through
if(createdMethodBody) {
inlineReplacementEditGroup = additionalInlineReplacementEdit;
}
ASTNode parent = selectedNodeOccurence.get(0).getParent();
inlineMethodCall = ASTNode.copySubtree(ast, inlineMethodCall);
ListRewrite lrw;
if(parent instanceof Block) {
if(!createdMethodBody) {
extractedMethodBody.statements().addAll(ASTNode.copySubtrees(ast, selectedNodeOccurence));
addReturnStatement(ast, extractedMethodBody, fReturnStatement);
createdMethodBody = true;
}
lrw = rewriter.getListRewrite(parent, Block.STATEMENTS_PROPERTY);
ExpressionStatement inlineReplacement;
if (fReturnStatement != null) {
inlineReplacement = ast.newExpressionStatement(ast.newAssignment(
ast.newVariable(fReturnStatement.getParameterName()),
Assignment.OP_EQUAL, inlineMethodCall));
} else {
inlineReplacement = ast.newExpressionStatement(inlineMethodCall);
}
lrw.replace(selectedNodeOccurence.get(0),inlineReplacement, inlineReplacementEditGroup);
for (int i = 1; i < selectedNodeOccurence.size(); ++i) {
lrw.remove(selectedNodeOccurence.get(i), inlineReplacementEditGroup);
}
} else {
if(!createdMethodBody) {
addReturnStatement(ast, extractedMethodBody, ASTNode.copySubtree(ast, selectedNodeOccurence.get(0)));
createdMethodBody = true;
}
rewriter.replace( selectedNodeOccurence.get(0), inlineMethodCall, inlineReplacementEditGroup);
}
}
classListRewrite.insertAfter(method, fCoveringDeclarationFinder.getCoveringMethodDeclaration(), newMethodEdit);
TextEdit fullDocumentEdit = rewriter.rewriteAST(document, null);
anotherChange.addEdit(fullDocumentEdit);
return anotherChange;
}