[PATCH] D66647: [clangd] DefineInline action apply logic with fully qualified names

Ilya Biryukov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 26 05:01:25 PDT 2019


ilya-biryukov added a comment.

Currently we add too many qualifiers in some cases, e.g. here's a common pattern in clangd:

  // foo.h
  #include "Decl.h"
  namespace clang::clangd { std::string printName(Decl*D); }
  
  // foo.cpp
  #include "foo.h"
  namespace clang::clangd { 
    std::string printName(Decl *D) {
      NamedDecl* ND = ...;
    } 
  ...
  }

this will result in:

  // foo.h
  namespace clang::clangd {
  std::string printName(Decl*D) {
    clang::NamedDecl *ND = ...; // <-- (!) we did not even had any 'using' declarations or 'using namespace's 
  }
  }

It's ok to leave this out of the initial change, but could we describe our strategy to tackle this somewhere in the comments - how we want to fix this and when.



================
Comment at: clang-tools-extra/clangd/unittests/TweakTesting.h:77
   //  - if apply() returns an error, returns "fail: <message>"
-  std::string apply(llvm::StringRef MarkedCode) const;
+  std::string apply(llvm::StringRef MarkedCode);
 
----------------
It seems weird that we have this inconsistency between the contents for current file (passed through the return value) and contents for other files (pass through the fields).

A few better alternatives that come to mind:
1. add an out parameter, could be optional in case when all changes are in the main file.
2. this function will fail when there are changes outside main file, but we can add a new function to return changes in all modified files, e.g. as `StringMap<std::string>` or `vector<pair<Path, string/*Content*/>>` (the latter allows to use standard matchers)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D66647/new/

https://reviews.llvm.org/D66647





More information about the cfe-commits mailing list