Как анализировать только пользовательские исходные файлы с помощью инструментов Clang - PullRequest
0 голосов
/ 26 апреля 2018

Я пишу инструмент clang, но я довольно плохо знаком с ним, поэтому я столкнулся с проблемой, которую не смог найти в документации (пока).

Я использую отличный API Matchers, чтобы найти некоторые узлы, которыми я позже хочу манипулировать в AST. Проблема заключается в том, что инструмент clang фактически проанализирует все, что принадлежит исходному файлу, включая заголовки, такие как iostream и т. Д. Поскольку мои манипуляции, вероятно, будут включать некоторый рефакторинг, я определенно не хочу касаться каждой вещи, которую находит синтаксический анализатор.

Прямо сейчас я имею дело с этим, сравнивая исходные файлы узлов, с которыми я совпал, с аргументами в argv, но, разумеется, это неправильно, поскольку он все еще анализирует ВСЕ код iostream - он просто игнорирует это при этом. Я просто не могу поверить, что нет способа просто сказать ClangTool что-то вроде:

"только сопоставлять узлы, исходный файл местоположения которых пользователь вводит в этот инструмент"

Думая об этом, имеет смысл, только если возможно индивидуально создавать AST для каждого исходного файла, но мне нужно, чтобы они знали друг о друге или обменивались контекстными знаниями, и я также не нашел способа сделать это либо.

Я чувствую, что упускаю что-то очень очевидное здесь.

заранее спасибо:)

1 Ответ

0 голосов
/ 27 апреля 2018

Есть несколько сужающих совпадений, которые могут помочь: isExpansionInMainFile и isExpansionInSystemHeader. Например, можно объединить последнее с unless, чтобы ограничить совпадения узлами AST, которых нет в системных файлах.

Есть несколько примеров их использования в Анализе кода и рефакторинге с репозиторием Clang Tools . Например, посмотрите файл lib / CallSite_expander.h в строке 34, где unless(isExpansionInSystemHeader)) используется для исключения выражений вызовов, которые находятся в системных заголовках. Другой пример находится в строке 27 lib / function_signature_expander.h, где то же самое используется для исключения объявлений функций в системных заголовках, которые в противном случае соответствовали бы.

...