<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Dec 22, 2012, at 8:15 PM, Jaymie Strecker <<a href="mailto:jstrecker@kosada.com">jstrecker@kosada.com</a>> wrote:</div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Is it possible to parse some code containing a typedef, then modify that typedef in the AST? For example, the input code contains `typedef int blah` and I want to change it to `typedef float blah`. </div><div><br></div><div>I found some <a href="http://eli.thegreenplace.net/2012/06/08/basic-source-to-source-transformation-with-clang/">example code for traversing the AST</a>, which I modified to visit each typedef declaration: </div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">   </span><span style="color: #cc00a2">bool</span> VisitDecl(Decl *d) {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(226, 3, 0); "><span class="Apple-style-span" style=""><span class="Apple-tab-span" style="white-space:pre">             </span>d->dump();printf(<span style="color: #e20300">"\n"</span>);</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">              </span><span style="color: #cc00a2">if</span> (TypedefDecl::classof(d)) {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">                 </span>TypedefDecl *td = <span style="color: #cc00a2">static_cast</span><TypedefDecl *>(d);</div></div></div></blockquote><div><br></div><div>The idiomatic way of writing this would be:</div><div>  if (TypedefDecl *td = dyn_cast<TypedefDecl>(d)) {</div><div>or (if you're not working on the compiler proper and you can use C++11 features):</div><div>  if (auto td = dyn_cast<TypedefDecl>(d)) {</div><div><br></div><div>That said, the AST is not designed to be mutable like this, which is why</div><div>TypedefDecl doesn't have a setter for the type.</div><div><br></div><div>John.</div></div></body></html>