use of lucee.transformer.Position in project Lucee by lucee.
the class AbstrCFMLScriptTransformer method doStatement.
/**
* Liest ein do Statement ein.
* <br />
* EBNF:<br />
* <code>block spaces "while" spaces "(" spaces condition spaces ")";</code>
* @return do Statement
* @throws TemplateException
*/
private final DoWhile doStatement(ExprData data) throws TemplateException {
int pos = data.srcCode.getPos();
// id
String id = variableDec(data, false);
if (id == null) {
data.srcCode.setPos(pos);
return null;
}
if (id.equalsIgnoreCase("do")) {
id = null;
if (!data.srcCode.isCurrent('{') && !data.srcCode.isCurrent(' ') && !data.srcCode.isCurrent('/')) {
data.srcCode.setPos(pos);
return null;
}
} else {
data.srcCode.removeSpace();
if (!data.srcCode.forwardIfCurrent(':')) {
data.srcCode.setPos(pos);
return null;
}
data.srcCode.removeSpace();
if (!data.srcCode.forwardIfCurrent("do", '{') && !data.srcCode.forwardIfCurrent("do ") && !data.srcCode.forwardIfCurrent("do", '/')) {
data.srcCode.setPos(pos);
return null;
}
data.srcCode.previous();
}
// if(!data.srcCode.forwardIfCurrent("do",'{') && !data.srcCode.forwardIfCurrent("do ") && !data.srcCode.forwardIfCurrent("do",'/'))
// return null;
Position line = data.srcCode.getPosition();
Body body = new BodyBase(data.factory);
// data.srcCode.previous();
statement(data, body, CTX_DO_WHILE);
comments(data);
if (!data.srcCode.forwardIfCurrent("while", '('))
throw new TemplateException(data.srcCode, "do statement must have a while at the end");
DoWhile doWhile = new DoWhile(condition(data), body, line, data.srcCode.getPosition(), id);
if (!data.srcCode.forwardIfCurrent(')'))
throw new TemplateException(data.srcCode, "do statement must end with a [)]");
return doWhile;
}
use of lucee.transformer.Position in project Lucee by lucee.
the class AbstrCFMLScriptTransformer method _paramStatement.
private Tag _paramStatement(ExprData data, Body parent) throws TemplateException {
if (!data.srcCode.forwardIfCurrent("param "))
return null;
Position line = data.srcCode.getPosition();
TagLibTag tlt = CFMLTransformer.getTLT(data.srcCode, "param", data.config.getIdentification());
TagParam param = new TagParam(data.factory, line, null);
// type
boolean hasType = false;
boolean hasName = false;
int pos = data.srcCode.getPos();
// first 2 arguments can be type/name directly
String tmp = variableDec(data, true);
do {
if (!StringUtil.isEmpty(tmp)) {
TagLibTagAttr attr = tlt.getAttribute(tmp.toLowerCase(), true);
// name is not a defined attribute
if (attr == null) {
comments(data);
// it could be a name followed by default value
if (data.srcCode.forwardIfCurrent('=')) {
comments(data);
Expression v = attributeValue(data, true);
param.addAttribute(new Attribute(false, "name", data.factory.createLitString(tmp), "string"));
param.addAttribute(new Attribute(false, "default", v, "string"));
hasName = true;
// if we had a value this was already name
break;
}
// can be type or name
int pos2 = data.srcCode.getPos();
// first could be type, followed by name
comments(data);
String tmp2 = variableDec(data, true);
if (!StringUtil.isEmpty(tmp2)) {
attr = tlt.getAttribute(tmp2.toLowerCase(), true);
if (attr == null) {
param.addAttribute(new Attribute(false, "name", data.factory.createLitString(tmp2), "string"));
param.addAttribute(new Attribute(false, "type", data.factory.createLitString(tmp), "string"));
if (data.srcCode.forwardIfCurrent('=')) {
Expression v = attributeValue(data, true);
param.addAttribute(new Attribute(false, "default", v, "string"));
}
hasName = true;
hasType = true;
break;
}
}
param.addAttribute(new Attribute(false, "name", data.factory.createLitString(tmp), "string"));
data.srcCode.setPos(pos2);
hasName = true;
} else
data.srcCode.setPos(pos);
} else
data.srcCode.setPos(pos);
} while (false);
// folgend wird tlt extra nicht uebergeben, sonst findet pruefung statt
Attribute[] attrs = attributes(param, tlt, data, SEMI, data.factory.NULL(), Boolean.TRUE, "name", true, ',', false);
checkSemiColonLineFeed(data, true, true, true);
param.setTagLibTag(tlt);
param.setScriptBase(true);
Attribute attr;
// first fill all regular attribute -> name="value"
boolean hasDynamic = false;
for (int i = attrs.length - 1; i >= 0; i--) {
attr = attrs[i];
if (!attr.getValue().equals(data.factory.NULL())) {
if (attr.getName().equalsIgnoreCase("name")) {
hasName = true;
param.addAttribute(attr);
} else if (attr.getName().equalsIgnoreCase("type")) {
hasType = true;
param.addAttribute(attr);
} else if (attr.isDynamicType()) {
hasName = true;
if (hasDynamic)
throw attrNotSupported(data.srcCode, tlt, attr.getName());
hasDynamic = true;
param.addAttribute(new Attribute(false, "name", data.factory.createLitString(attr.getName()), "string"));
param.addAttribute(new Attribute(false, "default", attr.getValue(), "any"));
} else
param.addAttribute(attr);
}
}
// now fill name named attributes -> attr1 attr2
String first = null, second = null;
for (int i = 0; i < attrs.length; i++) {
attr = attrs[i];
if (attr.getValue().equals(data.factory.NULL())) {
// type
if (first == null && (!hasName || !hasType)) {
first = attr.getName();
} else // name
if (second == null && !hasName && !hasType) {
second = attr.getName();
} else // attr with no value
{
attr = new Attribute(true, attr.getName(), data.factory.EMPTY(), "string");
param.addAttribute(attr);
}
}
}
if (first != null) {
if (second != null) {
hasName = true;
hasType = true;
if (hasDynamic)
throw attrNotSupported(data.srcCode, tlt, first);
hasDynamic = true;
param.addAttribute(new Attribute(false, "name", data.factory.createLitString(second), "string"));
param.addAttribute(new Attribute(false, "type", data.factory.createLitString(first), "string"));
} else {
param.addAttribute(new Attribute(false, hasName ? "type" : "name", data.factory.createLitString(first), "string"));
hasName = true;
}
}
if (!hasName)
throw new TemplateException(data.srcCode, "missing name declaration for param");
param.setEnd(data.srcCode.getPosition());
return param;
}
use of lucee.transformer.Position in project Lucee by lucee.
the class AbstrCFMLScriptTransformer method _propertyStatement.
private final Tag _propertyStatement(ExprData data, Body parent) throws TemplateException {
if (data.context != CTX_CFC || !data.srcCode.forwardIfCurrent("property "))
return null;
Position line = data.srcCode.getPosition();
TagLibTag tlt = CFMLTransformer.getTLT(data.srcCode, "property", data.config.getIdentification());
Tag property = new TagOther(data.factory, line, null);
addMetaData(data, property, IGNORE_LIST_PROPERTY);
boolean hasName = false, hasType = false;
int pos = data.srcCode.getPos();
String tmp = variableDec(data, true);
if (!StringUtil.isEmpty(tmp)) {
if (tmp.indexOf('.') != -1) {
property.addAttribute(new Attribute(false, "type", data.factory.createLitString(tmp), "string"));
hasType = true;
} else {
data.srcCode.setPos(pos);
}
} else
data.srcCode.setPos(pos);
// folgend wird tlt extra nicht uebergeben, sonst findet pruefung statt
Attribute[] attrs = attributes(property, tlt, data, SEMI, data.factory.NULL(), Boolean.FALSE, "name", true, NO_ATTR_SEP, false);
checkSemiColonLineFeed(data, true, true, false);
property.setTagLibTag(tlt);
property.setScriptBase(true);
Attribute attr;
// first fill all regular attribute -> name="value"
for (int i = attrs.length - 1; i >= 0; i--) {
attr = attrs[i];
if (!attr.getValue().equals(data.factory.NULL())) {
if (attr.getName().equalsIgnoreCase("name")) {
hasName = true;
} else if (attr.getName().equalsIgnoreCase("type")) {
hasType = true;
}
property.addAttribute(attr);
}
}
// now fill name named attributes -> attr1 attr2
String first = null, second = null;
for (int i = 0; i < attrs.length; i++) {
attr = attrs[i];
if (attr.getValue().equals(data.factory.NULL())) {
// type
if (first == null && ((!hasName && !hasType) || !hasName)) {
first = attr.getNameOC();
} else // name
if (second == null && !hasName && !hasType) {
second = attr.getNameOC();
} else // attr with no value
{
attr = new Attribute(true, attr.getName(), data.factory.EMPTY(), "string");
property.addAttribute(attr);
}
}
}
if (first != null) {
hasName = true;
if (second != null) {
hasType = true;
property.addAttribute(new Attribute(false, "name", data.factory.createLitString(second), "string"));
property.addAttribute(new Attribute(false, "type", data.factory.createLitString(first), "string"));
} else {
property.addAttribute(new Attribute(false, "name", data.factory.createLitString(first), "string"));
}
}
if (!hasType) {
property.addAttribute(new Attribute(false, "type", data.factory.createLitString("any"), "string"));
}
if (!hasName)
throw new TemplateException(data.srcCode, "missing name declaration for property");
/*Tag property=new TagBase(line);
property.setTagLibTag(tlt);
property.addAttribute(new Attribute(false,"name",data.factory.createLitString(name),"string"));
property.addAttribute(new Attribute(false,"type",data.factory.createLitString(type),"string"));
*/
property.setEnd(data.srcCode.getPosition());
return property;
}
use of lucee.transformer.Position in project Lucee by lucee.
the class AbstrCFMLScriptTransformer method whileStatement.
/**
* Liest ein while Statement ein.
* <br />
* EBNF:<br />
* <code>spaces condition spaces ")" spaces block;</code>
* @return while Statement
* @throws TemplateException
*/
private final While whileStatement(ExprData data) throws TemplateException {
int pos = data.srcCode.getPos();
// id
String id = variableDec(data, false);
if (id == null) {
data.srcCode.setPos(pos);
return null;
}
if (id.equalsIgnoreCase("while")) {
id = null;
data.srcCode.removeSpace();
if (!data.srcCode.forwardIfCurrent('(')) {
data.srcCode.setPos(pos);
return null;
}
} else {
data.srcCode.removeSpace();
if (!data.srcCode.forwardIfCurrent(':')) {
data.srcCode.setPos(pos);
return null;
}
data.srcCode.removeSpace();
if (!data.srcCode.forwardIfCurrent("while", '(')) {
data.srcCode.setPos(pos);
return null;
}
}
Position line = data.srcCode.getPosition();
Body body = new BodyBase(data.factory);
While whil = new While(condition(data), body, line, null, id);
if (!data.srcCode.forwardIfCurrent(')'))
throw new TemplateException(data.srcCode, "while statement must end with a [)]");
statement(data, body, CTX_WHILE);
whil.setEnd(data.srcCode.getPosition());
return whil;
}
use of lucee.transformer.Position in project Lucee by lucee.
the class AbstrCFMLScriptTransformer method elseifStatement.
/**
* Liest ein else if Statement ein.
* <br />
* EBNF:<br />
* <code>spaces condition spaces ")" spaces block;</code>
* @return else if Statement
* @throws TemplateException
*/
private final boolean elseifStatement(ExprData data, Condition cont) throws TemplateException {
int pos = data.srcCode.getPos();
if (!data.srcCode.forwardIfCurrent("else"))
return false;
comments(data);
if (!data.srcCode.forwardIfCurrent("if", '(')) {
data.srcCode.setPos(pos);
return false;
}
Position line = data.srcCode.getPosition();
Body body = new BodyBase(data.factory);
Pair pair = cont.addElseIf(condition(data), body, line, null);
if (!data.srcCode.forwardIfCurrent(')'))
throw new TemplateException(data.srcCode, "else if statement must end with a [)]");
// ex block
statement(data, body, CTX_ELSE_IF);
pair.end = data.srcCode.getPosition();
return true;
}
Aggregations