in lib/src/ast.dart [70:105]
OptionsNode flattenOptions() {
if (nodes.isEmpty) {
return OptionsNode([this], caseSensitive: caseSensitive);
}
var sequences =
nodes.first.flattenOptions().options.map((sequence) => sequence.nodes);
for (var node in nodes.skip(1)) {
// Concatenate all sequences in the next options node ([nextSequences])
// onto all previous sequences ([sequences]).
var nextSequences = node.flattenOptions().options;
sequences = sequences.expand((sequence) {
return nextSequences.map((nextSequence) {
return sequence.toList()..addAll(nextSequence.nodes);
});
});
}
return OptionsNode(sequences.map((sequence) {
// Combine any adjacent LiteralNodes in [sequence].
return SequenceNode(
sequence.fold<List<AstNode>>([], (combined, node) {
if (combined.isEmpty ||
combined.last is! LiteralNode ||
node is! LiteralNode) {
return combined..add(node);
}
combined[combined.length - 1] = LiteralNode(
(combined.last as LiteralNode).text + node.text,
caseSensitive: caseSensitive);
return combined;
}),
caseSensitive: caseSensitive);
}), caseSensitive: caseSensitive);
}