Search in sources :

Example 1 with CFFullVarExpression

use of cfml.parsing.cfscript.CFFullVarExpression in project CFLint by cflint.

the class CFLint method process.

/**
 * @param expression
 *            CF expression
 * @param elem
 *            Jericho HTML element
 * @param oldcontext
 *            The previous context
 */
private void process(final CFExpression expression, final Element elem, final Context oldcontext) {
    if (expression != null) {
        final Context context = oldcontext.subContext(elem);
        for (final CFLintScanner plugin : extensions) {
            try {
                plugin.expression(expression, context, bugs);
                for (final ContextMessage message : context.getMessages()) {
                    reportRule(elem, expression, context, plugin, message);
                }
                context.getMessages().clear();
            } catch (final Exception e) {
                printException(e);
                reportRule(elem, expression, context, plugin, PLUGIN_ERROR);
            }
        }
        // Handle a few expression types in a special fashion.
        if (expression instanceof CFVarDeclExpression) {
            handler.addVariable(((CFVarDeclExpression) expression).getName());
        }
        // CFIdentifier should not decompose
        if (expression.getClass().equals(CFIdentifier.class)) {
            final String name = ((CFIdentifier) expression).getName();
            handler.checkVariable(name);
        }
        if (expression instanceof CFStructElementExpression) {
            final Context assignmentContext = context.subContext(elem);
            assignmentContext.setInStructKeyExpression(true);
            handler.push(CF.STRUCT);
            process(((CFStructElementExpression) expression).getKey(), elem, assignmentContext);
            handler.pop();
            process(((CFStructElementExpression) expression).getValue(), elem, context);
        } else if (expression instanceof CFVarDeclExpression) {
            final Context assignmentContext = context.subContext(elem);
            assignmentContext.setInAssignmentExpression(true);
            process(((CFVarDeclExpression) expression).getVar(), elem, assignmentContext);
            // Right hand side is handled below. Left hand side gets a
            // special context.
            process(((CFVarDeclExpression) expression).getInit(), elem, context);
        // Only process function call expressions
        } else if (expression instanceof CFAssignmentExpression && !(expression instanceof CFTernaryExpression)) {
            final Context assignmentContext = context.subContext(elem);
            assignmentContext.setInAssignmentExpression(true);
            process(((CFAssignmentExpression) expression).getLeft(), elem, assignmentContext);
            // Right hand side is handled below. Left hand side gets a
            // special context.
            process(((CFAssignmentExpression) expression).getRight(), elem, context);
        // Only process function call expressions
        } else if (expression instanceof CFFullVarExpression) {
            final CFFullVarExpression fullVarExpression = (CFFullVarExpression) expression;
            if (context.isInAssignmentExpression() && new CFScopes().isScoped(fullVarExpression, "local") && fullVarExpression.getExpressions().size() > 1) {
                handler.addVariable(fullVarExpression.getExpressions().get(1).Decompile(0));
            }
            final Context subContext = context.subContext(context.getElement());
            subContext.setInAssignmentExpression(false);
            for (final CFExpression expr : fullVarExpression.getExpressions()) {
                if (expr instanceof CFFunctionExpression) {
                    process(expr, elem, subContext);
                } else if (expr instanceof CFMember) {
                    process(((CFMember) expr).getExpression(), elem, subContext);
                } else if (expr instanceof CFArrayExpression) {
                    final CFArrayExpression aryExpr = (CFArrayExpression) expr;
                    if (!aryExpr.getElements().isEmpty()) {
                        process(aryExpr.getElements().get(0), elem, subContext);
                    }
                }
            }
        } else if (expression instanceof CFFunctionExpression && tagInfo.isTag(((CFFunctionExpression) expression).getFunctionName())) {
            final CFFunctionExpression functionExpr = (CFFunctionExpression) expression;
            final StringBuilder sb = new StringBuilder();
            sb.append("<").append(functionExpr.getFunctionName()).append(" ");
            for (final CFExpression expr : functionExpr.getArgs()) {
                if (expr instanceof CFAssignmentExpression) {
                    final CFAssignmentExpression assignExpr = (CFAssignmentExpression) expr;
                    sb.append(assignExpr.getLeft().Decompile(0)).append("=").append(assignExpr.getRight().Decompile(0)).append(" ");
                }
            }
            sb.append("/>");
            final CFMLSource source = new CFMLSource(sb.toString());
            try {
                processStack(source.getChildElements(), " ", context.subContextCFML(source.getChildElements().size() > 0 ? source.getChildElements().get(0) : null, expression));
            } catch (CFLintScanException e) {
            }
            if (functionExpr.getBody() != null) {
                process(functionExpr.getBody(), context);
            }
        } else if (!(expression instanceof CFNewExpression)) {
            // EXCEPT CFNewExpressions.
            for (final CFExpression child : expression.decomposeExpression()) {
                process(child, elem, context.subContextInAssignment(false));
            }
        } else {
            // Process only the right hand side of new expressions
            final CFNewExpression newExpr = (CFNewExpression) expression;
            for (final CFExpression child : (List<CFExpression>) newExpr.getArgs()) {
                if (child instanceof CFAssignmentExpression) {
                    process(((CFAssignmentExpression) child).getRight(), elem, context.subContextInAssignment(false));
                }
            }
        }
    }
}
Also used : Context(com.cflint.plugins.Context) CFStructElementExpression(cfml.parsing.cfscript.CFStructElementExpression) CFMLSource(cfml.parsing.CFMLSource) CFNewExpression(cfml.parsing.cfscript.CFNewExpression) CFFunctionExpression(cfml.parsing.cfscript.CFFunctionExpression) CFLintScanException(com.cflint.exception.CFLintScanException) CFLintScanner(com.cflint.plugins.CFLintScanner) CFAssignmentExpression(cfml.parsing.cfscript.CFAssignmentExpression) CFIdentifier(cfml.parsing.cfscript.CFIdentifier) ParseException(cfml.parsing.reporting.ParseException) IOException(java.io.IOException) CFLintScanException(com.cflint.exception.CFLintScanException) CFScopes(com.cflint.plugins.core.CFScopes) CFArrayExpression(cfml.parsing.cfscript.CFArrayExpression) CFExpression(cfml.parsing.cfscript.CFExpression) ContextMessage(com.cflint.plugins.Context.ContextMessage) CFMember(cfml.parsing.cfscript.CFMember) CFVarDeclExpression(cfml.parsing.cfscript.CFVarDeclExpression) CFTernaryExpression(cfml.parsing.cfscript.CFTernaryExpression) CFFullVarExpression(cfml.parsing.cfscript.CFFullVarExpression)

Example 2 with CFFullVarExpression

use of cfml.parsing.cfscript.CFFullVarExpression in project CFLint by cflint.

the class VariableNameChecker method checkFullExpression.

private void checkFullExpression(final CFFullVarExpression expression, final Context context, final BugList bugs) {
    final CFFullVarExpression cfFullVarExpression = expression;
    for (final CFExpression subexpression : cfFullVarExpression.getExpressions()) {
        if (subexpression instanceof CFIdentifier) {
            final String varName = ((CFIdentifier) subexpression).getName();
            final int lineNo = ((CFIdentifier) subexpression).getLine() + context.startLine() - 1;
            final int offset = ((CFIdentifier) subexpression).getOffset() + context.offset();
            // can be null for nested arrays if so ignore
            if (varName != null) {
                checkNameForBugs(context, cfFullVarExpression.Decompile(0), varName, context.getFilename(), context.getFunctionName(), lineNo, offset, bugs, expression);
            }
        }
    }
}
Also used : CFIdentifier(cfml.parsing.cfscript.CFIdentifier) CFFullVarExpression(cfml.parsing.cfscript.CFFullVarExpression) CFExpression(cfml.parsing.cfscript.CFExpression)

Example 3 with CFFullVarExpression

use of cfml.parsing.cfscript.CFFullVarExpression in project CFLint by cflint.

the class VariableNameChecker method expression.

@Override
public void expression(final CFExpression expression, final Context context, final BugList bugs) {
    if (expression instanceof CFVarDeclExpression) {
        final CFVarDeclExpression cfVarDeclExpression = (CFVarDeclExpression) expression;
        final int lineNo = expression.getLine() + context.startLine() - 1;
        final String varName = cfVarDeclExpression.getName();
        checkNameForBugs(context, varName, varName, context.getFilename(), context.getFunctionName(), lineNo, bugs);
    } else if (expression instanceof CFFullVarExpression) {
        final CFFullVarExpression cfFullVarExpression = (CFFullVarExpression) expression;
        for (final CFExpression subexpression : cfFullVarExpression.getExpressions()) {
            if (subexpression instanceof CFIdentifier) {
                final String varName = ((CFIdentifier) subexpression).getName();
                final int lineNo = ((CFIdentifier) subexpression).getLine() + context.startLine() - 1;
                checkNameForBugs(context, cfFullVarExpression.Decompile(0), varName, context.getFilename(), context.getFunctionName(), lineNo, bugs);
            }
        }
    } else if (expression instanceof CFIdentifier) {
        final String varName = ((CFIdentifier) expression).getName();
        final int lineNo = ((CFIdentifier) expression).getLine() + context.startLine() - 1;
        checkNameForBugs(context, varName, varName, context.getFilename(), context.getFunctionName(), lineNo, bugs);
    }
}
Also used : CFVarDeclExpression(cfml.parsing.cfscript.CFVarDeclExpression) CFIdentifier(cfml.parsing.cfscript.CFIdentifier) CFFullVarExpression(cfml.parsing.cfscript.CFFullVarExpression) CFExpression(cfml.parsing.cfscript.CFExpression)

Example 4 with CFFullVarExpression

use of cfml.parsing.cfscript.CFFullVarExpression in project CFLint by cflint.

the class UnusedLocalVarChecker method expression.

@Override
public void expression(final CFExpression expression, final Context context, final BugList bugs) {
    if (expression instanceof CFFullVarExpression) {
        final CFFullVarExpression fullVarExpr = (CFFullVarExpression) expression;
        final CFExpression first = fullVarExpr.getExpressions().get(0);
        final CFExpression second = fullVarExpr.getExpressions().size() > 1 ? fullVarExpr.getExpressions().get(1) : null;
        // For local scope assignments:
        if (context.isInAssignmentExpression() && fullVarExpr.getExpressions().size() == 2 && first instanceof CFIdentifier && "local".equalsIgnoreCase(((CFIdentifier) first).getName())) {
            if (second instanceof CFIdentifier) {
                final String name = ((CFIdentifier) second).getName();
                localVariables.put(name.toLowerCase(), new VarInfo(name, false, second, context));
            }
        } else {
            checkFullExpression(fullVarExpr, context, bugs);
        }
    } else if (expression instanceof CFVarDeclExpression) {
        checkExpression((CFVarDeclExpression) expression, context);
    } else if (expression instanceof CFIdentifier && !context.isInAssignmentExpression()) {
        final String name = ((CFIdentifier) expression).getName();
        if (name != null) {
            localVariables.put(name.toLowerCase(), new VarInfo(name, true));
        }
    }
}
Also used : CFVarDeclExpression(cfml.parsing.cfscript.CFVarDeclExpression) CFIdentifier(cfml.parsing.cfscript.CFIdentifier) CFFullVarExpression(cfml.parsing.cfscript.CFFullVarExpression) CFExpression(cfml.parsing.cfscript.CFExpression)

Aggregations

CFExpression (cfml.parsing.cfscript.CFExpression)4 CFFullVarExpression (cfml.parsing.cfscript.CFFullVarExpression)4 CFIdentifier (cfml.parsing.cfscript.CFIdentifier)4 CFVarDeclExpression (cfml.parsing.cfscript.CFVarDeclExpression)3 CFMLSource (cfml.parsing.CFMLSource)1 CFArrayExpression (cfml.parsing.cfscript.CFArrayExpression)1 CFAssignmentExpression (cfml.parsing.cfscript.CFAssignmentExpression)1 CFFunctionExpression (cfml.parsing.cfscript.CFFunctionExpression)1 CFMember (cfml.parsing.cfscript.CFMember)1 CFNewExpression (cfml.parsing.cfscript.CFNewExpression)1 CFStructElementExpression (cfml.parsing.cfscript.CFStructElementExpression)1 CFTernaryExpression (cfml.parsing.cfscript.CFTernaryExpression)1 ParseException (cfml.parsing.reporting.ParseException)1 CFLintScanException (com.cflint.exception.CFLintScanException)1 CFLintScanner (com.cflint.plugins.CFLintScanner)1 Context (com.cflint.plugins.Context)1 ContextMessage (com.cflint.plugins.Context.ContextMessage)1 CFScopes (com.cflint.plugins.core.CFScopes)1 IOException (java.io.IOException)1