use of org.sonar.plugins.java.api.semantic.Type in project sonar-java by SonarSource.
the class AbsOnNegativeCheck method checkForIssue.
private void checkForIssue(ExpressionTree tree) {
if (tree.is(Tree.Kind.MEMBER_SELECT)) {
Symbol identifierSymbol = ((MemberSelectExpressionTree) tree).identifier().symbol();
Type ownerType = identifierSymbol.owner().type();
if ("MIN_VALUE".equals(identifierSymbol.name()) && (ownerType.is("java.lang.Integer") || ownerType.is("java.lang.Long"))) {
reportIssue(tree, "Use the original value instead.");
}
} else {
MethodInvocationTree nestedTree = extractMethodInvocation(tree);
if (nestedTree != null && NEGATIVE_METHODS.anyMatch(nestedTree)) {
reportIssue(nestedTree, "Use the original value instead.");
}
}
}
use of org.sonar.plugins.java.api.semantic.Type in project sonar-java by SonarSource.
the class MembersDifferOnlyByCapitalizationCheck method retrieveMembers.
private static List<Symbol> retrieveMembers(Symbol.TypeSymbol classSymbol) {
List<Symbol> results = Lists.newLinkedList();
results.addAll(extractMembers(classSymbol, false));
for (Type parentInterface : classSymbol.interfaces()) {
results.addAll(extractMembers(parentInterface.symbol(), true));
}
Type superClass = classSymbol.superClass();
if (superClass != null) {
results.addAll(extractMembers(superClass.symbol(), true));
}
return results;
}
use of org.sonar.plugins.java.api.semantic.Type in project sonar-java by SonarSource.
the class PrimitiveWrappersInTernaryOperatorCheck method visitNode.
@Override
public void visitNode(Tree tree) {
ConditionalExpressionTree cet = (ConditionalExpressionTree) tree;
Type trueExpressionType = cet.trueExpression().symbolType();
Type falseExpressionType = cet.falseExpression().symbolType();
if (dissimilarPrimitiveTypeWrappers(trueExpressionType, falseExpressionType)) {
reportIssue(cet.questionToken(), "Add an explicit cast to match types of operands.");
}
}
use of org.sonar.plugins.java.api.semantic.Type in project sonar-java by SonarSource.
the class PrintfFailCheck method verifyParameters.
private void verifyParameters(MethodInvocationTree mit, List<ExpressionTree> args, List<String> params) {
int index = 0;
for (String rawParam : params) {
String param = rawParam;
int argIndex = index;
if (param.contains("$")) {
argIndex = getIndex(param) - 1;
if (argIndex == -1) {
reportIssue(mit, "Arguments are numbered starting from 1.");
return;
}
param = param.substring(param.indexOf('$') + 1);
} else if (param.charAt(0) == '<') {
// refers to previous argument
argIndex = Math.max(0, argIndex - 1);
} else {
index++;
}
ExpressionTree argExpressionTree = args.get(argIndex);
Type argType = argExpressionTree.symbolType();
checkNumerical(mit, param, argType);
checkTimeConversion(mit, param, argType);
}
}
use of org.sonar.plugins.java.api.semantic.Type in project sonar-java by SonarSource.
the class PrintfFailCheck method checkFormatting.
private void checkFormatting(MethodInvocationTree mit, boolean isMessageFormat) {
if (mit.arguments().stream().map(ExpressionTree::symbolType).anyMatch(Type::isUnknown)) {
// method resolved but not all the parameters are
return;
}
ExpressionTree formatStringTree;
List<ExpressionTree> args;
// Check type of first argument:
if (mit.arguments().get(0).symbolType().is("java.lang.String")) {
formatStringTree = mit.arguments().get(0);
args = mit.arguments().subList(1, mit.arguments().size());
} else {
// format method with "Locale" first argument, skip that one.
formatStringTree = mit.arguments().get(1);
args = mit.arguments().subList(2, mit.arguments().size());
}
if (formatStringTree.is(Tree.Kind.STRING_LITERAL)) {
String formatString = LiteralUtils.trimQuotes(((LiteralTree) formatStringTree).value());
if (isMessageFormat) {
handleMessageFormat(mit, formatString, args);
} else {
handlePrintfFormat(mit, formatString, args);
}
}
}
Aggregations