У меня есть SourceLocation
, из которого я получу sh для извлечения его имени файла. По-видимому, я мог бы сделать это, используя SourceManager
s getFilename
. Однако при обработке некоторых файлов заголовков результатом всегда является пустая строка.
Я следую исходному коду и обнаружил, что проблема заключается в функции getFilename
, которая гласит:
/// Return the filename of the file containing a SourceLocation.
StringRef getFilename(SourceLocation SpellingLoc) const {
if (const FileEntry *F = getFileEntryForID(getFileID(SpellingLoc)))
return F->getName();
return StringRef();
}
Результат getFileID
как-то недопустим в том смысле, что SLocEntry
, построенный из него, будет иметь isFile
, возвращающий false
. Это заставляет getFileEntryForID
(который создает SLocEntry
под капотом) возвращать нулевой указатель.
У меня есть обходной путь, который является:
StringRef myGetFilename(SourceLocation SpellingLoc) const {
std::pair<FileID, unsigned> locInfo = getDecomposedExpansionLoc(SpellingLoc);
if (const FileEntry *F = srcManager.getFileEntryForID(locInfo.first))
return F->getName();
return StringRef();
}
То есть сначала позвоните getDecomposedExpansionLoc
, чтобы получить FileID
и использовать вместо него getFileEntryForID
.
Экспериментально это работает хорошо, но это мой первый день с clang, поэтому я Я очень не уверен, что это действительно правильно. Итак, у меня есть два вопроса:
- Это ошибка в Clang?
- Правильно ли мой обходной путь?
Спасибо!