<div dir="ltr">I was wondering if anybody spend some efforts in implementing a clone Method for all ASTNodes?<div><br></div><div>It seems to me, that the current approach implemented in the ASTImporter is error-prone and hard to maintain.</div><div><br></div><div>Currently it looks to me that Decls / Stmt's are being probed for their type and then downcasted, eg.:<br><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace, monospace">/* ASTNodeImporter::VisitExplicitCastExpr */</font></div><div><font face="monospace, monospace">/* ASTImporter.cpp:6060 */</font></div><div><font face="monospace, monospace">switch (E->getStmtClass()) {</font></div><div><font face="monospace, monospace">  case Stmt::CStyleCastExprClass: {</font></div><div><font face="monospace, monospace">     CStyleCastExpr *CCE = cast<CStyleCastExpr>(E);</font></div><div><font face="monospace, monospace">     return CStyleCastExpr::Create(Importer.getToContext(), T,</font></div><div><font face="monospace, monospace">        E->getValueKind(), E->getCastKind(),</font></div><div><font face="monospace, monospace">        SubExpr, &BasePath, TInfo,</font></div><div><font face="monospace, monospace">        Importer.Import(CCE->getLParenLoc()),</font></div><div><font face="monospace, monospace">        Importer.Import(CCE->getRParenLoc()));</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace">/* more cases*/</font></div></blockquote><div><br></div><div><br></div><div>As the AST contains circular references and many nodes require an ASTContext</div><div>for construction, i'm wondering how feasible it would be to implement the following interface for each Decl?</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace, monospace"> virtual Decl* clone(</font></div><div><font face="monospace, monospace">   ASTContext* newContext, </font></div><div><font face="monospace, monospace">   DenseMap<Decl*, Decl*> ImportedDeclsCache = {}</font></div><div><font face="monospace, monospace"> );</font></div></blockquote><div><br></div><div><br></div><div><br></div><div><br><br><br><div class="mt-signature"><a href="https://mailtrack.io/trace/link/b910ce4d02f08facbacacd7152c370d845d81397?url=https%3A%2F%2Fmailtrack.io%2F&signature=e6da9dfa433d9e41" class="gmail-mt-signature-logo" style="text-decoration:none"><img src="https://s3-eu-west-1.amazonaws.com/mailtrack-crx/icon-signature.png" width="16" height="14"> </a><font color="#999999" class="mt-signature-text">Sent with <a href="https://mailtrack.io/install?source=signature&lang=en&referral=gaetano.checinski@gmail.com&idSignature=22" class="mt-install">Mailtrack</a></font></div></div><img width="0" height="0" class="mailtrack-img" src="https://mailtrack.io/trace/mail/60b1fad8a10e8e81bb7515ece8f346d88128107a.png?u=931501"></div>