All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.cflint.plugins.core.UnusedLocalVarChecker Maven / Gradle / Ivy

Go to download

A static code analysis tool for ColdFusion (in the spirit of FindBugs and Lint). With CFLint, you are able to analyze your ColdFusion code base for code violations.

There is a newer version: 1.5.0
Show newest version
package com.cflint.plugins.core;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.cflint.BugInfo;
import com.cflint.BugList;
import com.cflint.plugins.CFLintScannerAdapter;
import com.cflint.plugins.Context;

import cfml.parsing.cfscript.CFExpression;
import cfml.parsing.cfscript.CFFullVarExpression;
import cfml.parsing.cfscript.CFIdentifier;
import cfml.parsing.cfscript.CFMember;
import cfml.parsing.cfscript.CFVarDeclExpression;

public class UnusedLocalVarChecker extends CFLintScannerAdapter {
	final String severity = "INFO";

	protected CFScopes scopes = new CFScopes();
	protected Map localVariables = new HashMap();
	protected Map variableLineNo = new HashMap();

	@Override
	public void expression(final CFExpression expression, final Context context, final BugList bugs) {
		if (expression instanceof CFFullVarExpression) {
			final CFFullVarExpression fullVarExpression = (CFFullVarExpression) expression;
			final CFExpression variable = fullVarExpression.getExpressions().get(0);
			if (variable instanceof CFIdentifier) {
				final String name = ((CFIdentifier) variable).getName();
				if (!scopes.isCFScoped(name)) {
					localVariables.put(name, true);
				}else if(scopes.isLocalScoped(name) && fullVarExpression.getExpressions().size()>1){
					final CFExpression variable2 = fullVarExpression.getExpressions().get(1);
					if (variable2 instanceof CFIdentifier) {
						localVariables.put(((CFIdentifier) variable2).getName(), true);
					}
				}
			}
			for(CFExpression subexpr: ((CFFullVarExpression) expression).getExpressions()){
				if(subexpr instanceof CFMember){
					CFMember memberExpr = (CFMember) subexpr;
					if(memberExpr.getExpression() != null) {
						expression(memberExpr.getExpression(),context,bugs);
					}
				}
			}
		} else if (expression instanceof CFVarDeclExpression) {
			final String name = ((CFVarDeclExpression) expression).getName();
			final int lineNo = expression.getLine() + context.startLine() - 1;
			addLocalVariable(name, lineNo);
		} else if (expression instanceof CFIdentifier) {
			localVariables.put(((CFIdentifier) expression).getName(), true);
		}
	}

	protected void addLocalVariable(final String variable, final Integer lineNo) {
		if (localVariables.get(variable) == null) {
			localVariables.put(variable, false);
			setLocalVariableLineNo(variable, lineNo);
		}
	}

	protected void setLocalVariableLineNo(final String variable, final Integer lineNo) {
		if (variableLineNo.get(variable) == null) {
			variableLineNo.put(variable, lineNo);
		}
	}

	@Override
	public void startFunction(final Context context, final BugList bugs) {
		localVariables.clear();
		variableLineNo.clear();
	}

	@Override
	public void endFunction(final Context context, final BugList bugs) {
		// sort by line number
		final List presortbugs = new ArrayList();
		for (final Map.Entry variable : localVariables.entrySet()) {
			final Boolean used = variable.getValue();
			if (!used) {
				final String name = variable.getKey();
				final Integer lineNo = variableLineNo.get(name);
				presortbugs.add(new BugInfo.BugInfoBuilder().setLine(lineNo).setMessageCode("UNUSED_LOCAL_VARIABLE")
						.setSeverity(severity).setFilename(context.getFilename())
						.setFunction(context.getFunctionName()).setMessage("Local variable " + name
								+ " is not used in function " + context.getFunctionName() + ", consider removing it.")
						.setVariable(name).build());
			}
		}
		// Sort the bugs by line/col before adding to the list of bugs.
		Collections.sort(presortbugs);
		for (final BugInfo bugInfo : presortbugs) {
			bugs.add(bugInfo);
		}
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy