OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // Changes Blink-style names to Chrome-style names. Currently transforms: | 5 // Changes Blink-style names to Chrome-style names. Currently transforms: |
6 // fields: | 6 // fields: |
7 // int m_operationCount => int operation_count_ | 7 // int m_operationCount => int operation_count_ |
8 // variables (including parameters): | 8 // variables (including parameters): |
9 // int mySuperVariable => int my_super_variable | 9 // int mySuperVariable => int my_super_variable |
10 // constants: | 10 // constants: |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
55 bool IsMatching(const MatcherType& matcher, | 55 bool IsMatching(const MatcherType& matcher, |
56 const NodeType& node, | 56 const NodeType& node, |
57 clang::ASTContext& context) { | 57 clang::ASTContext& context) { |
58 return !match(matcher, node, context).empty(); | 58 return !match(matcher, node, context).empty(); |
59 } | 59 } |
60 | 60 |
61 const clang::ast_matchers::internal:: | 61 const clang::ast_matchers::internal:: |
62 VariadicDynCastAllOfMatcher<clang::Expr, clang::UnresolvedMemberExpr> | 62 VariadicDynCastAllOfMatcher<clang::Expr, clang::UnresolvedMemberExpr> |
63 unresolvedMemberExpr; | 63 unresolvedMemberExpr; |
64 | 64 |
65 const clang::ast_matchers::internal:: | |
66 VariadicDynCastAllOfMatcher<clang::Expr, clang::DependentScopeDeclRefExpr> | |
67 dependentScopeDeclRefExpr; | |
68 | |
69 const clang::ast_matchers::internal:: | |
70 VariadicDynCastAllOfMatcher<clang::Expr, clang::CXXDependentScopeMemberExpr> | |
71 cxxDependentScopeMemberExpr; | |
72 | |
65 AST_MATCHER(clang::FunctionDecl, isOverloadedOperator) { | 73 AST_MATCHER(clang::FunctionDecl, isOverloadedOperator) { |
66 return Node.isOverloadedOperator(); | 74 return Node.isOverloadedOperator(); |
67 } | 75 } |
68 | 76 |
69 AST_MATCHER(clang::CXXMethodDecl, isInstanceMethod) { | 77 AST_MATCHER(clang::CXXMethodDecl, isInstanceMethod) { |
70 return Node.isInstance(); | 78 return Node.isInstance(); |
71 } | 79 } |
72 | 80 |
73 AST_MATCHER_P(clang::FunctionTemplateDecl, | 81 AST_MATCHER_P(clang::FunctionTemplateDecl, |
74 templatedDecl, | 82 templatedDecl, |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
158 return inner_matcher.matches(decl, finder, builder); | 166 return inner_matcher.matches(decl, finder, builder); |
159 } | 167 } |
160 | 168 |
161 AST_MATCHER_P(clang::CXXMethodDecl, | 169 AST_MATCHER_P(clang::CXXMethodDecl, |
162 includeAllOverriddenMethods, | 170 includeAllOverriddenMethods, |
163 clang::ast_matchers::internal::Matcher<clang::CXXMethodDecl>, | 171 clang::ast_matchers::internal::Matcher<clang::CXXMethodDecl>, |
164 InnerMatcher) { | 172 InnerMatcher) { |
165 return MatchAllOverriddenMethods(Node, InnerMatcher, Finder, Builder); | 173 return MatchAllOverriddenMethods(Node, InnerMatcher, Finder, Builder); |
166 } | 174 } |
167 | 175 |
176 // Matches |x.m| CXXDependentScopeMemberExpr if InnerMatcher matches |x|. | |
177 AST_MATCHER_P(clang::CXXDependentScopeMemberExpr, | |
178 hasBaseExprMissingOrMatching, | |
179 clang::ast_matchers::internal::Matcher<clang::Expr>, | |
180 InnerMatcher) { | |
181 clang::Expr* base_expr = Node.isImplicitAccess() ? nullptr : Node.getBase(); | |
182 return !base_expr || InnerMatcher.matches(*base_expr, Finder, Builder); | |
dcheng
2016/11/30 05:55:52
What's an implicit access look like? Why is it OK
Łukasz Anforowicz
2016/11/30 23:26:53
1. You are right that we should not return a match
dcheng
2016/12/01 07:15:06
I see. I think the usual preference is to have sma
Łukasz Anforowicz
2016/12/01 18:26:56
Acknowledged.
| |
183 } | |
184 | |
185 // Matches |T::m| CXXDependentScopeMemberExpr if InnerMatcher matches |T|. | |
186 AST_MATCHER_P( | |
187 clang::CXXDependentScopeMemberExpr, | |
188 hasQualifierMissingOrMatching, | |
189 clang::ast_matchers::internal::Matcher<clang::NestedNameSpecifier>, | |
190 InnerMatcher) { | |
191 clang::NestedNameSpecifier* qual = Node.getQualifier(); | |
192 return !qual || InnerMatcher.matches(*qual, Finder, Builder); | |
dcheng
2016/11/30 05:55:52
Similar question here: why is it OK to return a ma
Łukasz Anforowicz
2016/11/30 23:26:53
See above.
| |
193 } | |
194 | |
195 // Matches |const Class<T>&| QualType if InnerMatcher matches |Class<T>|. | |
196 AST_MATCHER_P(clang::QualType, | |
197 hasBaseType, | |
198 clang::ast_matchers::internal::Matcher<clang::Type>, | |
199 InnerMatcher) { | |
200 const clang::Type* type = Node.getTypePtrOrNull(); | |
201 return type && InnerMatcher.matches(*type, Finder, Builder); | |
202 } | |
203 | |
168 bool IsMethodOverrideOf(const clang::CXXMethodDecl& decl, | 204 bool IsMethodOverrideOf(const clang::CXXMethodDecl& decl, |
169 const char* class_name) { | 205 const char* class_name) { |
170 if (decl.getParent()->getQualifiedNameAsString() == class_name) | 206 if (decl.getParent()->getQualifiedNameAsString() == class_name) |
171 return true; | 207 return true; |
172 for (auto it = decl.begin_overridden_methods(); | 208 for (auto it = decl.begin_overridden_methods(); |
173 it != decl.end_overridden_methods(); ++it) { | 209 it != decl.end_overridden_methods(); ++it) { |
174 if (IsMethodOverrideOf(**it, class_name)) | 210 if (IsMethodOverrideOf(**it, class_name)) |
175 return true; | 211 return true; |
176 } | 212 } |
177 return false; | 213 return false; |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
524 template <> | 560 template <> |
525 struct TargetNodeTraits<clang::DeclRefExpr> { | 561 struct TargetNodeTraits<clang::DeclRefExpr> { |
526 static clang::SourceLocation GetLoc(const clang::DeclRefExpr& expr) { | 562 static clang::SourceLocation GetLoc(const clang::DeclRefExpr& expr) { |
527 return expr.getLocation(); | 563 return expr.getLocation(); |
528 } | 564 } |
529 static const char* GetName() { return "expr"; } | 565 static const char* GetName() { return "expr"; } |
530 static const char* GetType() { return "DeclRefExpr"; } | 566 static const char* GetType() { return "DeclRefExpr"; } |
531 }; | 567 }; |
532 | 568 |
533 template <> | 569 template <> |
570 struct TargetNodeTraits<clang::DependentScopeDeclRefExpr> { | |
571 static clang::SourceLocation GetLoc( | |
572 const clang::DependentScopeDeclRefExpr& expr) { | |
573 return expr.getLocation(); | |
574 } | |
575 static const char* GetName() { return "expr"; } | |
576 }; | |
577 | |
578 template <> | |
579 struct TargetNodeTraits<clang::CXXDependentScopeMemberExpr> { | |
580 static clang::SourceLocation GetLoc( | |
581 const clang::CXXDependentScopeMemberExpr& expr) { | |
582 return expr.getMemberLoc(); | |
583 } | |
584 static const char* GetName() { return "expr"; } | |
585 }; | |
586 | |
587 template <> | |
534 struct TargetNodeTraits<clang::CXXCtorInitializer> { | 588 struct TargetNodeTraits<clang::CXXCtorInitializer> { |
535 static clang::SourceLocation GetLoc(const clang::CXXCtorInitializer& init) { | 589 static clang::SourceLocation GetLoc(const clang::CXXCtorInitializer& init) { |
536 assert(init.isWritten()); | 590 assert(init.isWritten()); |
537 return init.getSourceLocation(); | 591 return init.getSourceLocation(); |
538 } | 592 } |
539 static const char* GetName() { return "initializer"; } | 593 static const char* GetName() { return "initializer"; } |
540 static const char* GetType() { return "CXXCtorInitializer"; } | 594 static const char* GetType() { return "CXXCtorInitializer"; } |
541 }; | 595 }; |
542 | 596 |
543 template <> | 597 template <> |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
670 DeclRewriterBase<clang::NamedDecl, clang::UnresolvedMemberExpr>; | 724 DeclRewriterBase<clang::NamedDecl, clang::UnresolvedMemberExpr>; |
671 | 725 |
672 using UsingDeclRewriter = DeclRewriterBase<clang::UsingDecl, clang::NamedDecl>; | 726 using UsingDeclRewriter = DeclRewriterBase<clang::UsingDecl, clang::NamedDecl>; |
673 | 727 |
674 clang::DeclarationName GetUnresolvedName( | 728 clang::DeclarationName GetUnresolvedName( |
675 const clang::UnresolvedMemberExpr& expr) { | 729 const clang::UnresolvedMemberExpr& expr) { |
676 return expr.getMemberName(); | 730 return expr.getMemberName(); |
677 } | 731 } |
678 | 732 |
679 clang::DeclarationName GetUnresolvedName( | 733 clang::DeclarationName GetUnresolvedName( |
734 const clang::DependentScopeDeclRefExpr& expr) { | |
735 return expr.getDeclName(); | |
736 } | |
737 | |
738 clang::DeclarationName GetUnresolvedName( | |
739 const clang::CXXDependentScopeMemberExpr& expr) { | |
740 return expr.getMember(); | |
741 } | |
742 | |
743 clang::DeclarationName GetUnresolvedName( | |
680 const clang::UnresolvedUsingValueDecl& decl) { | 744 const clang::UnresolvedUsingValueDecl& decl) { |
681 return decl.getDeclName(); | 745 return decl.getDeclName(); |
682 } | 746 } |
683 | 747 |
748 // Returns whether |expr_node| is used as a callee in the AST (i.e. if | |
749 // |expr_node| needs to resolve to a method or a function). | |
750 bool IsCallee(const clang::Expr& expr, clang::ASTContext& context) { | |
751 auto matcher = stmt(hasParent(callExpr(callee(equalsNode(&expr))))); | |
752 return IsMatching(matcher, expr, context); | |
753 } | |
754 | |
755 // Returns whether |decl| will be used as a callee in the AST (i.e. if the value | |
756 // brought by the using declaration will resolve to a method or a function). | |
757 bool IsCallee(const clang::UnresolvedUsingValueDecl& /* decl */, | |
758 clang::ASTContext& /* context */) { | |
759 // Heuristic - looking only at the shape of AST, let's assume that |using | |
760 // Base::foo| refers to a method. This heuristic can be refined by also | |
761 // looking at the name of |decl| (this is done both for | |
762 // UnresolvedUsingValueDecl and for clang::Expr in | |
763 // GuessNameForUnresolvedDependentNode method). | |
764 return true; | |
765 } | |
766 | |
684 template <typename TargetNode> | 767 template <typename TargetNode> |
685 class UnresolvedRewriterBase : public RewriterBase<TargetNode> { | 768 class UnresolvedRewriterBase : public RewriterBase<TargetNode> { |
686 public: | 769 public: |
687 using Base = RewriterBase<TargetNode>; | 770 using Base = RewriterBase<TargetNode>; |
688 | 771 |
689 explicit UnresolvedRewriterBase(std::set<Replacement>* replacements) | 772 explicit UnresolvedRewriterBase(std::set<Replacement>* replacements) |
690 : RewriterBase<TargetNode>(replacements) {} | 773 : RewriterBase<TargetNode>(replacements) {} |
691 | 774 |
692 void run(const MatchFinder::MatchResult& result) override { | 775 void run(const MatchFinder::MatchResult& result) override { |
693 const TargetNode& expr = Base::GetTargetNode(result); | 776 const TargetNode& expr = Base::GetTargetNode(result); |
694 llvm::StringRef old_name = GetUnresolvedName(expr).getAsString(); | 777 |
695 std::string new_name; | 778 clang::DeclarationName unresolved_name = GetUnresolvedName(expr); |
696 if (GuessNameForUnresolvedDependentNode(expr, *result.Context, old_name, | 779 switch (unresolved_name.getNameKind()) { |
697 new_name)) { | 780 // Do not rewrite this: |
781 // return operator T*(); | |
782 // into this: | |
783 // return Operator type - parameter - 0 - 0 * T * (); | |
784 case clang::DeclarationName::NameKind::CXXConversionFunctionName: | |
785 case clang::DeclarationName::NameKind::CXXOperatorName: | |
786 case clang::DeclarationName::NameKind::CXXLiteralOperatorName: | |
787 return; | |
788 default: | |
789 break; | |
790 } | |
791 | |
792 std::string old_name = unresolved_name.getAsString(); | |
793 std::string new_name = GuessNameForUnresolvedDependentNode( | |
794 expr, *result.Context, old_name); | |
795 if (!new_name.empty()) | |
698 Base::AddReplacement(result, old_name, std::move(new_name)); | 796 Base::AddReplacement(result, old_name, std::move(new_name)); |
699 } | |
700 } | 797 } |
701 | 798 |
702 private: | 799 private: |
703 // This method calculates a new name for nodes that depend on template | 800 // This method calculates a new name for nodes that depend on template |
704 // parameters (http://en.cppreference.com/w/cpp/language/dependent_name). The | 801 // parameters (http://en.cppreference.com/w/cpp/language/dependent_name). The |
705 // renaming is based on crude heuristics, because such nodes are not bound to | 802 // renaming is based on crude heuristics, because such nodes are not bound to |
706 // a specific decl until template instantiation - at the point of rename, one | 803 // a specific decl until template instantiation - at the point of rename, one |
707 // cannot tell whether the node will eventually resolve to a field / method / | 804 // cannot tell whether the node will eventually resolve to a field / method / |
708 // constant / etc. | 805 // constant / etc. |
709 bool GuessNameForUnresolvedDependentNode(const TargetNode& node, | 806 // |
807 // The guessed new name is returned (or an empty string if no name was | |
808 // guessed). | |
809 std::string GuessNameForUnresolvedDependentNode(const TargetNode& node, | |
dcheng
2016/11/30 05:55:52
Can we keep this consistent with GetNameForDecl()?
Łukasz Anforowicz
2016/11/30 23:26:53
Done (I think).
There is some duplication for cal
dcheng
2016/12/01 07:15:06
I think I'm OK with passing old_name in; just havi
Łukasz Anforowicz
2016/12/01 18:26:57
Done.
| |
710 clang::ASTContext& context, | 810 clang::ASTContext& context, |
711 llvm::StringRef old_name, | 811 llvm::StringRef old_name) { |
712 std::string& new_name) { | |
713 // |m_fieldName| -> |field_name_|. | 812 // |m_fieldName| -> |field_name_|. |
714 if (old_name.startswith(kBlinkFieldPrefix)) { | 813 if (old_name.startswith(kBlinkFieldPrefix)) { |
715 std::string field_name = old_name.str().substr(strlen(kBlinkFieldPrefix)); | 814 std::string field_name = old_name.substr(strlen(kBlinkFieldPrefix)); |
716 if (field_name.find('_') == std::string::npos) { | 815 if (field_name.find('_') == std::string::npos) |
717 new_name = CamelCaseToUnderscoreCase(field_name) + "_"; | 816 return CamelCaseToUnderscoreCase(field_name) + "_"; |
718 return true; | |
719 } | |
720 } | 817 } |
721 | 818 |
722 // |T::myMethod(...)| -> |T::MyMethod(...)|. | 819 // |T::myMethod(...)| -> |T::MyMethod(...)|. |
723 if ((old_name.find('_') == std::string::npos) && | 820 if ((old_name.find('_') == std::string::npos) && IsCallee(node, context) && |
724 !IsBlacklistedFunctionOrMethodName(old_name)) { | 821 !IsBlacklistedFunctionOrMethodName(old_name)) { |
725 new_name = old_name; | 822 std::string new_name = old_name; |
726 new_name[0] = clang::toUppercase(new_name[0]); | 823 new_name[0] = clang::toUppercase(new_name[0]); |
727 return true; | 824 return new_name; |
728 } | 825 } |
729 | 826 |
730 // In the future we can consider more heuristics: | 827 // In the future we can consider more heuristics: |
731 // - "s_" and "g_" prefixes | 828 // - "s_" and "g_" prefixes |
732 // - "ALL_CAPS" | 829 // - "ALL_CAPS" |
733 // - |T::myStaticField| -> |T::kMyStaticField| | 830 // - |T::myStaticField| -> |T::kMyStaticField| |
734 // (but have to be careful not to rename |value| in WTF/TypeTraits.h?) | 831 // (but have to be careful not to rename |value| in WTF/TypeTraits.h?) |
735 return false; | 832 return std::string(); |
736 } | 833 } |
737 }; | 834 }; |
738 | 835 |
739 using UnresolvedDependentMemberRewriter = | 836 using UnresolvedDependentMemberRewriter = |
740 UnresolvedRewriterBase<clang::UnresolvedMemberExpr>; | 837 UnresolvedRewriterBase<clang::UnresolvedMemberExpr>; |
741 | 838 |
742 using UnresolvedUsingValueDeclRewriter = | 839 using UnresolvedUsingValueDeclRewriter = |
743 UnresolvedRewriterBase<clang::UnresolvedUsingValueDecl>; | 840 UnresolvedRewriterBase<clang::UnresolvedUsingValueDecl>; |
744 | 841 |
842 using DependentScopeDeclRefExprRewriter = | |
843 UnresolvedRewriterBase<clang::DependentScopeDeclRefExpr>; | |
844 | |
845 using CXXDependentScopeMemberExprRewriter = | |
846 UnresolvedRewriterBase<clang::CXXDependentScopeMemberExpr>; | |
847 | |
745 } // namespace | 848 } // namespace |
746 | 849 |
747 static llvm::cl::extrahelp common_help(CommonOptionsParser::HelpMessage); | 850 static llvm::cl::extrahelp common_help(CommonOptionsParser::HelpMessage); |
748 | 851 |
749 int main(int argc, const char* argv[]) { | 852 int main(int argc, const char* argv[]) { |
750 // TODO(dcheng): Clang tooling should do this itself. | 853 // TODO(dcheng): Clang tooling should do this itself. |
751 // http://llvm.org/bugs/show_bug.cgi?id=21627 | 854 // http://llvm.org/bugs/show_bug.cgi?id=21627 |
752 llvm::InitializeNativeTarget(); | 855 llvm::InitializeNativeTarget(); |
753 llvm::InitializeNativeTargetAsmParser(); | 856 llvm::InitializeNativeTargetAsmParser(); |
754 llvm::cl::OptionCategory category( | 857 llvm::cl::OptionCategory category( |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1061 // using blink::X; | 1164 // using blink::X; |
1062 // matches |using blink::X|. | 1165 // matches |using blink::X|. |
1063 auto using_decl_matcher = id( | 1166 auto using_decl_matcher = id( |
1064 "decl", usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(anyOf( | 1167 "decl", usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(anyOf( |
1065 var_decl_matcher, field_decl_matcher, function_decl_matcher, | 1168 var_decl_matcher, field_decl_matcher, function_decl_matcher, |
1066 method_decl_matcher, function_template_decl_matcher, | 1169 method_decl_matcher, function_template_decl_matcher, |
1067 method_template_decl_matcher, enum_member_decl_matcher))))); | 1170 method_template_decl_matcher, enum_member_decl_matcher))))); |
1068 UsingDeclRewriter using_decl_rewriter(&replacements); | 1171 UsingDeclRewriter using_decl_rewriter(&replacements); |
1069 match_finder.addMatcher(using_decl_matcher, &using_decl_rewriter); | 1172 match_finder.addMatcher(using_decl_matcher, &using_decl_rewriter); |
1070 | 1173 |
1174 // Matches any QualType that refers to a blink type: | |
1175 // - const blink::Foo& | |
1176 // - blink::Foo* | |
1177 // - blink::Foo<T> | |
1178 // - ... | |
1179 // TODO(lukasza): The matchers below can be simplified after | |
1180 // https://llvm.org/bugs/show_bug.cgi?id=30331 is fixed. | |
1181 // Simplified matchers: | |
1182 // auto blink_qual_type_base_matcher = | |
1183 // qualType(hasDeclaration(in_blink_namespace)); | |
1184 // auto blink_qual_type_matcher = qualType(anyOf( | |
1185 // blink_qual_type_base_matcher, | |
1186 // pointsTo(blink_qual_type_base_matcher), | |
1187 // references(blink_qual_type_base_matcher))); | |
1188 auto blink_qual_type_bug_workaround_matcher1 = hasBaseType( | |
1189 anyOf(enumType(hasDeclaration(in_blink_namespace)), | |
1190 recordType(hasDeclaration(in_blink_namespace)), | |
1191 templateSpecializationType(hasDeclaration(in_blink_namespace)), | |
1192 templateTypeParmType(hasDeclaration(in_blink_namespace)), | |
1193 typedefType(hasDeclaration(in_blink_namespace)))); | |
1194 auto blink_qual_type_base_matcher = | |
1195 qualType(anyOf(blink_qual_type_bug_workaround_matcher1, | |
1196 hasBaseType(elaboratedType( | |
1197 namesType(blink_qual_type_bug_workaround_matcher1))))); | |
1198 auto blink_qual_type_matcher = | |
1199 qualType(anyOf(blink_qual_type_base_matcher, pointsTo(in_blink_namespace), | |
1200 references(in_blink_namespace))); | |
1201 | |
1202 // Template-dependent decl lookup ======== | |
1203 // Given | |
1204 // template <typename T> void f() { T::foo(); } | |
1205 // matches |T::foo|. | |
1206 auto dependent_scope_decl_ref_expr_matcher = | |
1207 expr(id("expr", dependentScopeDeclRefExpr(has(nestedNameSpecifier( | |
1208 specifiesType(blink_qual_type_matcher)))))); | |
1209 DependentScopeDeclRefExprRewriter dependent_scope_decl_ref_expr_rewriter( | |
1210 &replacements); | |
1211 match_finder.addMatcher(dependent_scope_decl_ref_expr_matcher, | |
1212 &dependent_scope_decl_ref_expr_rewriter); | |
1213 | |
1214 // Template-dependent member lookup ======== | |
1215 // Given | |
1216 // template <typename T> | |
1217 // class Foo { | |
1218 // void f() { T::foo(); } | |
1219 // void g(T x) { x.bar(); } | |
1220 // }; | |
1221 // matches |T::foo| and |x.bar|. | |
1222 auto cxx_dependent_scope_member_expr_matcher = expr( | |
1223 id("expr", | |
1224 cxxDependentScopeMemberExpr(allOf( | |
1225 hasBaseExprMissingOrMatching(hasType(blink_qual_type_matcher)), | |
1226 hasQualifierMissingOrMatching( | |
1227 specifiesType(blink_qual_type_matcher)))))); | |
1228 CXXDependentScopeMemberExprRewriter cxx_dependent_scope_member_expr_rewriter( | |
1229 &replacements); | |
1230 match_finder.addMatcher(cxx_dependent_scope_member_expr_matcher, | |
1231 &cxx_dependent_scope_member_expr_rewriter); | |
1232 | |
1071 std::unique_ptr<clang::tooling::FrontendActionFactory> factory = | 1233 std::unique_ptr<clang::tooling::FrontendActionFactory> factory = |
1072 clang::tooling::newFrontendActionFactory(&match_finder); | 1234 clang::tooling::newFrontendActionFactory(&match_finder); |
1073 int result = tool.run(factory.get()); | 1235 int result = tool.run(factory.get()); |
1074 if (result != 0) | 1236 if (result != 0) |
1075 return result; | 1237 return result; |
1076 | 1238 |
1077 #if defined(_WIN32) | 1239 #if defined(_WIN32) |
1078 HANDLE lockfd = CreateFile("rewrite-sym.lock", GENERIC_READ, FILE_SHARE_READ, | 1240 HANDLE lockfd = CreateFile("rewrite-sym.lock", GENERIC_READ, FILE_SHARE_READ, |
1079 NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | 1241 NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
1080 OVERLAPPED overlapped = {}; | 1242 OVERLAPPED overlapped = {}; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1112 for (const auto& r : replacements) { | 1274 for (const auto& r : replacements) { |
1113 std::string replacement_text = r.getReplacementText().str(); | 1275 std::string replacement_text = r.getReplacementText().str(); |
1114 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0'); | 1276 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0'); |
1115 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset() | 1277 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset() |
1116 << ":::" << r.getLength() << ":::" << replacement_text << "\n"; | 1278 << ":::" << r.getLength() << ":::" << replacement_text << "\n"; |
1117 } | 1279 } |
1118 llvm::outs() << "==== END EDITS ====\n"; | 1280 llvm::outs() << "==== END EDITS ====\n"; |
1119 | 1281 |
1120 return 0; | 1282 return 0; |
1121 } | 1283 } |
OLD | NEW |