package monolipse.core.compiler;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
public class OutlineNode {
public static final OutlineNode[] NO_CHILDREN = new OutlineNode[0];
public static final String INTERFACE = "InterfaceDefinition";
public static final String PROTECTED_INTERFACE = "Protected_InterfaceDefinition";
public static final String PRIVATE_INTERFACE = "Private_InterfaceDefinition";
public static final String INTERNAL_INTERFACE = "Internal_InterfaceDefinition";
public static final String CLASS = "ClassDefinition";
public static final String PROTECTED_CLASS = "Protected_ClassDefinition";
public static final String PRIVATE_CLASS = "Private_ClassDefinition";
public static final String INTERNAL_CLASS = "Internal_ClassDefinition";
public static final String METHOD = "Method";
public static final String PROTECTED_METHOD = "Protected_Method";
public static final String PRIVATE_METHOD = "Private_Method";
public static final String INTERNAL_METHOD = "Internal_Method";
public static final String PROPERTY = "Property";
public static final String PROTECTED_PROPERTY = "Protected_Property";
public static final String PRIVATE_PROPERTY = "Private_Property";
public static final String INTERNAL_PROPERTY = "Internal_Property";
public static final String FIELD = "Field";
public static final String PROTECTED_FIELD = "Protected_Field";
public static final String PRIVATE_FIELD = "Private_Field";
public static final String INTERNAL_FIELD = "Internal_Field";
public static final String ENUM = "EnumDefinition";
public static final String PROTECTED_ENUM = "ProtectedEnumDefinition";
public static final String PRIVATE_ENUM = "PrivateEnumDefinition";
public static final String INTERNAL_ENUM = "InternalEnumDefinition";
public static final String CONSTRUCTOR = "Constructor";
public static final String CALLABLE = "CallableDefinition";
public static final String STRUCT = "StructDefinition";
public static final String EVENT = "Event";
public static final String NAMESPACE = "Namespace";
public static final String IMPORT_COLLECTION = "ImportCollection";
public static final String IMPORT = "Import";
public static final String MACRO = "MacroStatement";
private String _name;
private ArrayList<OutlineNode> _children;
private OutlineNode _parent;
private String _type;
private int _startline;
private String _visibility = "";
private int _endline;
public OutlineNode() {
}
private OutlineNode(OutlineNode parent) {
_parent = parent;
}
public OutlineNode create() {
OutlineNode child = new OutlineNode(this);
add(child);
return child;
}
private void add(OutlineNode child) {
if (null == _children) _children = new ArrayList<OutlineNode>();
_children.add(child);
}
private int sortNode(OutlineNode p1, OutlineNode p2) {
int index1 = getSortIndex(p1.type());
int index2 = getSortIndex(p2.type());
return index1 < index2 ? -1 : (index1 > index2 ? 1 : p1.name().compareTo(p2.name()));
}
private int getSortIndex(String type) {
HashMap<String, Integer> mapping = new HashMap<String, Integer>();
mapping.put("ImportCollection", 0);
mapping.put("Import", 0);
mapping.put("InterfaceDefinition", 1);
mapping.put("Protected_InterfaceDefinition", 1);
mapping.put("Private_InterfaceDefinition", 1);
mapping.put("Internal_InterfaceDefinition", 1);
mapping.put("ClassDefinition", 2);
mapping.put("Protected_ClassDefinition", 2);
mapping.put("Private_ClassDefinition", 2);
mapping.put("Internal_ClassDefinition", 2);
mapping.put("Event", 3);
mapping.put("CallableDefinition", 4);
mapping.put("StructDefinition", 5);
mapping.put("EnumDefinition", 6);
mapping.put("ProtectedEnumDefinition", 6);
mapping.put("PrivateEnumDefinition", 6);
mapping.put("InternalEnumDefinition", 6);
mapping.put("Field", 7);
mapping.put("Protected_Field", 7);
mapping.put("Private_Field", 7);
mapping.put("Internal_Field", 7);
mapping.put("Property", 8);
mapping.put("Protected_Property", 8);
mapping.put("Private_Property", 8);
mapping.put("Internal_Property", 8);
mapping.put("Constructor", 9);
mapping.put("Method", 10);
mapping.put("Protected_Method", 10);
mapping.put("Private_Method", 10);
mapping.put("Internal_Method", 10);
return (mapping.containsKey(type) ? mapping.get(type) : 100);
}
public OutlineNode parent() {
return _parent;
}
public OutlineNode[] children() {
if (null == _children) return NO_CHILDREN;
OutlineNode[] result = _children.toArray(new OutlineNode[_children.size()]);
Arrays.sort(result, new Comparator<OutlineNode>() {
public int compare(OutlineNode o1, OutlineNode o2) {
return sortNode(o1, o2);
}
});
return result;
}
public String name() {
return _name;
}
public void name(String name) {
_name = name;
}
public void type(String type) {
_type = type;
}
public String type() {
return _type;
}
public int startLine() {
return _startline;
}
public void startLine(int line) {
_startline = line;
}
public int endLine() {
return _endline;
}
public void endLine(int endline) {
_endline = endline;
}
public void visibility(String visibilty) {
_visibility = visibilty;
}
public String visibility() {
return _visibility;
}
public interface Visitor {
boolean visit(OutlineNode node);
}
public boolean accept(Visitor visitor) {
if (!visitor.visit(this))
return false;
if (null != _children)
for (OutlineNode child : _children)
if (!child.accept(visitor))
return false;
return true;
}
}