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

Side by Side Diff: pkg/analyzer_cli/lib/src/options.dart

Issue 2578733002: move CommandLineParser into analyzer for reuse by DDC (Closed)
Patch Set: merge 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
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer_cli.src.options; 5 library analyzer_cli.src.options;
6 6
7 import 'dart:io'; 7 import 'dart:io';
8 8
9 import 'package:analyzer/file_system/physical_file_system.dart'; 9 import 'package:analyzer/file_system/physical_file_system.dart';
10 import 'package:analyzer/src/command_line/arguments.dart'; 10 import 'package:analyzer/src/command_line/arguments.dart';
11 import 'package:analyzer/src/command_line/command_line_parser.dart';
11 import 'package:analyzer_cli/src/driver.dart'; 12 import 'package:analyzer_cli/src/driver.dart';
12 import 'package:args/args.dart'; 13 import 'package:args/args.dart';
13 import 'package:cli_util/cli_util.dart' show getSdkDir; 14 import 'package:cli_util/cli_util.dart' show getSdkDir;
14 15
15 const _binaryName = 'dartanalyzer'; 16 const _binaryName = 'dartanalyzer';
16 17
17 /// Shared exit handler. 18 /// Shared exit handler.
18 /// 19 ///
19 /// *Visible for testing.* 20 /// *Visible for testing.*
20 ExitHandler exitHandler = exit; 21 ExitHandler exitHandler = exit;
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 help: 'Print the analyzer version.', 311 help: 'Print the analyzer version.',
311 defaultsTo: false, 312 defaultsTo: false,
312 negatable: false) 313 negatable: false)
313 ..addFlag('lints', 314 ..addFlag('lints',
314 help: 'Show lint results.', defaultsTo: false, negatable: false) 315 help: 'Show lint results.', defaultsTo: false, negatable: false)
315 ..addFlag('no-hints', 316 ..addFlag('no-hints',
316 help: 'Do not show hint results.', 317 help: 'Do not show hint results.',
317 defaultsTo: false, 318 defaultsTo: false,
318 negatable: false) 319 negatable: false)
319 ..addFlag('disable-cache-flushing', defaultsTo: false, hide: true) 320 ..addFlag('disable-cache-flushing', defaultsTo: false, hide: true)
320 ..addFlag('ignore-unrecognized-flags',
321 help: 'Ignore unrecognized command line flags.',
322 defaultsTo: false,
323 negatable: false)
324 ..addFlag('fatal-hints', 321 ..addFlag('fatal-hints',
325 help: 'Treat hints as fatal.', defaultsTo: false, negatable: false) 322 help: 'Treat hints as fatal.', defaultsTo: false, negatable: false)
326 ..addFlag('fatal-warnings', 323 ..addFlag('fatal-warnings',
327 help: 'Treat non-type warnings as fatal.', 324 help: 'Treat non-type warnings as fatal.',
328 defaultsTo: false, 325 defaultsTo: false,
329 negatable: false) 326 negatable: false)
330 ..addFlag('fatal-lints', 327 ..addFlag('fatal-lints',
331 help: 'Treat lints as fatal.', defaultsTo: false, negatable: false) 328 help: 'Treat lints as fatal.', defaultsTo: false, negatable: false)
332 ..addFlag('package-warnings', 329 ..addFlag('package-warnings',
333 help: 'Show warnings from package: imports.', 330 help: 'Show warnings from package: imports.',
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
559 556
560 static _showUsage(parser) { 557 static _showUsage(parser) {
561 errorSink 558 errorSink
562 .writeln('Usage: $_binaryName [options...] <libraries to analyze...>'); 559 .writeln('Usage: $_binaryName [options...] <libraries to analyze...>');
563 errorSink.writeln(parser.getUsage()); 560 errorSink.writeln(parser.getUsage());
564 errorSink.writeln(''); 561 errorSink.writeln('');
565 errorSink.writeln( 562 errorSink.writeln(
566 'For more information, see http://www.dartlang.org/tools/analyzer.'); 563 'For more information, see http://www.dartlang.org/tools/analyzer.');
567 } 564 }
568 } 565 }
569
570 /// Commandline argument parser.
571 ///
572 /// TODO(pq): when the args package supports ignoring unrecognized
573 /// options/flags, this class can be replaced with a simple [ArgParser]
574 /// instance.
575 class CommandLineParser {
576 final List<String> _knownFlags;
577 final bool _alwaysIgnoreUnrecognized;
578 final ArgParser _parser;
579
580 /// Creates a new command line parser.
581 CommandLineParser({bool alwaysIgnoreUnrecognized: false})
582 : _knownFlags = <String>[],
583 _alwaysIgnoreUnrecognized = alwaysIgnoreUnrecognized,
584 _parser = new ArgParser(allowTrailingOptions: true);
585
586 ArgParser get parser => _parser;
587
588 /// Defines a flag.
589 /// See [ArgParser.addFlag()].
590 void addFlag(String name,
591 {String abbr,
592 String help,
593 bool defaultsTo: false,
594 bool negatable: true,
595 void callback(bool value),
596 bool hide: false}) {
597 _knownFlags.add(name);
598 _parser.addFlag(name,
599 abbr: abbr,
600 help: help,
601 defaultsTo: defaultsTo,
602 negatable: negatable,
603 callback: callback,
604 hide: hide);
605 }
606
607 /// Defines a value-taking option.
608 /// See [ArgParser.addOption()].
609 void addOption(String name,
610 {String abbr,
611 String help,
612 List<String> allowed,
613 Map<String, String> allowedHelp,
614 String defaultsTo,
615 void callback(value),
616 bool allowMultiple: false,
617 bool splitCommas,
618 bool hide: false}) {
619 _knownFlags.add(name);
620 _parser.addOption(name,
621 abbr: abbr,
622 help: help,
623 allowed: allowed,
624 allowedHelp: allowedHelp,
625 defaultsTo: defaultsTo,
626 callback: callback,
627 allowMultiple: allowMultiple,
628 splitCommas: splitCommas,
629 hide: hide);
630 }
631
632 /// Generates a string displaying usage information for the defined options.
633 /// See [ArgParser.usage].
634 String getUsage() => _parser.usage;
635
636 /// Parses [args], a list of command-line arguments, matches them against the
637 /// flags and options defined by this parser, and returns the result.
638 /// See [ArgParser].
639 ArgResults parse(List<String> args) => _parser.parse(_filterUnknowns(args));
640
641 List<String> _filterUnknowns(List<String> args) {
642 // Only filter args if the ignore flag is specified, or if
643 // _alwaysIgnoreUnrecognized was set to true.
644 if (_alwaysIgnoreUnrecognized ||
645 args.contains('--ignore-unrecognized-flags')) {
646 //TODO(pquitslund): replace w/ the following once library skew issues are
647 // sorted out
648 //return args.where((arg) => !arg.startsWith('--') ||
649 // _knownFlags.contains(arg.substring(2)));
650
651 // Filter all unrecognized flags and options.
652 List<String> filtered = <String>[];
653 for (int i = 0; i < args.length; ++i) {
654 String arg = args[i];
655 if (arg.startsWith('--') && arg.length > 2) {
656 String option = arg.substring(2);
657 // strip the last '=value'
658 int equalsOffset = option.lastIndexOf('=');
659 if (equalsOffset != -1) {
660 option = option.substring(0, equalsOffset);
661 }
662 // Check the option
663 if (!_knownFlags.contains(option)) {
664 //"eat" params by advancing to the next flag/option
665 i = _getNextFlagIndex(args, i);
666 } else {
667 filtered.add(arg);
668 }
669 } else {
670 filtered.add(arg);
671 }
672 }
673
674 return filtered;
675 } else {
676 return args;
677 }
678 }
679
680 int _getNextFlagIndex(args, i) {
681 for (; i < args.length; ++i) {
682 if (args[i].startsWith('--')) {
683 return i;
684 }
685 }
686 return i;
687 }
688 }
OLDNEW
« no previous file with comments | « pkg/analyzer/test/src/command_line/test_all.dart ('k') | pkg/analyzer_cli/test/options_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698