Chromium Code Reviews| Index: lib/src/backend/platform_selector.dart |
| diff --git a/lib/src/backend/platform_selector.dart b/lib/src/backend/platform_selector.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..6677f90adc5a534300005085653a8ad460251bba |
| --- /dev/null |
| +++ b/lib/src/backend/platform_selector.dart |
| @@ -0,0 +1,59 @@ |
| +// Copyright (c) 2015, 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. |
| + |
| +library unittest.backend.platform_selector; |
| + |
| +import 'package:source_span/source_span.dart'; |
| + |
| +import 'operating_system.dart'; |
| +import 'platform_selector/ast.dart'; |
| +import 'platform_selector/evaluator.dart'; |
| +import 'platform_selector/parser.dart'; |
| +import 'platform_selector/visitor.dart'; |
| +import 'test_platform.dart'; |
| + |
| +/// The set of all valid variable names. |
| +final _validVariables = |
| + new Set<String>.from(["posix", "dart-vm", "browser", "dart2js", "blink"]) |
| + ..addAll(TestPlatform.all.map((platform) => platform.identifier)) |
| + ..addAll(OperatingSystem.all.map((os) => os.name)); |
| + |
| +/// An expressing for selecting certain platforms, including operating systems |
|
Bob Nystrom
2015/03/16 16:54:26
"expressing" -> "expression".
nweiz
2015/03/24 01:03:28
Done.
|
| +/// and browsers. |
| +/// |
| +/// The syntax is mostly Dart's expression syntax restricted to boolean |
| +/// operations. See the README for full details. |
| +class PlatformSelector { |
| + /// 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. |
| + PlatformSelector.parse(String selector) |
| + : _selector = new Parser(selector).parse() { |
| + _selector.accept(const _VariableValidator()); |
| + } |
| + |
| + /// Evaluates the selector against the given [platform] and [os]. |
|
Bob Nystrom
2015/03/16 16:54:26
How about something that explains what the evaluat
nweiz
2015/03/24 01:03:28
Done.
|
| + /// |
| + /// [os] defaults to [OperatingSystem.none]. |
| + bool evaluate(TestPlatform platform, {OperatingSystem os}) => |
| + _selector.accept(new Evaluator(platform, os: os)); |
| +} |
| + |
| +/// An AST visitor that ensures that all variables are valid. |
| +/// |
| +/// This isn't done when evaluating to ensure that errors are eagerly detected, |
| +/// and it isn't done when parsing to avoid coupling the syntax too tightly to |
| +/// the semantics. |
| +class _VariableValidator extends RecursiveVisitor { |
| + const _VariableValidator(); |
| + |
| + void visitVariable(VariableNode node) { |
| + if (_validVariables.contains(node.name)) return; |
| + throw new SourceSpanFormatException("Undefined variable.", node.span); |
| + } |
| +} |