| 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 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 | 121 |
| 122 // Remove trailing spaces from the current line. | 122 // Remove trailing spaces from the current line. |
| 123 void Trim(); | 123 void Trim(); |
| 124 | 124 |
| 125 // Whether there's a blank separator line at the current position. | 125 // Whether there's a blank separator line at the current position. |
| 126 bool HaveBlankLine(); | 126 bool HaveBlankLine(); |
| 127 | 127 |
| 128 // Flag assignments to sources, deps, etc. to make their RHSs multiline. | 128 // Flag assignments to sources, deps, etc. to make their RHSs multiline. |
| 129 void AnnotatePreferredMultilineAssignment(const BinaryOpNode* binop); | 129 void AnnotatePreferredMultilineAssignment(const BinaryOpNode* binop); |
| 130 | 130 |
| 131 // Alphabetically a list on the RHS if the LHS is 'sources'. | 131 // Sort a list on the RHS if the LHS is 'sources', 'deps' or 'public_deps'. |
| 132 void SortIfSources(const BinaryOpNode* binop); | 132 // The 'sources' are sorted alphabetically while the 'deps' and 'public_deps' |
| 133 // are sorted putting first the relative targets and then the global ones |
| 134 // (both sorted alphabetically). |
| 135 void SortIfSourcesOrDeps(const BinaryOpNode* binop); |
| 133 | 136 |
| 134 // Heuristics to decide if there should be a blank line added between two | 137 // Heuristics to decide if there should be a blank line added between two |
| 135 // items. For various "small" items, it doesn't look nice if there's too much | 138 // items. For various "small" items, it doesn't look nice if there's too much |
| 136 // vertical whitespace added. | 139 // vertical whitespace added. |
| 137 bool ShouldAddBlankLineInBetween(const ParseNode* a, const ParseNode* b); | 140 bool ShouldAddBlankLineInBetween(const ParseNode* a, const ParseNode* b); |
| 138 | 141 |
| 139 // Get the 0-based x position on the current line. | 142 // Get the 0-based x position on the current line. |
| 140 int CurrentColumn() const; | 143 int CurrentColumn() const; |
| 141 | 144 |
| 142 // Get the current line in the output; | 145 // Get the current line in the output; |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 if (binop->op().value() == "=" && ident && list) { | 303 if (binop->op().value() == "=" && ident && list) { |
| 301 const base::StringPiece lhs = ident->value().value(); | 304 const base::StringPiece lhs = ident->value().value(); |
| 302 if (lhs == "data" || lhs == "datadeps" || lhs == "data_deps" || | 305 if (lhs == "data" || lhs == "datadeps" || lhs == "data_deps" || |
| 303 lhs == "deps" || lhs == "inputs" || lhs == "outputs" || | 306 lhs == "deps" || lhs == "inputs" || lhs == "outputs" || |
| 304 lhs == "public" || lhs == "public_deps" || lhs == "sources") { | 307 lhs == "public" || lhs == "public_deps" || lhs == "sources") { |
| 305 const_cast<ListNode*>(list)->set_prefer_multiline(true); | 308 const_cast<ListNode*>(list)->set_prefer_multiline(true); |
| 306 } | 309 } |
| 307 } | 310 } |
| 308 } | 311 } |
| 309 | 312 |
| 310 void Printer::SortIfSources(const BinaryOpNode* binop) { | 313 void Printer::SortIfSourcesOrDeps(const BinaryOpNode* binop) { |
| 311 const IdentifierNode* ident = binop->left()->AsIdentifier(); | 314 const IdentifierNode* ident = binop->left()->AsIdentifier(); |
| 312 const ListNode* list = binop->right()->AsList(); | 315 const ListNode* list = binop->right()->AsList(); |
| 313 // TODO(scottmg): Sort more than 'sources'? | |
| 314 if ((binop->op().value() == "=" || binop->op().value() == "+=" || | 316 if ((binop->op().value() == "=" || binop->op().value() == "+=" || |
| 315 binop->op().value() == "-=") && | 317 binop->op().value() == "-=") && |
| 316 ident && list) { | 318 ident && list) { |
| 317 const base::StringPiece lhs = ident->value().value(); | 319 const base::StringPiece lhs = ident->value().value(); |
| 318 if (lhs == "sources") | 320 if (lhs == "sources") |
| 319 const_cast<ListNode*>(list)->SortAsStringsList(); | 321 const_cast<ListNode*>(list)->SortAsStringsList(); |
| 322 else if (lhs == "deps" || lhs == "public_deps") |
| 323 const_cast<ListNode*>(list)->SortAsDepsList(); |
| 320 } | 324 } |
| 321 } | 325 } |
| 322 | 326 |
| 323 | |
| 324 bool Printer::ShouldAddBlankLineInBetween(const ParseNode* a, | 327 bool Printer::ShouldAddBlankLineInBetween(const ParseNode* a, |
| 325 const ParseNode* b) { | 328 const ParseNode* b) { |
| 326 LocationRange a_range = a->GetRange(); | 329 LocationRange a_range = a->GetRange(); |
| 327 LocationRange b_range = b->GetRange(); | 330 LocationRange b_range = b->GetRange(); |
| 328 // If they're already separated by 1 or more lines, then we want to keep a | 331 // If they're already separated by 1 or more lines, then we want to keep a |
| 329 // blank line. | 332 // blank line. |
| 330 return (b_range.begin().line_number() > a_range.end().line_number() + 1) || | 333 return (b_range.begin().line_number() > a_range.end().line_number() + 1) || |
| 331 // Always put a blank line before a block comment. | 334 // Always put a blank line before a block comment. |
| 332 b->AsBlockComment(); | 335 b->AsBlockComment(); |
| 333 } | 336 } |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 Expr(accessor->member(), kPrecedenceLowest, std::string()); | 454 Expr(accessor->member(), kPrecedenceLowest, std::string()); |
| 452 } else { | 455 } else { |
| 453 CHECK(accessor->index()); | 456 CHECK(accessor->index()); |
| 454 Print("["); | 457 Print("["); |
| 455 Expr(accessor->index(), kPrecedenceLowest, "]"); | 458 Expr(accessor->index(), kPrecedenceLowest, "]"); |
| 456 } | 459 } |
| 457 } else if (const BinaryOpNode* binop = root->AsBinaryOp()) { | 460 } else if (const BinaryOpNode* binop = root->AsBinaryOp()) { |
| 458 CHECK(precedence_.find(binop->op().value()) != precedence_.end()); | 461 CHECK(precedence_.find(binop->op().value()) != precedence_.end()); |
| 459 AnnotatePreferredMultilineAssignment(binop); | 462 AnnotatePreferredMultilineAssignment(binop); |
| 460 | 463 |
| 461 SortIfSources(binop); | 464 SortIfSourcesOrDeps(binop); |
| 462 | 465 |
| 463 Precedence prec = precedence_[binop->op().value()]; | 466 Precedence prec = precedence_[binop->op().value()]; |
| 464 | 467 |
| 465 // Since binary operators format left-to-right, it is ok for the left side | 468 // Since binary operators format left-to-right, it is ok for the left side |
| 466 // use the same operator without parentheses, so the left uses prec. For the | 469 // use the same operator without parentheses, so the left uses prec. For the |
| 467 // same reason, the right side cannot reuse the same operator, or else "x + | 470 // same reason, the right side cannot reuse the same operator, or else "x + |
| 468 // (y + z)" would format as "x + y + z" which means "(x + y) + z". So, treat | 471 // (y + z)" would format as "x + y + z" which means "(x + y) + z". So, treat |
| 469 // the right expression as appearing one precedence level higher. | 472 // the right expression as appearing one precedence level higher. |
| 470 // However, because the source parens are not in the parse tree, as a | 473 // However, because the source parens are not in the parse tree, as a |
| 471 // special case for && and || we insert strictly-redundant-but-helpful-for- | 474 // special case for && and || we insert strictly-redundant-but-helpful-for- |
| (...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1045 } | 1048 } |
| 1046 } else { | 1049 } else { |
| 1047 printf("%s", output_string.c_str()); | 1050 printf("%s", output_string.c_str()); |
| 1048 } | 1051 } |
| 1049 } | 1052 } |
| 1050 | 1053 |
| 1051 return 0; | 1054 return 0; |
| 1052 } | 1055 } |
| 1053 | 1056 |
| 1054 } // namespace commands | 1057 } // namespace commands |
| OLD | NEW |