package org.netbeans.modules.ruby.elements;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import org.jrubyparser.ast.DefnNode;
import org.jrubyparser.ast.DefsNode;
import org.jrubyparser.ast.MethodDefNode;
import org.jrubyparser.ast.Node;
import org.netbeans.modules.csl.api.ElementKind;
import org.netbeans.modules.csl.api.Modifier;
import org.netbeans.modules.csl.spi.ParserResult;
import org.netbeans.modules.ruby.AstUtilities;
public class AstMethodElement extends AstElement implements MethodElement {
private List<String> parameters;
private Modifier access = Modifier.PUBLIC;
public AstMethodElement(ParserResult info, Node node) {
super(info, node);
}
public List<String> getParameters() {
if (parameters == null) {
parameters = AstUtilities.getDefArgs((MethodDefNode)node, false);
if (parameters == null) {
parameters = Collections.emptyList();
}
}
return parameters;
}
public boolean isDeprecated() {
// XXX TODO: When wrapping java objects I guess these functions -could- be deprecated, right?
return false;
}
@Override
public String getName() {
if (name == null) {
if (node instanceof DefnNode) {
name = ((DefnNode)node).getName();
} else if (node instanceof DefsNode) {
name = ((DefsNode)node).getName();
}
if (name == null) {
name = node.toString();
}
}
return name;
}
public void setModifiers(Set<Modifier> modifiers) {
this.modifiers = modifiers;
}
@Override
public Set<Modifier> getModifiers() {
if (modifiers == null) {
if (node instanceof DefsNode) {
modifiers = EnumSet.of(Modifier.STATIC, access);
} else {
modifiers = EnumSet.of(access);
}
}
return modifiers;
}
public void setAccess(Modifier access) {
this.access = access;
if (modifiers != null && modifiers.contains(Modifier.STATIC)) {
modifiers = EnumSet.of(Modifier.STATIC, access);
} else {
modifiers = null;
}
}
@Override
public ElementKind getKind() {
if ("initialize".equals(getName()) || "new".equals(getName())) {
return ElementKind.CONSTRUCTOR;
} else {
return ElementKind.METHOD;
}
}
/**
* @todo Compute answer
*/
public boolean isTopLevel() {
return false;
}
/**
* @todo Compute answer
*/
public boolean isInherited() {
return false;
}
}