/***** BEGIN LICENSE BLOCK *****
* Version: CPL 1.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Common Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.eclipse.org/legal/cpl-v10.html
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* Copyright (C) 2006 Lukas Felber <lfelber@hsr.ch>
* Copyright (C) 2006 Mirko Stocker <me@misto.ch>
* Copyright (C) 2006 Thomas Corbat <tcorbat@hsr.ch>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the CPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the CPL, the GPL or the LGPL.
***** END LICENSE BLOCK *****/
package org.rubypeople.rdt.refactoring.nodewrapper;
import java.util.ArrayList;
import java.util.Collection;
import org.jruby.ast.DAsgnNode;
import org.jruby.ast.DVarNode;
import org.jruby.ast.LocalAsgnNode;
import org.jruby.ast.LocalVarNode;
import org.jruby.ast.Node;
import org.rubypeople.rdt.refactoring.core.NodeProvider;
import org.rubypeople.rdt.refactoring.util.NodeUtil;
public class LocalNodeWrapper implements INodeWrapper {
public static final int INVALID_ID = -1;
public static final int LOCAL_ASGN_VAR_NODE = 1;
public static final int LOCAL_VAR_NODE = 2;
public static final int D_VAR_NODE = 3;
public static final int D_ASGN_NODE = 4;
public static final Class[] LOCAL_NODES_CLASSES = { LocalAsgnNode.class, LocalVarNode.class, DVarNode.class, DAsgnNode.class };
private Node wrappedNode;
private int nodeType;
private Node valueNode;
private String name;
private int id; // aka count
public LocalNodeWrapper(Node node) {
id = INVALID_ID;
if (NodeUtil.nodeAssignableFrom(node, LocalVarNode.class)) {
id = ((LocalVarNode) node).getIndex();
name = ((LocalVarNode) node).getName();
nodeType = LOCAL_VAR_NODE;
} else if (NodeUtil.nodeAssignableFrom(node, LocalAsgnNode.class)) {
LocalAsgnNode localAsgnNode = (LocalAsgnNode) node;
id = localAsgnNode.getIndex();
name = localAsgnNode.getName();
nodeType = LOCAL_ASGN_VAR_NODE;
valueNode = localAsgnNode.getValueNode();
} else if (NodeUtil.nodeAssignableFrom(node, DAsgnNode.class)) {
DAsgnNode dAsgnNode = (DAsgnNode) node;
name = dAsgnNode.getName();
nodeType = D_ASGN_NODE;
valueNode = dAsgnNode.getValueNode();
} else if (NodeUtil.nodeAssignableFrom(node, DVarNode.class)) {
DVarNode dVarNode = (DVarNode) node;
name = dVarNode.getName();
nodeType = D_VAR_NODE;
}
wrappedNode = node;
}
public Node getWrappedNode() {
return wrappedNode;
}
public boolean hasValidId() {
return id != INVALID_ID;
}
public int getId() {
return id;
}
public int getNodeType() {
return nodeType;
}
public Node getValueNode() {
return valueNode;
}
public boolean hasValueNode() {
return valueNode != null;
}
public boolean hasName() {
return name != null;
}
public String getName() {
return name;
}
public boolean isAsgnNode() {
return nodeType == LOCAL_ASGN_VAR_NODE || nodeType == D_ASGN_NODE;
}
public boolean isDVarNode() {
return nodeType == D_VAR_NODE || nodeType == D_ASGN_NODE;
}
public void setName(String name) {
if (nodeType != LOCAL_VAR_NODE) {
this.name = name;
}
if (NodeUtil.nodeAssignableFrom(wrappedNode, LocalVarNode.class)) {
LocalVarNode localVarNode = (LocalVarNode) wrappedNode;
localVarNode.setName(name);
} else if (NodeUtil.nodeAssignableFrom(wrappedNode, LocalAsgnNode.class)) {
LocalAsgnNode localAsgnNode = (LocalAsgnNode) wrappedNode;
localAsgnNode.setName(name);
} else if (NodeUtil.nodeAssignableFrom(wrappedNode, DAsgnNode.class)) {
DAsgnNode dAsgnNode = (DAsgnNode) wrappedNode;
dAsgnNode.setName(name);
} else if (NodeUtil.nodeAssignableFrom(wrappedNode, DVarNode.class)) {
DVarNode dVarNode = (DVarNode) wrappedNode;
dVarNode.setName(name);
}
}
public static String getLocalNodeName(LocalNodeWrapper node) {
return node.getName();
}
public static Collection<LocalNodeWrapper> gatherLocalNodes(Node baseNode) {
return gatherLocalNodes(baseNode, LOCAL_NODES_CLASSES);
}
public static Collection<LocalNodeWrapper> gatherLocalVarNodes(Node baseNode) {
return gatherLocalNodes(baseNode, DVarNode.class, LocalVarNode.class);
}
public static Collection<LocalNodeWrapper> gatherLocalAsgnNodes(Node baseNode) {
return gatherLocalNodes(baseNode, DAsgnNode.class, LocalAsgnNode.class);
}
private static Collection<LocalNodeWrapper> gatherLocalNodes(Node baseNode, Class... klasses) {
Collection<LocalNodeWrapper> localNodes = new ArrayList<LocalNodeWrapper>();
for (Node aktNode : NodeProvider.getSubNodes(baseNode, klasses)) {
localNodes.add(new LocalNodeWrapper(aktNode));
}
return localNodes;
}
public static Collection<LocalNodeWrapper> createLocalNodes(Collection<Node> nodes) {
Collection<LocalNodeWrapper> localNodes = new ArrayList<LocalNodeWrapper>();
for (Node aktNode : nodes) {
if (NodeUtil.nodeAssignableFrom(aktNode, LOCAL_NODES_CLASSES)) {
localNodes.add(new LocalNodeWrapper(aktNode));
}
}
return localNodes;
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((wrappedNode == null) ? 0 : wrappedNode.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof LocalNodeWrapper) {
LocalNodeWrapper localNode = (LocalNodeWrapper) obj;
return localNode.getWrappedNode().equals(getWrappedNode());
}
return false;
}
}