OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include <sstream> | 5 #include <sstream> |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
9 #include "base/strings/string_split.h" | 9 #include "base/strings/string_split.h" |
10 #include "tools/gn/commands.h" | 10 #include "tools/gn/commands.h" |
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 | 679 |
680 // Calculate the penalties for 3 possible layouts: | 680 // Calculate the penalties for 3 possible layouts: |
681 // 1. all on same line; | 681 // 1. all on same line; |
682 // 2. starting on same line, broken at each comma but paren aligned; | 682 // 2. starting on same line, broken at each comma but paren aligned; |
683 // 3. broken to next line + 4, broken at each comma. | 683 // 3. broken to next line + 4, broken at each comma. |
684 std::string terminator = ")"; | 684 std::string terminator = ")"; |
685 if (have_block) | 685 if (have_block) |
686 terminator += " {"; | 686 terminator += " {"; |
687 terminator += suffix; | 687 terminator += suffix; |
688 | 688 |
| 689 // Special case to make function calls of one arg taking a long list of |
| 690 // boolean operators not indent. |
| 691 bool continuation_requires_indent = |
| 692 list.size() != 1 || !list[0]->AsBinaryOp() || |
| 693 (list[0]->AsBinaryOp()->op().value() != "||" && |
| 694 list[0]->AsBinaryOp()->op().value() != "&&"); |
| 695 |
689 // 1: Same line. | 696 // 1: Same line. |
690 Printer sub1; | 697 Printer sub1; |
691 InitializeSub(&sub1); | 698 InitializeSub(&sub1); |
692 sub1.stack_.push_back(IndentState(CurrentColumn(), true, false)); | 699 sub1.stack_.push_back( |
| 700 IndentState(CurrentColumn(), continuation_requires_indent, false)); |
693 int penalty_one_line = 0; | 701 int penalty_one_line = 0; |
694 for (size_t i = 0; i < list.size(); ++i) { | 702 for (size_t i = 0; i < list.size(); ++i) { |
695 penalty_one_line += sub1.Expr(list[i], kPrecedenceLowest, | 703 penalty_one_line += sub1.Expr(list[i], kPrecedenceLowest, |
696 i < list.size() - 1 ? ", " : std::string()); | 704 i < list.size() - 1 ? ", " : std::string()); |
697 } | 705 } |
698 sub1.Print(terminator); | 706 sub1.Print(terminator); |
699 penalty_one_line += AssessPenalty(sub1.String()); | 707 penalty_one_line += AssessPenalty(sub1.String()); |
700 // This extra penalty prevents a short second argument from being squeezed in | 708 // This extra penalty prevents a short second argument from being squeezed in |
701 // after a first argument that went multiline (and instead preferring a | 709 // after a first argument that went multiline (and instead preferring a |
702 // variant below). | 710 // variant below). |
703 penalty_one_line += | 711 penalty_one_line += |
704 (CountLines(sub1.String()) - 1) * kPenaltyBrokenLineOnOneLiner; | 712 (CountLines(sub1.String()) - 1) * kPenaltyBrokenLineOnOneLiner; |
705 | 713 |
706 // 2: Starting on same line, broken at commas. | 714 // 2: Starting on same line, broken at commas. |
707 Printer sub2; | 715 Printer sub2; |
708 InitializeSub(&sub2); | 716 InitializeSub(&sub2); |
709 sub2.stack_.push_back(IndentState(CurrentColumn(), true, false)); | 717 sub2.stack_.push_back( |
| 718 IndentState(CurrentColumn(), continuation_requires_indent, false)); |
710 int penalty_multiline_start_same_line = 0; | 719 int penalty_multiline_start_same_line = 0; |
711 for (size_t i = 0; i < list.size(); ++i) { | 720 for (size_t i = 0; i < list.size(); ++i) { |
712 penalty_multiline_start_same_line += sub2.Expr( | 721 penalty_multiline_start_same_line += sub2.Expr( |
713 list[i], kPrecedenceLowest, i < list.size() - 1 ? "," : std::string()); | 722 list[i], kPrecedenceLowest, i < list.size() - 1 ? "," : std::string()); |
714 if (i < list.size() - 1) { | 723 if (i < list.size() - 1) { |
715 sub2.Newline(); | 724 sub2.Newline(); |
716 } | 725 } |
717 } | 726 } |
718 sub2.Print(terminator); | 727 sub2.Print(terminator); |
719 penalty_multiline_start_same_line += AssessPenalty(sub2.String()); | 728 penalty_multiline_start_same_line += AssessPenalty(sub2.String()); |
720 | 729 |
721 // 3: Starting on next line, broken at commas. | 730 // 3: Starting on next line, broken at commas. |
722 Printer sub3; | 731 Printer sub3; |
723 InitializeSub(&sub3); | 732 InitializeSub(&sub3); |
724 sub3.stack_.push_back(IndentState(margin() + kIndentSize * 2, true, false)); | 733 sub3.stack_.push_back(IndentState(margin() + kIndentSize * 2, |
| 734 continuation_requires_indent, false)); |
725 sub3.Newline(); | 735 sub3.Newline(); |
726 int penalty_multiline_start_next_line = 0; | 736 int penalty_multiline_start_next_line = 0; |
727 for (size_t i = 0; i < list.size(); ++i) { | 737 for (size_t i = 0; i < list.size(); ++i) { |
728 if (i == 0) { | 738 if (i == 0) { |
729 penalty_multiline_start_next_line += | 739 penalty_multiline_start_next_line += |
730 std::abs(sub3.CurrentColumn() - start_column) * | 740 std::abs(sub3.CurrentColumn() - start_column) * |
731 kPenaltyHorizontalSeparation; | 741 kPenaltyHorizontalSeparation; |
732 } | 742 } |
733 penalty_multiline_start_next_line += sub3.Expr( | 743 penalty_multiline_start_next_line += sub3.Expr( |
734 list[i], kPrecedenceLowest, i < list.size() - 1 ? "," : std::string()); | 744 list[i], kPrecedenceLowest, i < list.size() - 1 ? "," : std::string()); |
(...skipping 15 matching lines...) Expand all Loading... |
750 force_multiline = true; | 760 force_multiline = true; |
751 } | 761 } |
752 } else { | 762 } else { |
753 force_multiline = true; | 763 force_multiline = true; |
754 } | 764 } |
755 | 765 |
756 if (list.size() == 0 && !force_multiline) { | 766 if (list.size() == 0 && !force_multiline) { |
757 // No elements, and not forcing newlines, print nothing. | 767 // No elements, and not forcing newlines, print nothing. |
758 } else { | 768 } else { |
759 if (penalty_multiline_start_next_line < penalty_multiline_start_same_line) { | 769 if (penalty_multiline_start_next_line < penalty_multiline_start_same_line) { |
760 stack_.push_back(IndentState(margin() + kIndentSize * 2, true, false)); | 770 stack_.push_back(IndentState(margin() + kIndentSize * 2, |
| 771 continuation_requires_indent, |
| 772 false)); |
761 Newline(); | 773 Newline(); |
762 } else { | 774 } else { |
763 stack_.push_back(IndentState(CurrentColumn(), true, false)); | 775 stack_.push_back( |
| 776 IndentState(CurrentColumn(), continuation_requires_indent, false)); |
764 } | 777 } |
765 | 778 |
766 for (size_t i = 0; i < list.size(); ++i) { | 779 for (size_t i = 0; i < list.size(); ++i) { |
767 const auto& x = list[i]; | 780 const auto& x = list[i]; |
768 if (i > 0) { | 781 if (i > 0) { |
769 if (fits_on_current_line && !force_multiline) | 782 if (fits_on_current_line && !force_multiline) |
770 Print(" "); | 783 Print(" "); |
771 else | 784 else |
772 Newline(); | 785 Newline(); |
773 } | 786 } |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
964 printf("Wrote formatted to '%s'.\n", to_write.AsUTF8Unsafe().c_str()); | 977 printf("Wrote formatted to '%s'.\n", to_write.AsUTF8Unsafe().c_str()); |
965 } else { | 978 } else { |
966 printf("%s", output_string.c_str()); | 979 printf("%s", output_string.c_str()); |
967 } | 980 } |
968 } | 981 } |
969 | 982 |
970 return 0; | 983 return 0; |
971 } | 984 } |
972 | 985 |
973 } // namespace commands | 986 } // namespace commands |
OLD | NEW |