我正在使用clang matcher来获取结果节点。从结果节点,我能够得到行号,让我们说17.现在,我想在该行中获得整个源代码。请帮忙。
让我详细解释一下。我有一个clang matcher,它在源代码中找到浮动文字。例如,第17行,sr = 2.0 * rt_urand_Upu32_Yd_f_pw_snf(u);
是源代码,然后它与2.0匹配。这是我的匹配器:
const auto PA = floatLiteral(
isExpansionInMainFile(),
unless(hasAncestor(arraySubscriptExpr()))
).bind("pa");
MatchFinder MatchFinder;
MatchFinder.addMatcher(PA, &Handler);
MatchFinder.matchAST(Context);
从匹配器中,我能够获得匹配的节点。我能够检索行号(第17行)和列号(6)。请在下面找到我的代码:
const clang::FloatingLiteral* Variable = Result.Nodes.getNodeAs<clang::FloatingLiteral>("pa");
clang::SourceRange loc = Variable16->getSourceRange();
locStart = srcMgr.getPresumedLoc(loc.getBegin());
locEnd = srcMgr.getPresumedLoc(loc.getEnd());
std::cout << locStart.getLine()<< ":" << locEnd.getLine() << std::endl;
std::cout << locStart.getColumn() <<":" << locEnd.getColumn() << std::endl;
现在,如果我尝试检索源代码,我只获取部分数据。在网上做了一些研究之后,我尝试用两种方式检索源代码。第一种方法是使用词法分析器,请找到以下代码:
llvm::StringRef ref = Lexer::getSourceText(CharSourceRange::getCharRange(statement->getSourceRange()), srcMgr, LangOptions());
cout << ref.str() << endl;
第二种方法是使用重写器,请找到以下代码:
clang::Rewriter rewriter;
rewriter.setSourceMgr(Result.Context->getSourceManager(),Result.Context->getLangOpts());
cout<<rewriter.getRewrittenText (loc)<<endl;
根据我的理解,似乎我需要从第17行的第0列开始到第17行的列结尾的源范围.ASTA匹配器只匹配特定节点,所以我的问题是:
1)是否可以获得第17行的最终列号?
2)有没有其他方法可以从行号中获取源代码?
3)有没有其他方法可以从matcher获取源代码?
感谢您的帮助。