Search in sources :

Example 16 with Tag

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

the class Static method evaluate.

@Override
public void evaluate(Tag tag, TagLibTag libTag) throws EvaluatorException {
    // check parent
    Body body = null;
    String compName = Property.getComponentName(tag);
    boolean isCompChild = false;
    Tag p = ASMUtil.getParentTag(tag);
    if (p != null && (p instanceof TagComponent || getFullname(p, "").equalsIgnoreCase(compName))) {
        isCompChild = true;
        body = p.getBody();
    }
    Tag pp = p != null ? ASMUtil.getParentTag(p) : null;
    if (!isCompChild && pp != null && (p instanceof TagComponent || getFullname(pp, "").equalsIgnoreCase(compName))) {
        isCompChild = true;
        body = pp.getBody();
    }
    if (!isCompChild) {
        throw new EvaluatorException("Wrong Context for the the static constructor, " + "a static constructor must inside a component body.");
    }
    // Body body=(Body) tag.getParent();
    List<Statement> children = tag.getBody().getStatements();
    // remove that tag from parent
    ASMUtil.remove(tag);
    StaticBody sb = getStaticBody(body);
    ASMUtil.addStatements(sb, children);
}
Also used : EvaluatorException(lucee.transformer.cfml.evaluator.EvaluatorException) Statement(lucee.transformer.bytecode.Statement) StaticBody(lucee.transformer.bytecode.StaticBody) Tag(lucee.transformer.bytecode.statement.tag.Tag) TagLibTag(lucee.transformer.library.tag.TagLibTag) TagComponent(lucee.transformer.bytecode.statement.tag.TagComponent) Body(lucee.transformer.bytecode.Body) StaticBody(lucee.transformer.bytecode.StaticBody)

Example 17 with Tag

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

the class Try method evaluate.

/**
 * @see lucee.transformer.cfml.evaluator.EvaluatorSupport#evaluate(Element)
 */
@Override
public void evaluate(Tag tag) throws EvaluatorException {
    Body body = tag.getBody();
    int catchCount = 0;
    int noCatchCount = 0;
    int finallyCount = 0;
    // count catch tag and other in body
    if (body != null) {
        List stats = body.getStatements();
        Iterator it = stats.iterator();
        Statement stat;
        Tag t;
        String name;
        while (it.hasNext()) {
            stat = (Statement) it.next();
            if (stat instanceof Tag) {
                t = (Tag) stat;
                name = t.getTagLibTag().getName();
                if (name.equals("finally")) {
                    finallyCount++;
                    noCatchCount++;
                } else if (name.equals("catch"))
                    catchCount++;
                else
                    noCatchCount++;
            } else
                noCatchCount++;
        }
    }
    // check if has Content
    if (catchCount == 0 && finallyCount == 0)
        throw new EvaluatorException("Wrong Context, tag cftry must have at least one tag cfcatch inside or a cffinally tag.");
    if (finallyCount > 1)
        throw new EvaluatorException("Wrong Context, tag cftry can have only one tag cffinally inside.");
    // check if no has Content
    if (noCatchCount == 0) {
        ASMUtil.remove(tag);
    }
}
Also used : EvaluatorException(lucee.transformer.cfml.evaluator.EvaluatorException) Statement(lucee.transformer.bytecode.Statement) Iterator(java.util.Iterator) List(java.util.List) Tag(lucee.transformer.bytecode.statement.tag.Tag) Body(lucee.transformer.bytecode.Body)

Example 18 with Tag

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

the class AbstrCFMLScriptTransformer method __multiAttrStatement.

private final Tag __multiAttrStatement(Body parent, ExprData data, TagLibTag tlt) throws TemplateException {
    if (data.ep == null)
        return null;
    String type = tlt.getName();
    if (data.srcCode.forwardIfCurrent(type) || // lucee dialect support component as alias for class
    (data.srcCode.getDialect() == CFMLEngine.DIALECT_LUCEE && type.equalsIgnoreCase(Constants.LUCEE_COMPONENT_TAG_NAME) && data.srcCode.forwardIfCurrent(Constants.CFML_COMPONENT_TAG_NAME))) {
        boolean isValid = (data.srcCode.isCurrent(' ') || (tlt.getHasBody() && data.srcCode.isCurrent('{')));
        if (!isValid) {
            data.srcCode.setPos(data.srcCode.getPos() - type.length());
            return null;
        }
    } else
        return null;
    Position line = data.srcCode.getPosition();
    TagLibTagScript script = tlt.getScript();
    // TagLibTag tlt = CFMLTransformer.getTLT(data.srcCode,type);
    if (script.getContext() == CTX_CFC)
        data.isCFC = true;
    else if (script.getContext() == CTX_INTERFACE)
        data.isInterface = true;
    // Tag tag=new TagComponent(line);
    Tag tag = getTag(data, parent, tlt, line, null);
    tag.setTagLibTag(tlt);
    tag.setScriptBase(true);
    // add component meta data
    if (data.isCFC) {
        addMetaData(data, tag, IGNORE_LIST_COMPONENT);
    }
    if (data.isInterface) {
        addMetaData(data, tag, IGNORE_LIST_INTERFACE);
    }
    // EvaluatorPool.getPool();
    comments(data);
    // attributes
    // attributes(func,data);
    Attribute[] attrs = attributes(tag, tlt, data, SEMI_BLOCK, data.factory.EMPTY(), script.getRtexpr() ? Boolean.TRUE : Boolean.FALSE, null, false, ',', false);
    for (int i = 0; i < attrs.length; i++) {
        tag.addAttribute(attrs[i]);
    }
    comments(data);
    // body
    if (tlt.getHasBody()) {
        Body body = new BodyBase(data.factory);
        boolean wasSemiColon = statement(data, body, script.getContext());
        if (!wasSemiColon || !tlt.isBodyFree() || body.hasStatements())
            tag.setBody(body);
    } else
        checkSemiColonLineFeed(data, true, true, true);
    tag.setEnd(data.srcCode.getPosition());
    eval(tlt, data, tag);
    return tag;
}
Also used : TagLibTagScript(lucee.transformer.library.tag.TagLibTagScript) Position(lucee.transformer.Position) Attribute(lucee.transformer.bytecode.statement.tag.Attribute) TagLibTag(lucee.transformer.library.tag.TagLibTag) Tag(lucee.transformer.bytecode.statement.tag.Tag) Body(lucee.transformer.bytecode.Body) ScriptBody(lucee.transformer.bytecode.ScriptBody) FunctionBody(lucee.transformer.bytecode.FunctionBody) BodyBase(lucee.transformer.bytecode.BodyBase)

Example 19 with Tag

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

the class AbstrCFMLScriptTransformer method __singleAttrStatement.

private final Statement __singleAttrStatement(Body parent, ExprData data, TagLibTag tlt, boolean allowTwiceAttr) throws TemplateException {
    String tagName = tlt.getName();
    if (data.srcCode.forwardIfCurrent(tagName)) {
        if (!data.srcCode.isCurrent(' ') && !data.srcCode.isCurrent(';')) {
            data.srcCode.setPos(data.srcCode.getPos() - tagName.length());
            return null;
        }
    } else
        return null;
    int pos = data.srcCode.getPos() - tagName.length();
    Position line = data.srcCode.getPosition();
    // TagLibTag tlt = CFMLTransformer.getTLT(data.srcCode,tagName.equals("pageencoding")?"processingdirective":tagName);
    Tag tag = getTag(data, parent, tlt, line, null);
    tag.setScriptBase(true);
    tag.setTagLibTag(tlt);
    comments(data);
    // attribute
    TagLibTagAttr attr = tlt.getScript().getSingleAttr();
    String attrName = null;
    Expression attrValue = null;
    short attrType = ATTR_TYPE_NONE;
    if (attr != null) {
        attrType = attr.getScriptSupport();
        char c = data.srcCode.getCurrent();
        if (ATTR_TYPE_REQUIRED == attrType || (!data.srcCode.isCurrent(';') && ATTR_TYPE_OPTIONAL == attrType)) {
            if (data.srcCode.isCurrent('{')) {
                // this can be only a json string
                int p = data.srcCode.getPos();
                try {
                    attrValue = isSimpleValue(attr.getType()) ? null : json(data, JSON_STRUCT, '{', '}');
                } catch (Throwable t) {
                    ExceptionUtil.rethrowIfNecessary(t);
                    data.srcCode.setPos(p);
                }
            } else
                attrValue = attributeValue(data, tlt.getScript().getRtexpr());
            if (attrValue != null && isOperator(c)) {
                data.srcCode.setPos(pos);
                return null;
            }
        }
    }
    if (attrValue != null) {
        attrName = attr.getName();
        TagLibTagAttr tlta = tlt.getAttribute(attr.getName(), true);
        tag.addAttribute(new Attribute(false, attrName, CastOther.toExpression(attrValue, tlta.getType()), tlta.getType()));
    } else if (ATTR_TYPE_REQUIRED == attrType) {
        data.srcCode.setPos(pos);
        return null;
    }
    // body
    if (tlt.getHasBody()) {
        Body body = new BodyBase(data.factory);
        boolean wasSemiColon = statement(data, body, tlt.getScript().getContext());
        if (!wasSemiColon || !tlt.isBodyFree() || body.hasStatements())
            tag.setBody(body);
    } else
        checkSemiColonLineFeed(data, true, true, true);
    if (tlt.hasTTE())
        data.ep.add(tlt, tag, data.flibs, data.srcCode);
    if (!StringUtil.isEmpty(attrName))
        validateAttributeName(attrName, data.srcCode, new ArrayList<String>(), tlt, new RefBooleanImpl(false), new StringBuffer(), allowTwiceAttr);
    tag.setEnd(data.srcCode.getPosition());
    eval(tlt, data, tag);
    return tag;
}
Also used : TagLibTagAttr(lucee.transformer.library.tag.TagLibTagAttr) Position(lucee.transformer.Position) Attribute(lucee.transformer.bytecode.statement.tag.Attribute) ArrayList(java.util.ArrayList) FunctionAsExpression(lucee.transformer.bytecode.expression.FunctionAsExpression) Expression(lucee.transformer.expression.Expression) TagLibTag(lucee.transformer.library.tag.TagLibTag) Tag(lucee.transformer.bytecode.statement.tag.Tag) RefBooleanImpl(lucee.commons.lang.types.RefBooleanImpl) Body(lucee.transformer.bytecode.Body) ScriptBody(lucee.transformer.bytecode.ScriptBody) FunctionBody(lucee.transformer.bytecode.FunctionBody) BodyBase(lucee.transformer.bytecode.BodyBase)

Example 20 with Tag

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

the class AbstrCFMLScriptTransformer method cftagStatement.

private Statement cftagStatement(ExprData data, Body parent) throws TemplateException {
    // that is because cfloop-contition evaluator does not pass this
    if (data.ep == null)
        return null;
    final int start = data.srcCode.getPos();
    // namespace and separator
    final TagLib tagLib = CFMLTransformer.nameSpace(data);
    if (tagLib == null || !tagLib.isCore())
        return null;
    // print.e("namespace:"+tagLib.getNameSpaceAndSeparator());
    // get the name of the tag
    String id = CFMLTransformer.identifier(data.srcCode, false, true);
    if (id == null) {
        data.srcCode.setPos(start);
        return null;
    }
    id = id.toLowerCase();
    String appendix = null;
    TagLibTag tlt = tagLib.getTag(id);
    // get taglib
    if (tlt == null) {
        tlt = tagLib.getAppendixTag(id);
        if (tlt == null) {
            // if(tagLib.getIgnoreUnknowTags()){ if we do this a expression like the following no longer work cfwhatever=1;
            data.srcCode.setPos(start);
            return null;
        // }
        // throw new TemplateException(data.srcCode,"undefined tag ["+tagLib.getNameSpaceAndSeparator()+id+"]");
        }
        appendix = StringUtil.removeStartingIgnoreCase(id, tlt.getName());
    }
    if (tlt.getScript() == null) {
        data.srcCode.setPos(start);
        return null;
    }
    // check for opening bracked or closing semicolon
    comments(data);
    boolean noAttrs = false;
    if (!data.srcCode.forwardIfCurrent('(')) {
        if (checkSemiColonLineFeed(data, false, false, false)) {
            noAttrs = true;
        } else {
            data.srcCode.setPos(start);
            return null;
        }
    }
    Position line = data.srcCode.getPosition();
    // script specific behavior
    short context = CTX_OTHER;
    Boolean allowExpression = Boolean.TRUE;
    {
        TagLibTagScript script = tlt.getScript();
        if (script != null) {
            context = script.getContext();
            // always true for this tags allowExpression=script.getRtexpr()?Boolean.TRUE:Boolean.FALSE;
            if (context == CTX_CFC)
                data.isCFC = true;
            else if (context == CTX_INTERFACE)
                data.isInterface = true;
        }
    }
    Tag tag = getTag(data, parent, tlt, line, null);
    if (appendix != null) {
        tag.setAppendix(appendix);
        tag.setFullname(tlt.getFullName().concat(appendix));
    } else {
        tag.setFullname(tlt.getFullName());
    }
    tag.setTagLibTag(tlt);
    tag.setScriptBase(true);
    // add component meta data
    if (data.isCFC) {
        addMetaData(data, tag, IGNORE_LIST_COMPONENT);
    }
    if (data.isInterface) {
        addMetaData(data, tag, IGNORE_LIST_INTERFACE);
    }
    comments(data);
    // attributes
    Attribute[] attrs = noAttrs ? new Attribute[0] : attributes(tag, tlt, data, BRACKED, data.factory.EMPTY(), allowExpression, null, false, ',', true);
    data.srcCode.forwardIfCurrent(')');
    for (int i = 0; i < attrs.length; i++) {
        tag.addAttribute(attrs[i]);
    }
    comments(data);
    // body
    if (tlt.getHasBody()) {
        Body body = new BodyBase(data.factory);
        boolean wasSemiColon = statement(data, body, context);
        if (!wasSemiColon || !tlt.isBodyFree() || body.hasStatements())
            tag.setBody(body);
    } else
        checkSemiColonLineFeed(data, true, true, true);
    tag.setEnd(data.srcCode.getPosition());
    eval(tlt, data, tag);
    return tag;
}
Also used : TagLibTagScript(lucee.transformer.library.tag.TagLibTagScript) TagLibTag(lucee.transformer.library.tag.TagLibTag) Position(lucee.transformer.Position) Attribute(lucee.transformer.bytecode.statement.tag.Attribute) TagLib(lucee.transformer.library.tag.TagLib) TagLibTag(lucee.transformer.library.tag.TagLibTag) Tag(lucee.transformer.bytecode.statement.tag.Tag) RefBoolean(lucee.commons.lang.types.RefBoolean) ExprBoolean(lucee.transformer.expression.ExprBoolean) CastBoolean(lucee.transformer.bytecode.cast.CastBoolean) LitBoolean(lucee.transformer.expression.literal.LitBoolean) Body(lucee.transformer.bytecode.Body) ScriptBody(lucee.transformer.bytecode.ScriptBody) FunctionBody(lucee.transformer.bytecode.FunctionBody) BodyBase(lucee.transformer.bytecode.BodyBase)

Aggregations

Tag (lucee.transformer.bytecode.statement.tag.Tag)21 TagLibTag (lucee.transformer.library.tag.TagLibTag)14 Statement (lucee.transformer.bytecode.Statement)13 Body (lucee.transformer.bytecode.Body)12 Attribute (lucee.transformer.bytecode.statement.tag.Attribute)8 EvaluatorException (lucee.transformer.cfml.evaluator.EvaluatorException)7 ScriptBody (lucee.transformer.bytecode.ScriptBody)6 Position (lucee.transformer.Position)5 LitString (lucee.transformer.expression.literal.LitString)5 BodyBase (lucee.transformer.bytecode.BodyBase)4 PrintOut (lucee.transformer.bytecode.statement.PrintOut)4 Expression (lucee.transformer.expression.Expression)4 TemplateException (lucee.runtime.exp.TemplateException)3 FunctionBody (lucee.transformer.bytecode.FunctionBody)3 HasBody (lucee.transformer.bytecode.statement.HasBody)3 Literal (lucee.transformer.expression.literal.Literal)3 ArrayList (java.util.ArrayList)2 List (java.util.List)2 StaticBody (lucee.transformer.bytecode.StaticBody)2 BIF (lucee.transformer.bytecode.expression.var.BIF)2