blob: 94f6a057c57bc6f835aa8ae6cef0ad7999e3d493 [file] [log] [blame]
// Copyright (c) 2014, 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:path/path.dart' as p;
/// A range from [min] to [max], inclusive.
class Range {
/// The minimum value included by the range.
final int min;
/// The maximum value included by the range.
final int max;
/// Whether this range covers only a single number.
bool get isSingleton => min == max;
Range(this.min, this.max);
/// Returns a range that covers only [value].
Range.singleton(int value)
: this(value, value);
/// Whether [this] contains [value].
bool contains(int value) => value >= min && value <= max;
bool operator==(Object other) => other is Range &&
other.min == min && other.max == max;
int get hashCode => 3 * min + 7 * max;
}
/// An implementation of [Match] constructed by [Glob]s.
class GlobMatch implements Match {
final String input;
final Pattern pattern;
final int start = 0;
int get end => input.length;
int get groupCount => 0;
GlobMatch(this.input, this.pattern);
String operator [](int group) => this.group(group);
String group(int group) {
if (group != 0) throw new RangeError.range(group, 0, 0);
return input;
}
List<String> groups(List<int> groupIndices) =>
groupIndices.map((index) => group(index)).toList();
}
final _quote = new RegExp(r"[+*?{}|[\]\\().^$-]");
/// Returns [contents] with characters that are meaningful in regular
/// expressions backslash-escaped.
String regExpQuote(String contents) =>
contents.replaceAllMapped(_quote, (char) => "\\${char[0]}");
/// Returns [path] with all its separators replaced with forward slashes.
///
/// This is useful when converting from Windows paths to globs.
String separatorToForwardSlash(String path) {
if (p.style != p.Style.windows) return path;
return path.replaceAll('\\', '/');
}
/// Returns [path] which follows [context] converted to the POSIX format that
/// globs match against.
String toPosixPath(p.Context context, String path) {
if (context.style == p.Style.windows) return path.replaceAll('\\', '/');
if (context.style == p.Style.url) return Uri.decodeFull(path);
return path;
}