2016-05-19 5 views
0

libToolingを使用してソーストランスレータにソースを書き込もうとしています。ここでは、ソースの場所が2文字で終わるのはなぜですか?

私はASTMatchersを使用して中括弧を持たない文を見つけようとしていますし、リライタを使用して中括弧を追加しようとしています。

私が使用しているマッチャは次のとおりです。

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つの文字によって常にオフであるということです。なぜこれはそうですか?

+0

私はInserTextの代わりにInsertTextAfterTokenを使ってみました。それは常にセミコロンを見逃していたので、今は1つしかありません。 – bloodstalker

答えて

0

私が取得したSourceLocationは、トークンと ";"しか一致しないため、1つだけオフになっていました。それの一部ではありません。 btw、誰かが ";"彼らが望むなら範囲に、あなたはちょうどLexer::MeasureTokenLengthを使用し、それを1つ追加して、新しいSourceLocaitonoffsetで得ることができます。

関連する問題