为什么源位置在此处以两个字符结尾?

时间:2016-05-19 10:27:20

标签: llvm-clang libtooling

我正在尝试使用libTooling为源代码转换器编写源代码。

我使用ASTMatchers尝试查找没有大括号的if语句,然后使用重写器添加大括号。

我使用的匹配器是:

ifStmt(unless(hasDescendant(compoundStmt())))

然后我只是获取开始和结束位置,并重写大括号。

以下是其源代码:

if (const IfStmt *IfS = Result.Nodes.getNodeAs<clang::IfStmt>("ifStmt")) {
const Stmt *Then = IfS->getThen();
Rewrite.InsertText(Then->getLocStart(), "{", true, true);
Rewrite.InsertText(Then->getLocEnd(),"}",true,true);

现在的问题是,由于某种原因,结束位置总是偏离2个字符。为什么会这样?

1 个答案:

答案 0 :(得分:2)

我得到的SourceLocation是一个因为它只匹配令牌和&#34 ;;&#34;不是其中的一部分。 顺便说一下,如果有人想知道如何包含&#34 ;;&#34;如果他们愿意,可以使用Lexer::MeasureTokenLength,然后将其添加到SourceLocaiton