| Index: tools/ddbg_service/lib/commando.dart
|
| diff --git a/tools/ddbg_service/lib/commando.dart b/tools/ddbg_service/lib/commando.dart
|
| index f490cf8f836784ff921d649f1d6510037220c611..3996880d41ba363af8e3b6b1a149c7040adb06f3 100644
|
| --- a/tools/ddbg_service/lib/commando.dart
|
| +++ b/tools/ddbg_service/lib/commando.dart
|
| @@ -143,9 +143,7 @@ class Commando {
|
| break;
|
|
|
| case runeTAB:
|
| - if (_complete(_tabCount > 1)) {
|
| - _tabCount = 0;
|
| - }
|
| + _complete(_tabCount > 1);
|
| break;
|
|
|
| case runeNewline:
|
| @@ -327,57 +325,57 @@ class Commando {
|
| return shared;
|
| }
|
|
|
| - bool _complete(bool showCompletions) {
|
| + void _complete(bool showCompletions) {
|
| if (completer == null) {
|
| - return false;
|
| + return;
|
| }
|
|
|
| var linePrefix = _currentLine.take(_cursorPos).toList();
|
| - List<String> commandParts =
|
| - _trimLeadingSpaces(new String.fromCharCodes(linePrefix)).split(' ');
|
| + var lineAsString = new String.fromCharCodes(linePrefix);
|
| + var commandParts = new List.from(lineAsString.split(' ').where((line) {
|
| + return line != ' ' && line != '';
|
| + }));
|
| + if (lineAsString.endsWith(' ')) {
|
| + // If the current line ends with a space, they are hoping to
|
| + // complete the next word in the command. Add an empty string
|
| + // to the commandParts to signal this to the completer.
|
| + commandParts.add('');
|
| + }
|
| List<String> completionList = completer(commandParts);
|
| - var completion = '';
|
| + var completion = null;
|
|
|
| if (completionList.length == 0) {
|
| // The current line admits no possible completion.
|
| - return false;
|
| + return;
|
|
|
| } else if (completionList.length == 1) {
|
| // There is a single, non-ambiguous completion for the current line.
|
| completion = completionList[0];
|
|
|
| - // If we are at the end of the line, add a space to signal that
|
| - // the completion is unambiguous.
|
| - if (_currentLine.length == _cursorPos) {
|
| - completion = completion + ' ';
|
| - }
|
| } else {
|
| // There are ambiguous completions. Find the longest common
|
| // shared prefix of all of the completions.
|
| completion = completionList.fold(completionList[0], _sharedPrefix);
|
| }
|
|
|
| - var lastWord = commandParts.last;
|
| - if (completion == lastWord) {
|
| - // The completion does not add anything.
|
| - if (showCompletions) {
|
| - // User hit double-TAB. Show them all possible completions.
|
| - _move(_cursorPos, _currentLine.length);
|
| - _stdout.writeln();
|
| - _stdout.writeln(completionList);
|
| - _writePromptAndLine();
|
| - }
|
| - return false;
|
| + if (showCompletions) {
|
| + // User hit double-TAB. Show them all possible completions.
|
| + completionList.sort((a,b) => a.compareTo(b));
|
| + _move(_cursorPos, _currentLine.length);
|
| + _stdout.writeln();
|
| + _stdout.writeln(completionList);
|
| + _writePromptAndLine();
|
| + return;
|
| +
|
| } else {
|
| // Apply the current completion.
|
| var completionRunes = completion.runes.toList();
|
|
|
| var newLine = [];
|
| - newLine..addAll(linePrefix)
|
| - ..addAll(completionRunes.skip(lastWord.length))
|
| + newLine..addAll(completionRunes)
|
| ..addAll(_currentLine.skip(_cursorPos));
|
| - _update(newLine, _cursorPos + completionRunes.length - lastWord.length);
|
| - return true;
|
| + _update(newLine, completionRunes.length);
|
| + return;
|
| }
|
| }
|
|
|
|
|