为什么源位置在这里以两个字符结束?
Why is the source location end off by two characters here?
我正在尝试使用 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 个字符。为什么会这样?
我得到的 SourceLocation 差了一个,因为它只匹配令牌和“;”不是其中的一部分。
顺便说一句,如果有人想知道如何包含“;”如果他们愿意,您可以使用 Lexer::MeasureTokenLength
然后将其加一并通过 offset
.
获得新的 SourceLocaiton
我正在尝试使用 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 个字符。为什么会这样?
我得到的 SourceLocation 差了一个,因为它只匹配令牌和“;”不是其中的一部分。
顺便说一句,如果有人想知道如何包含“;”如果他们愿意,您可以使用 Lexer::MeasureTokenLength
然后将其加一并通过 offset
.
SourceLocaiton