如何使用 clang libtooling 获取 #includes 的源位置?
How to get source location of #includes using clang libtooling?
有没有什么方法可以通过 clang::FileID
或 clang::FileEntry
之类的方式为文件中的每个 #include
获取 clang::SourceLocation
?
使用源管理器的 GetIncludedLoc 函数,以 fileid 作为参数怎么样?
SourceManager.GetIncludedLoc(文件 ID)
感谢@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);
}
也可以通过
获得一些关于include的信息
Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc, StringRef &Buffer)
和
Lexer::ComputePreamble(StringRef Buffer, const LangOptions &LangOpts, unsigned MaxLines = 0)
有没有什么方法可以通过 clang::FileID
或 clang::FileEntry
之类的方式为文件中的每个 #include
获取 clang::SourceLocation
?
使用源管理器的 GetIncludedLoc 函数,以 fileid 作为参数怎么样?
SourceManager.GetIncludedLoc(文件 ID)
感谢@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);
}
也可以通过
获得一些关于include的信息Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc, StringRef &Buffer)
和
Lexer::ComputePreamble(StringRef Buffer, const LangOptions &LangOpts, unsigned MaxLines = 0)