getFilename возвращает пустую строку - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть 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, поэтому я Я очень не уверен, что это действительно правильно. Итак, у меня есть два вопроса:

  1. Это ошибка в Clang?
  2. Правильно ли мой обходной путь?

Спасибо!

1 Ответ

0 голосов
/ 04 февраля 2020

Ах, значит, проблема в том, что getFilename ожидает определенный c вид SourceLocation, а именно "SpellingLo c". Итак, измените:

srcManager.getFilename(loc)

на

srcManager.getFilename(srcManager.getSpellingLoc(loc))

, чтобы решить проблему.

...