Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(638)

Unified Diff: lib/src/list_tree.dart

Issue 1491003002: Add a caseSensitive flag to new Glob(). (Closed) Base URL: git@github.com:dart-lang/glob@master
Patch Set: Code review changes Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/src/ast.dart ('k') | lib/src/parser.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/list_tree.dart
diff --git a/lib/src/list_tree.dart b/lib/src/list_tree.dart
index 3667d63c1abbd2a1a9492af9601203717604f736..641dba12502def130af6e32392f992effa8a521a 100644
--- a/lib/src/list_tree.dart
+++ b/lib/src/list_tree.dart
@@ -234,6 +234,13 @@ class _ListTreeNode {
/// A recursive node has no children and is listed recursively.
bool get isRecursive => children == null;
+ bool get _caseSensitive {
+ if (_validator != null) return _validator.caseSensitive;
+ if (children == null) return true;
+ if (children.isEmpty) return true;
+ return children.keys.first.caseSensitive;
+ }
+
/// Whether this node doesn't itself need to be listed.
///
/// If a node has no validator and all of its children are literal filenames,
@@ -241,6 +248,7 @@ class _ListTreeNode {
/// its children.
bool get _isIntermediate {
if (_validator != null) return false;
+ if (!_caseSensitive) return false;
return children.keys.every((sequence) =>
sequence.nodes.length == 1 && sequence.nodes.first is LiteralNode);
}
@@ -255,9 +263,14 @@ class _ListTreeNode {
// If there's more than one child node and at least one of the children is
// dynamic (that is, matches more than just a literal string), there may be
// overlap.
- if (children.length > 1 && children.keys.any((sequence) =>
+ if (children.length > 1) {
+ // Case-insensitivity means that even literals may match multiple entries.
+ if (!_caseSensitive) return true;
+
+ if (children.keys.any((sequence) =>
sequence.nodes.length > 1 || sequence.nodes.single is! LiteralNode)) {
- return true;
+ return true;
+ }
}
return children.values.any((node) => node.canOverlap);
@@ -271,7 +284,8 @@ class _ListTreeNode {
/// Creates a recursive node the given [validator].
_ListTreeNode.recursive(SequenceNode validator)
: children = null,
- _validator = new OptionsNode([validator]);
+ _validator = new OptionsNode([validator],
+ caseSensitive: validator.caseSensitive);
/// Transforms this into recursive node, folding all its children into its
/// validator.
@@ -281,14 +295,15 @@ class _ListTreeNode {
var child = children[sequence];
child.makeRecursive();
return _join([sequence, child._validator]);
- }));
+ }), caseSensitive: _caseSensitive);
children = null;
}
/// Adds [validator] to this node's existing validator.
void addOption(SequenceNode validator) {
if (_validator == null) {
- _validator = new OptionsNode([validator]);
+ _validator = new OptionsNode([validator],
+ caseSensitive: validator.caseSensitive);
} else {
_validator.options.add(validator);
}
@@ -411,10 +426,11 @@ class _ListTreeNode {
/// a path separator.
SequenceNode _join(Iterable<AstNode> components) {
var componentsList = components.toList();
- var nodes = [componentsList.removeAt(0)];
+ var first = componentsList.removeAt(0);
+ var nodes = [first];
for (var component in componentsList) {
- nodes.add(new LiteralNode('/'));
+ nodes.add(new LiteralNode('/', caseSensitive: first.caseSensitive));
nodes.add(component);
}
- return new SequenceNode(nodes);
+ return new SequenceNode(nodes, caseSensitive: first.caseSensitive);
}
« no previous file with comments | « lib/src/ast.dart ('k') | lib/src/parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698