Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Side by Side Diff: tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp

Issue 2256913002: Handling of DependentScopeDeclRefExpr and CXXDependentScopeMemberExpr nodes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@blink-style-new-clang
Patch Set: Added a regression test that shows the necessity of IsCallee function. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tools/clang/rewrite_to_chrome_style/tests/fields-expected.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | tools/clang/rewrite_to_chrome_style/tests/fields-expected.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698