Я пишу инструмент Clang для статического анализа исходного файла и для сопоставления и переименования всех частных членов класса.Сопоставление частных членов класса с использованием clang AST Matcher
Рассмотрим пример:
class AClass { // problem: my matcher modifies AST node here too
private:
int a; // <- I know how to rename this 'a' using other matcher
public:
AClass() {
AClass cl;
this->a = 1; // <- rename this 'a'
cl.a = 2; // <- rename this 'a'
}
};
void bar(AClass);
void foo() {
//bar(AClass());
}
Я использую следующий Искателя, чтобы получить доступ к AST узлов, которые я хотел бы изменить. Он работает, как я ожидаю.
clang-query> match memberExpr(hasDeclaration(namedDecl(isPrivate())))
Match #1:
sum.cpp:7:9: note: "root" binds here
this->a = 1;
^~~~~~~
Match #2:
sum.cpp:8:9: note: "root" binds here
cl.a = 2;
^~~~
2 matches.
Если в примере я раскомментировать строку с bar(AClass());
, возникает проблема. Существует дополнительный матч, точно
Match #3:
sum.cpp:1:7: note: "root" binds here
class AClass {
^~~~~~
3 matches.
что приводит к перезаписи class AClass
декларации в странном образе. Я хочу избавиться от этого матча.
Матчи возвращают указатель на объект MemberExpr
. Я попытался отфильтровать третий матч, проверив предикат isArrow()
, и это помогло, но затем я не могу сопоставить выражения с точками, например cl.a
.
Я ищу другое выражение для определения AST или код, который работает с объектами MemberExpr
, и получает доступ ко всем закрытым переменным в исходном файле и не более того.
это мог быть местом, которое звон дает в неявном определен копировать конструктор? Я не знаком с тем, как это делает clang, но я знаком с подобными инструментами. Общий подход заключается в том, чтобы неявно объявленные/определенные функции занимали местоположение конструктора. Может быть, вы можете добавить фильтр на закрывающей функции, которая не определена неявно? –
@RichardCorden, я попытался использовать 'memberExpr (hasDeclaration (namedDecl (isPrivate(), если только (isImplicit()))))' Соответствие expresion и ничего не сказалось. –
Я вообще не знаком с Clang API. Вы не хотите спрашивать, является ли 'a' неявным, вы хотите спросить, неявно ли определена функция, охватывающая выражение. Вы можете получить эту информацию? Один из способов проверить мою теорию - явно определить конструктор копирования. Если вы больше не получаете совпадение в строке 1 исходного файла, то это показывает, что это было место конструктора копирования. –