For-range in replacement logic (#631)

This replaces GetAstMatcher with AddMatcher because cxxForRangeStmt is a StatementMatcher. addMatcher has multiple definitions (https://clang.llvm.org/doxygen/classclang_1_1ast__matchers_1_1MatchFinder.html) and so this approach allows using the right addMatcher without writing per-call overloads.

To handle the `var`, I'm considering something like moving VarDecl logic into a VarMatcherBase so that I can just use CXXForRangeStmt's getLoopVariable. The problem is a for-range statement has multiple VarDecls, and getLoopVariable may be the easiest way to identify the real one.
This commit is contained in:
Jon Meow
2021-07-12 16:20:44 -07:00
committed by GitHub
parent c4079bfdae
commit 6fa42a7f3c
18 changed files with 212 additions and 69 deletions
+6 -4
View File
@@ -131,10 +131,12 @@ void VarDecl::Run() {
clang::CharSourceRange::getCharRange(replace_start, replace_end), after);
}
auto VarDeclFactory::GetAstMatcher() -> cam::DeclarationMatcher {
return cam::varDecl(cam::unless(cam::hasParent(cam::declStmt(
cam::hasParent(cam::cxxForRangeStmt())))))
.bind(Label);
void VarDeclFactory::AddMatcher(cam::MatchFinder* finder,
cam::MatchFinder::MatchCallback* callback) {
finder->addMatcher(cam::varDecl(cam::unless(cam::hasParent(cam::declStmt(
cam::hasParent(cam::cxxForRangeStmt())))))
.bind(Label),
callback);
}
} // namespace Carbon