/**
* Copyright (c) 2008 Aptana, Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl -v10.html. If redistributing this code,
* this entire header must remain intact.
*/
package org.rubypeople.rdt.refactoring.core.pullup;
import java.util.ArrayList;
import java.util.Collection;
import org.jruby.ast.BlockNode;
import org.jruby.ast.Node;
import org.rubypeople.rdt.refactoring.core.NodeFactory;
import org.rubypeople.rdt.refactoring.editprovider.InsertEditProvider;
import org.rubypeople.rdt.refactoring.nodewrapper.ClassNodeWrapper;
import org.rubypeople.rdt.refactoring.nodewrapper.MethodNodeWrapper;
import org.rubypeople.rdt.refactoring.offsetprovider.ConstructorOffsetProvider;
import org.rubypeople.rdt.refactoring.offsetprovider.IOffsetProvider;
import org.rubypeople.rdt.refactoring.offsetprovider.MethodOffsetProvider;
public class UpPulledMethods extends InsertEditProvider {
private Collection<MethodNodeWrapper> methodNodes;
private boolean constructors;
private ClassNodeWrapper classNode;
public UpPulledMethods(Collection<MethodNodeWrapper> methodNodes, ClassNodeWrapper classNode, boolean constructors) {
super(true);
this.methodNodes = methodNodes;
this.constructors = constructors;
this.classNode = classNode;
}
@Override
protected BlockNode getInsertNode(int offset, String document) {
boolean needsNewLineAtEndOfBlock = lastEditInGroup && !isNextLineEmpty(offset, document);
return NodeFactory.createBlockNode(needsNewLineAtEndOfBlock, getMethodNodes(methodNodes));
}
private Node[] getMethodNodes(Collection<MethodNodeWrapper> nodeCollection) {
Collection<Node> nodes = new ArrayList<Node>();
boolean first = true;
for (MethodNodeWrapper methodNode : nodeCollection) {
if (first) {
first = false;
} else {
nodes.add(NodeFactory.createNewLineNode(null));
}
nodes.add(NodeFactory.createNewLineNode(methodNode.getWrappedNode()));
}
return nodes.toArray(new Node[nodes.size()]);
}
@Override
protected int getOffset(String document) {
IOffsetProvider offsetProvider;
if (constructors) {
offsetProvider = new ConstructorOffsetProvider(classNode, document);
} else {
offsetProvider = new MethodOffsetProvider(classNode, document);
}
return offsetProvider.getOffset();
}
}