blob: 6a4053060ad7bc3e119ba928942f90716140b2cb [file] [log] [blame]
// Copyright (c) 2016, 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 '../boolean_selector.dart';
import 'ast.dart';
import 'evaluator.dart';
import 'intersection_selector.dart';
import 'parser.dart';
import 'union_selector.dart';
import 'validator.dart';
/// The concrete implementation of a [BooleanSelector] parsed from a string.
/// This is separate from [BooleanSelector] so that [intersect] and [union] can
/// check to see whether they're passed a [BooleanSelectorImpl] or a different
/// class that implements [BooleanSelector].
class BooleanSelectorImpl implements BooleanSelector {
/// The parsed AST.
final Node _selector;
/// Parses [selector].
/// This will throw a [SourceSpanFormatException] if the selector is
/// malformed or if it uses an undefined variable.
BooleanSelectorImpl.parse(String selector)
: _selector = new Parser(selector).parse();
Iterable<String> get variables => _selector.variables;
bool evaluate(semantics) => _selector.accept(new Evaluator(semantics));
BooleanSelector intersection(BooleanSelector other) {
if (other == BooleanSelector.all) return this;
if (other == BooleanSelector.none) return other;
return other is BooleanSelectorImpl
? new BooleanSelectorImpl._(new AndNode(_selector, other._selector))
: new IntersectionSelector(this, other);
BooleanSelector union(BooleanSelector other) {
if (other == BooleanSelector.all) return other;
if (other == BooleanSelector.none) return this;
return other is BooleanSelectorImpl
? new BooleanSelectorImpl._(new OrNode(_selector, other._selector))
: new UnionSelector(this, other);
void validate(bool isDefined(String variable)) {
_selector.accept(new Validator(isDefined));
String toString() => _selector.toString();