use of net.sourceforge.pmd.lang.java.ast.ASTName in project pmd by pmd.
the class UnusedImportsRule method visit.
@Override
public Object visit(ASTImportDeclaration node, Object data) {
if (node.isImportOnDemand()) {
ASTName importedType = (ASTName) node.jjtGetChild(0);
imports.add(new ImportWrapper(importedType.getImage(), null, node, node.getType(), node.isStatic()));
} else {
if (!node.isImportOnDemand()) {
ASTName importedType = (ASTName) node.jjtGetChild(0);
String className;
if (isQualifiedName(importedType)) {
int lastDot = importedType.getImage().lastIndexOf('.') + 1;
className = importedType.getImage().substring(lastDot);
} else {
className = importedType.getImage();
}
imports.add(new ImportWrapper(importedType.getImage(), className, node));
}
}
return data;
}
use of net.sourceforge.pmd.lang.java.ast.ASTName in project pmd by pmd.
the class UseCollectionIsEmptyRule method getTypeOfMethodCall.
private ASTClassOrInterfaceType getTypeOfMethodCall(ASTPrimarySuffix node) {
ASTClassOrInterfaceType type = null;
ASTName methodName = node.jjtGetParent().getFirstChildOfType(ASTPrimaryPrefix.class).getFirstChildOfType(ASTName.class);
if (methodName != null) {
ClassScope classScope = node.getScope().getEnclosingScope(ClassScope.class);
Map<MethodNameDeclaration, List<NameOccurrence>> methods = classScope.getMethodDeclarations();
for (Map.Entry<MethodNameDeclaration, List<NameOccurrence>> e : methods.entrySet()) {
if (e.getKey().getName().equals(methodName.getImage())) {
type = e.getKey().getNode().getFirstParentOfType(ASTMethodDeclaration.class).getFirstChildOfType(ASTResultType.class).getFirstDescendantOfType(ASTClassOrInterfaceType.class);
break;
}
}
}
return type;
}
use of net.sourceforge.pmd.lang.java.ast.ASTName in project pmd by pmd.
the class AbstractSunSecureRule method getReturnedVariableName.
/**
* Gets the name of the variable returned. Some examples: <br>
* for this.foo returns foo <br>
* for foo returns foo <br>
* for foo.bar returns foo.bar
*
* @param ret
* a return statement to evaluate
* @return the name of the variable associated or <code>null</code> if it
* cannot be detected
*/
protected final String getReturnedVariableName(ASTReturnStatement ret) {
if (hasTernaryCondition(ret) && hasTernaryNullCheck(ret)) {
return ret.getFirstDescendantOfType(ASTConditionalExpression.class).jjtGetChild(0).getFirstDescendantOfType(ASTName.class).getImage();
}
final ASTName n = ret.getFirstDescendantOfType(ASTName.class);
if (n != null) {
return n.getImage();
}
final ASTPrimarySuffix ps = ret.getFirstDescendantOfType(ASTPrimarySuffix.class);
if (ps != null) {
return ps.getImage();
}
return null;
}
use of net.sourceforge.pmd.lang.java.ast.ASTName in project pmd by pmd.
the class UnnecessaryLocalBeforeReturnRule method visit.
@Override
public Object visit(ASTReturnStatement rtn, Object data) {
// skip returns of literals
ASTName name = rtn.getFirstDescendantOfType(ASTName.class);
if (name == null) {
return data;
}
// skip 'complicated' expressions
if (rtn.findDescendantsOfType(ASTExpression.class).size() > 1 || rtn.findDescendantsOfType(ASTPrimaryExpression.class).size() > 1 || isMethodCall(rtn)) {
return data;
}
Map<VariableNameDeclaration, List<NameOccurrence>> vars = name.getScope().getDeclarations(VariableNameDeclaration.class);
for (Map.Entry<VariableNameDeclaration, List<NameOccurrence>> entry : vars.entrySet()) {
VariableNameDeclaration variableDeclaration = entry.getKey();
List<NameOccurrence> usages = entry.getValue();
if (usages.size() == 1) {
// If there is more than 1 usage, then it's not only returned
NameOccurrence occ = usages.get(0);
if (occ.getLocation().equals(name) && isNotAnnotated(variableDeclaration)) {
String var = name.getImage();
if (var.indexOf('.') != -1) {
var = var.substring(0, var.indexOf('.'));
}
// Is the variable initialized with another member that is later used?
if (!isInitDataModifiedAfterInit(variableDeclaration, rtn) && !statementsBeforeReturn(variableDeclaration, rtn)) {
addViolation(data, rtn, var);
}
}
}
}
return data;
}
use of net.sourceforge.pmd.lang.java.ast.ASTName in project pmd by pmd.
the class UnnecessaryLocalBeforeReturnRule method isInitDataModifiedAfterInit.
private boolean isInitDataModifiedAfterInit(final VariableNameDeclaration variableDeclaration, final ASTReturnStatement rtn) {
final ASTVariableInitializer initializer = variableDeclaration.getAccessNodeParent().getFirstDescendantOfType(ASTVariableInitializer.class);
if (initializer != null) {
final List<ASTName> referencedNames = initializer.findDescendantsOfType(ASTName.class);
for (final ASTName refName : referencedNames) {
// TODO : Shouldn't the scope allow us to search for a var name occurrences directly, moving up through parent scopes?
Scope scope = refName.getScope();
do {
final Map<VariableNameDeclaration, List<NameOccurrence>> declarations = scope.getDeclarations(VariableNameDeclaration.class);
for (final Map.Entry<VariableNameDeclaration, List<NameOccurrence>> entry : declarations.entrySet()) {
if (entry.getKey().getName().equals(refName.getImage())) {
// Variable found! Check usage locations
for (final NameOccurrence occ : entry.getValue()) {
final ScopedNode location = occ.getLocation();
// Is it used after initializing our "unnecessary" local but before the return statement?
if (isAfter(location, initializer) && isAfter(rtn, location)) {
return true;
}
}
return false;
}
}
scope = scope.getParent();
} while (scope != null);
}
}
return false;
}
Aggregations