Search in sources :

Example 1 with TagContinue

use of lucee.transformer.bytecode.statement.tag.TagContinue in project Lucee by lucee.

the class Continue method evaluate.

@Override
public void evaluate(Tag tag, TagLibTag libTag) throws EvaluatorException {
    String ns = libTag.getTagLib().getNameSpaceAndSeparator();
    String loopName = ns + "loop";
    String whileName = ns + "while";
    // label
    String label = null;
    Attribute attrLabel = tag.getAttribute("label");
    if (attrLabel != null) {
        TagContinue tc = (TagContinue) tag;
        label = Break.variableToString(tag, attrLabel, null);
        if (label != null) {
            tc.setLabel(label = label.trim());
            tag.removeAttribute("label");
        } else if (ASMUtil.isLiteralAttribute(tag, attrLabel, ASMUtil.TYPE_STRING, false, true)) {
            LitString ls = (LitString) tag.getFactory().toExprString(tag.getAttribute("label").getValue());
            label = ls.getString();
            if (!StringUtil.isEmpty(label, true)) {
                tc.setLabel(label = label.trim());
                tag.removeAttribute("label");
            } else
                label = null;
        }
    }
    if (ASMUtil.isLiteralAttribute(tag, "label", ASMUtil.TYPE_STRING, false, true)) {
        LitString ls = (LitString) tag.getFactory().toExprString(tag.getAttribute("label").getValue());
        TagContinue tc = (TagContinue) tag;
        label = ls.getString();
        if (!StringUtil.isEmpty(label, true)) {
            tc.setLabel(label = label.trim());
            tag.removeAttribute("label");
        } else
            label = null;
    }
    if (!ASMUtil.hasAncestorContinueFCStatement(tag, label)) {
        if (tag.isScriptBase()) {
            if (StringUtil.isEmpty(label))
                throw new EvaluatorException("Wrong Context, " + libTag.getName() + " must be inside a loop (for,while,loop ...)");
            throw new EvaluatorException("Wrong Context, " + libTag.getName() + " must be inside a loop (for,while,loop ...) with the label [" + label + "]");
        }
        if (StringUtil.isEmpty(label))
            throw new EvaluatorException("Wrong Context, tag " + libTag.getFullName() + " must be inside a " + loopName + " or " + whileName + " tag");
        throw new EvaluatorException("Wrong Context, tag " + libTag.getFullName() + " must be inside a " + loopName + " or " + whileName + " tag with the label [" + label + "]");
    }
}
Also used : LitString(lucee.transformer.expression.literal.LitString) TagContinue(lucee.transformer.bytecode.statement.tag.TagContinue) Attribute(lucee.transformer.bytecode.statement.tag.Attribute) EvaluatorException(lucee.transformer.cfml.evaluator.EvaluatorException) LitString(lucee.transformer.expression.literal.LitString)

Aggregations

Attribute (lucee.transformer.bytecode.statement.tag.Attribute)1 TagContinue (lucee.transformer.bytecode.statement.tag.TagContinue)1 EvaluatorException (lucee.transformer.cfml.evaluator.EvaluatorException)1 LitString (lucee.transformer.expression.literal.LitString)1