Chromium Code Reviews| 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 != ''; |
|
turnidge
2014/09/17 16:06:24
My old command parsing introduced empty command pa
|
| + })); |
| + 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 + ' '; |
|
turnidge
2014/09/17 16:06:24
Now all completions come back with a space at the
|
| - } |
| } 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)); |
|
Cutch
2014/09/17 20:07:26
You can just call sort(), it will default to compa
|
| + _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) |
|
turnidge
2014/09/17 16:06:24
Before I used to preserve all of the user's extra
|
| ..addAll(_currentLine.skip(_cursorPos)); |
| - _update(newLine, _cursorPos + completionRunes.length - lastWord.length); |
| - return true; |
| + _update(newLine, completionRunes.length); |
| + return; |
| } |
| } |