[cfe-dev] replacing Statement/Expression
Ted Kremenek
kremenek at apple.com
Sun Aug 17 13:11:25 PDT 2008
On Aug 17, 2008, at 12:52 PM, Rajesh Karmani wrote:
> Hello,
> Is there a facility to replace a statement or an expression with
> another
> in the AST? In the scenario that I am looking at, the text replacement
> strategy doesn't work because after rewriting the child expression,
> when
> I rewrite the parent expression it picks the child expressions from
> the
> AST which do not reflect the "updated" child expression.
Hi Rajesh,
While we haven't fleshed out the use of setter methods for ASTs, one
can indeed replace the AST nodes using Stmt::child_iterator
interface. child_iterator (which is a typedef of the class
StmtIterator) actually returns a reference to the Stmt* contained
within an AST node. For example, here is a snippet from
RewriteObjC.cpp:
// Start by rewriting all children.
for (Stmt::child_iterator CI = S->child_begin(), E = S->child_end();
CI != E; ++CI)
if (*CI) {
Stmt *newStmt = RewriteFunctionBodyOrGlobalInitializer(*CI);
if (newStmt)
*CI = newStmt;
}
We may gradually add direct setter methods to AST nodes as the
refactoring API gets fleshed out (feel free to make suggestions and
propose patches). One thing we're still resolving is the memory
management model for AST nodes. Right now they are all created using
new/malloc, but we've started rolling out changes that Stmt's are
allocated using a memory allocator associated with the ASTContext
object. I don't think you have to worry about this for now, but it is
something to be aware of (i.e., the API is still evolving).
Ted
More information about the cfe-dev
mailing list