<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><br></div><div>Thanks for your help,</div><div>Tim</div><div><br></div></div></div>