<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><div><span class=""><blockquote type="cite"><div dir="ltr"><div>- Does the code for the refactoring engine use ASTUnit? Can it be used without that?</div></div></blockquote><div>Not really. The core engine itself doesn’t really care about the ASTUnit. As long as it gets the ASTContext from somewhere it should work :) <br></div></span></div></div></blockquote><div>Good to know, then it shouldn't be a problem to reuse your code in clangd even if we move away from ASTUnit. </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><div><span class=""><blockquote type="cite"><div dir="ltr"><div>- Does refactoring engine have a separate component for testing correctness of the refactoring? Does it have an API to provide conflicts?<br></div></div></blockquote><div>Do you mean the correctness of the transformed source (i.e. it should be semantically identical to the original source) or something else? No, we don’t have a component that verifies semantic correctness. Furthermore, our implementation of “extract”s doesn’t provide any semantic correctness guarantees, as there are cases when the semantics of the program will change (we could probably diagnose them, but we don’t).<br></div></span></div></div></blockquote><div>I.e. a common check for rename would be to resolve all occurrences again after rename is completed and check that they actually resolve to the renamed entity. (I.e. there might've been a parameter with the same name and some references may now resolves to a parameter, rather than some class you were renaming. In case there are errors, we may want to notify users about those (that's what I call conflicts).</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><div><span class=""><blockquote type="cite"><div><div dir="ltr"><div>- What data does refactoring engine requires from Indexing API specifically?</div></div></div></blockquote></span><div>What do you mean by the Indexing API? There’s no direct interaction with Clang’s indexing API and the refactoring engine. For global rename, Xcode’s indexer passes in the source location and symbol kinds for the previously indexed occurrences, but that relies on new refactoring APIs.</div></div></div></blockquote><div>I was asking about the data you pass from Xcode's indexer to refactoring engine. Got it, thanks.</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><div><span class=""><blockquote type="cite"><div><div dir="ltr"><div>- Why is 'Generate missing definitions' considered a cross-TU action? You actually touch only one file (i.e. the .cpp file where you put the definitions) and the AST for it should be enough for generating definitions.</div></div></div></blockquote></span><div>The action is typically initiated in the header file, so we treat it as a separate TU. Also, C++ classes can be scattered across many CPP files, so even if we are initiating in a CPP file that contains the declaration of the class, it might not be the right CPP file (we put the out-of-line functions to the CPP file that already has the majority of the out-of-line methods from that class).</div></div></div></blockquote><div>Got it.</div><div>Have you thought about actions that would require referring to classes/functions that aren't available in the TU you're changing (i.e. require includes to added in order to become available)?</div><div>Say, we want to implement an action/refactoring to create a missing declaration inside class A (see code below):</div><div>// Foo.h</div><div>struct A {</div><div>  int foo();</div><div>};</div><div><br></div><div>// Foo.cpp</div><div>#include "Foo.h"</div><div>#include <string></div><div><br></div><div>using namespace std;</div><div>int A::bar(string a) {  // <-- action available here to create bar() in Foo.h</div><div>  return 10;</div><div>}</div><div><br></div><div>Can the current refactoring infrastructure be used to implement that? (i.e. add '#include <string>' to Foo.h, qualify string with 'std::' when creating a declaration?)</div><div>If not, maybe you've already thought how we could make that possible?</div><div> </div></div>
</div></div>