You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
2.3 KiB
58 lines
2.3 KiB
7 months ago
|
//===--- DurationDivisionCheck.cpp - clang-tidy----------------------------===//
|
||
|
//
|
||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
#include "DurationDivisionCheck.h"
|
||
|
#include "clang/AST/ASTContext.h"
|
||
|
#include "clang/ASTMatchers/ASTMatchFinder.h"
|
||
|
#include "clang/Lex/Lexer.h"
|
||
|
|
||
|
namespace clang {
|
||
|
namespace tidy {
|
||
|
namespace abseil {
|
||
|
|
||
|
using namespace clang::ast_matchers;
|
||
|
|
||
|
void DurationDivisionCheck::registerMatchers(MatchFinder *finder) {
|
||
|
const auto DurationExpr =
|
||
|
expr(hasType(cxxRecordDecl(hasName("::absl::Duration"))));
|
||
|
finder->addMatcher(
|
||
|
traverse(ast_type_traits::TK_AsIs,
|
||
|
implicitCastExpr(
|
||
|
hasSourceExpression(ignoringParenCasts(
|
||
|
cxxOperatorCallExpr(hasOverloadedOperatorName("/"),
|
||
|
hasArgument(0, DurationExpr),
|
||
|
hasArgument(1, DurationExpr))
|
||
|
.bind("OpCall"))),
|
||
|
hasImplicitDestinationType(qualType(unless(isInteger()))),
|
||
|
unless(hasParent(cxxStaticCastExpr())),
|
||
|
unless(hasParent(cStyleCastExpr())),
|
||
|
unless(isInTemplateInstantiation()))),
|
||
|
this);
|
||
|
}
|
||
|
|
||
|
void DurationDivisionCheck::check(const MatchFinder::MatchResult &result) {
|
||
|
const auto *OpCall = result.Nodes.getNodeAs<CXXOperatorCallExpr>("OpCall");
|
||
|
diag(OpCall->getOperatorLoc(),
|
||
|
"operator/ on absl::Duration objects performs integer division; "
|
||
|
"did you mean to use FDivDuration()?")
|
||
|
<< FixItHint::CreateInsertion(OpCall->getBeginLoc(),
|
||
|
"absl::FDivDuration(")
|
||
|
<< FixItHint::CreateReplacement(
|
||
|
SourceRange(OpCall->getOperatorLoc(), OpCall->getOperatorLoc()),
|
||
|
", ")
|
||
|
<< FixItHint::CreateInsertion(
|
||
|
Lexer::getLocForEndOfToken(
|
||
|
result.SourceManager->getSpellingLoc(OpCall->getEndLoc()), 0,
|
||
|
*result.SourceManager, result.Context->getLangOpts()),
|
||
|
")");
|
||
|
}
|
||
|
|
||
|
} // namespace abseil
|
||
|
} // namespace tidy
|
||
|
} // namespace clang
|