Search in sources :

Example 76 with Type

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);
}
Also used : Type(org.sonar.plugins.java.api.semantic.Type)

Example 77 with Type

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));
    }
}
Also used : TypeVariableJavaType(org.sonar.java.resolve.TypeVariableJavaType) Type(org.sonar.plugins.java.api.semantic.Type) JavaType(org.sonar.java.resolve.JavaType) ParametrizedTypeJavaType(org.sonar.java.resolve.ParametrizedTypeJavaType) MemberSelectExpressionTree(org.sonar.plugins.java.api.tree.MemberSelectExpressionTree) ExpressionTree(org.sonar.plugins.java.api.tree.ExpressionTree) MemberSelectExpressionTree(org.sonar.plugins.java.api.tree.MemberSelectExpressionTree)

Example 78 with Type

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.");
        }
    }
}
Also used : Type(org.sonar.plugins.java.api.semantic.Type) JavaType(org.sonar.java.resolve.JavaType)

Example 79 with Type

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();
            }
        }
    }
}
Also used : Type(org.sonar.plugins.java.api.semantic.Type) ClassJavaType(org.sonar.java.resolve.ClassJavaType) MethodTree(org.sonar.plugins.java.api.tree.MethodTree) MethodJavaSymbol(org.sonar.java.resolve.JavaSymbol.MethodJavaSymbol) Symbol(org.sonar.plugins.java.api.semantic.Symbol)

Example 80 with Type

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.");
        }
    }
}
Also used : ParametrizedTypeJavaType(org.sonar.java.resolve.ParametrizedTypeJavaType) Type(org.sonar.plugins.java.api.semantic.Type) ParametrizedTypeJavaType(org.sonar.java.resolve.ParametrizedTypeJavaType) Symbol(org.sonar.plugins.java.api.semantic.Symbol) NewClassTree(org.sonar.plugins.java.api.tree.NewClassTree)

Aggregations

Type (org.sonar.plugins.java.api.semantic.Type)164 Test (org.junit.Test)67 Symbol (org.sonar.plugins.java.api.semantic.Symbol)23 ExpressionTree (org.sonar.plugins.java.api.tree.ExpressionTree)23 MethodJavaSymbol (org.sonar.java.resolve.JavaSymbol.MethodJavaSymbol)18 ClassTree (org.sonar.plugins.java.api.tree.ClassTree)18 IdentifierTree (org.sonar.plugins.java.api.tree.IdentifierTree)17 MethodInvocationTree (org.sonar.plugins.java.api.tree.MethodInvocationTree)17 MethodTree (org.sonar.plugins.java.api.tree.MethodTree)17 JavaType (org.sonar.java.resolve.JavaType)16 Tree (org.sonar.plugins.java.api.tree.Tree)15 VariableTree (org.sonar.plugins.java.api.tree.VariableTree)13 MemberSelectExpressionTree (org.sonar.plugins.java.api.tree.MemberSelectExpressionTree)12 SymbolicValue (org.sonar.java.se.symbolicvalues.SymbolicValue)11 AssignmentExpressionTree (org.sonar.plugins.java.api.tree.AssignmentExpressionTree)10 ArrayList (java.util.ArrayList)9 TypeTree (org.sonar.plugins.java.api.tree.TypeTree)9 VisibleForTesting (com.google.common.annotations.VisibleForTesting)8 RelationalSymbolicValue (org.sonar.java.se.symbolicvalues.RelationalSymbolicValue)8 CompilationUnitTree (org.sonar.plugins.java.api.tree.CompilationUnitTree)8