package cn.bran.japid.compiler;
import java.util.ArrayList;
import java.util.List;
public class Tag {
static final String ROOT_TAGNAME = "_root";
public String tagName;
public int startLine;
public boolean hasBody; // tga invoke with a body part
// bran: put everything in the args tag in it
public String callbackArgs = null;
// public StringBuffer bodyBuffer = new StringBuffer(2000);
// each line contains a line of text in the body of a tag scope.
List<String> bodyTextList = new ArrayList<String>();
{
bodyTextList.add("");
}
public String innerClassName;
public String args = "";
public int tagIndex;
// null == not named args
List<NamedArg> namedArgs = null;
public String getBodyText() {
if (!hasBody)
return null;
StringBuffer sb = new StringBuffer(2000);
for (String s : bodyTextList) {
sb.append(s).append('\n');
}
String string = sb.toString();
return string.substring(0, string.length() - 1);
}
public String getTagVarName() {
return "_" + tagName.replace('.', '_').replace('/', '_') + tagIndex;
}
public String getBodyVar() {
return getTagVarName() + "DoBody";
}
@Override
public String toString() {
return tagName;
}
public boolean isRoot() {
return tagName.equals(ROOT_TAGNAME);
}
public static class TagIf extends Tag {
public TagIf(String expr, int line) {
super();
args = expr;
tagName = "if";
super.startLine = line;
hasBody = true;
}
}
/**
* the `def, `set tag that end up as methods thus a new scope for tags inside
* @author Bing Ran<bing_ran@hotmail.com>
*
*/
public static class TagInTag extends Tag {
public List<Tag> tags = new ArrayList<Tag>();
}
/**
* the def tag
* @author Bing Ran<bing_ran@hotmail.com>
*
*/
public static class TagDef extends TagInTag {
public TagDef() {
super();
tagName = "def";
hasBody = true;
}
}
/**
* the set tag
* @author Bing Ran<bing_ran@hotmail.com>
*
*/
public static class TagSet extends TagInTag {
public TagSet() {
super();
tagName = "set";
}
}
public boolean argsNamed() {
return (namedArgs != null && namedArgs.size() > 0);
}
}