如何使用clang libtooling获取#includes的源位置?

时间:2017-04-17 09:09:29

标签: include clang libtooling

是否可以通过clang::SourceLocation#include或其他内容为文件中的每个clang::FileID获取clang::FileEntry

2 个答案:

答案 0 :(得分:2)

如何使用源管理器的GetIncludedLoc函数,该函数将fileid作为参数。

SourceManager.GetIncludedLoc(FILEID)

答案 1 :(得分:0)

感谢@Hemant的答案,你是对的

我已经发现自己(在clang 3.8中称为getIncludeLoc) 但忘了写在这里。 我用这个来找到所有#includes的位置,我可以自己放置。 这是我为此写的功能(当然不是最好的方法),希望它可以帮助某人

SourceLocation getIncludeLocation(FileID fileID, SourceManager &sm, unsigned carriages) {
       return SourceLocation();
     set<unsigned> lines;
    if (fileID.isInvalid())
    for (auto it = sm.fileinfo_begin(); it != sm.fileinfo_end(); it++) {
        SourceLocation includeLoc = sm.getIncludeLoc(sm.translateFile(it->first));
        if (includeLoc.isValid() && sm.isInFileID(includeLoc, fileID)) {
            lines.insert(sm.getSpellingLineNumber(includeLoc));
        }
    }
    unsigned pos(0);
    if (!lines.empty()) {
        bool first = true;
        for (unsigned line :lines) {
            if (first)
                first = false;
            else if ((line - pos) > carriages)
                break;
            pos = line;
            //cout << "Include line:" << pos << endl;
        }
        //cout << console_hline('-') << endl;
    }
    cout << sm.getFileEntryForID(fileID)->getName() << endl;
    return sm.translateFileLineCol(sm.getFileEntryForID(fileID), ++pos, 1);
}

还可以通过

获取有关包含的一些信息
Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc, StringRef &Buffer)

Lexer::ComputePreamble(StringRef Buffer, const LangOptions &LangOpts, unsigned MaxLines = 0)