Используя libclang, у меня есть курсор в AST, что соответствует выражению, вызванному расширением макроса. Я хочу получить исходный, нерасширенный текст макроса.
Я искал API libclang для этого и не могу найти его. Я что-то пропустил?
Предполагая, что такого API не существует, я вижу несколько способов сделать это, как на основе использования clang_getCursorExtent(), чтобы получить исходный диапазон курсора - который, предположительно, является диапазоном исходного текст.
Первой идеей является использование clang_getFileLocation() для получения имени файла и позиции od начала и конца диапазона и для чтения текста непосредственно из файла. Если я скомпилирован из несохраненных файлов, то мне нужно разобраться с этим, но моя основная забота об этом подходе заключается в том, что просто не кажется правильным выйти за пределы файловой системы, когда я уверен, что clang хранит всю эту информацию внутри, Также были бы последствия, если бы AST был загружен, а не сгенерирован, или если исходные файлы были изменены после их разбора.
Второй подход заключается в вызове clang_tokenize() на уровне курсора. Я попытался сделать это и обнаружил, что он не может создать список токенов для большинства курсоров в AST. Выяснив, что внутри clang_tokenize() внутренне манипулирует поставляемым диапазоном и заканчивается тем, что он охватывает несколько файлов (предположительно из-за некоторого эффекта расширения макроса) и прерывается. Это кажется мне неправильным, но я чувствую, что в любом случае я злоупотребляю clang_tokenize(), пытаясь это сделать.
Итак, какой лучший подход?