<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">A general thought:</div><div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">What makes this perhaps unnecessarily difficult is that ASTConsumer does not provide a full suite of overrideable `Handle*` functions to be called in the midst of parsing.</div><div style="margin: 0px; font-stretch: normal; line-height: normal; min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">There is `HandleTranslationUnit()` (called after the full translation unit has been parsed), `HandleTopLevelDecl()` (called after each top-level decl is parsed), and the remainder seem to be assorted special cases (`HandleInterestingDecl()` etc).</div><div style="margin: 0px; font-stretch: normal; line-height: normal; min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">If there were e.g. `HandleCXXThisExpr(CXXThisExpr *E)` et al, called while `E`’s proper scope/state data is still active, Oleksandr could define his logic in an override of that, within which he could simply call `S.LookupName(Result, S.getCurScope())` to get his lookup results.  No need to copy and paste implementation details to reenter the proper scope/state.</div><p style="margin: 0px; font-stretch: normal; line-height: normal; min-height: 14px;" class=""><br class="webkit-block-placeholder"></p><div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">Re how it could be implemented to minimize overhead:</div><div style="margin: 0px; font-stretch: normal; line-height: normal; min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">```</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">// — ASTConsumer.h — //</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">class AbstractDeclHandler {…}; // Like DeclVisitor but using virtuals instead of CRTP</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">class AbstractStmtHandler {…}; //""</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">class AbstractExprHandler {</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">  … //e.g.:</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">  virtual bool HandleCXXThisExpr(Expr *E) { return true; }</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">  …</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">};</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">class ASTConsumer {</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">  AbstractDeclHandler *DH = nullptr;</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">  AbstractStmtHandler *SH = nullptr;</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">  AbstractExprHandler *EH = nullptr;</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">public:</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">  //getDeclHandler/setDeclHandler/et al</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">  …</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">};</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">// - lib/Sema/… - //</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">ExprResult Sema::BuildCXXThisExpr(…) {</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">  ExprResult res = …;</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">  if (auto *Handler = Consumer.getExprHandler())</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">    if (!Handler->HandleCXXThisExpr(res.get()))</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">      return ExprError();</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">  return res;</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">}</div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class="">// same for other Stmts & Decls: always Handle* after building</div><div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">```</div><div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">To further reduce overhead: "handling" Exprs immediately upon building is too fine-grained — probably only need to handle Stmts and Decls immediately after building them, and group the Expr handling calls together in the handling of their parent Stmt.</div><div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><br class=""></div><div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">But this at least demonstrates how a user override called in this way would have access to all the proper scope/state info originally available to the node, which could be a very useful addition to ASTConsumer.</div><div><br class=""><blockquote type="cite" class=""><div class="">On Oct 4, 2020, at 3:15 AM, Vassil Vassilev via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" class="">cfe-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">
  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" class="">
  
  <div class="">
    <div class="moz-cite-prefix">On 10/3/20 3:40 PM, Oleksandr Koval via
      cfe-dev wrote:<br class="">
    </div>
    <blockquote type="cite" cite="mid:CAGatSHGuxARpSxiESd60Q_5AJbmbCDXuGjCQ6Yq8Cg+A5mL+jw@mail.gmail.com" class="">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8" class="">
      <div dir="ltr" class="">
        <div class="">Hi, I'm writing a check that detects and removes redundant
          `this->` usage. Finding explicit `this->` was simple,
          now I want to check whether it's safe to remove it. My main
          concern is such case:</div>
        <pre style="background-image: none; background-attachment: scroll; background-color: rgb(255, 255, 255); background-position: 0% 0%; background-repeat: repeat repeat;" class=""><span style="color:rgb(128,0,0);font-weight:bold" class="">struct</span> X<span style="color:rgb(128,0,128)" class="">{</span>
    <span style="color:rgb(128,0,0);font-weight:bold" class="">void</span> f<span style="color:rgb(128,128,48)" class="">(</span><span style="color:rgb(128,0,0);font-weight:bold" class="">int</span> x<span style="color:rgb(128,128,48)" class="">)</span><span style="color:rgb(128,0,128)" class="">{</span>
        <span style="color:rgb(105,105,105)" class="">// without `this->` will use parameter</span>
        <span style="color:rgb(128,0,0);font-weight:bold" class="">this</span><span style="color:rgb(128,128,48)" class="">-</span><span style="color:rgb(128,128,48)" class="">></span>x<span style="color:rgb(128,128,48)" class="">+</span><span style="color:rgb(128,128,48)" class="">+</span><span style="color:rgb(128,0,128)" class="">;</span>

        <span style="color:rgb(105,105,105)" class="">// can remove `this->` because</span>
        <span style="color:rgb(105,105,105)" class="">// local `y` is not visible yet</span>
        <span style="color:rgb(128,0,0);font-weight:bold" class="">this</span><span style="color:rgb(128,128,48)" class="">-</span><span style="color:rgb(128,128,48)" class="">></span>y<span style="color:rgb(128,128,48)" class="">+</span><span style="color:rgb(128,128,48)" class="">+</span><span style="color:rgb(128,0,128)" class="">;</span>
        y<span style="color:rgb(128,128,48)" class="">+</span><span style="color:rgb(128,128,48)" class="">+</span><span style="color:rgb(128,0,128)" class="">;</span>

        <span style="color:rgb(128,0,0);font-weight:bold" class="">int</span> y<span style="color:rgb(128,0,128)" class="">;</span>
        y<span style="color:rgb(128,128,48)" class="">+</span><span style="color:rgb(128,128,48)" class="">+</span><span style="color:rgb(128,0,128)" class="">;</span>
    <span style="color:rgb(128,0,128)" class="">}</span>
    <span style="color:rgb(128,0,0);font-weight:bold" class="">int</span> x<span style="color:rgb(128,0,128)" class="">;</span>
    <span style="color:rgb(128,0,0);font-weight:bold" class="">int</span> y<span style="color:rgb(128,0,128)" class="">;</span>
<span style="color:rgb(128,0,128)" class="">}</span><span style="color:rgb(128,0,128)" class="">;</span>
</pre>
        <div class="">I need to know whether a specific name(function or
          variable) will resolve to the same declaration without
          `this->` part. My matcher is <i class="">memberExpr(has(cxxThisExpr()))</i>,
          I bind  MemberExpr and CXXThisExpr, I can rewrite matcher to
          also bind enclosing CXXMethodDecl. As I understand, simple
          enumeration of parameter/local variable names won't work(as in
          case with `y`) because of lookup/visibility rules. Is there
          some `lookup()` function whose result I can compare against
          the declaration of original function/variable? I found
          Sema::LookupName() but can't figure out how to get Scope of
          the found expression. Can you give me an example please?<br class="">
        </div>
      </div>
    </blockquote><p class=""><br class="">
    </p><p class="">  The Scope is a parser thing which contains an opaque ptr to the
      DeclContext. In principle, you can create a fake Scope and attach
      the relevant DeclContext via setEntity. I think just passing
      Sema::TUScope may work. If you want some pseudocode:</p><p class="">  Scope *fakeS = new Scope(...);<br class="">
        fakeS->setEntity(DC);<br class="">
        // you may need to do some work for the variable shadowing<br class="">
        LookupResult R(Sema, Var->getName(), SourceLocation(),
      Sema::LookupOrdinaryName, Sema::ForRedeclaration);<br class="">
        Sema->LookupName(R, fakeS);<br class="">
        delete fakeS;</p><p class="">  Note that is an approximation as we do not attach the scope to
      the chain of scopes like the parser does. It some extra work that
      is also possible.</p><p class=""><br class="">
    </p>
    <blockquote type="cite" cite="mid:CAGatSHGuxARpSxiESd60Q_5AJbmbCDXuGjCQ6Yq8Cg+A5mL+jw@mail.gmail.com" class="">
      <div dir="ltr" class="">
        <div class=""><br class="">
        </div>
        <div class="">-- <br class="">
          <div dir="ltr" data-smartmail="gmail_signature" class="">
            <div dir="ltr" class="">
              <div class="">Regards,</div>
              <div class="">Oleksandr Koval.<br class="">
              </div>
            </div>
          </div>
        </div>
      </div>
      <br class="">
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
cfe-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>
<a class="moz-txt-link-freetext" href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
</pre>
    </blockquote><p class=""><br class="">
    </p>
  </div>

_______________________________________________<br class="">cfe-dev mailing list<br class=""><a href="mailto:cfe-dev@lists.llvm.org" class="">cfe-dev@lists.llvm.org</a><br class="">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev<br class=""></div></blockquote></div><br class=""></body></html>