| 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 |