2016-05-19 15 views
0

Ich versuche, einen Source-to-Source-Übersetzer mit libTooling zu schreiben.Warum endet der Quellort hier mit zwei Zeichen?

Ich benutze ASTMatchers zu versuchen, if Anweisungen zu finden, die nicht geschweifte Klammern haben und dann einen Rewriter verwenden, um die Klammern hinzuzufügen.

Der Matcher Ich verwende ist:

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

Dann bekomme ich nur die Start- und Endstellen und die geschweiften Klammern umschreiben.

Hier ist der Quellcode für die:

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); 

Das Problem ist jetzt, dass die Endstelle aus irgendeinem Grunde von 2 Zeichen immer ausgeschaltet ist. Warum ist das so?

+0

Ich habe versucht, InsertTextAfterToken anstelle von InserText zu verwenden. Es hat immer das Semikolon verpasst, jetzt ist es nur noch eins. – bloodstalker

Antwort

0

der SourceLocation, die ich bekam, ist um eins, weil es nur das Token und ";" gehört nicht dazu. BTW, wenn jemand fragt, wie man das ";" in den Bereich, wenn sie wollen, könnten Sie einfach Lexer::MeasureTokenLength verwenden und dann das um eins hinzufügen und die neue SourceLocaiton von offset bekommen.