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

Side by Side Diff: tools/gn/command_format.cc

Issue 613083003: gn format: support absolute file system paths (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: help Created 6 years, 2 months 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/gn/command_format_unittest.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 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/strings/string_split.h" 8 #include "base/strings/string_split.h"
9 #include "tools/gn/commands.h" 9 #include "tools/gn/commands.h"
10 #include "tools/gn/filesystem_utils.h"
10 #include "tools/gn/input_file.h" 11 #include "tools/gn/input_file.h"
11 #include "tools/gn/parser.h" 12 #include "tools/gn/parser.h"
12 #include "tools/gn/scheduler.h" 13 #include "tools/gn/scheduler.h"
13 #include "tools/gn/setup.h" 14 #include "tools/gn/setup.h"
14 #include "tools/gn/source_file.h" 15 #include "tools/gn/source_file.h"
15 #include "tools/gn/tokenizer.h" 16 #include "tools/gn/tokenizer.h"
16 17
17 namespace commands { 18 namespace commands {
18 19
19 const char kSwitchDumpTree[] = "dump-tree"; 20 const char kSwitchDumpTree[] = "dump-tree";
21 const char kSwitchInPlace[] = "in-place";
20 22
21 const char kFormat[] = "format"; 23 const char kFormat[] = "format";
22 const char kFormat_HelpShort[] = 24 const char kFormat_HelpShort[] =
23 "format: Format .gn file."; 25 "format: Format .gn file. (ALPHA, WILL DESTROY DATA!)";
24 const char kFormat_Help[] = 26 const char kFormat_Help[] =
25 "gn format: Format .gn file. (ALPHA, WILL CURRENTLY DESTROY DATA!)\n" 27 "gn format [--dump-tree] [--in-place] BUILD.gn\n"
26 "\n"
27 " gn format //some/BUILD.gn\n"
28 " gn format some\\BUILD.gn\n"
29 "\n" 28 "\n"
30 " Formats .gn file to a standard format. THIS IS NOT FULLY IMPLEMENTED\n" 29 " Formats .gn file to a standard format. THIS IS NOT FULLY IMPLEMENTED\n"
31 " YET! IT WILL EAT YOUR BEAUTIFUL .GN FILES. AND YOUR LAUNDRY.\n" 30 " YET! IT WILL EAT YOUR BEAUTIFUL .GN FILES. AND YOUR LAUNDRY.\n"
32 " At a minimum, make sure everything is `git commit`d so you can\n" 31 " At a minimum, make sure everything is `git commit`d so you can\n"
33 " `git checkout -f` to recover.\n"; 32 " `git checkout -f` to recover.\n"
33 "\n"
34 "Arguments\n"
35 " --dump-tree\n"
36 " For debugging only, dumps the parse tree.\n"
37 "\n"
38 " --in-place\n"
39 " Instead writing the formatted file to stdout, replace the input\n"
40 " with the formatted output.\n"
41 "\n"
42 "Examples\n"
43 " gn format //some/BUILD.gn\n"
44 " gn format some\\BUILD.gn\n"
45 " gn format /abspath/some/BUILD.gn\n";
34 46
35 namespace { 47 namespace {
36 48
37 const int kIndentSize = 2; 49 const int kIndentSize = 2;
38 const int kMaximumWidth = 80; 50 const int kMaximumWidth = 80;
39 51
40 class Printer { 52 class Printer {
41 public: 53 public:
42 Printer(); 54 Printer();
43 ~Printer(); 55 ~Printer();
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 else if (style == kSequenceStyleList) 495 else if (style == kSequenceStyleList)
484 Print("]"); 496 Print("]");
485 else if (style == kSequenceStyleBracedBlock) 497 else if (style == kSequenceStyleBracedBlock)
486 Print("}"); 498 Print("}");
487 499
488 margin_ = old_margin; 500 margin_ = old_margin;
489 } 501 }
490 502
491 } // namespace 503 } // namespace
492 504
493 bool FormatFileToString(const std::string& input_filename, 505 bool FormatFileToString(Setup* setup,
506 const SourceFile& file,
494 bool dump_tree, 507 bool dump_tree,
495 std::string* output) { 508 std::string* output) {
496 Setup setup;
497 Err err; 509 Err err;
498 SourceFile input_file(input_filename);
499 const ParseNode* parse_node = 510 const ParseNode* parse_node =
500 setup.scheduler().input_file_manager()->SyncLoadFile( 511 setup->scheduler().input_file_manager()->SyncLoadFile(
501 LocationRange(), &setup.build_settings(), input_file, &err); 512 LocationRange(), &setup->build_settings(), file, &err);
502 if (err.has_error()) { 513 if (err.has_error()) {
503 err.PrintToStdout(); 514 err.PrintToStdout();
504 return false; 515 return false;
505 } 516 }
506 if (dump_tree) { 517 if (dump_tree) {
507 std::ostringstream os; 518 std::ostringstream os;
508 parse_node->Print(os, 0); 519 parse_node->Print(os, 0);
509 printf("----------------------\n"); 520 printf("----------------------\n");
510 printf("-- PARSE TREE --------\n"); 521 printf("-- PARSE TREE --------\n");
511 printf("----------------------\n"); 522 printf("----------------------\n");
(...skipping 13 matching lines...) Expand all
525 // print the formatted output to stdout. 536 // print the formatted output to stdout.
526 if (args.size() != 1) { 537 if (args.size() != 1) {
527 Err(Location(), "Expecting exactly one argument, see `gn help format`.\n") 538 Err(Location(), "Expecting exactly one argument, see `gn help format`.\n")
528 .PrintToStdout(); 539 .PrintToStdout();
529 return 1; 540 return 1;
530 } 541 }
531 542
532 bool dump_tree = 543 bool dump_tree =
533 base::CommandLine::ForCurrentProcess()->HasSwitch(kSwitchDumpTree); 544 base::CommandLine::ForCurrentProcess()->HasSwitch(kSwitchDumpTree);
534 545
535 std::string input_name = args[0]; 546 Setup setup;
536 if (input_name[0] != '/') { 547 SourceDir source_dir =
537 std::replace(input_name.begin(), input_name.end(), '\\', '/'); 548 SourceDirForCurrentDirectory(setup.build_settings().root_path());
538 input_name = "//" + input_name; 549 SourceFile file = source_dir.ResolveRelativeFile(args[0]);
539 } 550
540 std::string output_string; 551 std::string output_string;
541 if (FormatFileToString(input_name, dump_tree, &output_string)) { 552 if (FormatFileToString(&setup, file, dump_tree, &output_string)) {
553 bool in_place =
554 base::CommandLine::ForCurrentProcess()->HasSwitch(kSwitchInPlace);
555 CHECK(!in_place) << "TODO(scottmg)";
scottmg 2014/10/02 21:54:29 (is there an easy way to map a SourceFile back to
brettw 2014/10/02 22:03:27 setup.build_settings()->GetFullPath(source_file)
542 printf("%s", output_string.c_str()); 556 printf("%s", output_string.c_str());
543 } 557 }
544 558
545 return 0; 559 return 0;
546 } 560 }
547 561
548 } // namespace commands 562 } // namespace commands
OLDNEW
« no previous file with comments | « no previous file | tools/gn/command_format_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698