Получите классы как минимум с двумя одинаковыми спецификаторами доступа с помощью ASTMatcher

Мне нужно отлавливать случаи в коде C ++, когда в классе есть два или более одинаковых спецификатора доступа.
Допустим, есть два класса

class A{
public:
int b;
public:
int a;
}

class B{
public:
int a;
}

Как сопоставить класс A (потому что у него два public), но не класс B с ASTMatcher?

0

Решение

Этот сопоставитель захватывает «публичную» декларацию:

accessSpecDecl(
isPublic(),
hasAncestor(cxxRecordDecl().bind("crd"))).bind("asd")

В классе обратного вызова вы можете отследить количество попаданий, которые получает совпадение для данного объявления структуры, например, с помощью std::map<string,int>:

struct report_public : public MatchCallback{
using map_t = std::map<string,int>;
using map_it = map_t::iterator;

map_t count;

void run(MatchResult const & result){
AccessSpecDecl const * asd = result.Nodes.getNodeAs<AccessSpecDecl>("asd");
CXXRecordDecl const * crd = result.Nodes.getNodeAs<CXXRecordDecl>("crd");
if(asd && crd){
string const struct_name = crd->getNameAsString();
map_it it = count.find(struct_name);
if(it != count.end()) count[struct_name]++;
else count[struct_name] = 1;
}
else { /* error handling */}
return;
} // run
}; // report_public
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]