use of org.sonar.plugins.java.api.semantic.Type in project sonar-java by SonarSource.
the class CastArithmeticOperandCheck method visitVariable.
@Override
public void visitVariable(VariableTree tree) {
Type varType = tree.type().symbolType();
checkExpression(varType, tree.initializer());
super.visitVariable(tree);
}
use of org.sonar.plugins.java.api.semantic.Type in project sonar-java by SonarSource.
the class CollectionInappropriateCallsCheck method onMethodInvocationFound.
@Override
protected void onMethodInvocationFound(MethodInvocationTree tree) {
ExpressionTree firstArgument = tree.arguments().get(0);
Type argumentType = firstArgument.symbolType();
if (argumentType.isUnknown()) {
// could happen with type inference.
return;
}
Type collectionType = getMethodOwner(tree);
// can be null when using raw types
Type collectionParameterType = getTypeParameter(collectionType);
boolean isCallToParametrizedOrUnknownMethod = isCallToParametrizedOrUnknownMethod(firstArgument);
if (!isCallToParametrizedOrUnknownMethod && tree.methodSelect().is(Tree.Kind.MEMBER_SELECT)) {
isCallToParametrizedOrUnknownMethod = isCallToParametrizedOrUnknownMethod(((MemberSelectExpressionTree) tree.methodSelect()).expression());
}
if (collectionParameterType != null && !collectionParameterType.isUnknown() && !isCallToParametrizedOrUnknownMethod && !isArgumentCompatible(argumentType, collectionParameterType)) {
reportIssue(ExpressionUtils.methodName(tree), MessageFormat.format("A \"{0}<{1}>\" cannot contain a \"{2}\"", collectionType, collectionParameterType, argumentType));
}
}
use of org.sonar.plugins.java.api.semantic.Type in project sonar-java by SonarSource.
the class CompareObjectWithEqualsCheck method visitBinaryExpression.
@Override
public void visitBinaryExpression(BinaryExpressionTree tree) {
super.visitBinaryExpression(tree);
if (tree.is(Tree.Kind.EQUAL_TO, Tree.Kind.NOT_EQUAL_TO)) {
Type leftOpType = tree.leftOperand().symbolType();
Type rightOpType = tree.rightOperand().symbolType();
if (!isExcluded(leftOpType, rightOpType) && hasObjectOperand(leftOpType, rightOpType) && bothImplementsEqualsMethod(leftOpType, rightOpType) && neitherIsPublicStaticFinal(tree.leftOperand(), tree.rightOperand())) {
context.reportIssue(this, tree.operatorToken(), "Use the \"equals\" method if value comparison was intended.");
}
}
}
use of org.sonar.plugins.java.api.semantic.Type in project sonar-java by SonarSource.
the class ConfusingOverloadCheck method visitNode.
@Override
public void visitNode(Tree tree) {
if (!hasSemantic()) {
return;
}
MethodTree methodTree = (MethodTree) tree;
if (Boolean.FALSE.equals(methodTree.isOverriding())) {
Symbol.MethodSymbol methodSymbol = methodTree.symbol();
Symbol.TypeSymbol owner = (Symbol.TypeSymbol) methodSymbol.owner();
Type superClass = owner.superClass();
if (superClass != null && !SERIALIZATION_METHOD_NAME.contains(methodSymbol.name())) {
boolean reportStaticIssue = checkMethod(methodTree.simpleName(), methodSymbol, superClass);
superClass = superClass.symbol().superClass();
while (superClass != null && !reportStaticIssue) {
reportStaticIssue = checkStaticMethod(methodTree.simpleName(), methodSymbol, superClass);
superClass = superClass.symbol().superClass();
}
}
}
}
use of org.sonar.plugins.java.api.semantic.Type in project sonar-java by SonarSource.
the class ClassWithoutHashCodeInHashStructureCheck method visitNode.
@Override
public void visitNode(Tree tree) {
if (!hasSemantic()) {
return;
}
Type type = ((NewClassTree) tree).symbolType();
if (type instanceof ParametrizedTypeJavaType && useHashDataStructure(type)) {
ParametrizedTypeJavaType ptt = (ParametrizedTypeJavaType) type;
Symbol.TypeSymbol symbol = ptt.substitution(ptt.typeParameters().get(0)).symbol();
if (implementsEquals(symbol) && !implementsHashCode(symbol)) {
reportIssue(tree, "Add a \"hashCode()\" method to \"" + symbol.name() + "\" or remove it from this hash.");
}
}
}
Aggregations