Search in sources :

Example 21 with TemplateException

use of lucee.runtime.exp.TemplateException in project Lucee by lucee.

the class AbstrCFMLScriptTransformer method tryStatement.

/**
 * Liest eine try Block ein
 * <br />
 * EBNF:<br />
 * <code>;</code>
 * @return Try Block
 * @throws TemplateException
 */
private final TryCatchFinally tryStatement(ExprData data) throws TemplateException {
    if (!data.srcCode.forwardIfCurrent("try", '{') && !data.srcCode.forwardIfCurrent("try ") && !data.srcCode.forwardIfCurrent("try", '/'))
        return null;
    data.srcCode.previous();
    Body body = new BodyBase(data.factory);
    TryCatchFinally tryCatchFinally = new TryCatchFinally(data.factory, body, data.srcCode.getPosition(), null);
    statement(data, body, CTX_TRY);
    comments(data);
    // catches
    short catchCount = 0;
    while (data.srcCode.forwardIfCurrent("catch", '(')) {
        catchCount++;
        comments(data);
        // type
        int pos = data.srcCode.getPos();
        Position line = data.srcCode.getPosition();
        Expression name = null, type = null;
        StringBuffer sbType = new StringBuffer();
        String id;
        while (true) {
            id = identifier(data, false);
            if (id == null)
                break;
            sbType.append(id);
            data.srcCode.removeSpace();
            if (!data.srcCode.forwardIfCurrent('.'))
                break;
            sbType.append('.');
            data.srcCode.removeSpace();
        }
        if (sbType.length() == 0) {
            type = string(data);
            if (type == null)
                throw new TemplateException(data.srcCode, "a catch statement must begin with the throwing type (query, application ...).");
        } else {
            type = data.factory.createLitString(sbType.toString());
        }
        // name = expression();
        comments(data);
        // name
        if (!data.srcCode.isCurrent(')')) {
            name = expression(data);
        } else {
            data.srcCode.setPos(pos);
            name = expression(data);
            type = data.factory.createLitString("any");
        }
        comments(data);
        Body b = new BodyBase(data.factory);
        try {
            tryCatchFinally.addCatch(type, name, b, line);
        } catch (TransformerException e) {
            throw new TemplateException(data.srcCode, e.getMessage());
        }
        comments(data);
        if (!data.srcCode.forwardIfCurrent(')'))
            throw new TemplateException(data.srcCode, "invalid catch statement, missing closing )");
        statement(data, b, CTX_CATCH);
        comments(data);
    }
    // finally
    if (finallyStatement(data, tryCatchFinally)) {
        comments(data);
    } else if (catchCount == 0)
        throw new TemplateException(data.srcCode, "a try statement must have at least one catch statement");
    // if(body.isEmpty()) return null;
    tryCatchFinally.setEnd(data.srcCode.getPosition());
    return tryCatchFinally;
}
Also used : Position(lucee.transformer.Position) FunctionAsExpression(lucee.transformer.bytecode.expression.FunctionAsExpression) Expression(lucee.transformer.expression.Expression) TemplateException(lucee.runtime.exp.TemplateException) Body(lucee.transformer.bytecode.Body) ScriptBody(lucee.transformer.bytecode.ScriptBody) FunctionBody(lucee.transformer.bytecode.FunctionBody) BodyBase(lucee.transformer.bytecode.BodyBase) TransformerException(lucee.transformer.TransformerException) TryCatchFinally(lucee.transformer.bytecode.statement.TryCatchFinally)

Example 22 with TemplateException

use of lucee.runtime.exp.TemplateException in project Lucee by lucee.

the class AbstrCFMLScriptTransformer method caseStatement.

/**
 * Liest ein Case Statement ein
 * @return case Statement
 * @throws TemplateException
 */
private final boolean caseStatement(ExprData data, Switch swit) throws TemplateException {
    if (!data.srcCode.forwardIfCurrentAndNoWordAfter("case"))
        return false;
    // int line=data.srcCode.getLine();
    comments(data);
    Expression expr = super.expression(data);
    comments(data);
    if (!data.srcCode.forwardIfCurrent(':'))
        throw new TemplateException(data.srcCode, "case body must start with [:]");
    Body body = new BodyBase(data.factory);
    switchBlock(data, body);
    swit.addCase(expr, body);
    return true;
}
Also used : FunctionAsExpression(lucee.transformer.bytecode.expression.FunctionAsExpression) Expression(lucee.transformer.expression.Expression) TemplateException(lucee.runtime.exp.TemplateException) Body(lucee.transformer.bytecode.Body) ScriptBody(lucee.transformer.bytecode.ScriptBody) FunctionBody(lucee.transformer.bytecode.FunctionBody) BodyBase(lucee.transformer.bytecode.BodyBase)

Example 23 with TemplateException

use of lucee.runtime.exp.TemplateException in project Lucee by lucee.

the class AbstrCFMLScriptTransformer method switchStatement.

/**
 * Liest ein switch Statment ein
 * @return switch Statement
 * @throws TemplateException
 */
private final Switch switchStatement(ExprData data) throws TemplateException {
    if (!data.srcCode.forwardIfCurrent("switch", '('))
        return null;
    Position line = data.srcCode.getPosition();
    comments(data);
    Expression expr = super.expression(data);
    comments(data);
    // end )
    if (!data.srcCode.forwardIfCurrent(')'))
        throw new TemplateException(data.srcCode, "switch statement must end with a [)]");
    comments(data);
    if (!data.srcCode.forwardIfCurrent('{'))
        throw new TemplateException(data.srcCode, "switch statement must have a starting  [{]");
    Switch swit = new Switch(expr, line, null);
    // cases
    // Node child=null;
    comments(data);
    while (caseStatement(data, swit)) {
        comments(data);
    }
    // default
    if (defaultStatement(data, swit)) {
        comments(data);
    }
    while (caseStatement(data, swit)) {
        comments(data);
    }
    // }
    if (!data.srcCode.forwardIfCurrent('}'))
        throw new TemplateException(data.srcCode, "invalid construct in switch statement");
    swit.setEnd(data.srcCode.getPosition());
    return swit;
}
Also used : Switch(lucee.transformer.bytecode.statement.Switch) Position(lucee.transformer.Position) FunctionAsExpression(lucee.transformer.bytecode.expression.FunctionAsExpression) Expression(lucee.transformer.expression.Expression) TemplateException(lucee.runtime.exp.TemplateException)

Example 24 with TemplateException

use of lucee.runtime.exp.TemplateException 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;
}
Also used : Position(lucee.transformer.Position) TemplateException(lucee.runtime.exp.TemplateException) DoWhile(lucee.transformer.bytecode.statement.DoWhile) Body(lucee.transformer.bytecode.Body) ScriptBody(lucee.transformer.bytecode.ScriptBody) FunctionBody(lucee.transformer.bytecode.FunctionBody) BodyBase(lucee.transformer.bytecode.BodyBase)

Example 25 with TemplateException

use of lucee.runtime.exp.TemplateException 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;
}
Also used : TagLibTagAttr(lucee.transformer.library.tag.TagLibTagAttr) TagLibTag(lucee.transformer.library.tag.TagLibTag) TagParam(lucee.transformer.bytecode.statement.tag.TagParam) Position(lucee.transformer.Position) FunctionAsExpression(lucee.transformer.bytecode.expression.FunctionAsExpression) Expression(lucee.transformer.expression.Expression) Attribute(lucee.transformer.bytecode.statement.tag.Attribute) TemplateException(lucee.runtime.exp.TemplateException)

Aggregations

TemplateException (lucee.runtime.exp.TemplateException)55 Position (lucee.transformer.Position)21 Expression (lucee.transformer.expression.Expression)18 FunctionAsExpression (lucee.transformer.bytecode.expression.FunctionAsExpression)15 LitString (lucee.transformer.expression.literal.LitString)14 ScriptBody (lucee.transformer.bytecode.ScriptBody)9 Attribute (lucee.transformer.bytecode.statement.tag.Attribute)9 Body (lucee.transformer.bytecode.Body)8 BodyBase (lucee.transformer.bytecode.BodyBase)8 FunctionBody (lucee.transformer.bytecode.FunctionBody)8 ComponentTemplateException (lucee.transformer.cfml.script.AbstrCFMLScriptTransformer.ComponentTemplateException)8 Variable (lucee.transformer.expression.var.Variable)8 ExprString (lucee.transformer.expression.ExprString)7 TagLibTag (lucee.transformer.library.tag.TagLibTag)6 PageSourceCode (lucee.transformer.util.PageSourceCode)6 ArrayList (java.util.ArrayList)5 OpVariable (lucee.transformer.bytecode.op.OpVariable)5 TagLibTagAttr (lucee.transformer.library.tag.TagLibTagAttr)5 Resource (lucee.commons.io.res.Resource)4 EvaluatorException (lucee.transformer.cfml.evaluator.EvaluatorException)4