| // Copyright (c) 2022, 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 'dart:io'; |
| |
| import 'package:path/path.dart' as path; |
| |
| class PostfixCompleter { |
| final String text; |
| |
| PostfixCompleter(this.text); |
| |
| String? tryComplete(String partial, List<String> candidates) { |
| if (!text.endsWith(partial)) throw 'caller error'; |
| final completion = _selectCandidate(partial, candidates); |
| if (completion != null) { |
| return text.substring(0, text.length - partial.length) + completion; |
| } |
| return null; |
| } |
| } |
| |
| String? _selectCandidate(String prefix, List<String> candidates) { |
| // If there's an exact match, use that. |
| if (candidates.any((candidate) => prefix == candidate)) { |
| return prefix; |
| } |
| |
| // Otherwise use the longest possible completion. |
| candidates = candidates |
| .where((c) => prefix.length < c.length && c.startsWith(prefix)) |
| .toList(); |
| if (candidates.isEmpty) return null; |
| candidates.sort((a, b) => b.length - a.length); |
| return candidates.first; |
| } |
| |
| final homePath = Platform.environment['HOME']!; |
| |
| String? tryCompleteFileSystemEntity( |
| String incompleteFilePattern, bool Function(String) consider) { |
| if (incompleteFilePattern.isEmpty) return null; |
| |
| final filename = incompleteFilePattern.endsWith(path.separator) |
| ? '' |
| : path.basename(incompleteFilePattern); |
| final dirname = incompleteFilePattern.substring( |
| 0, incompleteFilePattern.length - filename.length); |
| |
| final dir = dirname != '' |
| ? Directory(dirname.startsWith('~/') |
| ? (homePath + dirname.substring(1)) |
| : dirname) |
| : Directory.current; |
| |
| if (dir.existsSync()) { |
| final entries = dir |
| .listSync() |
| .where((fse) => fse is File && consider(fse.path) || fse is Directory) |
| .map((fse) => path.basename(fse.path)) |
| .toList(); |
| final pc = PostfixCompleter(incompleteFilePattern); |
| return pc.tryComplete(filename, entries); |
| } |
| |
| return null; |
| } |
| |
| final _spaceCodeUnit = ' '.codeUnitAt(0); |
| |
| String getFirstWordWithSpaces(String text) { |
| int i = 0; |
| while (i < text.length && text.codeUnitAt(i) != _spaceCodeUnit) i++; |
| while (i < text.length && text.codeUnitAt(i) == _spaceCodeUnit) i++; |
| return text.substring(0, i); |
| } |
| |
| String getLastWord(String text) { |
| return text.substring(text.lastIndexOf(' ') + 1); |
| } |