| Index: pkg/analyzer/lib/src/command_line/command_line_parser.dart
|
| diff --git a/pkg/analyzer/lib/src/command_line/command_line_parser.dart b/pkg/analyzer/lib/src/command_line/command_line_parser.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5b857dc0b629f57dac0e938c44dbcd5f1ce30622
|
| --- /dev/null
|
| +++ b/pkg/analyzer/lib/src/command_line/command_line_parser.dart
|
| @@ -0,0 +1,127 @@
|
| +// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +import 'package:args/args.dart';
|
| +
|
| +/**
|
| + * Commandline argument parser.
|
| + *
|
| + * TODO(pq): when the args package supports ignoring unrecognized options/flags,
|
| + * this class can be replaced with a simple [ArgParser] instance.
|
| + */
|
| +class CommandLineParser {
|
| + static const String IGNORE_UNRECOGNIZED_FLAG = 'ignore-unrecognized-flags';
|
| +
|
| + final List<String> _knownFlags;
|
| + final bool _alwaysIgnoreUnrecognized;
|
| + final ArgParser _parser;
|
| +
|
| + /// Creates a new command line parser.
|
| + CommandLineParser({bool alwaysIgnoreUnrecognized: false})
|
| + : _knownFlags = <String>[],
|
| + _alwaysIgnoreUnrecognized = alwaysIgnoreUnrecognized,
|
| + _parser = new ArgParser(allowTrailingOptions: true) {
|
| + addFlag(IGNORE_UNRECOGNIZED_FLAG,
|
| + help: 'Ignore unrecognized command line flags.',
|
| + defaultsTo: false,
|
| + negatable: false);
|
| + }
|
| +
|
| + ArgParser get parser => _parser;
|
| +
|
| + /// Defines a flag.
|
| + /// See [ArgParser.addFlag()].
|
| + void addFlag(String name,
|
| + {String abbr,
|
| + String help,
|
| + bool defaultsTo: false,
|
| + bool negatable: true,
|
| + void callback(bool value),
|
| + bool hide: false}) {
|
| + _knownFlags.add(name);
|
| + _parser.addFlag(name,
|
| + abbr: abbr,
|
| + help: help,
|
| + defaultsTo: defaultsTo,
|
| + negatable: negatable,
|
| + callback: callback,
|
| + hide: hide);
|
| + }
|
| +
|
| + /// Defines a value-taking option.
|
| + /// See [ArgParser.addOption()].
|
| + void addOption(String name,
|
| + {String abbr,
|
| + String help,
|
| + List<String> allowed,
|
| + Map<String, String> allowedHelp,
|
| + String defaultsTo,
|
| + void callback(value),
|
| + bool allowMultiple: false,
|
| + bool splitCommas,
|
| + bool hide: false}) {
|
| + _knownFlags.add(name);
|
| + _parser.addOption(name,
|
| + abbr: abbr,
|
| + help: help,
|
| + allowed: allowed,
|
| + allowedHelp: allowedHelp,
|
| + defaultsTo: defaultsTo,
|
| + callback: callback,
|
| + allowMultiple: allowMultiple,
|
| + splitCommas: splitCommas,
|
| + hide: hide);
|
| + }
|
| +
|
| + /// Parses [args], a list of command-line arguments, matches them against the
|
| + /// flags and options defined by this parser, and returns the result.
|
| + /// See [ArgParser].
|
| + ArgResults parse(List<String> args) => _parser.parse(_filterUnknowns(args));
|
| +
|
| + List<String> _filterUnknowns(List<String> args) {
|
| + if (!_alwaysIgnoreUnrecognized &&
|
| + !args.contains('--$IGNORE_UNRECOGNIZED_FLAG')) {
|
| + return args;
|
| + }
|
| +
|
| + //TODO(pquitslund): replace w/ the following once library skew issues are
|
| + // sorted out
|
| + //return args.where((arg) => !arg.startsWith('--') ||
|
| + // _knownFlags.contains(arg.substring(2)));
|
| +
|
| + // Filter all unrecognized flags and options.
|
| + List<String> filtered = <String>[];
|
| + for (int i = 0; i < args.length; ++i) {
|
| + String arg = args[i];
|
| + if (arg.startsWith('--') && arg.length > 2) {
|
| + String option = arg.substring(2);
|
| + // strip the last '=value'
|
| + int equalsOffset = option.lastIndexOf('=');
|
| + if (equalsOffset != -1) {
|
| + option = option.substring(0, equalsOffset);
|
| + }
|
| + // Check the option
|
| + if (!_knownFlags.contains(option)) {
|
| + //"eat" params by advancing to the next flag/option
|
| + i = _getNextFlagIndex(args, i);
|
| + } else {
|
| + filtered.add(arg);
|
| + }
|
| + } else {
|
| + filtered.add(arg);
|
| + }
|
| + }
|
| +
|
| + return filtered;
|
| + }
|
| +
|
| + int _getNextFlagIndex(args, i) {
|
| + for (; i < args.length; ++i) {
|
| + if (args[i].startsWith('--')) {
|
| + return i;
|
| + }
|
| + }
|
| + return i;
|
| + }
|
| +}
|
|
|