<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, May 27, 2014 at 8:44 AM, Timothée Vandeput <span dir="ltr"><<a href="mailto:timothee.vandeput@gmail.com" target="_blank">timothee.vandeput@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr"><div>Hello,</div><div><br></div><div>We are currently working on a clang plugin to check some StringLiteral (In-class initializer of field).</div>
<div>So far we are able to find the fields, analyze the strings and make the replacement in the source file when needed with :</div>

<div><br></div><div>PluginASTAction::CreateASTConsumer => SemaConsumer::HandleTopLevelDecl => RecursiveASTVisitor::TraverseFieldDecl => Rewriter::ReplaceText</div><div><br></div><div>What we would like now, is to make the change 'online'. So when we compile our sources, apply the modification in the source file but also in the AST (to avoid a second compilation step).</div>


<div><br></div><div>We tried the StringLiteral::setString method to change the string, but it partially worked. The string gets changed but the size of the const char [] doesn't, which result in the string being truncated.</div>


<div><br></div><div>Here is the ouput of the dump before and after the setString :</div><div><br></div><div>CXXConstructExpr 0xb8eec90 'class Toto' 'void (const char *, double)'<br>|-ImplicitCastExpr 0xb8eec80 'const char *' <ArrayToPointerDecay><br>


<strong>| `-StringLiteral 0xb8eec14 'const char [2]' lvalue "-"<br></strong>`-FloatingLiteral 0xb8eec38 'double' 4.250000e+01</div><div><br>CXXConstructExpr 0xb8eec90 'class Toto' 'void (const char *, double)'<br>


|-ImplicitCastExpr 0xb8eec80 'const char *' <ArrayToPointerDecay><br><strong>| `-StringLiteral 0xb8eec14 'const char [2]' lvalue "modified"<br></strong>`-FloatingLiteral 0xb8eec38 'double' 4.250000e+01<br>


</div><div><br></div><div>We also tried to use the TreeTransform class by implementing the TransformStringLiteral method and invoking the TreeTransform::TransformInitializer method.</div><div>The result was the same, it seems the node doesn't get rebuild.</div>


<div><br></div><div>Are we missing something obvious? Any suggestion of how we could replace that string in the AST?</div></div></div></blockquote><div><br></div><div>The AST is neither designed nor intended to support in-place modification -- it's supposed to be essentially immutable once created. TreeTransform is a better approach (since it creates new AST rather than updating existing AST nodes in-place).</div>
<div><br></div><div>In your overridden TransformStringLiteral, how are you creating the new StringLiteral? We don't seem to have any relevant functions on Sema for this, so I think you'd need to compute the relevant type yourself and call StringLiteral::Create.</div>
</div></div></div>