hokein created this revision. hokein added a reviewer: ioeric. hokein added a subscriber: cfe-commits.
Also ignore helpers which are defined in macro. Currently clang-move doesn't handle macro well enough, especiall for complex macros. This patch will ignore declarations in macros to make the behavior of clang-move more correct. https://reviews.llvm.org/D28774 Files: clang-move/ClangMove.cpp test/clang-move/Inputs/macro_helper_test.cpp test/clang-move/Inputs/macro_helper_test.h test/clang-move/no-move-macro-helpers.cpp Index: test/clang-move/no-move-macro-helpers.cpp =================================================================== --- /dev/null +++ test/clang-move/no-move-macro-helpers.cpp @@ -0,0 +1,19 @@ +// RUN: mkdir -p %T/no-move-macro-helper +// RUN: cp %S/Inputs/macro_helper_test.h %T/no-move-macro-helper/macro_helper_test.h +// RUN: cp %S/Inputs/macro_helper_test.cpp %T/no-move-macro-helper/macro_helper_test.cpp +// RUN: cd %T/no-move-macro-helper +// +// ----------------------------------------------------------------------------- +// Test no moving helpers in macro. +// ----------------------------------------------------------------------------- +// RUN: clang-move -names="A" -new_cc=%T/no-move-macro-helper/new_test.cpp -new_header=%T/no-move-macro-helper/new_test.h -old_cc=%T/no-move-macro-helper/macro_helper_test.cpp -old_header=%T/no-move-macro-helper/macro_helper_test.h %T/no-move-macro-helper/macro_helper_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/no-move-macro-helper/new_test.h -check-prefix=CHECK-NEW-TEST-H %s +// RUN: FileCheck -input-file=%T/no-move-macro-helper/macro_helper_test.h -check-prefix=CHECK-OLD-TEST-H %s +// RUN: FileCheck -input-file=%T/no-move-macro-helper/new_test.cpp -check-prefix=CHECK-NEW-TEST-CPP %s + + +// CHECK-NEW-TEST-H: class A {}; + +// CHECK-OLD-TEST-H-NOT: class A {}; + +// CHECK-NEW-TEST-CPP-NOT: DEFINE(test) Index: test/clang-move/Inputs/macro_helper_test.h =================================================================== --- /dev/null +++ test/clang-move/Inputs/macro_helper_test.h @@ -0,0 +1,2 @@ +class A {}; +void f1(); Index: test/clang-move/Inputs/macro_helper_test.cpp =================================================================== --- /dev/null +++ test/clang-move/Inputs/macro_helper_test.cpp @@ -0,0 +1,13 @@ +#include "macro_helper_test.h" + +#define DEFINE(name) \ + namespace ns { \ + static const bool t1 = false; \ + bool t2_##name = t1; \ + bool t3_##name = t1; \ + } \ + using ns::t2_##name; + +DEFINE(test) + +void f1() {} Index: clang-move/ClangMove.cpp =================================================================== --- clang-move/ClangMove.cpp +++ clang-move/ClangMove.cpp @@ -31,6 +31,8 @@ // FIXME: Move to ASTMatchers. AST_MATCHER(VarDecl, isStaticDataMember) { return Node.isStaticDataMember(); } +AST_MATCHER(NamedDecl, notInMacro) { return !Node.getLocation().isMacroID(); } + AST_MATCHER_P(Decl, hasOutermostEnclosingClass, ast_matchers::internal::Matcher<Decl>, InnerMatcher) { const auto *Context = Node.getDeclContext(); @@ -525,12 +527,12 @@ // Matching using decls/type alias decls which are in named/anonymous/global // namespace, these decls are always copied to new.h/cc. Those in classes, // functions are covered in other matchers. - Finder->addMatcher( - namedDecl(anyOf(usingDecl(IsOldCCTopLevelDecl), - usingDirectiveDecl(IsOldCCTopLevelDecl), - typeAliasDecl(IsOldCCTopLevelDecl))) - .bind("using_decl"), - this); + Finder->addMatcher(namedDecl(anyOf(usingDecl(IsOldCCTopLevelDecl), + usingDirectiveDecl(IsOldCCTopLevelDecl), + typeAliasDecl(IsOldCCTopLevelDecl)), + notInMacro()) + .bind("using_decl"), + this); // Match static functions/variable definitions which are defined in named // namespaces. @@ -556,9 +558,11 @@ allOf(DefinitionInOldCC, anyOf(isStaticStorageClass(), InAnonymousNS)); // Match helper classes separately with helper functions/variables since we // want to reuse these matchers in finding helpers usage below. - auto HelperFuncOrVar = namedDecl(anyOf(functionDecl(IsOldCCHelperDefinition), - varDecl(IsOldCCHelperDefinition))); - auto HelperClasses = cxxRecordDecl(DefinitionInOldCC, InAnonymousNS); + auto HelperFuncOrVar = + namedDecl(notInMacro(), anyOf(functionDecl(IsOldCCHelperDefinition), + varDecl(IsOldCCHelperDefinition))); + auto HelperClasses = + cxxRecordDecl(notInMacro(), DefinitionInOldCC, InAnonymousNS); // Save all helper declarations in old.cc. Finder->addMatcher( namedDecl(anyOf(HelperFuncOrVar, HelperClasses)).bind("helper_decls"),
Index: test/clang-move/no-move-macro-helpers.cpp =================================================================== --- /dev/null +++ test/clang-move/no-move-macro-helpers.cpp @@ -0,0 +1,19 @@ +// RUN: mkdir -p %T/no-move-macro-helper +// RUN: cp %S/Inputs/macro_helper_test.h %T/no-move-macro-helper/macro_helper_test.h +// RUN: cp %S/Inputs/macro_helper_test.cpp %T/no-move-macro-helper/macro_helper_test.cpp +// RUN: cd %T/no-move-macro-helper +// +// ----------------------------------------------------------------------------- +// Test no moving helpers in macro. +// ----------------------------------------------------------------------------- +// RUN: clang-move -names="A" -new_cc=%T/no-move-macro-helper/new_test.cpp -new_header=%T/no-move-macro-helper/new_test.h -old_cc=%T/no-move-macro-helper/macro_helper_test.cpp -old_header=%T/no-move-macro-helper/macro_helper_test.h %T/no-move-macro-helper/macro_helper_test.cpp -- -std=c++11 +// RUN: FileCheck -input-file=%T/no-move-macro-helper/new_test.h -check-prefix=CHECK-NEW-TEST-H %s +// RUN: FileCheck -input-file=%T/no-move-macro-helper/macro_helper_test.h -check-prefix=CHECK-OLD-TEST-H %s +// RUN: FileCheck -input-file=%T/no-move-macro-helper/new_test.cpp -check-prefix=CHECK-NEW-TEST-CPP %s + + +// CHECK-NEW-TEST-H: class A {}; + +// CHECK-OLD-TEST-H-NOT: class A {}; + +// CHECK-NEW-TEST-CPP-NOT: DEFINE(test) Index: test/clang-move/Inputs/macro_helper_test.h =================================================================== --- /dev/null +++ test/clang-move/Inputs/macro_helper_test.h @@ -0,0 +1,2 @@ +class A {}; +void f1(); Index: test/clang-move/Inputs/macro_helper_test.cpp =================================================================== --- /dev/null +++ test/clang-move/Inputs/macro_helper_test.cpp @@ -0,0 +1,13 @@ +#include "macro_helper_test.h" + +#define DEFINE(name) \ + namespace ns { \ + static const bool t1 = false; \ + bool t2_##name = t1; \ + bool t3_##name = t1; \ + } \ + using ns::t2_##name; + +DEFINE(test) + +void f1() {} Index: clang-move/ClangMove.cpp =================================================================== --- clang-move/ClangMove.cpp +++ clang-move/ClangMove.cpp @@ -31,6 +31,8 @@ // FIXME: Move to ASTMatchers. AST_MATCHER(VarDecl, isStaticDataMember) { return Node.isStaticDataMember(); } +AST_MATCHER(NamedDecl, notInMacro) { return !Node.getLocation().isMacroID(); } + AST_MATCHER_P(Decl, hasOutermostEnclosingClass, ast_matchers::internal::Matcher<Decl>, InnerMatcher) { const auto *Context = Node.getDeclContext(); @@ -525,12 +527,12 @@ // Matching using decls/type alias decls which are in named/anonymous/global // namespace, these decls are always copied to new.h/cc. Those in classes, // functions are covered in other matchers. - Finder->addMatcher( - namedDecl(anyOf(usingDecl(IsOldCCTopLevelDecl), - usingDirectiveDecl(IsOldCCTopLevelDecl), - typeAliasDecl(IsOldCCTopLevelDecl))) - .bind("using_decl"), - this); + Finder->addMatcher(namedDecl(anyOf(usingDecl(IsOldCCTopLevelDecl), + usingDirectiveDecl(IsOldCCTopLevelDecl), + typeAliasDecl(IsOldCCTopLevelDecl)), + notInMacro()) + .bind("using_decl"), + this); // Match static functions/variable definitions which are defined in named // namespaces. @@ -556,9 +558,11 @@ allOf(DefinitionInOldCC, anyOf(isStaticStorageClass(), InAnonymousNS)); // Match helper classes separately with helper functions/variables since we // want to reuse these matchers in finding helpers usage below. - auto HelperFuncOrVar = namedDecl(anyOf(functionDecl(IsOldCCHelperDefinition), - varDecl(IsOldCCHelperDefinition))); - auto HelperClasses = cxxRecordDecl(DefinitionInOldCC, InAnonymousNS); + auto HelperFuncOrVar = + namedDecl(notInMacro(), anyOf(functionDecl(IsOldCCHelperDefinition), + varDecl(IsOldCCHelperDefinition))); + auto HelperClasses = + cxxRecordDecl(notInMacro(), DefinitionInOldCC, InAnonymousNS); // Save all helper declarations in old.cc. Finder->addMatcher( namedDecl(anyOf(HelperFuncOrVar, HelperClasses)).bind("helper_decls"),
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits