hokein added inline comments.

================
Comment at: clang-move/ClangMove.cpp:38
@@ +37,3 @@
+                          const clang::Module * /*Imported*/) override {
+    if (const auto *FileEntry = SM.getFileEntryForID(SM.getFileID(HashLoc))) {
+      if (IsAngled) {
----------------
ioeric wrote:
> Might want to comment on how #include "old_header" is handled here?
Currently the old_header is also copied to new file.

================
Comment at: clang-move/ClangMove.cpp:103
@@ +102,3 @@
+                                     const clang::SourceManager *SM) {
+  // Gets the ending ";".
+  auto EndLoc = clang::Lexer::getLocForEndOfToken(D->getLocEnd(), 0, *SM,
----------------
ioeric wrote:
> Consider the code below to also include trailing comment.
>     clang::SourceLocation after_semi = clang::Lexer::findLocationAfterToken(
>         D->getLocEnd, clang::tok::semi, *SM,
>         result.Context->getLangOpts(),
>         /*SkipTrailingWhitespaceAndNewLine=*/true);
> 
But this code could not handle cases where the declaration definition has no 
semi at the end, such as "void f() {}"

================
Comment at: clang-move/ClangMove.cpp:125
@@ +124,3 @@
+
+  // Add moved class definition and its related declarations. All declarations
+  // in same namespace are grouped together.
----------------
ioeric wrote:
> If two declarations in the same namespace are not consecutive in the vector 
> (i.e. there is a decl in a different ns between them), will they be put into 
> two canonical namespace blocks?
Yes, only declarations which are consecutive in the vector and in the same 
namespace are put in one namespace block.

================
Comment at: clang-move/ClangMove.cpp:129
@@ +128,3 @@
+  for (const auto &MovedDecl : Decls) {
+    std::vector<std::string> DeclNamespaces = GetNamespaces(MovedDecl.Decl);
+    auto CurrentIt = CurrentNamespaces.begin();
----------------
ioeric wrote:
> Is it possible to restrict all `MovedDecl.Decl` to NamedDecl so that we can 
> use `getQualifiedNameAsString` instead of having a second implementation of 
> retrieving namespaces. 
> 
> Also how is anonymous namespace handled here?
> 
> 
Yeah, `getQualifiedNameAsString` looks like a simpler way, but it doesn't 
suitable for our usage here.

The `getQualifiedNameAsString` includes the name of the class.  For instance, a 
class method decl like `void A::f() {}` defined in global namespace, it retruns 
`A::f` which is not intended. 

It handles anonymous namespace by wrapping like `namespace { ... } // 
namespace`, see the test.


================
Comment at: clang-move/ClangMove.cpp:199
@@ +198,3 @@
+
+  // Match functions defined in anonymous namespace.
+  Finder->addMatcher(
----------------
ioeric wrote:
> What about static functions?
Good catch, I missed it. Added.

================
Comment at: clang-move/ClangMove.cpp:210
@@ +209,3 @@
+      this);
+}
+
----------------
ioeric wrote:
> FIXME: support out-of-line member variable initializations etc? Or is it 
> already covered?
Add support now.

================
Comment at: clang-move/ClangMove.cpp:240
@@ +239,3 @@
+                                llvm::StringRef FileName) {
+  if (!Spec.OldHeader.empty() && FileName.endswith(Spec.OldHeader)) {
+    HeaderIncludes.push_back(IncludeLine.str());
----------------
ioeric wrote:
> No braces.
> 
> Also, I am worrying if `endswith` is a safe way to compare files. For 
> example, what if `FileName` is relative path? 
The `FileName` is from the `PPCallbacks::InclusionDirective` APIs. From my 
experience, it seems always to be an absolute file path either I pass a 
relative file path or a absolute path to clang-move, but this is no guarantee 
in the document.

Using `endswith` is the most reliable way so far.



================
Comment at: clang-move/ClangMove.h:39
@@ +38,3 @@
+  struct MoveDefinitionSpec {
+    std::string Name;
+    std::string OldHeader;
----------------
ioeric wrote:
> Should the `Name` be fully qualified?
It's not required. The name can be fully/partially qualified, e.g., 
`::a::b::X`, `a::b::X`, `b::X`, `X`, which has the same behavior with `hasName` 
ast matcher.

It the given name is partially qualified, it will match all the class whose 
name ends with the given name.

================
Comment at: clang-move/ClangMove.h:65
@@ +64,3 @@
+
+  const MoveDefinitionSpec &Spec;
+  // The Key is file path, value is the replacements being applied to the file.
----------------
ioeric wrote:
> Is there any reason why you made this a reference?
To avoid the cost of making a copy of the structure.

================
Comment at: clang-move/ClangMove.h:83
@@ +82,3 @@
+public:
+  explicit ClangMoveAction(
+      const ClangMoveTool::MoveDefinitionSpec &spec,
----------------
Eugene.Zelenko wrote:
> Is explicit necessary?
The `explicit` keyword can prevent the copy-list-initialization like 
`ClangMoveAction a = {spec, file_to_replacement}`. I'm fine to remove it since 
it is trival.

================
Comment at: clang-move/tool/ClangMoveMain.cpp:102
@@ +101,3 @@
+    for (const auto &it : Tool.getReplacements())
+      Files.insert(it.first);
+    auto WriteToJson = [&](llvm::raw_ostream& OS) {
----------------
ioeric wrote:
> Indentation.
Indentation is correct here, clang-format doesn't complain anything about it.


https://reviews.llvm.org/D24243



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to