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

Side by Side Diff: lib/src/backend/platform_selector/ast.dart

Issue 1717483002: Make PlatformSelector use boolean_selector. (Closed) Base URL: git@github.com:dart-lang/test@master
Patch Set: Code review changes Created 4 years, 10 months 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 import 'package:source_span/source_span.dart';
6
7 import 'visitor.dart';
8
9 /// The superclass of nodes in the platform selector abstract syntax tree.
10 abstract class Node {
11 /// The span indicating where this node came from.
12 ///
13 /// This is a [FileSpan] because the nodes are parsed from a single continuous
14 /// string, but the string itself isn't actually a file. It might come from a
15 /// statically-parsed annotation or from a parameter.
16 ///
17 /// This may be `null` for nodes without source information.
18 FileSpan get span;
19
20 /// Calls the appropriate [Visitor] method on [this] and returns the result.
21 accept(Visitor visitor);
22 }
23
24 /// A single variable.
25 class VariableNode implements Node {
26 final FileSpan span;
27
28 /// The variable name.
29 final String name;
30
31 VariableNode(this.name, [this.span]);
32
33 accept(Visitor visitor) => visitor.visitVariable(this);
34
35 String toString() => name;
36 }
37
38 /// A negation expression.
39 class NotNode implements Node {
40 final FileSpan span;
41
42 /// The expression being negated.
43 final Node child;
44
45 NotNode(this.child, [this.span]);
46
47 accept(Visitor visitor) => visitor.visitNot(this);
48
49 String toString() => child is VariableNode || child is NotNode
50 ? "!$child"
51 : "!($child)";
52 }
53
54 /// An or expression.
55 class OrNode implements Node {
56 FileSpan get span => _expandSafe(left.span, right.span);
57
58 /// The left-hand branch of the expression.
59 final Node left;
60
61 /// The right-hand branch of the expression.
62 final Node right;
63
64 OrNode(this.left, this.right);
65
66 accept(Visitor visitor) => visitor.visitOr(this);
67
68 String toString() {
69 var string1 = left is AndNode || left is ConditionalNode
70 ? "($left)"
71 : left;
72 var string2 = right is AndNode || right is ConditionalNode
73 ? "($right)"
74 : right;
75
76 return "$string1 || $string2";
77 }
78 }
79
80 /// An and expression.
81 class AndNode implements Node {
82 FileSpan get span => _expandSafe(left.span, right.span);
83
84 /// The left-hand branch of the expression.
85 final Node left;
86
87 /// The right-hand branch of the expression.
88 final Node right;
89
90 AndNode(this.left, this.right);
91
92 accept(Visitor visitor) => visitor.visitAnd(this);
93
94 String toString() {
95 var string1 = left is OrNode || left is ConditionalNode
96 ? "($left)"
97 : left;
98 var string2 = right is OrNode || right is ConditionalNode
99 ? "($right)"
100 : right;
101
102 return "$string1 && $string2";
103 }
104 }
105
106 /// A ternary conditional expression.
107 class ConditionalNode implements Node {
108 FileSpan get span => _expandSafe(condition.span, whenFalse.span);
109
110 /// The condition expression to check.
111 final Node condition;
112
113 /// The branch to run if the condition is true.
114 final Node whenTrue;
115
116 /// The branch to run if the condition is false.
117 final Node whenFalse;
118
119 ConditionalNode(this.condition, this.whenTrue, this.whenFalse);
120
121 accept(Visitor visitor) => visitor.visitConditional(this);
122
123 String toString() {
124 var conditionString =
125 condition is ConditionalNode ? "($condition)" : condition;
126 var trueString = whenTrue is ConditionalNode ? "($whenTrue)" : whenTrue;
127 return "$conditionString ? $trueString : $whenFalse";
128 }
129 }
130
131 /// Like [FileSpan.expand], except if [start] and [end] are `null` or from
132 /// different files it returns `null` rather than throwing an error.
133 FileSpan _expandSafe(FileSpan start, FileSpan end) {
134 if (start == null || end == null) return null;
135 if (start.file != end.file) return null;
136 return start.expand(end);
137 }
OLDNEW
« no previous file with comments | « lib/src/backend/platform_selector.dart ('k') | lib/src/backend/platform_selector/evaluator.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698