| Index: tools/ddbg_service/lib/debugger.dart
|
| diff --git a/tools/ddbg_service/lib/debugger.dart b/tools/ddbg_service/lib/debugger.dart
|
| index a5dbb6d9cb64db557729aaa6e66c220c0ba10f31..d3b0f9cbfd071e155b1bd2db9ba52b7f4295236d 100644
|
| --- a/tools/ddbg_service/lib/debugger.dart
|
| +++ b/tools/ddbg_service/lib/debugger.dart
|
| @@ -14,6 +14,8 @@ class Debugger {
|
| Commando cmdo;
|
| var _cmdoSubscription;
|
|
|
| + CommandList _commands;
|
| +
|
| VM _vm;
|
| VM get vm => _vm;
|
| set vm(VM vm) {
|
| @@ -91,10 +93,16 @@ class Debugger {
|
| }
|
|
|
| Debugger() {
|
| - cmdo = new Commando(completer: completeCommand);
|
| + cmdo = new Commando(completer: _completeCommand);
|
| _cmdoSubscription = cmdo.commands.listen(_processCommand,
|
| onError: _cmdoError,
|
| onDone: _cmdoDone);
|
| + _commands = new CommandList();
|
| + _commands.register(new AttachCommand());
|
| + _commands.register(new DetachCommand());
|
| + _commands.register(new HelpCommand(_commands));
|
| + _commands.register(new IsolateCommand());
|
| + _commands.register(new QuitCommand());
|
| }
|
|
|
| Future _closeCmdo() {
|
| @@ -116,7 +124,7 @@ class Debugger {
|
| });
|
| }
|
|
|
| - void _cmdoError(self, parent, zone, error, StackTrace trace) {
|
| + void _cmdoError(error, StackTrace trace) {
|
| cmdo.print('\n--------\nExiting due to unexpected error:\n'
|
| ' $error\n$trace\n');
|
| quit();
|
| @@ -126,6 +134,10 @@ class Debugger {
|
| quit();
|
| }
|
|
|
| + List<String> _completeCommand(List<String> commandParts) {
|
| + return _commands.complete(commandParts);
|
| + }
|
| +
|
| void _processCommand(String cmdLine) {
|
| void huh() {
|
| cmdo.print("'$cmdLine' not understood, try 'help' for help.");
|
| @@ -138,7 +150,7 @@ class Debugger {
|
| return;
|
| }
|
| var command = args[0];
|
| - var matches = matchCommand(command, true);
|
| + var matches = _commands.match(command, true);
|
| if (matches.length == 0) {
|
| huh();
|
| cmdo.show();
|
| @@ -161,6 +173,10 @@ abstract class Command {
|
| String get helpShort;
|
| void printHelp(Debugger debugger, List<String> args);
|
| Future run(Debugger debugger, List<String> args);
|
| + List<String> complete(List<String> commandParts) {
|
| + return ["$name ${commandParts.join(' ')}"];
|
| +
|
| + }
|
| }
|
|
|
| class AttachCommand extends Command {
|
| @@ -203,11 +219,70 @@ Usage:
|
| }
|
| }
|
|
|
| +class CommandList {
|
| + List _commands = new List<Command>();
|
| +
|
| + void register(Command cmd) {
|
| + _commands.add(cmd);
|
| + }
|
| +
|
| + List<Command> match(String commandName, bool exactMatchWins) {
|
| + var matches = [];
|
| + for (var command in _commands) {
|
| + if (command.name.startsWith(commandName)) {
|
| + if (exactMatchWins && command.name == commandName) {
|
| + // Exact match
|
| + return [command];
|
| + } else {
|
| + matches.add(command);
|
| + }
|
| + }
|
| + }
|
| + return matches;
|
| + }
|
| +
|
| + List<String> complete(List<String> commandParts) {
|
| + var completions = new List<String>();
|
| + String prefix = commandParts[0];
|
| + for (var command in _commands) {
|
| + if (command.name.startsWith(prefix)) {
|
| + completions.addAll(command.complete(commandParts.sublist(1)));
|
| + }
|
| + }
|
| + return completions;
|
| + }
|
| +
|
| + void printHelp(Debugger debugger, List<String> args) {
|
| + var cmdo = debugger.cmdo;
|
| + if (args.length <= 1) {
|
| + cmdo.print("\nDebugger commands:\n");
|
| + for (var command in _commands) {
|
| + cmdo.print(' ${command.name.padRight(11)} ${command.helpShort}');
|
| + }
|
| + cmdo.print("For more information about a particular command, type:\n\n"
|
| + " help <command>\n");
|
| +
|
| + cmdo.print("Commands may be abbreviated: e.g. type 'h' for 'help.\n");
|
| + } else {
|
| + var commandName = args[1];
|
| + var matches =match(commandName, true);
|
| + if (matches.length == 0) {
|
| + cmdo.print("Command '$commandName' not recognized. "
|
| + "Try 'help' for a list of commands.");
|
| + } else {
|
| + for (var command in matches) {
|
| + command.printHelp(debugger, args);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| class DetachCommand extends Command {
|
| final name = 'detach';
|
| final helpShort = 'Detach from a running Dart VM';
|
| void printHelp(Debugger debugger, List<String> args) {
|
| - cmdo.print('''
|
| + debugger.cmdo.print('''
|
| ----- detach -----
|
|
|
| Detach from the Dart VM.
|
| @@ -233,6 +308,9 @@ Usage:
|
| }
|
|
|
| class HelpCommand extends Command {
|
| + HelpCommand(this._commands);
|
| + final CommandList _commands;
|
| +
|
| final name = 'help';
|
| final helpShort = 'Show a list of debugger commands';
|
| void printHelp(Debugger debugger, List<String> args) {
|
| @@ -249,30 +327,17 @@ Usage:
|
| }
|
|
|
| Future run(Debugger debugger, List<String> args) {
|
| - var cmdo = debugger.cmdo;
|
| - if (args.length <= 1) {
|
| - cmdo.print("\nDebugger commands:\n");
|
| - for (var command in commandList) {
|
| - cmdo.print(' ${command.name.padRight(11)} ${command.helpShort}');
|
| - }
|
| - cmdo.print("For more information about a particular command, type:\n\n"
|
| - " help <command>\n");
|
| + _commands.printHelp(debugger, args);
|
| + return new Future.value();
|
| + }
|
|
|
| - cmdo.print("Commands may be abbreviated: e.g. type 'h' for 'help.\n");
|
| - } else {
|
| - var commandName = args[1];
|
| - var matches = matchCommand(commandName, true);
|
| - if (matches.length == 0) {
|
| - cmdo.print("Command '$commandName' not recognized. "
|
| - "Try 'help' for a list of commands.");
|
| - } else {
|
| - for (var command in matches) {
|
| - command.printHelp(debugger, args);
|
| - }
|
| - }
|
| + List<String> complete(List<String> commandParts) {
|
| + if (commandParts.isEmpty) {
|
| + return ['$name '];
|
| }
|
| -
|
| - return new Future.value();
|
| + return _commands.complete(commandParts).map((value) {
|
| + return '$name $value';
|
| + });
|
| }
|
| }
|
|
|
| @@ -375,6 +440,17 @@ Usage:
|
| });
|
| return new Future.value();
|
| }
|
| +
|
| + List<String> complete(List<String> commandParts) {
|
| + if (commandParts.isEmpty) {
|
| + return ['$name ${commandParts.join(" ")}'];
|
| + } else {
|
| + var completions = _commands.complete(commandParts);
|
| + return completions.map((completion) {
|
| + return '$name $completion';
|
| + });
|
| + }
|
| + }
|
| }
|
|
|
| class QuitCommand extends Command {
|
| @@ -400,38 +476,3 @@ Usage:
|
| return debugger.quit();
|
| }
|
| }
|
| -
|
| -List<Command> commandList =
|
| - [ new AttachCommand(),
|
| - new DetachCommand(),
|
| - new HelpCommand(),
|
| - new IsolateCommand(),
|
| - new QuitCommand() ];
|
| -
|
| -List<Command> matchCommand(String commandName, bool exactMatchWins) {
|
| - var matches = [];
|
| - for (var command in commandList) {
|
| - if (command.name.startsWith(commandName)) {
|
| - if (exactMatchWins && command.name == commandName) {
|
| - // Exact match
|
| - return [command];
|
| - } else {
|
| - matches.add(command);
|
| - }
|
| - }
|
| - }
|
| - return matches;
|
| -}
|
| -
|
| -List<String> completeCommand(List<String> commandParts) {
|
| - var completions = new List<String>();
|
| - if (commandParts.length == 1) {
|
| - String prefix = commandParts[0];
|
| - for (var command in commandList) {
|
| - if (command.name.startsWith(prefix)) {
|
| - completions.add(command.name);
|
| - }
|
| - }
|
| - }
|
| - return completions;
|
| -}
|
|
|