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

Side by Side Diff: pkg/analyzer_experimental/lib/src/generated/constant.dart

Issue 16337007: Version 0.5.13.1 . (Closed) Base URL: http://dart.googlecode.com/svn/trunk/dart/
Patch Set: Created 7 years, 6 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 | Annotate | Revision Log
OLDNEW
1 // This code was auto-generated, is not intended to be edited, and is subject to 1 // This code was auto-generated, is not intended to be edited, and is subject to
2 // significant change. Please see the README file for more information. 2 // significant change. Please see the README file for more information.
3 3
4 library engine.constant; 4 library engine.constant;
5 5
6 import 'java_core.dart'; 6 import 'java_core.dart';
7 import 'source.dart' show Source; 7 import 'source.dart' show Source;
8 import 'error.dart' show AnalysisError, ErrorCode, CompileTimeErrorCode; 8 import 'error.dart' show AnalysisError, ErrorCode, CompileTimeErrorCode;
9 import 'scanner.dart' show TokenType; 9 import 'scanner.dart' show TokenType;
10 import 'ast.dart'; 10 import 'ast.dart';
11 import 'element.dart'; 11 import 'element.dart';
12 import 'engine.dart' show AnalysisEngine; 12 import 'engine.dart' show AnalysisEngine;
13 13
14
14 /** 15 /**
15 * Instances of the class {@code ConstantEvaluator} evaluate constant expression s to produce their 16 * Instances of the class {@code ConstantEvaluator} evaluate constant expression s to produce their
16 * compile-time value. According to the Dart Language Specification: <blockquote > A constant 17 * compile-time value. According to the Dart Language Specification: <blockquote > A constant
17 * expression is one of the following: 18 * expression is one of the following:
18 * <ul> 19 * <ul>
19 * <li>A literal number.</li> 20 * <li>A literal number.</li>
20 * <li>A literal boolean.</li> 21 * <li>A literal boolean.</li>
21 * <li>A literal string where any interpolated expression is a compile-time cons tant that evaluates 22 * <li>A literal string where any interpolated expression is a compile-time cons tant that evaluates
22 * to a numeric, string or boolean value or to {@code null}.</li> 23 * to a numeric, string or boolean value or to {@code null}.</li>
23 * <li>{@code null}.</li> 24 * <li>{@code null}.</li>
(...skipping 12 matching lines...) Expand all
36 * <li>An expression of one of the forms {@code -e}, {@code e1 + e2}, {@code e1 - e2},{@code e1 * e2}, {@code e1 / e2}, {@code e1 ~/ e2}, {@code e1 > e2}, {@cod e e1 < e2},{@code e1 >= e2}, {@code e1 <= e2} or {@code e1 % e2}, where {@code e }, {@code e1} and {@code e2}are constant expressions that evaluate to a numeric value or to {@code null}.</li> 37 * <li>An expression of one of the forms {@code -e}, {@code e1 + e2}, {@code e1 - e2},{@code e1 * e2}, {@code e1 / e2}, {@code e1 ~/ e2}, {@code e1 > e2}, {@cod e e1 < e2},{@code e1 >= e2}, {@code e1 <= e2} or {@code e1 % e2}, where {@code e }, {@code e1} and {@code e2}are constant expressions that evaluate to a numeric value or to {@code null}.</li>
37 * </ul> 38 * </ul>
38 * </blockquote> The values returned by instances of this class are therefore {@ code null} and 39 * </blockquote> The values returned by instances of this class are therefore {@ code null} and
39 * instances of the classes {@code Boolean}, {@code BigInteger}, {@code Double}, {@code String}, and{@code DartObject}. 40 * instances of the classes {@code Boolean}, {@code BigInteger}, {@code Double}, {@code String}, and{@code DartObject}.
40 * <p> 41 * <p>
41 * In addition, this class defines several values that can be returned to indica te various 42 * In addition, this class defines several values that can be returned to indica te various
42 * conditions encountered during evaluation. These are documented with the stati c field that define 43 * conditions encountered during evaluation. These are documented with the stati c field that define
43 * those values. 44 * those values.
44 */ 45 */
45 class ConstantEvaluator { 46 class ConstantEvaluator {
47
46 /** 48 /**
47 * The source containing the expression(s) that will be evaluated. 49 * The source containing the expression(s) that will be evaluated.
48 */ 50 */
49 Source _source; 51 Source _source;
52
50 /** 53 /**
51 * Initialize a newly created evaluator to evaluate expressions in the given s ource. 54 * Initialize a newly created evaluator to evaluate expressions in the given s ource.
52 * @param source the source containing the expression(s) that will be evaluate d 55 * @param source the source containing the expression(s) that will be evaluate d
53 */ 56 */
54 ConstantEvaluator(Source source) { 57 ConstantEvaluator(Source source) {
55 this._source = source; 58 this._source = source;
56 } 59 }
57 EvaluationResult evaluate(Expression expression) { 60 EvaluationResult evaluate(Expression expression) {
58 EvaluationResultImpl result = expression.accept(new ConstantVisitor()); 61 EvaluationResultImpl result = expression.accept(new ConstantVisitor());
59 if (result is ValidResult) { 62 if (result is ValidResult) {
60 return EvaluationResult.forValue(((result as ValidResult)).value); 63 return EvaluationResult.forValue(((result as ValidResult)).value);
61 } 64 }
62 List<AnalysisError> errors = new List<AnalysisError>(); 65 List<AnalysisError> errors = new List<AnalysisError>();
63 for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) { 66 for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) {
64 ASTNode node2 = data.node; 67 ASTNode node2 = data.node;
65 errors.add(new AnalysisError.con2(_source, node2.offset, node2.length, dat a.errorCode, [])); 68 errors.add(new AnalysisError.con2(_source, node2.offset, node2.length, dat a.errorCode, []));
66 } 69 }
67 return EvaluationResult.forErrors(new List.from(errors)); 70 return EvaluationResult.forErrors(new List.from(errors));
68 } 71 }
69 } 72 }
73
70 /** 74 /**
71 * Instances of the class {@code EvaluationResult} represent the result of attem pting to evaluate an 75 * Instances of the class {@code EvaluationResult} represent the result of attem pting to evaluate an
72 * expression. 76 * expression.
73 */ 77 */
74 class EvaluationResult { 78 class EvaluationResult {
79
75 /** 80 /**
76 * Return an evaluation result representing the result of evaluating an expres sion that is not a 81 * Return an evaluation result representing the result of evaluating an expres sion that is not a
77 * compile-time constant because of the given errors. 82 * compile-time constant because of the given errors.
78 * @param errors the errors that should be reported for the expression(s) that were evaluated 83 * @param errors the errors that should be reported for the expression(s) that were evaluated
79 * @return the result of evaluating an expression that is not a compile-time c onstant 84 * @return the result of evaluating an expression that is not a compile-time c onstant
80 */ 85 */
81 static EvaluationResult forErrors(List<AnalysisError> errors) => new Evaluatio nResult(null, errors); 86 static EvaluationResult forErrors(List<AnalysisError> errors) => new Evaluatio nResult(null, errors);
87
82 /** 88 /**
83 * Return an evaluation result representing the result of evaluating an expres sion that is a 89 * Return an evaluation result representing the result of evaluating an expres sion that is a
84 * compile-time constant that evaluates to the given value. 90 * compile-time constant that evaluates to the given value.
85 * @param value the value of the expression 91 * @param value the value of the expression
86 * @return the result of evaluating an expression that is a compile-time const ant 92 * @return the result of evaluating an expression that is a compile-time const ant
87 */ 93 */
88 static EvaluationResult forValue(Object value) => new EvaluationResult(value, null); 94 static EvaluationResult forValue(Object value) => new EvaluationResult(value, null);
95
89 /** 96 /**
90 * The value of the expression. 97 * The value of the expression.
91 */ 98 */
92 Object _value; 99 Object _value;
100
93 /** 101 /**
94 * The errors that should be reported for the expression(s) that were evaluate d. 102 * The errors that should be reported for the expression(s) that were evaluate d.
95 */ 103 */
96 List<AnalysisError> _errors; 104 List<AnalysisError> _errors;
105
97 /** 106 /**
98 * Initialize a newly created result object with the given state. Clients shou ld use one of the 107 * Initialize a newly created result object with the given state. Clients shou ld use one of the
99 * factory methods: {@link #forErrors(AnalysisError\[\])} and {@link #forValue (Object)}. 108 * factory methods: {@link #forErrors(AnalysisError\[\])} and {@link #forValue (Object)}.
100 * @param value the value of the expression 109 * @param value the value of the expression
101 * @param errors the errors that should be reported for the expression(s) that were evaluated 110 * @param errors the errors that should be reported for the expression(s) that were evaluated
102 */ 111 */
103 EvaluationResult(Object value, List<AnalysisError> errors) { 112 EvaluationResult(Object value, List<AnalysisError> errors) {
104 this._value = value; 113 this._value = value;
105 this._errors = errors; 114 this._errors = errors;
106 } 115 }
116
107 /** 117 /**
108 * Return an array containing the errors that should be reported for the expre ssion(s) that were 118 * Return an array containing the errors that should be reported for the expre ssion(s) that were
109 * evaluated. If there are no such errors, the array will be empty. The array can be empty even if 119 * evaluated. If there are no such errors, the array will be empty. The array can be empty even if
110 * the expression is not a valid compile time constant if the errors would hav e been reported by 120 * the expression is not a valid compile time constant if the errors would hav e been reported by
111 * other parts of the analysis engine. 121 * other parts of the analysis engine.
112 */ 122 */
113 List<AnalysisError> get errors => _errors == null ? AnalysisError.NO_ERRORS : _errors; 123 List<AnalysisError> get errors => _errors == null ? AnalysisError.NO_ERRORS : _errors;
124
114 /** 125 /**
115 * Return the value of the expression, or {@code null} if the expression evalu ated to {@code null}or if the expression could not be evaluated, either because it was not a compile-time constant 126 * Return the value of the expression, or {@code null} if the expression evalu ated to {@code null}or if the expression could not be evaluated, either because it was not a compile-time constant
116 * expression or because it would throw an exception when evaluated. 127 * expression or because it would throw an exception when evaluated.
117 * @return the value of the expression 128 * @return the value of the expression
118 */ 129 */
119 Object get value => _value; 130 Object get value => _value;
131
120 /** 132 /**
121 * Return {@code true} if the expression is a compile-time constant expression that would not 133 * Return {@code true} if the expression is a compile-time constant expression that would not
122 * throw an exception when evaluated. 134 * throw an exception when evaluated.
123 * @return {@code true} if the expression is a valid compile-time constant exp ression 135 * @return {@code true} if the expression is a valid compile-time constant exp ression
124 */ 136 */
125 bool isValid() => _errors == null; 137 bool isValid() => _errors == null;
126 } 138 }
139
127 /** 140 /**
128 * Instances of the class {@code ConstantFinder} are used to traverse the AST st ructures of all of 141 * Instances of the class {@code ConstantFinder} are used to traverse the AST st ructures of all of
129 * the compilation units being resolved and build a table mapping constant varia ble elements to the 142 * the compilation units being resolved and build a table mapping constant varia ble elements to the
130 * declarations of those variables. 143 * declarations of those variables.
131 */ 144 */
132 class ConstantFinder extends RecursiveASTVisitor<Object> { 145 class ConstantFinder extends RecursiveASTVisitor<Object> {
146
133 /** 147 /**
134 * A table mapping constant variable elements to the declarations of those var iables. 148 * A table mapping constant variable elements to the declarations of those var iables.
135 */ 149 */
136 Map<VariableElement, VariableDeclaration> _variableMap = new Map<VariableEleme nt, VariableDeclaration>(); 150 Map<VariableElement, VariableDeclaration> _variableMap = new Map<VariableEleme nt, VariableDeclaration>();
137 /** 151
138 * Initialize a newly created constant finder.
139 */
140 ConstantFinder() : super() {
141 }
142 /** 152 /**
143 * Return a table mapping constant variable elements to the declarations of th ose variables. 153 * Return a table mapping constant variable elements to the declarations of th ose variables.
144 * @return a table mapping constant variable elements to the declarations of t hose variables 154 * @return a table mapping constant variable elements to the declarations of t hose variables
145 */ 155 */
146 Map<VariableElement, VariableDeclaration> get variableMap => _variableMap; 156 Map<VariableElement, VariableDeclaration> get variableMap => _variableMap;
147 Object visitVariableDeclaration(VariableDeclaration node) { 157 Object visitVariableDeclaration(VariableDeclaration node) {
148 super.visitVariableDeclaration(node); 158 super.visitVariableDeclaration(node);
149 Expression initializer2 = node.initializer; 159 Expression initializer2 = node.initializer;
150 if (initializer2 != null && node.isConst()) { 160 if (initializer2 != null && node.isConst()) {
151 VariableElement element2 = node.element; 161 VariableElement element2 = node.element;
152 if (element2 != null) { 162 if (element2 != null) {
153 _variableMap[element2] = node; 163 _variableMap[element2] = node;
154 } 164 }
155 } 165 }
156 return null; 166 return null;
157 } 167 }
158 } 168 }
169
159 /** 170 /**
160 * Instances of the class {@code ConstantValueComputer} compute the values of co nstant variables in 171 * Instances of the class {@code ConstantValueComputer} compute the values of co nstant variables in
161 * one or more compilation units. The expected usage pattern is for the compilat ion units to be 172 * one or more compilation units. The expected usage pattern is for the compilat ion units to be
162 * added to this computer using the method {@link #add(CompilationUnit)} and the n for the method{@link #computeValues()} to invoked exactly once. Any use of an instance after invoking the 173 * added to this computer using the method {@link #add(CompilationUnit)} and the n for the method{@link #computeValues()} to invoked exactly once. Any use of an instance after invoking the
163 * method {@link #computeValues()} will result in unpredictable behavior. 174 * method {@link #computeValues()} will result in unpredictable behavior.
164 */ 175 */
165 class ConstantValueComputer { 176 class ConstantValueComputer {
177
166 /** 178 /**
167 * The object used to find constant variables in the compilation units that we re added. 179 * The object used to find constant variables in the compilation units that we re added.
168 */ 180 */
169 ConstantFinder _constantFinder = new ConstantFinder(); 181 ConstantFinder _constantFinder = new ConstantFinder();
182
170 /** 183 /**
171 * A graph in which the nodes are the constant variables and the edges are fro m each variable to 184 * A graph in which the nodes are the constant variables and the edges are fro m each variable to
172 * the other constant variables that are referenced in the head's initializer. 185 * the other constant variables that are referenced in the head's initializer.
173 */ 186 */
174 DirectedGraph<VariableElement> _referenceGraph = new DirectedGraph<VariableEle ment>(); 187 DirectedGraph<VariableElement> _referenceGraph = new DirectedGraph<VariableEle ment>();
188
175 /** 189 /**
176 * A table mapping constant variables to the declarations of those variables. 190 * A table mapping constant variables to the declarations of those variables.
177 */ 191 */
178 Map<VariableElement, VariableDeclaration> _declarationMap; 192 Map<VariableElement, VariableDeclaration> _declarationMap;
179 /** 193
180 * Initialize a newly created constant value computer.
181 */
182 ConstantValueComputer() : super() {
183 }
184 /** 194 /**
185 * Add the constant variables in the given compilation unit to the list of con stant variables 195 * Add the constant variables in the given compilation unit to the list of con stant variables
186 * whose value needs to be computed. 196 * whose value needs to be computed.
187 * @param unit the compilation unit defining the constant variables to be adde d 197 * @param unit the compilation unit defining the constant variables to be adde d
188 */ 198 */
189 void add(CompilationUnit unit) { 199 void add(CompilationUnit unit) {
190 unit.accept(_constantFinder); 200 unit.accept(_constantFinder);
191 } 201 }
202
192 /** 203 /**
193 * Compute values for all of the constant variables in the compilation units t hat were added. 204 * Compute values for all of the constant variables in the compilation units t hat were added.
194 */ 205 */
195 void computeValues() { 206 void computeValues() {
196 _declarationMap = _constantFinder.variableMap; 207 _declarationMap = _constantFinder.variableMap;
197 for (MapEntry<VariableElement, VariableDeclaration> entry in getMapEntrySet( _declarationMap)) { 208 for (MapEntry<VariableElement, VariableDeclaration> entry in getMapEntrySet( _declarationMap)) {
198 VariableElement element = entry.getKey(); 209 VariableElement element = entry.getKey();
199 ReferenceFinder referenceFinder = new ReferenceFinder(element, _referenceG raph); 210 ReferenceFinder referenceFinder = new ReferenceFinder(element, _referenceG raph);
200 _referenceGraph.addNode(element); 211 _referenceGraph.addNode(element);
201 entry.getValue().initializer.accept(referenceFinder); 212 entry.getValue().initializer.accept(referenceFinder);
(...skipping 10 matching lines...) Expand all
212 AnalysisEngine.instance.logger.logError("Exiting constant value comput er with ${_referenceGraph.nodeCount} variables that are neither sinks no in a cy cle"); 223 AnalysisEngine.instance.logger.logError("Exiting constant value comput er with ${_referenceGraph.nodeCount} variables that are neither sinks no in a cy cle");
213 return; 224 return;
214 } 225 }
215 for (VariableElement variable in variablesInCycle) { 226 for (VariableElement variable in variablesInCycle) {
216 generateCycleError(variablesInCycle, variable); 227 generateCycleError(variablesInCycle, variable);
217 } 228 }
218 _referenceGraph.removeAllNodes(variablesInCycle); 229 _referenceGraph.removeAllNodes(variablesInCycle);
219 } 230 }
220 } 231 }
221 } 232 }
233
222 /** 234 /**
223 * Compute a value for the given variable. 235 * Compute a value for the given variable.
224 * @param variable the variable for which a value is to be computed 236 * @param variable the variable for which a value is to be computed
225 */ 237 */
226 void computeValueFor(VariableElement variable) { 238 void computeValueFor(VariableElement variable) {
227 VariableDeclaration declaration = _declarationMap[variable]; 239 VariableDeclaration declaration = _declarationMap[variable];
228 if (declaration == null) { 240 if (declaration == null) {
229 return; 241 return;
230 } 242 }
231 EvaluationResultImpl result = declaration.initializer.accept(new ConstantVis itor()); 243 EvaluationResultImpl result = declaration.initializer.accept(new ConstantVis itor());
232 ((variable as VariableElementImpl)).evaluationResult = result; 244 ((variable as VariableElementImpl)).evaluationResult = result;
233 if (result is ErrorResult) { 245 if (result is ErrorResult) {
234 List<AnalysisError> errors = new List<AnalysisError>(); 246 List<AnalysisError> errors = new List<AnalysisError>();
235 for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) { 247 for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) {
236 ASTNode node2 = data.node; 248 ASTNode node2 = data.node;
237 Source source2 = variable.getAncestor(CompilationUnitElement).source; 249 Source source2 = variable.getAncestor(CompilationUnitElement).source;
238 errors.add(new AnalysisError.con2(source2, node2.offset, node2.length, d ata.errorCode, [])); 250 errors.add(new AnalysisError.con2(source2, node2.offset, node2.length, d ata.errorCode, []));
239 } 251 }
240 } 252 }
241 } 253 }
254
242 /** 255 /**
243 * Generate an error indicating that the given variable is not a valid compile -time constant 256 * Generate an error indicating that the given variable is not a valid compile -time constant
244 * because it references at least one of the variables in the given cycle, eac h of which directly 257 * because it references at least one of the variables in the given cycle, eac h of which directly
245 * or indirectly references the variable. 258 * or indirectly references the variable.
246 * @param variablesInCycle the variables in the cycle that includes the given variable 259 * @param variablesInCycle the variables in the cycle that includes the given variable
247 * @param variable the variable that is not a valid compile-time constant 260 * @param variable the variable that is not a valid compile-time constant
248 */ 261 */
249 void generateCycleError(List<VariableElement> variablesInCycle, VariableElemen t variable) { 262 void generateCycleError(List<VariableElement> variablesInCycle, VariableElemen t variable) {
250 } 263 }
251 } 264 }
265
252 /** 266 /**
253 * Instances of the class {@code ConstantVisitor} evaluate constant expressions to produce their 267 * Instances of the class {@code ConstantVisitor} evaluate constant expressions to produce their
254 * compile-time value. According to the Dart Language Specification: <blockquote > A constant 268 * compile-time value. According to the Dart Language Specification: <blockquote > A constant
255 * expression is one of the following: 269 * expression is one of the following:
256 * <ul> 270 * <ul>
257 * <li>A literal number.</li> 271 * <li>A literal number.</li>
258 * <li>A literal boolean.</li> 272 * <li>A literal boolean.</li>
259 * <li>A literal string where any interpolated expression is a compile-time cons tant that evaluates 273 * <li>A literal string where any interpolated expression is a compile-time cons tant that evaluates
260 * to a numeric, string or boolean value or to {@code null}.</li> 274 * to a numeric, string or boolean value or to {@code null}.</li>
261 * <li>{@code null}.</li> 275 * <li>{@code null}.</li>
262 * <li>A reference to a static constant variable.</li> 276 * <li>A reference to a static constant variable.</li>
263 * <li>An identifier expression that denotes a constant variable, a class or a t ype variable.</li> 277 * <li>An identifier expression that denotes a constant variable, a class or a t ype variable.</li>
264 * <li>A constant constructor invocation.</li> 278 * <li>A constant constructor invocation.</li>
265 * <li>A constant list literal.</li> 279 * <li>A constant list literal.</li>
266 * <li>A constant map literal.</li> 280 * <li>A constant map literal.</li>
267 * <li>A simple or qualified identifier denoting a top-level function or a stati c method.</li> 281 * <li>A simple or qualified identifier denoting a top-level function or a stati c method.</li>
268 * <li>A parenthesized expression {@code (e)} where {@code e} is a constant expr ession.</li> 282 * <li>A parenthesized expression {@code (e)} where {@code e} is a constant expr ession.</li>
269 * <li>An expression of one of the forms {@code identical(e1, e2)}, {@code e1 == e2},{@code e1 != e2} where {@code e1} and {@code e2} are constant expressions t hat evaluate to a 283 * <li>An expression of one of the forms {@code identical(e1, e2)}, {@code e1 == e2},{@code e1 != e2} where {@code e1} and {@code e2} are constant expressions t hat evaluate to a
270 * numeric, string or boolean value or to {@code null}.</li> 284 * numeric, string or boolean value or to {@code null}.</li>
271 * <li>An expression of one of the forms {@code !e}, {@code e1 && e2} or {@code e1 || e2}, where{@code e}, {@code e1} and {@code e2} are constant expressions th at evaluate to a boolean value or 285 * <li>An expression of one of the forms {@code !e}, {@code e1 && e2} or {@code e1 || e2}, where{@code e}, {@code e1} and {@code e2} are constant expressions th at evaluate to a boolean value or
272 * to {@code null}.</li> 286 * to {@code null}.</li>
273 * <li>An expression of one of the forms {@code ~e}, {@code e1 ^ e2}, {@code e1 & e2},{@code e1 | e2}, {@code e1 >> e2} or {@code e1 << e2}, where {@code e}, {@ code e1} and {@code e2}are constant expressions that evaluate to an integer valu e or to {@code null}.</li> 287 * <li>An expression of one of the forms {@code ~e}, {@code e1 ^ e2}, {@code e1 & e2},{@code e1 | e2}, {@code e1 >> e2} or {@code e1 << e2}, where {@code e}, {@ code e1} and {@code e2}are constant expressions that evaluate to an integer valu e or to {@code null}.</li>
274 * <li>An expression of one of the forms {@code -e}, {@code e1 + e2}, {@code e1 - e2},{@code e1 * e2}, {@code e1 / e2}, {@code e1 ~/ e2}, {@code e1 > e2}, {@cod e e1 < e2},{@code e1 >= e2}, {@code e1 <= e2} or {@code e1 % e2}, where {@code e }, {@code e1} and {@code e2}are constant expressions that evaluate to a numeric value or to {@code null}.</li> 288 * <li>An expression of one of the forms {@code -e}, {@code e1 + e2}, {@code e1 - e2},{@code e1 * e2}, {@code e1 / e2}, {@code e1 ~/ e2}, {@code e1 > e2}, {@cod e e1 < e2},{@code e1 >= e2}, {@code e1 <= e2} or {@code e1 % e2}, where {@code e }, {@code e1} and {@code e2}are constant expressions that evaluate to a numeric value or to {@code null}.</li>
275 * </ul> 289 * </ul>
276 * </blockquote> 290 * </blockquote>
277 */ 291 */
278 class ConstantVisitor extends GeneralizingASTVisitor<EvaluationResultImpl> { 292 class ConstantVisitor extends GeneralizingASTVisitor<EvaluationResultImpl> {
279 /**
280 * Initialize a newly created constant visitor.
281 */
282 ConstantVisitor() : super() {
283 }
284 EvaluationResultImpl visitAdjacentStrings(AdjacentStrings node) { 293 EvaluationResultImpl visitAdjacentStrings(AdjacentStrings node) {
285 EvaluationResultImpl result = null; 294 EvaluationResultImpl result = null;
286 for (StringLiteral string in node.strings) { 295 for (StringLiteral string in node.strings) {
287 if (result == null) { 296 if (result == null) {
288 result = string.accept(this); 297 result = string.accept(this);
289 } else { 298 } else {
290 result = result.concatenate(node, string.accept(this)); 299 result = result.concatenate(node, string.accept(this));
291 } 300 }
292 } 301 }
293 return result; 302 return result;
294 } 303 }
295 EvaluationResultImpl visitBinaryExpression(BinaryExpression node) { 304 EvaluationResultImpl visitBinaryExpression(BinaryExpression node) {
296 EvaluationResultImpl leftResult = node.leftOperand.accept(this); 305 EvaluationResultImpl leftResult = node.leftOperand.accept(this);
297 EvaluationResultImpl rightResult = node.rightOperand.accept(this); 306 EvaluationResultImpl rightResult = node.rightOperand.accept(this);
307 TokenType operatorType = node.operator.type;
308 if (operatorType != TokenType.BANG_EQ && operatorType != TokenType.EQ_EQ) {
309 if (leftResult is ValidResult && ((leftResult as ValidResult)).isNull() || rightResult is ValidResult && ((rightResult as ValidResult)).isNull()) {
310 return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
311 }
312 }
298 while (true) { 313 while (true) {
299 if (node.operator.type == TokenType.AMPERSAND) { 314 if (operatorType == TokenType.AMPERSAND) {
300 return leftResult.bitAnd(node, rightResult); 315 return leftResult.bitAnd(node, rightResult);
301 } else if (node.operator.type == TokenType.AMPERSAND_AMPERSAND) { 316 } else if (operatorType == TokenType.AMPERSAND_AMPERSAND) {
302 return leftResult.logicalAnd(node, rightResult); 317 return leftResult.logicalAnd(node, rightResult);
303 } else if (node.operator.type == TokenType.BANG_EQ) { 318 } else if (operatorType == TokenType.BANG_EQ) {
304 return leftResult.notEqual(node, rightResult); 319 return leftResult.notEqual(node, rightResult);
305 } else if (node.operator.type == TokenType.BAR) { 320 } else if (operatorType == TokenType.BAR) {
306 return leftResult.bitOr(node, rightResult); 321 return leftResult.bitOr(node, rightResult);
307 } else if (node.operator.type == TokenType.BAR_BAR) { 322 } else if (operatorType == TokenType.BAR_BAR) {
308 return leftResult.logicalOr(node, rightResult); 323 return leftResult.logicalOr(node, rightResult);
309 } else if (node.operator.type == TokenType.CARET) { 324 } else if (operatorType == TokenType.CARET) {
310 return leftResult.bitXor(node, rightResult); 325 return leftResult.bitXor(node, rightResult);
311 } else if (node.operator.type == TokenType.EQ_EQ) { 326 } else if (operatorType == TokenType.EQ_EQ) {
312 return leftResult.equalEqual(node, rightResult); 327 return leftResult.equalEqual(node, rightResult);
313 } else if (node.operator.type == TokenType.GT) { 328 } else if (operatorType == TokenType.GT) {
314 return leftResult.greaterThan(node, rightResult); 329 return leftResult.greaterThan(node, rightResult);
315 } else if (node.operator.type == TokenType.GT_EQ) { 330 } else if (operatorType == TokenType.GT_EQ) {
316 return leftResult.greaterThanOrEqual(node, rightResult); 331 return leftResult.greaterThanOrEqual(node, rightResult);
317 } else if (node.operator.type == TokenType.GT_GT) { 332 } else if (operatorType == TokenType.GT_GT) {
318 return leftResult.shiftRight(node, rightResult); 333 return leftResult.shiftRight(node, rightResult);
319 } else if (node.operator.type == TokenType.LT) { 334 } else if (operatorType == TokenType.LT) {
320 return leftResult.lessThan(node, rightResult); 335 return leftResult.lessThan(node, rightResult);
321 } else if (node.operator.type == TokenType.LT_EQ) { 336 } else if (operatorType == TokenType.LT_EQ) {
322 return leftResult.lessThanOrEqual(node, rightResult); 337 return leftResult.lessThanOrEqual(node, rightResult);
323 } else if (node.operator.type == TokenType.LT_LT) { 338 } else if (operatorType == TokenType.LT_LT) {
324 return leftResult.shiftLeft(node, rightResult); 339 return leftResult.shiftLeft(node, rightResult);
325 } else if (node.operator.type == TokenType.MINUS) { 340 } else if (operatorType == TokenType.MINUS) {
326 return leftResult.minus(node, rightResult); 341 return leftResult.minus(node, rightResult);
327 } else if (node.operator.type == TokenType.PERCENT) { 342 } else if (operatorType == TokenType.PERCENT) {
328 return leftResult.remainder(node, rightResult); 343 return leftResult.remainder(node, rightResult);
329 } else if (node.operator.type == TokenType.PLUS) { 344 } else if (operatorType == TokenType.PLUS) {
330 return leftResult.add(node, rightResult); 345 return leftResult.add(node, rightResult);
331 } else if (node.operator.type == TokenType.STAR) { 346 } else if (operatorType == TokenType.STAR) {
332 return leftResult.times(node, rightResult); 347 return leftResult.times(node, rightResult);
333 } else if (node.operator.type == TokenType.SLASH) { 348 } else if (operatorType == TokenType.SLASH) {
334 return leftResult.divide(node, rightResult); 349 return leftResult.divide(node, rightResult);
335 } else if (node.operator.type == TokenType.TILDE_SLASH) { 350 } else if (operatorType == TokenType.TILDE_SLASH) {
336 return leftResult.integerDivide(node, rightResult); 351 return leftResult.integerDivide(node, rightResult);
337 } 352 }
338 break; 353 break;
339 } 354 }
340 return error(node, null); 355 return error(node, null);
341 } 356 }
342 EvaluationResultImpl visitBooleanLiteral(BooleanLiteral node) => node.value ? ValidResult.RESULT_TRUE : ValidResult.RESULT_FALSE; 357 EvaluationResultImpl visitBooleanLiteral(BooleanLiteral node) => node.value ? ValidResult.RESULT_TRUE : ValidResult.RESULT_FALSE;
343 EvaluationResultImpl visitDoubleLiteral(DoubleLiteral node) => new ValidResult (node.value); 358 EvaluationResultImpl visitDoubleLiteral(DoubleLiteral node) => new ValidResult (node.value);
344 EvaluationResultImpl visitInstanceCreationExpression(InstanceCreationExpressio n node) { 359 EvaluationResultImpl visitInstanceCreationExpression(InstanceCreationExpressio n node) {
345 ConstructorElement constructor = node.element; 360 ConstructorElement constructor = node.element;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 EvaluationResultImpl rightArgument = arguments2[1].accept(this); 406 EvaluationResultImpl rightArgument = arguments2[1].accept(this);
392 return leftArgument.equalEqual(node, rightArgument); 407 return leftArgument.equalEqual(node, rightArgument);
393 } 408 }
394 } 409 }
395 } 410 }
396 } 411 }
397 } 412 }
398 return error(node, null); 413 return error(node, null);
399 } 414 }
400 EvaluationResultImpl visitNode(ASTNode node) => error(node, null); 415 EvaluationResultImpl visitNode(ASTNode node) => error(node, null);
401 EvaluationResultImpl visitNullLiteral(NullLiteral node) => new ValidResult(nul l); 416 EvaluationResultImpl visitNullLiteral(NullLiteral node) => ValidResult.RESULT_ NULL;
402 EvaluationResultImpl visitParenthesizedExpression(ParenthesizedExpression node ) => node.expression.accept(this); 417 EvaluationResultImpl visitParenthesizedExpression(ParenthesizedExpression node ) => node.expression.accept(this);
403 EvaluationResultImpl visitPrefixedIdentifier(PrefixedIdentifier node) => getCo nstantValue(node, node.element); 418 EvaluationResultImpl visitPrefixedIdentifier(PrefixedIdentifier node) => getCo nstantValue(node, node.element);
404 EvaluationResultImpl visitPrefixExpression(PrefixExpression node) { 419 EvaluationResultImpl visitPrefixExpression(PrefixExpression node) {
405 EvaluationResultImpl operand2 = node.operand.accept(this); 420 EvaluationResultImpl operand2 = node.operand.accept(this);
421 if (operand2 is ValidResult && ((operand2 as ValidResult)).isNull()) {
422 return error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
423 }
406 while (true) { 424 while (true) {
407 if (node.operator.type == TokenType.BANG) { 425 if (node.operator.type == TokenType.BANG) {
408 return operand2.logicalNot(node); 426 return operand2.logicalNot(node);
409 } else if (node.operator.type == TokenType.TILDE) { 427 } else if (node.operator.type == TokenType.TILDE) {
410 return operand2.bitNot(node); 428 return operand2.bitNot(node);
411 } else if (node.operator.type == TokenType.MINUS) { 429 } else if (node.operator.type == TokenType.MINUS) {
412 return operand2.negated(node); 430 return operand2.negated(node);
413 } 431 }
414 break; 432 break;
415 } 433 }
416 return error(node, null); 434 return error(node, null);
417 } 435 }
418 EvaluationResultImpl visitPropertyAccess(PropertyAccess node) => getConstantVa lue(node, node.propertyName.element); 436 EvaluationResultImpl visitPropertyAccess(PropertyAccess node) => getConstantVa lue(node, node.propertyName.element);
419 EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) => getConsta ntValue(node, node.element); 437 EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) => getConsta ntValue(node, node.element);
420 EvaluationResultImpl visitSimpleStringLiteral(SimpleStringLiteral node) => new ValidResult(node.value); 438 EvaluationResultImpl visitSimpleStringLiteral(SimpleStringLiteral node) => new ValidResult(node.value);
421 EvaluationResultImpl visitStringInterpolation(StringInterpolation node) { 439 EvaluationResultImpl visitStringInterpolation(StringInterpolation node) {
422 EvaluationResultImpl result = null; 440 EvaluationResultImpl result = null;
423 for (InterpolationElement element in node.elements) { 441 for (InterpolationElement element in node.elements) {
424 if (result == null) { 442 if (result == null) {
425 result = element.accept(this); 443 result = element.accept(this);
426 } else { 444 } else {
427 result = result.concatenate(node, element.accept(this)); 445 result = result.concatenate(node, element.accept(this));
428 } 446 }
429 } 447 }
430 return result; 448 return result;
431 } 449 }
450
432 /** 451 /**
433 * Return a result object representing an error associated with the given node . 452 * Return a result object representing an error associated with the given node .
434 * @param node the AST node associated with the error 453 * @param node the AST node associated with the error
435 * @param code the error code indicating the nature of the error 454 * @param code the error code indicating the nature of the error
436 * @return a result object representing an error associated with the given nod e 455 * @return a result object representing an error associated with the given nod e
437 */ 456 */
438 ErrorResult error(ASTNode node, ErrorCode code) => new ErrorResult.con1(node, code == null ? CompileTimeErrorCode.INVALID_CONSTANT : code); 457 ErrorResult error(ASTNode node, ErrorCode code) => new ErrorResult.con1(node, code == null ? CompileTimeErrorCode.INVALID_CONSTANT : code);
458
439 /** 459 /**
440 * Return the constant value of the static constant represented by the given e lement. 460 * Return the constant value of the static constant represented by the given e lement.
441 * @param node the node to be used if an error needs to be reported 461 * @param node the node to be used if an error needs to be reported
442 * @param element the element whose value is to be returned 462 * @param element the element whose value is to be returned
443 * @return the constant value of the static constant 463 * @return the constant value of the static constant
444 */ 464 */
445 EvaluationResultImpl getConstantValue(ASTNode node, Element element) { 465 EvaluationResultImpl getConstantValue(ASTNode node, Element element) {
446 if (element is PropertyAccessorElement) { 466 if (element is PropertyAccessorElement) {
447 element = ((element as PropertyAccessorElement)).variable; 467 element = ((element as PropertyAccessorElement)).variable;
448 } 468 }
449 if (element is VariableElementImpl) { 469 if (element is VariableElementImpl) {
450 EvaluationResultImpl value = ((element as VariableElementImpl)).evaluation Result; 470 EvaluationResultImpl value = ((element as VariableElementImpl)).evaluation Result;
451 if (value != null) { 471 if (value != null) {
452 return value; 472 return value;
453 } 473 }
454 } else if (element is ExecutableElement) { 474 } else if (element is ExecutableElement) {
455 return new ValidResult(element); 475 return new ValidResult(element);
476 } else if (element is ClassElement) {
477 return ValidResult.RESULT_OBJECT;
456 } 478 }
457 return error(node, null); 479 return error(node, null);
458 } 480 }
481
459 /** 482 /**
460 * Return the union of the errors encoded in the given results. 483 * Return the union of the errors encoded in the given results.
461 * @param leftResult the first set of errors, or {@code null} if there was no previous collection 484 * @param leftResult the first set of errors, or {@code null} if there was no previous collection
462 * of errors 485 * of errors
463 * @param rightResult the errors to be added to the collection, or a valid res ult if there are no 486 * @param rightResult the errors to be added to the collection, or a valid res ult if there are no
464 * errors to be added 487 * errors to be added
465 * @return the union of the errors encoded in the given results 488 * @return the union of the errors encoded in the given results
466 */ 489 */
467 ErrorResult union(ErrorResult leftResult, EvaluationResultImpl rightResult) { 490 ErrorResult union(ErrorResult leftResult, EvaluationResultImpl rightResult) {
468 if (rightResult is ErrorResult) { 491 if (rightResult is ErrorResult) {
469 if (leftResult != null) { 492 if (leftResult != null) {
470 return new ErrorResult.con2(leftResult, (rightResult as ErrorResult)); 493 return new ErrorResult.con2(leftResult, (rightResult as ErrorResult));
471 } else { 494 } else {
472 return rightResult as ErrorResult; 495 return rightResult as ErrorResult;
473 } 496 }
474 } 497 }
475 return leftResult; 498 return leftResult;
476 } 499 }
477 } 500 }
501
478 /** 502 /**
479 * Instances of the class {@code DirectedGraph} implement a directed graph in wh ich the nodes are 503 * Instances of the class {@code DirectedGraph} implement a directed graph in wh ich the nodes are
480 * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an 504 * arbitrary (client provided) objects and edges are represented implicitly. The graph will allow an
481 * edge from any node to any other node, including itself, but will not represen t multiple edges 505 * edge from any node to any other node, including itself, but will not represen t multiple edges
482 * between the same pair of nodes. 506 * between the same pair of nodes.
483 * @param N the type of the nodes in the graph 507 * @param N the type of the nodes in the graph
484 */ 508 */
485 class DirectedGraph<N> { 509 class DirectedGraph<N> {
510
486 /** 511 /**
487 * The table encoding the edges in the graph. An edge is represented by an ent ry mapping the head 512 * The table encoding the edges in the graph. An edge is represented by an ent ry mapping the head
488 * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping 513 * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping
489 * the node to an empty set of tails. 514 * the node to an empty set of tails.
490 */ 515 */
491 Map<N, Set<N>> _edges = new Map<N, Set<N>>(); 516 Map<N, Set<N>> _edges = new Map<N, Set<N>>();
492 /** 517
493 * Initialize a newly create directed graph to be empty.
494 */
495 DirectedGraph() : super() {
496 }
497 /** 518 /**
498 * Add an edge from the given head node to the given tail node. Both nodes wil l be a part of the 519 * Add an edge from the given head node to the given tail node. Both nodes wil l be a part of the
499 * graph after this method is invoked, whether or not they were before. 520 * graph after this method is invoked, whether or not they were before.
500 * @param head the node at the head of the edge 521 * @param head the node at the head of the edge
501 * @param tail the node at the tail of the edge 522 * @param tail the node at the tail of the edge
502 */ 523 */
503 void addEdge(N head, N tail) { 524 void addEdge(N head, N tail) {
504 Set<N> tails = _edges[tail]; 525 Set<N> tails = _edges[tail];
505 if (tails == null) { 526 if (tails == null) {
506 _edges[tail] = new Set<N>(); 527 _edges[tail] = new Set<N>();
507 } 528 }
508 tails = _edges[head]; 529 tails = _edges[head];
509 if (tails == null) { 530 if (tails == null) {
510 tails = new Set<N>(); 531 tails = new Set<N>();
511 _edges[head] = tails; 532 _edges[head] = tails;
512 } 533 }
513 javaSetAdd(tails, tail); 534 javaSetAdd(tails, tail);
514 } 535 }
536
515 /** 537 /**
516 * Add the given node to the set of nodes in the graph. 538 * Add the given node to the set of nodes in the graph.
517 * @param node the node to be added 539 * @param node the node to be added
518 */ 540 */
519 void addNode(N node) { 541 void addNode(N node) {
520 Set<N> tails = _edges[node]; 542 Set<N> tails = _edges[node];
521 if (tails == null) { 543 if (tails == null) {
522 _edges[node] = new Set<N>(); 544 _edges[node] = new Set<N>();
523 } 545 }
524 } 546 }
547
525 /** 548 /**
526 * Return a list of nodes that form a cycle, or {@code null} if there are no c ycles in this graph. 549 * Return a list of nodes that form a cycle, or {@code null} if there are no c ycles in this graph.
527 * @return a list of nodes that form a cycle 550 * @return a list of nodes that form a cycle
528 */ 551 */
529 List<N> findCycle() => null; 552 List<N> findCycle() => null;
553
530 /** 554 /**
531 * Return the number of nodes in this graph. 555 * Return the number of nodes in this graph.
532 * @return the number of nodes in this graph 556 * @return the number of nodes in this graph
533 */ 557 */
534 int get nodeCount => _edges.length; 558 int get nodeCount => _edges.length;
559
535 /** 560 /**
536 * Return a set containing the tails of edges that have the given node as thei r head. The set will 561 * Return a set containing the tails of edges that have the given node as thei r head. The set will
537 * be empty if there are no such edges or if the node is not part of the graph . Clients must not 562 * be empty if there are no such edges or if the node is not part of the graph . Clients must not
538 * modify the returned set. 563 * modify the returned set.
539 * @param head the node at the head of all of the edges whose tails are to be returned 564 * @param head the node at the head of all of the edges whose tails are to be returned
540 * @return a set containing the tails of edges that have the given node as the ir head 565 * @return a set containing the tails of edges that have the given node as the ir head
541 */ 566 */
542 Set<N> getTails(N head) { 567 Set<N> getTails(N head) {
543 Set<N> tails = _edges[head]; 568 Set<N> tails = _edges[head];
544 if (tails == null) { 569 if (tails == null) {
545 return new Set<N>(); 570 return new Set<N>();
546 } 571 }
547 return tails; 572 return tails;
548 } 573 }
574
549 /** 575 /**
550 * Return {@code true} if this graph is empty. 576 * Return {@code true} if this graph is empty.
551 * @return {@code true} if this graph is empty 577 * @return {@code true} if this graph is empty
552 */ 578 */
553 bool isEmpty() => _edges.isEmpty; 579 bool isEmpty() => _edges.isEmpty;
580
554 /** 581 /**
555 * Remove all of the given nodes from this graph. As a consequence, any edges for which those 582 * Remove all of the given nodes from this graph. As a consequence, any edges for which those
556 * nodes were either a head or a tail will also be removed. 583 * nodes were either a head or a tail will also be removed.
557 * @param nodes the nodes to be removed 584 * @param nodes the nodes to be removed
558 */ 585 */
559 void removeAllNodes(List<N> nodes) { 586 void removeAllNodes(List<N> nodes) {
560 for (N node in nodes) { 587 for (N node in nodes) {
561 removeNode(node); 588 removeNode(node);
562 } 589 }
563 } 590 }
591
564 /** 592 /**
565 * Remove the edge from the given head node to the given tail node. If there w as no such edge then 593 * Remove the edge from the given head node to the given tail node. If there w as no such edge then
566 * the graph will be unmodified: the number of edges will be the same and the set of nodes will be 594 * the graph will be unmodified: the number of edges will be the same and the set of nodes will be
567 * the same (neither node will either be added or removed). 595 * the same (neither node will either be added or removed).
568 * @param head the node at the head of the edge 596 * @param head the node at the head of the edge
569 * @param tail the node at the tail of the edge 597 * @param tail the node at the tail of the edge
570 * @return {@code true} if the graph was modified as a result of this operatio n 598 * @return {@code true} if the graph was modified as a result of this operatio n
571 */ 599 */
572 void removeEdge(N head, N tail) { 600 void removeEdge(N head, N tail) {
573 Set<N> tails = _edges[head]; 601 Set<N> tails = _edges[head];
574 if (tails != null) { 602 if (tails != null) {
575 tails.remove(tail); 603 tails.remove(tail);
576 } 604 }
577 } 605 }
606
578 /** 607 /**
579 * Remove the given node from this graph. As a consequence, any edges for whic h that node was 608 * Remove the given node from this graph. As a consequence, any edges for whic h that node was
580 * either a head or a tail will also be removed. 609 * either a head or a tail will also be removed.
581 * @param node the node to be removed 610 * @param node the node to be removed
582 */ 611 */
583 void removeNode(N node) { 612 void removeNode(N node) {
584 _edges.remove(node); 613 _edges.remove(node);
585 for (Set<N> tails in _edges.values) { 614 for (Set<N> tails in _edges.values) {
586 tails.remove(node); 615 tails.remove(node);
587 } 616 }
588 } 617 }
618
589 /** 619 /**
590 * Find one node (referred to as a sink node) that has no outgoing edges (that is, for which there 620 * Find one node (referred to as a sink node) that has no outgoing edges (that is, for which there
591 * are no edges that have that node as the head of the edge) and remove it fro m this graph. Return 621 * are no edges that have that node as the head of the edge) and remove it fro m this graph. Return
592 * the node that was removed, or {@code null} if there are no such nodes eithe r because the graph 622 * the node that was removed, or {@code null} if there are no such nodes eithe r because the graph
593 * is empty or because every node in the graph has at least one outgoing edge. As a consequence of 623 * is empty or because every node in the graph has at least one outgoing edge. As a consequence of
594 * removing the node from the graph any edges for which that node was a tail w ill also be removed. 624 * removing the node from the graph any edges for which that node was a tail w ill also be removed.
595 * @return the sink node that was removed 625 * @return the sink node that was removed
596 */ 626 */
597 N removeSink() { 627 N removeSink() {
598 N sink = findSink(); 628 N sink = findSink();
599 if (sink == null) { 629 if (sink == null) {
600 return null; 630 return null;
601 } 631 }
602 removeNode(sink); 632 removeNode(sink);
603 return sink; 633 return sink;
604 } 634 }
635
605 /** 636 /**
606 * Return one node that has no outgoing edges (that is, for which there are no edges that have 637 * Return one node that has no outgoing edges (that is, for which there are no edges that have
607 * that node as the head of the edge), or {@code null} if there are no such no des. 638 * that node as the head of the edge), or {@code null} if there are no such no des.
608 * @return a sink node 639 * @return a sink node
609 */ 640 */
610 N findSink() { 641 N findSink() {
611 for (MapEntry<N, Set<N>> entry in getMapEntrySet(_edges)) { 642 for (MapEntry<N, Set<N>> entry in getMapEntrySet(_edges)) {
612 if (entry.getValue().isEmpty) { 643 if (entry.getValue().isEmpty) {
613 return entry.getKey(); 644 return entry.getKey();
614 } 645 }
615 } 646 }
616 return null; 647 return null;
617 } 648 }
618 } 649 }
650
619 /** 651 /**
620 * Instances of the class {@code ErrorResult} represent the result of evaluating an expression that 652 * Instances of the class {@code ErrorResult} represent the result of evaluating an expression that
621 * is not a valid compile time constant. 653 * is not a valid compile time constant.
622 */ 654 */
623 class ErrorResult extends EvaluationResultImpl { 655 class ErrorResult extends EvaluationResultImpl {
656
624 /** 657 /**
625 * The errors that prevent the expression from being a valid compile time cons tant. 658 * The errors that prevent the expression from being a valid compile time cons tant.
626 */ 659 */
627 List<ErrorResult_ErrorData> _errors = new List<ErrorResult_ErrorData>(); 660 List<ErrorResult_ErrorData> _errors = new List<ErrorResult_ErrorData>();
661
628 /** 662 /**
629 * Initialize a newly created result representing the error with the given cod e reported against 663 * Initialize a newly created result representing the error with the given cod e reported against
630 * the given node. 664 * the given node.
631 * @param node the node against which the error should be reported 665 * @param node the node against which the error should be reported
632 * @param errorCode the error code for the error to be generated 666 * @param errorCode the error code for the error to be generated
633 */ 667 */
634 ErrorResult.con1(ASTNode node, ErrorCode errorCode) { 668 ErrorResult.con1(ASTNode node, ErrorCode errorCode) {
635 _jtd_constructor_168_impl(node, errorCode); 669 _jtd_constructor_171_impl(node, errorCode);
636 } 670 }
637 _jtd_constructor_168_impl(ASTNode node, ErrorCode errorCode) { 671 _jtd_constructor_171_impl(ASTNode node, ErrorCode errorCode) {
638 _errors.add(new ErrorResult_ErrorData(node, errorCode)); 672 _errors.add(new ErrorResult_ErrorData(node, errorCode));
639 } 673 }
674
640 /** 675 /**
641 * Initialize a newly created result to represent the union of the errors in t he given result 676 * Initialize a newly created result to represent the union of the errors in t he given result
642 * objects. 677 * objects.
643 * @param firstResult the first set of results being merged 678 * @param firstResult the first set of results being merged
644 * @param secondResult the second set of results being merged 679 * @param secondResult the second set of results being merged
645 */ 680 */
646 ErrorResult.con2(ErrorResult firstResult, ErrorResult secondResult) { 681 ErrorResult.con2(ErrorResult firstResult, ErrorResult secondResult) {
647 _jtd_constructor_169_impl(firstResult, secondResult); 682 _jtd_constructor_172_impl(firstResult, secondResult);
648 } 683 }
649 _jtd_constructor_169_impl(ErrorResult firstResult, ErrorResult secondResult) { 684 _jtd_constructor_172_impl(ErrorResult firstResult, ErrorResult secondResult) {
650 _errors.addAll(firstResult._errors); 685 _errors.addAll(firstResult._errors);
651 _errors.addAll(secondResult._errors); 686 _errors.addAll(secondResult._errors);
652 } 687 }
653 EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOper and) => rightOperand.addToError(node, this); 688 EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOper and) => rightOperand.addToError(node, this);
654 EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.bitAndError(node, this); 689 EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.bitAndError(node, this);
655 EvaluationResultImpl bitNot(Expression node) => this; 690 EvaluationResultImpl bitNot(Expression node) => this;
656 EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOp erand) => rightOperand.bitOrError(node, this); 691 EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOp erand) => rightOperand.bitOrError(node, this);
657 EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.bitXorError(node, this); 692 EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.bitXorError(node, this);
658 EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOp erand) => rightOperand.concatenateError(node, this); 693 EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOp erand) => rightOperand.concatenateError(node, this);
659 EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.divideError(node, this); 694 EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.divideError(node, this);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOpe rand) => new ErrorResult.con2(this, leftOperand); 745 EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOpe rand) => new ErrorResult.con2(this, leftOperand);
711 EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOpe rand) => this; 746 EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOpe rand) => this;
712 EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOpe rand) => new ErrorResult.con2(this, leftOperand); 747 EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOpe rand) => new ErrorResult.con2(this, leftOperand);
713 EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOpe rand) => this; 748 EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOpe rand) => this;
714 EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOp erand) => new ErrorResult.con2(this, leftOperand); 749 EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOp erand) => new ErrorResult.con2(this, leftOperand);
715 EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOp erand) => this; 750 EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOp erand) => this;
716 EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand ) => new ErrorResult.con2(this, leftOperand); 751 EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand ) => new ErrorResult.con2(this, leftOperand);
717 EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand ) => this; 752 EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand ) => this;
718 } 753 }
719 class ErrorResult_ErrorData { 754 class ErrorResult_ErrorData {
755
720 /** 756 /**
721 * The node against which the error should be reported. 757 * The node against which the error should be reported.
722 */ 758 */
723 ASTNode _node; 759 ASTNode _node;
760
724 /** 761 /**
725 * The error code for the error to be generated. 762 * The error code for the error to be generated.
726 */ 763 */
727 ErrorCode _errorCode; 764 ErrorCode _errorCode;
765
728 /** 766 /**
729 * Initialize a newly created data holder to represent the error with the give n code reported 767 * Initialize a newly created data holder to represent the error with the give n code reported
730 * against the given node. 768 * against the given node.
731 * @param node the node against which the error should be reported 769 * @param node the node against which the error should be reported
732 * @param errorCode the error code for the error to be generated 770 * @param errorCode the error code for the error to be generated
733 */ 771 */
734 ErrorResult_ErrorData(ASTNode node, ErrorCode errorCode) { 772 ErrorResult_ErrorData(ASTNode node, ErrorCode errorCode) {
735 this._node = node; 773 this._node = node;
736 this._errorCode = errorCode; 774 this._errorCode = errorCode;
737 } 775 }
776
738 /** 777 /**
739 * Return the error code for the error to be generated. 778 * Return the error code for the error to be generated.
740 * @return the error code for the error to be generated 779 * @return the error code for the error to be generated
741 */ 780 */
742 ErrorCode get errorCode => _errorCode; 781 ErrorCode get errorCode => _errorCode;
782
743 /** 783 /**
744 * Return the node against which the error should be reported. 784 * Return the node against which the error should be reported.
745 * @return the node against which the error should be reported 785 * @return the node against which the error should be reported
746 */ 786 */
747 ASTNode get node => _node; 787 ASTNode get node => _node;
748 } 788 }
789
749 /** 790 /**
750 * Instances of the class {@code InternalResult} represent the result of attempt ing to evaluate a 791 * Instances of the class {@code InternalResult} represent the result of attempt ing to evaluate a
751 * expression. 792 * expression.
752 */ 793 */
753 abstract class EvaluationResultImpl { 794 abstract class EvaluationResultImpl {
754 EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOper and); 795 EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOper and);
755 EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightO perand); 796 EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightO perand);
756 EvaluationResultImpl bitNot(Expression node); 797 EvaluationResultImpl bitNot(Expression node);
757 EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOp erand); 798 EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOp erand);
758 EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightO perand); 799 EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightO perand);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOper and); 850 EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOper and);
810 EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOpe rand); 851 EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOpe rand);
811 EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOpe rand); 852 EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOpe rand);
812 EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOpe rand); 853 EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOpe rand);
813 EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOpe rand); 854 EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOpe rand);
814 EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOp erand); 855 EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOp erand);
815 EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOp erand); 856 EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOp erand);
816 EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand ); 857 EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand );
817 EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand ); 858 EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand );
818 } 859 }
860
819 /** 861 /**
820 * Instances of the class {@code ReferenceFinder} add reference information for a given variable to 862 * Instances of the class {@code ReferenceFinder} add reference information for a given variable to
821 * the bi-directional mapping used to order the evaluation of constants. 863 * the bi-directional mapping used to order the evaluation of constants.
822 */ 864 */
823 class ReferenceFinder extends RecursiveASTVisitor<Object> { 865 class ReferenceFinder extends RecursiveASTVisitor<Object> {
866
824 /** 867 /**
825 * The element representing the variable whose initializer will be visited. 868 * The element representing the variable whose initializer will be visited.
826 */ 869 */
827 VariableElement _source; 870 VariableElement _source;
871
828 /** 872 /**
829 * A graph in which the nodes are the constant variables and the edges are fro m each variable to 873 * A graph in which the nodes are the constant variables and the edges are fro m each variable to
830 * the other constant variables that are referenced in the head's initializer. 874 * the other constant variables that are referenced in the head's initializer.
831 */ 875 */
832 DirectedGraph<VariableElement> _referenceGraph; 876 DirectedGraph<VariableElement> _referenceGraph;
877
833 /** 878 /**
834 * Initialize a newly created reference finder to find references from the giv en variable to other 879 * Initialize a newly created reference finder to find references from the giv en variable to other
835 * variables and to add those references to the given graph. 880 * variables and to add those references to the given graph.
836 * @param source the element representing the variable whose initializer will be visited 881 * @param source the element representing the variable whose initializer will be visited
837 * @param referenceGraph a graph recording which variables (heads) reference w hich other variables 882 * @param referenceGraph a graph recording which variables (heads) reference w hich other variables
838 * (tails) in their initializers 883 * (tails) in their initializers
839 */ 884 */
840 ReferenceFinder(VariableElement source, DirectedGraph<VariableElement> referen ceGraph) { 885 ReferenceFinder(VariableElement source, DirectedGraph<VariableElement> referen ceGraph) {
841 this._source = source; 886 this._source = source;
842 this._referenceGraph = referenceGraph; 887 this._referenceGraph = referenceGraph;
843 } 888 }
844 Object visitSimpleIdentifier(SimpleIdentifier node) { 889 Object visitSimpleIdentifier(SimpleIdentifier node) {
845 Element element2 = node.element; 890 Element element2 = node.element;
846 if (element2 is PropertyAccessorElement) { 891 if (element2 is PropertyAccessorElement) {
847 element2 = ((element2 as PropertyAccessorElement)).variable; 892 element2 = ((element2 as PropertyAccessorElement)).variable;
848 } 893 }
849 if (element2 is VariableElement) { 894 if (element2 is VariableElement) {
850 VariableElement variable = element2 as VariableElement; 895 VariableElement variable = element2 as VariableElement;
851 if (variable.isConst()) { 896 if (variable.isConst()) {
852 _referenceGraph.addEdge(_source, variable); 897 _referenceGraph.addEdge(_source, variable);
853 } 898 }
854 } 899 }
855 return null; 900 return null;
856 } 901 }
857 } 902 }
903
858 /** 904 /**
859 * Instances of the class {@code ValidResult} represent the result of attempting to evaluate a valid 905 * Instances of the class {@code ValidResult} represent the result of attempting to evaluate a valid
860 * compile time constant expression. 906 * compile time constant expression.
861 */ 907 */
862 class ValidResult extends EvaluationResultImpl { 908 class ValidResult extends EvaluationResultImpl {
909
863 /** 910 /**
864 * A result object representing the value 'false'. 911 * A result object representing the value 'false'.
865 */ 912 */
866 static ValidResult RESULT_FALSE = new ValidResult(false); 913 static ValidResult RESULT_FALSE = new ValidResult(false);
914
915 /**
916 * A result object representing the an object without specific type on which n o further operations
917 * can be performed.
918 */
919 static ValidResult RESULT_DYNAMIC = new ValidResult(null);
920
921 /**
922 * A result object representing the an arbitrary integer on which no further o perations can be
923 * performed.
924 */
925 static ValidResult RESULT_INT = new ValidResult(null);
926
927 /**
928 * A result object representing the {@code null} value.
929 */
930 static ValidResult RESULT_NULL = new ValidResult(null);
931
932 /**
933 * A result object representing the an arbitrary numeric on which no further o perations can be
934 * performed.
935 */
936 static ValidResult RESULT_NUM = new ValidResult(null);
937
938 /**
939 * A result object representing the an arbitrary boolean on which no further o perations can be
940 * performed.
941 */
942 static ValidResult RESULT_BOOL = new ValidResult(null);
943
867 /** 944 /**
868 * A result object representing the an arbitrary object on which no further op erations can be 945 * A result object representing the an arbitrary object on which no further op erations can be
869 * performed. 946 * performed.
870 */ 947 */
871 static ValidResult RESULT_OBJECT = new ValidResult(new Object()); 948 static ValidResult RESULT_OBJECT = new ValidResult(new Object());
949
950 /**
951 * A result object representing the an arbitrary string on which no further op erations can be
952 * performed.
953 */
954 static ValidResult RESULT_STRING = new ValidResult("<string>");
955
872 /** 956 /**
873 * A result object representing the value 'true'. 957 * A result object representing the value 'true'.
874 */ 958 */
875 static ValidResult RESULT_TRUE = new ValidResult(true); 959 static ValidResult RESULT_TRUE = new ValidResult(true);
960
876 /** 961 /**
877 * The value of the expression. 962 * The value of the expression.
878 */ 963 */
879 Object _value; 964 Object _value;
965
880 /** 966 /**
881 * Initialize a newly created result to represent the given value. 967 * Initialize a newly created result to represent the given value.
882 * @param value the value of the expression 968 * @param value the value of the expression
883 */ 969 */
884 ValidResult(Object value) { 970 ValidResult(Object value) {
885 this._value = value; 971 this._value = value;
886 } 972 }
887 EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOper and) => rightOperand.addToValid(node, this); 973 EvaluationResultImpl add(BinaryExpression node, EvaluationResultImpl rightOper and) => rightOperand.addToValid(node, this);
888 EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.bitAndValid(node, this); 974 EvaluationResultImpl bitAnd(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.bitAndValid(node, this);
889 EvaluationResultImpl bitNot(Expression node) { 975 EvaluationResultImpl bitNot(Expression node) {
976 if (isSomeInt()) {
977 return RESULT_INT;
978 }
890 if (_value == null) { 979 if (_value == null) {
891 return error(node); 980 return error(node);
892 } else if (_value is int) { 981 } else if (_value is int) {
893 return valueOf(~((_value as int))); 982 return valueOf(~((_value as int)));
894 } 983 }
895 return error(node); 984 return error(node);
896 } 985 }
897 EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOp erand) => rightOperand.bitOrValid(node, this); 986 EvaluationResultImpl bitOr(BinaryExpression node, EvaluationResultImpl rightOp erand) => rightOperand.bitOrValid(node, this);
898 EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.bitXorValid(node, this); 987 EvaluationResultImpl bitXor(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.bitXorValid(node, this);
899 EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOp erand) => rightOperand.concatenateValid(node, this); 988 EvaluationResultImpl concatenate(Expression node, EvaluationResultImpl rightOp erand) => rightOperand.concatenateValid(node, this);
900 EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.divideValid(node, this); 989 EvaluationResultImpl divide(BinaryExpression node, EvaluationResultImpl rightO perand) => rightOperand.divideValid(node, this);
901 EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOpe rand) => rightOperand.equalEqualValid(node, this); 990 EvaluationResultImpl equalEqual(Expression node, EvaluationResultImpl rightOpe rand) => rightOperand.equalEqualValid(node, this);
902 Object get value => _value; 991 Object get value => _value;
903 EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl r ightOperand) => rightOperand.greaterThanValid(node, this); 992 EvaluationResultImpl greaterThan(BinaryExpression node, EvaluationResultImpl r ightOperand) => rightOperand.greaterThanValid(node, this);
904 EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResul tImpl rightOperand) => rightOperand.greaterThanOrEqualValid(node, this); 993 EvaluationResultImpl greaterThanOrEqual(BinaryExpression node, EvaluationResul tImpl rightOperand) => rightOperand.greaterThanOrEqualValid(node, this);
905 EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideValid(node, this); 994 EvaluationResultImpl integerDivide(BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.integerDivideValid(node, this);
906 EvaluationResultImpl lessThan(BinaryExpression node, EvaluationResultImpl righ tOperand) => rightOperand.lessThanValid(node, this); 995 EvaluationResultImpl lessThan(BinaryExpression node, EvaluationResultImpl righ tOperand) => rightOperand.lessThanValid(node, this);
907 EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultIm pl rightOperand) => rightOperand.lessThanOrEqualValid(node, this); 996 EvaluationResultImpl lessThanOrEqual(BinaryExpression node, EvaluationResultIm pl rightOperand) => rightOperand.lessThanOrEqualValid(node, this);
908 EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl ri ghtOperand) => rightOperand.logicalAndValid(node, this); 997 EvaluationResultImpl logicalAnd(BinaryExpression node, EvaluationResultImpl ri ghtOperand) => rightOperand.logicalAndValid(node, this);
909 EvaluationResultImpl logicalNot(Expression node) { 998 EvaluationResultImpl logicalNot(Expression node) {
999 if (isSomeBool()) {
1000 return RESULT_BOOL;
1001 }
910 if (_value == null) { 1002 if (_value == null) {
911 return RESULT_TRUE; 1003 return RESULT_TRUE;
912 } else if (_value is bool) { 1004 } else if (_value is bool) {
913 return ((_value as bool)) ? RESULT_FALSE : RESULT_TRUE; 1005 return ((_value as bool)) ? RESULT_FALSE : RESULT_TRUE;
914 } 1006 }
915 return error(node); 1007 return error(node);
916 } 1008 }
917 EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rig htOperand) => rightOperand.logicalOrValid(node, this); 1009 EvaluationResultImpl logicalOr(BinaryExpression node, EvaluationResultImpl rig htOperand) => rightOperand.logicalOrValid(node, this);
918 EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOp erand) => rightOperand.minusValid(node, this); 1010 EvaluationResultImpl minus(BinaryExpression node, EvaluationResultImpl rightOp erand) => rightOperand.minusValid(node, this);
919 EvaluationResultImpl negated(Expression node) { 1011 EvaluationResultImpl negated(Expression node) {
1012 if (isSomeNum()) {
1013 return RESULT_INT;
1014 }
920 if (_value == null) { 1015 if (_value == null) {
921 return error(node); 1016 return error(node);
922 } else if (_value is int) { 1017 } else if (_value is int) {
923 return valueOf(-((_value as int))); 1018 return valueOf(-((_value as int)));
924 } else if (_value is double) { 1019 } else if (_value is double) {
925 return valueOf3(-((_value as double))); 1020 return valueOf3(-((_value as double)));
926 } 1021 }
927 return error(node); 1022 return error(node);
928 } 1023 }
929 EvaluationResultImpl notEqual(BinaryExpression node, EvaluationResultImpl righ tOperand) => rightOperand.notEqualValid(node, this); 1024 EvaluationResultImpl notEqual(BinaryExpression node, EvaluationResultImpl righ tOperand) => rightOperand.notEqualValid(node, this);
(...skipping 16 matching lines...) Expand all
946 EvaluationResultImpl shiftRight(BinaryExpression node, EvaluationResultImpl ri ghtOperand) => rightOperand.shiftRightValid(node, this); 1041 EvaluationResultImpl shiftRight(BinaryExpression node, EvaluationResultImpl ri ghtOperand) => rightOperand.shiftRightValid(node, this);
947 EvaluationResultImpl times(BinaryExpression node, EvaluationResultImpl rightOp erand) => rightOperand.timesValid(node, this); 1042 EvaluationResultImpl times(BinaryExpression node, EvaluationResultImpl rightOp erand) => rightOperand.timesValid(node, this);
948 String toString() { 1043 String toString() {
949 if (_value == null) { 1044 if (_value == null) {
950 return "null"; 1045 return "null";
951 } 1046 }
952 return _value.toString(); 1047 return _value.toString();
953 } 1048 }
954 EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand ) => leftOperand; 1049 EvaluationResultImpl addToError(BinaryExpression node, ErrorResult leftOperand ) => leftOperand;
955 EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand 2) { 1050 EvaluationResultImpl addToValid(BinaryExpression node, ValidResult leftOperand 2) {
1051 if (isSomeNum() || leftOperand2.isSomeNum()) {
1052 if (isAnyNum() && leftOperand2.isAnyNum()) {
1053 return RESULT_NUM;
1054 }
1055 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
1056 }
956 Object leftValue = leftOperand2.value; 1057 Object leftValue = leftOperand2.value;
957 if (leftValue == null) { 1058 if (leftValue == null) {
958 return error(node.leftOperand); 1059 return error(node.leftOperand);
959 } else if (_value == null) { 1060 } else if (_value == null) {
960 return error(node.rightOperand); 1061 return error(node.rightOperand);
961 } else if (leftValue is int) { 1062 } else if (leftValue is int) {
962 if (_value is int) { 1063 if (_value is int) {
963 return valueOf(((leftValue as int)) + (_value as int)); 1064 return valueOf(((leftValue as int)) + (_value as int));
964 } else if (_value is double) { 1065 } else if (_value is double) {
965 return valueOf3(((leftValue as int)).toDouble() + ((_value as double))); 1066 return valueOf3(((leftValue as int)).toDouble() + ((_value as double)));
966 } 1067 }
967 } else if (leftValue is double) { 1068 } else if (leftValue is double) {
968 if (_value is int) { 1069 if (_value is int) {
969 return valueOf3(((leftValue as double)) + ((_value as int)).toDouble()); 1070 return valueOf3(((leftValue as double)) + ((_value as int)).toDouble());
970 } else if (_value is double) { 1071 } else if (_value is double) {
971 return valueOf3(((leftValue as double)) + ((_value as double))); 1072 return valueOf3(((leftValue as double)) + ((_value as double)));
972 } 1073 }
973 } else if (leftValue is String) { 1074 } else if (leftValue is String) {
974 if (_value is String) { 1075 if (_value is String) {
975 return valueOf4("${((leftValue as String))}${((_value as String))}"); 1076 return valueOf4("${((leftValue as String))}${((_value as String))}");
976 } 1077 }
977 } 1078 }
978 return error(node); 1079 return error(node);
979 } 1080 }
980 EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperan d) => leftOperand; 1081 EvaluationResultImpl bitAndError(BinaryExpression node, ErrorResult leftOperan d) => leftOperand;
981 EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperan d2) { 1082 EvaluationResultImpl bitAndValid(BinaryExpression node, ValidResult leftOperan d2) {
1083 if (isSomeInt() || leftOperand2.isSomeInt()) {
1084 if (isAnyInt() && leftOperand2.isAnyInt()) {
1085 return RESULT_INT;
1086 }
1087 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
1088 }
982 Object leftValue = leftOperand2.value; 1089 Object leftValue = leftOperand2.value;
983 if (leftValue == null) { 1090 if (leftValue == null) {
984 return error(node.leftOperand); 1091 return error(node.leftOperand);
985 } else if (_value == null) { 1092 } else if (_value == null) {
986 return error(node.rightOperand); 1093 return error(node.rightOperand);
987 } else if (leftValue is int) { 1094 } else if (leftValue is int) {
988 if (_value is int) { 1095 if (_value is int) {
989 return valueOf(((leftValue as int)) & (_value as int)); 1096 return valueOf(((leftValue as int)) & (_value as int));
990 } 1097 }
991 return error(node.leftOperand); 1098 return error(node.leftOperand);
992 } 1099 }
993 if (_value is int) { 1100 if (_value is int) {
994 return error(node.rightOperand); 1101 return error(node.rightOperand);
995 } 1102 }
996 return union(error(node.leftOperand), error(node.rightOperand)); 1103 return union(error(node.leftOperand), error(node.rightOperand));
997 } 1104 }
998 EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand ) => leftOperand; 1105 EvaluationResultImpl bitOrError(BinaryExpression node, ErrorResult leftOperand ) => leftOperand;
999 EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand 2) { 1106 EvaluationResultImpl bitOrValid(BinaryExpression node, ValidResult leftOperand 2) {
1107 if (isSomeInt() || leftOperand2.isSomeInt()) {
1108 if (isAnyInt() && leftOperand2.isAnyInt()) {
1109 return RESULT_INT;
1110 }
1111 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
1112 }
1000 Object leftValue = leftOperand2.value; 1113 Object leftValue = leftOperand2.value;
1001 if (leftValue == null) { 1114 if (leftValue == null) {
1002 return error(node.leftOperand); 1115 return error(node.leftOperand);
1003 } else if (_value == null) { 1116 } else if (_value == null) {
1004 return error(node.rightOperand); 1117 return error(node.rightOperand);
1005 } else if (leftValue is int) { 1118 } else if (leftValue is int) {
1006 if (_value is int) { 1119 if (_value is int) {
1007 return valueOf(((leftValue as int)) | (_value as int)); 1120 return valueOf(((leftValue as int)) | (_value as int));
1008 } 1121 }
1009 return error(node.leftOperand); 1122 return error(node.leftOperand);
1010 } 1123 }
1011 if (_value is int) { 1124 if (_value is int) {
1012 return error(node.rightOperand); 1125 return error(node.rightOperand);
1013 } 1126 }
1014 return union(error(node.leftOperand), error(node.rightOperand)); 1127 return union(error(node.leftOperand), error(node.rightOperand));
1015 } 1128 }
1016 EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperan d) => leftOperand; 1129 EvaluationResultImpl bitXorError(BinaryExpression node, ErrorResult leftOperan d) => leftOperand;
1017 EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperan d2) { 1130 EvaluationResultImpl bitXorValid(BinaryExpression node, ValidResult leftOperan d2) {
1131 if (isSomeInt() || leftOperand2.isSomeInt()) {
1132 if (isAnyInt() && leftOperand2.isAnyInt()) {
1133 return RESULT_INT;
1134 }
1135 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
1136 }
1018 Object leftValue = leftOperand2.value; 1137 Object leftValue = leftOperand2.value;
1019 if (leftValue == null) { 1138 if (leftValue == null) {
1020 return error(node.leftOperand); 1139 return error(node.leftOperand);
1021 } else if (_value == null) { 1140 } else if (_value == null) {
1022 return error(node.rightOperand); 1141 return error(node.rightOperand);
1023 } else if (leftValue is int) { 1142 } else if (leftValue is int) {
1024 if (_value is int) { 1143 if (_value is int) {
1025 return valueOf(((leftValue as int)) ^ (_value as int)); 1144 return valueOf(((leftValue as int)) ^ (_value as int));
1026 } 1145 }
1027 return error(node.leftOperand); 1146 return error(node.leftOperand);
1028 } 1147 }
1029 if (_value is int) { 1148 if (_value is int) {
1030 return error(node.rightOperand); 1149 return error(node.rightOperand);
1031 } 1150 }
1032 return union(error(node.leftOperand), error(node.rightOperand)); 1151 return union(error(node.leftOperand), error(node.rightOperand));
1033 } 1152 }
1034 EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand ) => leftOperand; 1153 EvaluationResultImpl concatenateError(Expression node, ErrorResult leftOperand ) => leftOperand;
1035 EvaluationResultImpl concatenateValid(Expression node, ValidResult leftOperand ) { 1154 EvaluationResultImpl concatenateValid(Expression node, ValidResult leftOperand ) {
1036 Object leftValue = leftOperand.value; 1155 Object leftValue = leftOperand.value;
1037 if (leftValue is String && _value is String) { 1156 if (leftValue is String && _value is String) {
1038 return valueOf4("${((leftValue as String))}${((_value as String))}"); 1157 return valueOf4("${((leftValue as String))}${((_value as String))}");
1039 } 1158 }
1040 return error(node); 1159 return error(node);
1041 } 1160 }
1042 EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperan d) => leftOperand; 1161 EvaluationResultImpl divideError(BinaryExpression node, ErrorResult leftOperan d) => leftOperand;
1043 EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperan d2) { 1162 EvaluationResultImpl divideValid(BinaryExpression node, ValidResult leftOperan d2) {
1163 if (isSomeNum() || leftOperand2.isSomeNum()) {
1164 if (isAnyNum() && leftOperand2.isAnyNum()) {
1165 return RESULT_NUM;
1166 }
1167 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
1168 }
1044 Object leftValue = leftOperand2.value; 1169 Object leftValue = leftOperand2.value;
1045 if (leftValue == null) { 1170 if (leftValue == null) {
1046 return error(node.leftOperand); 1171 return error(node.leftOperand);
1047 } else if (_value == null) { 1172 } else if (_value == null) {
1048 return error(node.rightOperand); 1173 return error(node.rightOperand);
1049 } else if (leftValue is int) { 1174 } else if (leftValue is int) {
1050 if (_value is int) { 1175 if (_value is int) {
1051 if (((_value as int)) == 0) { 1176 if (((_value as int)) == 0) {
1052 return valueOf3(((leftValue as int)).toDouble() / ((_value as int)).to Double()); 1177 return valueOf3(((leftValue as int)).toDouble() / ((_value as int)).to Double());
1053 } 1178 }
1054 return valueOf(((leftValue as int)) ~/ (_value as int)); 1179 return valueOf(((leftValue as int)) ~/ (_value as int));
1055 } else if (_value is double) { 1180 } else if (_value is double) {
1056 return valueOf3(((leftValue as int)).toDouble() / ((_value as double))); 1181 return valueOf3(((leftValue as int)).toDouble() / ((_value as double)));
1057 } 1182 }
1058 } else if (leftValue is double) { 1183 } else if (leftValue is double) {
1059 if (_value is int) { 1184 if (_value is int) {
1060 return valueOf3(((leftValue as double)) / ((_value as int)).toDouble()); 1185 return valueOf3(((leftValue as double)) / ((_value as int)).toDouble());
1061 } else if (_value is double) { 1186 } else if (_value is double) {
1062 return valueOf3(((leftValue as double)) / ((_value as double))); 1187 return valueOf3(((leftValue as double)) / ((_value as double)));
1063 } 1188 }
1064 } 1189 }
1065 return error(node); 1190 return error(node);
1066 } 1191 }
1067 EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => leftOperand; 1192 EvaluationResultImpl equalEqualError(Expression node, ErrorResult leftOperand) => leftOperand;
1068 EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand) { 1193 EvaluationResultImpl equalEqualValid(Expression node, ValidResult leftOperand) {
1194 if (node is BinaryExpression) {
1195 if (!isAnyNullBoolNumString() || !leftOperand.isAnyNullBoolNumString()) {
1196 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING );
1197 }
1198 }
1069 Object leftValue = leftOperand.value; 1199 Object leftValue = leftOperand.value;
1070 if (leftValue == null) { 1200 if (leftValue == null) {
1071 return valueOf2(_value == null); 1201 return valueOf2(_value == null);
1072 } else if (leftValue is bool) { 1202 } else if (leftValue is bool) {
1073 if (_value is bool) { 1203 if (_value is bool) {
1074 return valueOf2(identical(((leftValue as bool)), ((_value as bool)))); 1204 return valueOf2(identical(((leftValue as bool)), ((_value as bool))));
1075 } 1205 }
1076 return RESULT_FALSE; 1206 return RESULT_FALSE;
1077 } else if (leftValue is int) { 1207 } else if (leftValue is int) {
1078 if (_value is int) { 1208 if (_value is int) {
(...skipping 13 matching lines...) Expand all
1092 if (_value is String) { 1222 if (_value is String) {
1093 return valueOf2(((leftValue as String)) == _value); 1223 return valueOf2(((leftValue as String)) == _value);
1094 } 1224 }
1095 return RESULT_FALSE; 1225 return RESULT_FALSE;
1096 } 1226 }
1097 return RESULT_FALSE; 1227 return RESULT_FALSE;
1098 } 1228 }
1099 EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftO perand) => leftOperand; 1229 EvaluationResultImpl greaterThanError(BinaryExpression node, ErrorResult leftO perand) => leftOperand;
1100 EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResul t leftOperand) => leftOperand; 1230 EvaluationResultImpl greaterThanOrEqualError(BinaryExpression node, ErrorResul t leftOperand) => leftOperand;
1101 EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResul t leftOperand2) { 1231 EvaluationResultImpl greaterThanOrEqualValid(BinaryExpression node, ValidResul t leftOperand2) {
1232 if (isSomeNum() || leftOperand2.isSomeNum()) {
1233 if (isAnyNum() && leftOperand2.isAnyNum()) {
1234 return RESULT_BOOL;
1235 }
1236 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
1237 }
1102 Object leftValue = leftOperand2.value; 1238 Object leftValue = leftOperand2.value;
1103 if (leftValue == null) { 1239 if (leftValue == null) {
1104 return error(node.leftOperand); 1240 return error(node.leftOperand);
1105 } else if (_value == null) { 1241 } else if (_value == null) {
1106 return error(node.rightOperand); 1242 return error(node.rightOperand);
1107 } else if (leftValue is int) { 1243 } else if (leftValue is int) {
1108 if (_value is int) { 1244 if (_value is int) {
1109 return valueOf2(((leftValue as int)).compareTo((_value as int)) >= 0); 1245 return valueOf2(((leftValue as int)).compareTo((_value as int)) >= 0);
1110 } else if (_value is double) { 1246 } else if (_value is double) {
1111 return valueOf2(((leftValue as int)).toDouble() >= ((_value as double))) ; 1247 return valueOf2(((leftValue as int)).toDouble() >= ((_value as double))) ;
1112 } 1248 }
1113 } else if (leftValue is double) { 1249 } else if (leftValue is double) {
1114 if (_value is int) { 1250 if (_value is int) {
1115 return valueOf2(((leftValue as double)) >= ((_value as int)).toDouble()) ; 1251 return valueOf2(((leftValue as double)) >= ((_value as int)).toDouble()) ;
1116 } else if (_value is double) { 1252 } else if (_value is double) {
1117 return valueOf2(((leftValue as double)) >= ((_value as double))); 1253 return valueOf2(((leftValue as double)) >= ((_value as double)));
1118 } 1254 }
1119 } 1255 }
1120 return error(node); 1256 return error(node);
1121 } 1257 }
1122 EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftO perand2) { 1258 EvaluationResultImpl greaterThanValid(BinaryExpression node, ValidResult leftO perand2) {
1259 if (isSomeNum() || leftOperand2.isSomeNum()) {
1260 if (isAnyNum() && leftOperand2.isAnyNum()) {
1261 return RESULT_BOOL;
1262 }
1263 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
1264 }
1123 Object leftValue = leftOperand2.value; 1265 Object leftValue = leftOperand2.value;
1124 if (leftValue == null) { 1266 if (leftValue == null) {
1125 return error(node.leftOperand); 1267 return error(node.leftOperand);
1126 } else if (_value == null) { 1268 } else if (_value == null) {
1127 return error(node.rightOperand); 1269 return error(node.rightOperand);
1128 } else if (leftValue is int) { 1270 } else if (leftValue is int) {
1129 if (_value is int) { 1271 if (_value is int) {
1130 return valueOf2(((leftValue as int)).compareTo((_value as int)) > 0); 1272 return valueOf2(((leftValue as int)).compareTo((_value as int)) > 0);
1131 } else if (_value is double) { 1273 } else if (_value is double) {
1132 return valueOf2(((leftValue as int)).toDouble() > ((_value as double))); 1274 return valueOf2(((leftValue as int)).toDouble() > ((_value as double)));
1133 } 1275 }
1134 } else if (leftValue is double) { 1276 } else if (leftValue is double) {
1135 if (_value is int) { 1277 if (_value is int) {
1136 return valueOf2(((leftValue as double)) > ((_value as int)).toDouble()); 1278 return valueOf2(((leftValue as double)) > ((_value as int)).toDouble());
1137 } else if (_value is double) { 1279 } else if (_value is double) {
1138 return valueOf2(((leftValue as double)) > ((_value as double))); 1280 return valueOf2(((leftValue as double)) > ((_value as double)));
1139 } 1281 }
1140 } 1282 }
1141 return error(node); 1283 return error(node);
1142 } 1284 }
1143 EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult lef tOperand) => leftOperand; 1285 EvaluationResultImpl integerDivideError(BinaryExpression node, ErrorResult lef tOperand) => leftOperand;
1144 EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult lef tOperand2) { 1286 EvaluationResultImpl integerDivideValid(BinaryExpression node, ValidResult lef tOperand2) {
1287 if (isSomeNum() || leftOperand2.isSomeNum()) {
1288 if (isAnyNum() && leftOperand2.isAnyNum()) {
1289 return RESULT_INT;
1290 }
1291 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
1292 }
1145 Object leftValue = leftOperand2.value; 1293 Object leftValue = leftOperand2.value;
1146 if (leftValue == null) { 1294 if (leftValue == null) {
1147 return error(node.leftOperand); 1295 return error(node.leftOperand);
1148 } else if (_value == null) { 1296 } else if (_value == null) {
1149 return error(node.rightOperand); 1297 return error(node.rightOperand);
1150 } else if (leftValue is int) { 1298 } else if (leftValue is int) {
1151 if (_value is int) { 1299 if (_value is int) {
1152 if (((_value as int)) == 0) { 1300 if (((_value as int)) == 0) {
1153 return valueOf3(((leftValue as int)).toDouble() / ((_value as int)).to Double()); 1301 return valueOf3(((leftValue as int)).toDouble() / ((_value as int)).to Double());
1154 } 1302 }
1155 return valueOf(((leftValue as int)) ~/ (_value as int)); 1303 return valueOf(((leftValue as int)) ~/ (_value as int));
1156 } else if (_value is double) { 1304 } else if (_value is double) {
1157 double result = ((leftValue as int)).toDouble() / ((_value as double)); 1305 double result = ((leftValue as int)).toDouble() / ((_value as double));
1158 return valueOf((result as int)); 1306 return valueOf((result as int));
1159 } 1307 }
1160 } else if (leftValue is double) { 1308 } else if (leftValue is double) {
1161 if (_value is int) { 1309 if (_value is int) {
1162 double result = ((leftValue as double)) / ((_value as int)).toDouble(); 1310 double result = ((leftValue as double)) / ((_value as int)).toDouble();
1163 return valueOf((result as int)); 1311 return valueOf((result as int));
1164 } else if (_value is double) { 1312 } else if (_value is double) {
1165 double result = ((leftValue as double)) / ((_value as double)); 1313 double result = ((leftValue as double)) / ((_value as double));
1166 return valueOf((result as int)); 1314 return valueOf((result as int));
1167 } 1315 }
1168 } 1316 }
1169 return error(node); 1317 return error(node);
1170 } 1318 }
1171 EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOper and) => leftOperand; 1319 EvaluationResultImpl lessThanError(BinaryExpression node, ErrorResult leftOper and) => leftOperand;
1172 EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult l eftOperand) => leftOperand; 1320 EvaluationResultImpl lessThanOrEqualError(BinaryExpression node, ErrorResult l eftOperand) => leftOperand;
1173 EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult l eftOperand2) { 1321 EvaluationResultImpl lessThanOrEqualValid(BinaryExpression node, ValidResult l eftOperand2) {
1322 if (isSomeNum() || leftOperand2.isSomeNum()) {
1323 if (isAnyNum() && leftOperand2.isAnyNum()) {
1324 return RESULT_BOOL;
1325 }
1326 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
1327 }
1174 Object leftValue = leftOperand2.value; 1328 Object leftValue = leftOperand2.value;
1175 if (leftValue == null) { 1329 if (leftValue == null) {
1176 return error(node.leftOperand); 1330 return error(node.leftOperand);
1177 } else if (_value == null) { 1331 } else if (_value == null) {
1178 return error(node.rightOperand); 1332 return error(node.rightOperand);
1179 } else if (leftValue is int) { 1333 } else if (leftValue is int) {
1180 if (_value is int) { 1334 if (_value is int) {
1181 return valueOf2(((leftValue as int)).compareTo((_value as int)) <= 0); 1335 return valueOf2(((leftValue as int)).compareTo((_value as int)) <= 0);
1182 } else if (_value is double) { 1336 } else if (_value is double) {
1183 return valueOf2(((leftValue as int)).toDouble() <= ((_value as double))) ; 1337 return valueOf2(((leftValue as int)).toDouble() <= ((_value as double))) ;
1184 } 1338 }
1185 } else if (leftValue is double) { 1339 } else if (leftValue is double) {
1186 if (_value is int) { 1340 if (_value is int) {
1187 return valueOf2(((leftValue as double)) <= ((_value as int)).toDouble()) ; 1341 return valueOf2(((leftValue as double)) <= ((_value as int)).toDouble()) ;
1188 } else if (_value is double) { 1342 } else if (_value is double) {
1189 return valueOf2(((leftValue as double)) <= ((_value as double))); 1343 return valueOf2(((leftValue as double)) <= ((_value as double)));
1190 } 1344 }
1191 } 1345 }
1192 return error(node); 1346 return error(node);
1193 } 1347 }
1194 EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOper and2) { 1348 EvaluationResultImpl lessThanValid(BinaryExpression node, ValidResult leftOper and2) {
1349 if (isSomeNum() || leftOperand2.isSomeNum()) {
1350 if (isAnyNum() && leftOperand2.isAnyNum()) {
1351 return RESULT_BOOL;
1352 }
1353 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
1354 }
1195 Object leftValue = leftOperand2.value; 1355 Object leftValue = leftOperand2.value;
1196 if (leftValue == null) { 1356 if (leftValue == null) {
1197 return error(node.leftOperand); 1357 return error(node.leftOperand);
1198 } else if (_value == null) { 1358 } else if (_value == null) {
1199 return error(node.rightOperand); 1359 return error(node.rightOperand);
1200 } else if (leftValue is int) { 1360 } else if (leftValue is int) {
1201 if (_value is int) { 1361 if (_value is int) {
1202 return valueOf2(((leftValue as int)).compareTo((_value as int)) < 0); 1362 return valueOf2(((leftValue as int)).compareTo((_value as int)) < 0);
1203 } else if (_value is double) { 1363 } else if (_value is double) {
1204 return valueOf2(((leftValue as int)).toDouble() < ((_value as double))); 1364 return valueOf2(((leftValue as int)).toDouble() < ((_value as double)));
1205 } 1365 }
1206 } else if (leftValue is double) { 1366 } else if (leftValue is double) {
1207 if (_value is int) { 1367 if (_value is int) {
1208 return valueOf2(((leftValue as double)) < ((_value as int)).toDouble()); 1368 return valueOf2(((leftValue as double)) < ((_value as int)).toDouble());
1209 } else if (_value is double) { 1369 } else if (_value is double) {
1210 return valueOf2(((leftValue as double)) < ((_value as double))); 1370 return valueOf2(((leftValue as double)) < ((_value as double)));
1211 } 1371 }
1212 } 1372 }
1213 return error(node); 1373 return error(node);
1214 } 1374 }
1215 EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOp erand) => leftOperand; 1375 EvaluationResultImpl logicalAndError(BinaryExpression node, ErrorResult leftOp erand) => leftOperand;
1216 EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOp erand) { 1376 EvaluationResultImpl logicalAndValid(BinaryExpression node, ValidResult leftOp erand) {
1377 if (isSomeBool() || leftOperand.isSomeBool()) {
1378 if (isAnyBool() && leftOperand.isAnyBool()) {
1379 return RESULT_BOOL;
1380 }
1381 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
1382 }
1217 Object leftValue = leftOperand.value; 1383 Object leftValue = leftOperand.value;
1218 if (leftValue is bool && ((leftValue as bool))) { 1384 if (leftValue is bool) {
1219 return booleanConversion(node.rightOperand, _value); 1385 if (((leftValue as bool))) {
1386 return booleanConversion(node.rightOperand, _value);
1387 }
1388 return RESULT_FALSE;
1220 } 1389 }
1221 return RESULT_FALSE; 1390 return error(node);
1222 } 1391 }
1223 EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOpe rand) => leftOperand; 1392 EvaluationResultImpl logicalOrError(BinaryExpression node, ErrorResult leftOpe rand) => leftOperand;
1224 EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOpe rand) { 1393 EvaluationResultImpl logicalOrValid(BinaryExpression node, ValidResult leftOpe rand) {
1394 if (isSomeBool() || leftOperand.isSomeBool()) {
1395 if (isAnyBool() && leftOperand.isAnyBool()) {
1396 return RESULT_BOOL;
1397 }
1398 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL);
1399 }
1225 Object leftValue = leftOperand.value; 1400 Object leftValue = leftOperand.value;
1226 if (leftValue is bool && ((leftValue as bool))) { 1401 if (leftValue is bool && ((leftValue as bool))) {
1227 return RESULT_TRUE; 1402 return RESULT_TRUE;
1228 } 1403 }
1229 return booleanConversion(node.rightOperand, _value); 1404 return booleanConversion(node.rightOperand, _value);
1230 } 1405 }
1231 EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand ) => leftOperand; 1406 EvaluationResultImpl minusError(BinaryExpression node, ErrorResult leftOperand ) => leftOperand;
1232 EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand 2) { 1407 EvaluationResultImpl minusValid(BinaryExpression node, ValidResult leftOperand 2) {
1408 if (isSomeNum() || leftOperand2.isSomeNum()) {
1409 if (isAnyNum() && leftOperand2.isAnyNum()) {
1410 return RESULT_NUM;
1411 }
1412 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
1413 }
1233 Object leftValue = leftOperand2.value; 1414 Object leftValue = leftOperand2.value;
1234 if (leftValue == null) { 1415 if (leftValue == null) {
1235 return error(node.leftOperand); 1416 return error(node.leftOperand);
1236 } else if (_value == null) { 1417 } else if (_value == null) {
1237 return error(node.rightOperand); 1418 return error(node.rightOperand);
1238 } else if (leftValue is int) { 1419 } else if (leftValue is int) {
1239 if (_value is int) { 1420 if (_value is int) {
1240 return valueOf(((leftValue as int)) - (_value as int)); 1421 return valueOf(((leftValue as int)) - (_value as int));
1241 } else if (_value is double) { 1422 } else if (_value is double) {
1242 return valueOf3(((leftValue as int)).toDouble() - ((_value as double))); 1423 return valueOf3(((leftValue as int)).toDouble() - ((_value as double)));
1243 } 1424 }
1244 } else if (leftValue is double) { 1425 } else if (leftValue is double) {
1245 if (_value is int) { 1426 if (_value is int) {
1246 return valueOf3(((leftValue as double)) - ((_value as int)).toDouble()); 1427 return valueOf3(((leftValue as double)) - ((_value as int)).toDouble());
1247 } else if (_value is double) { 1428 } else if (_value is double) {
1248 return valueOf3(((leftValue as double)) - ((_value as double))); 1429 return valueOf3(((leftValue as double)) - ((_value as double)));
1249 } 1430 }
1250 } 1431 }
1251 return error(node); 1432 return error(node);
1252 } 1433 }
1253 EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOper and) => leftOperand; 1434 EvaluationResultImpl notEqualError(BinaryExpression node, ErrorResult leftOper and) => leftOperand;
1254 EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOper and) { 1435 EvaluationResultImpl notEqualValid(BinaryExpression node, ValidResult leftOper and) {
1436 if (!isAnyNullBoolNumString() || !leftOperand.isAnyNullBoolNumString()) {
1437 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
1438 }
1255 Object leftValue = leftOperand.value; 1439 Object leftValue = leftOperand.value;
1256 if (leftValue == null) { 1440 if (leftValue == null) {
1257 return valueOf2(_value != null); 1441 return valueOf2(_value != null);
1258 } else if (leftValue is bool) { 1442 } else if (leftValue is bool) {
1259 if (_value is bool) { 1443 if (_value is bool) {
1260 return valueOf2(((leftValue as bool)) != ((_value as bool))); 1444 return valueOf2(((leftValue as bool)) != ((_value as bool)));
1261 } 1445 }
1262 return RESULT_TRUE; 1446 return RESULT_TRUE;
1263 } else if (leftValue is int) { 1447 } else if (leftValue is int) {
1264 if (_value is int) { 1448 if (_value is int) {
(...skipping 12 matching lines...) Expand all
1277 } else if (leftValue is String) { 1461 } else if (leftValue is String) {
1278 if (_value is String) { 1462 if (_value is String) {
1279 return valueOf2(((leftValue as String)) != _value); 1463 return valueOf2(((leftValue as String)) != _value);
1280 } 1464 }
1281 return RESULT_TRUE; 1465 return RESULT_TRUE;
1282 } 1466 }
1283 return RESULT_TRUE; 1467 return RESULT_TRUE;
1284 } 1468 }
1285 EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOpe rand) => leftOperand; 1469 EvaluationResultImpl remainderError(BinaryExpression node, ErrorResult leftOpe rand) => leftOperand;
1286 EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOpe rand2) { 1470 EvaluationResultImpl remainderValid(BinaryExpression node, ValidResult leftOpe rand2) {
1471 if (isSomeNum() || leftOperand2.isSomeNum()) {
1472 if (isAnyNum() && leftOperand2.isAnyNum()) {
1473 return RESULT_NUM;
1474 }
1475 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
1476 }
1287 Object leftValue = leftOperand2.value; 1477 Object leftValue = leftOperand2.value;
1288 if (leftValue == null) { 1478 if (leftValue == null) {
1289 return error(node.leftOperand); 1479 return error(node.leftOperand);
1290 } else if (_value == null) { 1480 } else if (_value == null) {
1291 return error(node.rightOperand); 1481 return error(node.rightOperand);
1292 } else if (leftValue is int) { 1482 } else if (leftValue is int) {
1293 if (_value is int) { 1483 if (_value is int) {
1294 if (((_value as int)) == 0) { 1484 if (((_value as int)) == 0) {
1295 return valueOf3(((leftValue as int)).toDouble() % ((_value as int)).to Double()); 1485 return valueOf3(((leftValue as int)).toDouble() % ((_value as int)).to Double());
1296 } 1486 }
1297 return valueOf(((leftValue as int)).remainder((_value as int))); 1487 return valueOf(((leftValue as int)).remainder((_value as int)));
1298 } else if (_value is double) { 1488 } else if (_value is double) {
1299 return valueOf3(((leftValue as int)).toDouble() % ((_value as double))); 1489 return valueOf3(((leftValue as int)).toDouble() % ((_value as double)));
1300 } 1490 }
1301 } else if (leftValue is double) { 1491 } else if (leftValue is double) {
1302 if (_value is int) { 1492 if (_value is int) {
1303 return valueOf3(((leftValue as double)) % ((_value as int)).toDouble()); 1493 return valueOf3(((leftValue as double)) % ((_value as int)).toDouble());
1304 } else if (_value is double) { 1494 } else if (_value is double) {
1305 return valueOf3(((leftValue as double)) % ((_value as double))); 1495 return valueOf3(((leftValue as double)) % ((_value as double)));
1306 } 1496 }
1307 } 1497 }
1308 return error(node); 1498 return error(node);
1309 } 1499 }
1310 EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOpe rand) => leftOperand; 1500 EvaluationResultImpl shiftLeftError(BinaryExpression node, ErrorResult leftOpe rand) => leftOperand;
1311 EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOpe rand2) { 1501 EvaluationResultImpl shiftLeftValid(BinaryExpression node, ValidResult leftOpe rand2) {
1502 if (isSomeInt() || leftOperand2.isSomeInt()) {
1503 if (isAnyInt() && leftOperand2.isAnyInt()) {
1504 return RESULT_INT;
1505 }
1506 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
1507 }
1312 Object leftValue = leftOperand2.value; 1508 Object leftValue = leftOperand2.value;
1313 if (leftValue == null) { 1509 if (leftValue == null) {
1314 return error(node.leftOperand); 1510 return error(node.leftOperand);
1315 } else if (_value == null) { 1511 } else if (_value == null) {
1316 return error(node.rightOperand); 1512 return error(node.rightOperand);
1317 } else if (leftValue is int) { 1513 } else if (leftValue is int) {
1318 if (_value is int) { 1514 if (_value is int) {
1319 return valueOf(((leftValue as int)) << ((_value as int))); 1515 return valueOf(((leftValue as int)) << ((_value as int)));
1320 } 1516 }
1321 return error(node.rightOperand); 1517 return error(node.rightOperand);
1322 } 1518 }
1323 if (_value is int) { 1519 if (_value is int) {
1324 return error(node.leftOperand); 1520 return error(node.leftOperand);
1325 } 1521 }
1326 return union(error(node.leftOperand), error(node.rightOperand)); 1522 return union(error(node.leftOperand), error(node.rightOperand));
1327 } 1523 }
1328 EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOp erand) => leftOperand; 1524 EvaluationResultImpl shiftRightError(BinaryExpression node, ErrorResult leftOp erand) => leftOperand;
1329 EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOp erand2) { 1525 EvaluationResultImpl shiftRightValid(BinaryExpression node, ValidResult leftOp erand2) {
1526 if (isSomeInt() || leftOperand2.isSomeInt()) {
1527 if (isAnyInt() && leftOperand2.isAnyInt()) {
1528 return RESULT_INT;
1529 }
1530 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_INT);
1531 }
1330 Object leftValue = leftOperand2.value; 1532 Object leftValue = leftOperand2.value;
1331 if (leftValue == null) { 1533 if (leftValue == null) {
1332 return error(node.leftOperand); 1534 return error(node.leftOperand);
1333 } else if (_value == null) { 1535 } else if (_value == null) {
1334 return error(node.rightOperand); 1536 return error(node.rightOperand);
1335 } else if (leftValue is int) { 1537 } else if (leftValue is int) {
1336 if (_value is int) { 1538 if (_value is int) {
1337 return valueOf(((leftValue as int)) >> ((_value as int))); 1539 return valueOf(((leftValue as int)) >> ((_value as int)));
1338 } 1540 }
1339 return error(node.rightOperand); 1541 return error(node.rightOperand);
1340 } 1542 }
1341 if (_value is int) { 1543 if (_value is int) {
1342 return error(node.leftOperand); 1544 return error(node.leftOperand);
1343 } 1545 }
1344 return union(error(node.leftOperand), error(node.rightOperand)); 1546 return union(error(node.leftOperand), error(node.rightOperand));
1345 } 1547 }
1346 EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand ) => leftOperand; 1548 EvaluationResultImpl timesError(BinaryExpression node, ErrorResult leftOperand ) => leftOperand;
1347 EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand 2) { 1549 EvaluationResultImpl timesValid(BinaryExpression node, ValidResult leftOperand 2) {
1550 if (isSomeNum() || leftOperand2.isSomeNum()) {
1551 if (isAnyNum() && leftOperand2.isAnyNum()) {
1552 return RESULT_NUM;
1553 }
1554 return error2(node, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM);
1555 }
1348 Object leftValue = leftOperand2.value; 1556 Object leftValue = leftOperand2.value;
1349 if (leftValue == null) { 1557 if (leftValue == null) {
1350 return error(node.leftOperand); 1558 return error(node.leftOperand);
1351 } else if (_value == null) { 1559 } else if (_value == null) {
1352 return error(node.rightOperand); 1560 return error(node.rightOperand);
1353 } else if (leftValue is int) { 1561 } else if (leftValue is int) {
1354 if (_value is int) { 1562 if (_value is int) {
1355 return valueOf(((leftValue as int)) * (_value as int)); 1563 return valueOf(((leftValue as int)) * (_value as int));
1356 } else if (_value is double) { 1564 } else if (_value is double) {
1357 return valueOf3(((leftValue as int)).toDouble() * ((_value as double))); 1565 return valueOf3(((leftValue as int)).toDouble() * ((_value as double)));
1358 } 1566 }
1359 } else if (leftValue is double) { 1567 } else if (leftValue is double) {
1360 if (_value is int) { 1568 if (_value is int) {
1361 return valueOf3(((leftValue as double)) * ((_value as int)).toDouble()); 1569 return valueOf3(((leftValue as double)) * ((_value as int)).toDouble());
1362 } else if (_value is double) { 1570 } else if (_value is double) {
1363 return valueOf3(((leftValue as double)) * ((_value as double))); 1571 return valueOf3(((leftValue as double)) * ((_value as double)));
1364 } 1572 }
1365 } 1573 }
1366 return error(node); 1574 return error(node);
1367 } 1575 }
1576 bool isNull() => identical(this, RESULT_NULL);
1577
1368 /** 1578 /**
1369 * Return the result of applying boolean conversion to the given value. 1579 * Return the result of applying boolean conversion to the given value.
1370 * @param node the node against which errors should be reported 1580 * @param node the node against which errors should be reported
1371 * @param value the value to be converted to a boolean 1581 * @param value the value to be converted to a boolean
1372 * @return the result of applying boolean conversion to the given value 1582 * @return the result of applying boolean conversion to the given value
1373 */ 1583 */
1374 EvaluationResultImpl booleanConversion(ASTNode node, Object value) { 1584 EvaluationResultImpl booleanConversion(ASTNode node, Object value) {
1375 if (value == null) { 1585 if (value is bool) {
1376 return error(node); 1586 if (((value as bool))) {
1377 } else if (value is bool && ((value as bool))) { 1587 return RESULT_TRUE;
1378 return RESULT_TRUE; 1588 } else {
1589 return RESULT_FALSE;
1590 }
1379 } 1591 }
1380 return RESULT_FALSE; 1592 return error(node);
1381 } 1593 }
1382 ErrorResult error(ASTNode node) => error2(node, CompileTimeErrorCode.INVALID_C ONSTANT); 1594 ErrorResult error(ASTNode node) => error2(node, CompileTimeErrorCode.INVALID_C ONSTANT);
1595
1383 /** 1596 /**
1384 * Return a result object representing an error associated with the given node . 1597 * Return a result object representing an error associated with the given node .
1385 * @param node the AST node associated with the error 1598 * @param node the AST node associated with the error
1386 * @param code the error code indicating the nature of the error 1599 * @param code the error code indicating the nature of the error
1387 * @return a result object representing an error associated with the given nod e 1600 * @return a result object representing an error associated with the given nod e
1388 */ 1601 */
1389 ErrorResult error2(ASTNode node, ErrorCode code) => new ErrorResult.con1(node, code); 1602 ErrorResult error2(ASTNode node, ErrorCode code) => new ErrorResult.con1(node, code);
1603
1604 /**
1605 * Checks if this result has type "bool", with known or unknown value.
1606 */
1607 bool isAnyBool() => isSomeBool() || identical(this, RESULT_TRUE) || identical( this, RESULT_FALSE);
1608
1609 /**
1610 * Checks if this result has type "int", with known or unknown value.
1611 */
1612 bool isAnyInt() => identical(this, RESULT_INT) || _value is int;
1613
1614 /**
1615 * Checks if this result has one of the types - "bool", "num" or "string"; or may be {@code null}.
1616 */
1617 bool isAnyNullBoolNumString() => isNull() || isAnyBool() || isAnyNum() || _val ue is String;
1618
1619 /**
1620 * Checks if this result has type "num", with known or unknown value.
1621 */
1622 bool isAnyNum() => isSomeNum() || _value is num;
1623
1624 /**
1625 * Checks if this result has type "bool", exact value of which we don't know.
1626 */
1627 bool isSomeBool() => identical(this, RESULT_BOOL);
1628
1629 /**
1630 * Checks if this result has type "int", exact value of which we don't know.
1631 */
1632 bool isSomeInt() => identical(this, RESULT_INT);
1633
1634 /**
1635 * Checks if this result has type "num" (or "int"), exact value of which we do n't know.
1636 */
1637 bool isSomeNum() => identical(this, RESULT_DYNAMIC) || identical(this, RESULT_ INT) || identical(this, RESULT_NUM);
1390 double toDouble(int value) => value.toDouble(); 1638 double toDouble(int value) => value.toDouble();
1639
1391 /** 1640 /**
1392 * Return an error result that is the union of the two given error results. 1641 * Return an error result that is the union of the two given error results.
1393 * @param firstError the first error to be combined 1642 * @param firstError the first error to be combined
1394 * @param secondError the second error to be combined 1643 * @param secondError the second error to be combined
1395 * @return an error result that is the union of the two given error results 1644 * @return an error result that is the union of the two given error results
1396 */ 1645 */
1397 ErrorResult union(ErrorResult firstError, ErrorResult secondError) => new Erro rResult.con2(firstError, secondError); 1646 ErrorResult union(ErrorResult firstError, ErrorResult secondError) => new Erro rResult.con2(firstError, secondError);
1647
1398 /** 1648 /**
1399 * Return a result object representing the given value. 1649 * Return a result object representing the given value.
1400 * @param value the value to be represented as a result object 1650 * @param value the value to be represented as a result object
1401 * @return a result object representing the given value 1651 * @return a result object representing the given value
1402 */ 1652 */
1403 ValidResult valueOf(int value) => new ValidResult(value); 1653 ValidResult valueOf(int value) => new ValidResult(value);
1654
1404 /** 1655 /**
1405 * Return a result object representing the given value. 1656 * Return a result object representing the given value.
1406 * @param value the value to be represented as a result object 1657 * @param value the value to be represented as a result object
1407 * @return a result object representing the given value 1658 * @return a result object representing the given value
1408 */ 1659 */
1409 ValidResult valueOf2(bool value) => value ? RESULT_TRUE : RESULT_FALSE; 1660 ValidResult valueOf2(bool value) => value ? RESULT_TRUE : RESULT_FALSE;
1661
1410 /** 1662 /**
1411 * Return a result object representing the given value. 1663 * Return a result object representing the given value.
1412 * @param value the value to be represented as a result object 1664 * @param value the value to be represented as a result object
1413 * @return a result object representing the given value 1665 * @return a result object representing the given value
1414 */ 1666 */
1415 ValidResult valueOf3(double value) => new ValidResult(value); 1667 ValidResult valueOf3(double value) => new ValidResult(value);
1668
1416 /** 1669 /**
1417 * Return a result object representing the given value. 1670 * Return a result object representing the given value.
1418 * @param value the value to be represented as a result object 1671 * @param value the value to be represented as a result object
1419 * @return a result object representing the given value 1672 * @return a result object representing the given value
1420 */ 1673 */
1421 ValidResult valueOf4(String value) => new ValidResult(value); 1674 ValidResult valueOf4(String value) => new ValidResult(value);
1422 } 1675 }
OLDNEW
« no previous file with comments | « pkg/analyzer_experimental/lib/src/generated/ast.dart ('k') | pkg/analyzer_experimental/lib/src/generated/element.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698