Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library dart2js.constants.expressions; | 5 library dart2js.constants.expressions; |
| 6 | 6 |
| 7 import '../dart2jslib.dart' show assertDebugMode; | 7 import '../dart2jslib.dart' show assertDebugMode; |
| 8 import '../dart_types.dart'; | 8 import '../dart_types.dart'; |
| 9 import '../elements/elements.dart' show | 9 import '../elements/elements.dart' show |
| 10 ConstructorElement, | 10 ConstructorElement, |
| 11 Element, | 11 Element, |
| 12 FieldElement, | |
| 12 FunctionElement, | 13 FunctionElement, |
| 13 VariableElement; | 14 VariableElement; |
| 14 import '../resolution/operators.dart'; | 15 import '../resolution/operators.dart'; |
| 15 import '../universe/universe.dart' show CallStructure; | 16 import '../universe/universe.dart' show CallStructure; |
| 16 import 'values.dart'; | 17 import 'values.dart'; |
| 17 | 18 |
| 18 enum ConstantExpressionKind { | 19 enum ConstantExpressionKind { |
| 19 BINARY, | 20 BINARY, |
| 20 BOOL, | 21 BOOL, |
| 22 BOOL_FROM_ENVIRONMENT, | |
| 21 CONCATENATE, | 23 CONCATENATE, |
| 22 CONDITIONAL, | 24 CONDITIONAL, |
| 23 CONSTRUCTED, | 25 CONSTRUCTED, |
| 24 DOUBLE, | 26 DOUBLE, |
| 25 ERRONEOUS, | 27 ERRONEOUS, |
| 26 FUNCTION, | 28 FUNCTION, |
| 27 IDENTICAL, | 29 IDENTICAL, |
| 28 INT, | 30 INT, |
| 31 INT_FROM_ENVIRONMENT, | |
| 29 LIST, | 32 LIST, |
| 30 MAP, | 33 MAP, |
| 31 NULL, | 34 NULL, |
| 32 STRING, | 35 STRING, |
| 36 STRING_FROM_ENVIRONMENT, | |
| 33 SYMBOL, | 37 SYMBOL, |
| 34 TYPE, | 38 TYPE, |
| 35 UNARY, | 39 UNARY, |
| 36 VARIABLE, | 40 VARIABLE, |
| 41 | |
| 42 POSITIONAL_REFERENCE, | |
| 43 NAMED_REFERENCE, | |
| 44 } | |
| 45 | |
| 46 /// The normalized arguments passed to a const constructor computed from the | |
| 47 /// actual [arguments] and the [defaultValues] of the called construrctor. | |
| 48 class Arguments { | |
|
karlklose
2015/05/11 10:23:18
This class should have a more specific name like,
Johnni Winther
2015/05/11 12:24:57
NormalizedArguments it is.
| |
| 49 final Map<dynamic/*int|String*/, ConstantExpression> defaultValues; | |
|
karlklose
2015/05/11 10:23:18
In the emitter code modell we used 'var /*Map|List
Johnni Winther
2015/05/11 12:24:57
A list is annoying is the indices are absolute and
| |
| 50 final CallStructure callStructure; | |
| 51 final List<ConstantExpression> arguments; | |
| 52 | |
| 53 Arguments(this.defaultValues, this.callStructure, this.arguments); | |
| 54 | |
| 55 /// Returns the normalized named argument [name]. | |
| 56 ConstantExpression getNamedArgument(String name) { | |
| 57 int index = callStructure.namedArguments.indexOf(name); | |
| 58 if (index == -1) { | |
| 59 // The named argument is not provided. | |
| 60 return defaultValues[name]; | |
| 61 } | |
| 62 return arguments[index + callStructure.positionalArgumentCount]; | |
| 63 } | |
| 64 | |
| 65 /// Returns the normalized [index]th positional argument. | |
| 66 ConstantExpression getPositionalArgument(int index) { | |
| 67 if (index >= callStructure.positionalArgumentCount) { | |
| 68 // The positional argument is not provided. | |
| 69 return defaultValues[index]; | |
| 70 } | |
| 71 return arguments[index]; | |
| 72 } | |
| 73 } | |
| 74 | |
| 75 enum ConstantConstructorKind { | |
| 76 GENERATIVE, | |
| 77 REDIRECTING_GENERATIVE, | |
| 78 REDIRECTING_FACTORY, | |
| 79 } | |
| 80 | |
| 81 /// Definition of a constant constructor. | |
| 82 abstract class ConstantConstructor { | |
| 83 ConstantConstructorKind get kind; | |
| 84 | |
| 85 /// Computes the type of the instance created in a const constructor | |
| 86 /// invocation with type [newType]. | |
| 87 InterfaceType computeInstanceType(InterfaceType newType); | |
| 88 | |
| 89 /// Computes the constant expressions of the fields of the created instance | |
| 90 /// in a const constructor invocation with [arguments]. | |
| 91 Map<FieldElement, ConstantExpression> computeInstanceFields( | |
| 92 List<ConstantExpression> arguments, | |
| 93 CallStructure callStructure); | |
| 94 } | |
| 95 | |
| 96 /// A generative constant constructor. | |
| 97 class GenerativeConstantConstructor implements ConstantConstructor{ | |
| 98 final InterfaceType type; | |
| 99 final Map<dynamic/*int|String*/, ConstantExpression> defaultValues; | |
| 100 final Map<FieldElement, ConstantExpression> fieldMap; | |
| 101 final ConstructedConstantExpression constructorInvocation; | |
|
karlklose
2015/05/11 10:23:19
'constructorInvocation' -> 'superConstructor[Invoc
Johnni Winther
2015/05/11 12:24:57
Done.
| |
| 102 | |
| 103 GenerativeConstantConstructor( | |
| 104 this.type, | |
| 105 this.defaultValues, | |
| 106 this.fieldMap, | |
| 107 this.constructorInvocation); | |
| 108 | |
| 109 ConstantConstructorKind get kind => ConstantConstructorKind.GENERATIVE; | |
| 110 | |
| 111 InterfaceType computeInstanceType(InterfaceType newType) { | |
| 112 return type.substByContext(newType); | |
| 113 } | |
| 114 | |
| 115 Map<FieldElement, ConstantExpression> computeInstanceFields( | |
| 116 List<ConstantExpression> arguments, | |
| 117 CallStructure callStructure) { | |
| 118 Arguments args = new Arguments(defaultValues, callStructure, arguments); | |
|
karlklose
2015/05/11 10:23:19
Lines 118-127 could be shared with ll. 171-178 in
Johnni Winther
2015/05/11 12:24:57
Done.
| |
| 119 Map<FieldElement, ConstantExpression> appliedFieldMap = | |
| 120 <FieldElement, ConstantExpression>{}; | |
| 121 if (constructorInvocation != null) { | |
| 122 Map<FieldElement, ConstantExpression> superFieldMap = | |
| 123 constructorInvocation.computeInstanceFields(); | |
| 124 superFieldMap.forEach((FieldElement field, ConstantExpression constant) { | |
| 125 appliedFieldMap[field] = constant.apply(args); | |
| 126 }); | |
| 127 } | |
| 128 fieldMap.forEach((FieldElement field, ConstantExpression constant) { | |
| 129 appliedFieldMap[field] = constant.apply(args); | |
| 130 }); | |
| 131 return appliedFieldMap; | |
| 132 } | |
| 133 | |
| 134 String toString() { | |
| 135 StringBuffer sb = new StringBuffer(); | |
| 136 sb.write("{'type': $type"); | |
|
karlklose
2015/05/11 10:23:19
Do we have a JSON library that could do this conve
Johnni Winther
2015/05/11 12:24:57
JSON isn't imported, just wanted it readable.
| |
| 137 defaultValues.forEach((key, ConstantExpression expression) { | |
| 138 sb.write(",\n 'default:${key}': ${expression.getText()}"); | |
| 139 }); | |
| 140 fieldMap.forEach((FieldElement field, ConstantExpression expression) { | |
| 141 sb.write(",\n 'field:${field}': ${expression.getText()}"); | |
| 142 }); | |
| 143 if (constructorInvocation != null) { | |
| 144 sb.write(",\n 'constructor: ${constructorInvocation.getText()}"); | |
| 145 } | |
| 146 sb.write("}"); | |
| 147 return sb.toString(); | |
| 148 } | |
| 149 } | |
| 150 | |
| 151 /// A redirecting generative constant constructor. | |
| 152 class RedirectingGenerativeConstantConstructor implements ConstantConstructor { | |
| 153 final Map<dynamic/*int|String*/, ConstantExpression> defaultValues; | |
| 154 final ConstructedConstantExpression constructorInvocation; | |
| 155 | |
| 156 RedirectingGenerativeConstantConstructor( | |
| 157 this.defaultValues, | |
| 158 this.constructorInvocation); | |
| 159 | |
| 160 ConstantConstructorKind get kind { | |
| 161 return ConstantConstructorKind.REDIRECTING_GENERATIVE; | |
| 162 } | |
| 163 | |
| 164 InterfaceType computeInstanceType(InterfaceType newType) { | |
| 165 return constructorInvocation.computeInstanceType().substByContext(newType); | |
| 166 } | |
| 167 | |
| 168 Map<FieldElement, ConstantExpression> computeInstanceFields( | |
| 169 List<ConstantExpression> arguments, | |
| 170 CallStructure callStructure) { | |
| 171 Arguments args = new Arguments(defaultValues, callStructure, arguments); | |
| 172 Map<FieldElement, ConstantExpression> appliedFieldMap = | |
| 173 <FieldElement, ConstantExpression>{}; | |
| 174 Map<FieldElement, ConstantExpression> fieldMap = | |
| 175 constructorInvocation.computeInstanceFields(); | |
| 176 fieldMap.forEach((FieldElement field, ConstantExpression constant) { | |
| 177 appliedFieldMap[field] = constant.apply(args); | |
| 178 }); | |
| 179 return appliedFieldMap; | |
| 180 } | |
| 181 | |
| 182 String toString() { | |
| 183 StringBuffer sb = new StringBuffer(); | |
| 184 sb.write("{'type': ${constructorInvocation.type}"); | |
| 185 defaultValues.forEach((key, ConstantExpression expression) { | |
| 186 sb.write(",\n 'default:${key}': ${expression.getText()}"); | |
| 187 }); | |
| 188 sb.write(",\n 'constructor': ${constructorInvocation.getText()}"); | |
| 189 sb.write("}"); | |
| 190 return sb.toString(); | |
| 191 } | |
| 192 } | |
| 193 | |
| 194 /// A redirecting factory constant constructor. | |
| 195 class RedirectingFactoryConstantConstructor implements ConstantConstructor { | |
| 196 final ConstructedConstantExpression constructorInvocation; | |
|
karlklose
2015/05/11 10:23:19
'targetConstructorInvocation'?
Johnni Winther
2015/05/11 12:24:57
Done.
| |
| 197 | |
| 198 RedirectingFactoryConstantConstructor(this.constructorInvocation); | |
| 199 | |
| 200 ConstantConstructorKind get kind { | |
| 201 return ConstantConstructorKind.REDIRECTING_FACTORY; | |
| 202 } | |
| 203 | |
| 204 InterfaceType computeInstanceType(InterfaceType newType) { | |
| 205 return constructorInvocation.computeInstanceType().substByContext(newType); | |
| 206 } | |
| 207 | |
| 208 Map<FieldElement, ConstantExpression> computeInstanceFields( | |
| 209 List<ConstantExpression> arguments, | |
| 210 CallStructure callStructure) { | |
| 211 ConstantConstructor constantConstructor = | |
| 212 constructorInvocation.target.constantConstructor; | |
| 213 return constantConstructor.computeInstanceFields(arguments, callStructure); | |
| 214 } | |
| 215 | |
| 216 String toString() { | |
| 217 StringBuffer sb = new StringBuffer(); | |
| 218 sb.write("{"); | |
| 219 sb.write("'constructor': ${constructorInvocation.getText()}"); | |
| 220 sb.write("}"); | |
| 221 return sb.toString(); | |
| 222 } | |
| 37 } | 223 } |
| 38 | 224 |
| 39 /// An expression that is a compile-time constant. | 225 /// An expression that is a compile-time constant. |
| 40 /// | 226 /// |
| 41 /// Whereas [ConstantValue] represent a compile-time value, a | 227 /// Whereas [ConstantValue] represent a compile-time value, a |
| 42 /// [ConstantExpression] represents an expression for creating a constant. | 228 /// [ConstantExpression] represents an expression for creating a constant. |
| 43 /// | 229 /// |
| 44 /// There is no one-to-one mapping between [ConstantExpression] and | 230 /// There is no one-to-one mapping between [ConstantExpression] and |
| 45 /// [ConstantValue], because different expressions can denote the same constant. | 231 /// [ConstantValue], because different expressions can denote the same constant. |
| 46 /// For instance, multiple `const` constructors may be used to create the same | 232 /// For instance, multiple `const` constructors may be used to create the same |
| 47 /// object, and different `const` variables may hold the same value. | 233 /// object, and different `const` variables may hold the same value. |
| 48 abstract class ConstantExpression { | 234 abstract class ConstantExpression { |
| 49 int _hashCode; | 235 int _hashCode; |
| 50 | 236 |
| 51 ConstantExpressionKind get kind; | 237 ConstantExpressionKind get kind; |
| 52 | 238 |
| 53 /// Returns the value of this constant expression. | 239 /// Returns the value of this constant expression. |
| 240 // TODO(johnniwinther): Replace this with an evaluation method that takes | |
| 241 // a constant system and an environment. | |
| 54 ConstantValue get value; | 242 ConstantValue get value; |
| 55 | 243 |
| 56 // TODO(johnniwinther): Unify precedence handled between constants, front-end | 244 // TODO(johnniwinther): Unify precedence handled between constants, front-end |
| 57 // and back-end. | 245 // and back-end. |
| 58 int get precedence => 16; | 246 int get precedence => 16; |
| 59 | 247 |
| 60 accept(ConstantExpressionVisitor visitor, [context]); | 248 accept(ConstantExpressionVisitor visitor, [context]); |
| 61 | 249 |
| 250 /// Substitute free variables using arguments. | |
| 251 ConstantExpression apply(Arguments arguments) => this; | |
| 252 | |
| 62 String getText() { | 253 String getText() { |
| 63 ConstExpPrinter printer = new ConstExpPrinter(); | 254 ConstExpPrinter printer = new ConstExpPrinter(); |
| 64 accept(printer); | 255 accept(printer); |
| 65 return printer.toString(); | 256 return printer.toString(); |
| 66 } | 257 } |
| 67 | 258 |
| 68 int _computeHashCode(); | 259 int _computeHashCode(); |
| 69 | 260 |
| 70 int get hashCode { | 261 int get hashCode { |
| 71 if (_hashCode == null) { | 262 if (_hashCode == null) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 } | 300 } |
| 110 | 301 |
| 111 /// A boolean, int, double, string, or null constant. | 302 /// A boolean, int, double, string, or null constant. |
| 112 abstract class PrimitiveConstantExpression extends ConstantExpression { | 303 abstract class PrimitiveConstantExpression extends ConstantExpression { |
| 113 final PrimitiveConstantValue value; | 304 final PrimitiveConstantValue value; |
| 114 | 305 |
| 115 PrimitiveConstantExpression(this.value); | 306 PrimitiveConstantExpression(this.value); |
| 116 | 307 |
| 117 /// The primitive value of this contant expression. | 308 /// The primitive value of this contant expression. |
| 118 get primitiveValue; | 309 get primitiveValue; |
| 119 | |
| 120 accept(ConstantExpressionVisitor visitor, [context]) { | |
| 121 return visitor.visitPrimitive(this, context); | |
| 122 } | |
| 123 } | 310 } |
| 124 | 311 |
| 125 /// Boolean literal constant. | 312 /// Boolean literal constant. |
| 126 class BoolConstantExpression extends PrimitiveConstantExpression { | 313 class BoolConstantExpression extends PrimitiveConstantExpression { |
| 127 final bool primitiveValue; | 314 final bool primitiveValue; |
| 128 | 315 |
| 129 BoolConstantExpression(this.primitiveValue, | 316 BoolConstantExpression(this.primitiveValue, |
| 130 PrimitiveConstantValue value) : super(value); | 317 PrimitiveConstantValue value) : super(value); |
| 131 | 318 |
| 132 ConstantExpressionKind get kind => ConstantExpressionKind.BOOL; | 319 ConstantExpressionKind get kind => ConstantExpressionKind.BOOL; |
| 133 | 320 |
| 321 accept(ConstantExpressionVisitor visitor, [context]) { | |
| 322 return visitor.visitBool(this, context); | |
| 323 } | |
| 324 | |
| 134 @override | 325 @override |
| 135 int _computeHashCode() => 13 * primitiveValue.hashCode; | 326 int _computeHashCode() => 13 * primitiveValue.hashCode; |
| 136 | 327 |
| 137 @override | 328 @override |
| 138 bool _equals(BoolConstantExpression other) { | 329 bool _equals(BoolConstantExpression other) { |
| 139 return primitiveValue == other.primitiveValue; | 330 return primitiveValue == other.primitiveValue; |
| 140 } | 331 } |
| 141 } | 332 } |
| 142 | 333 |
| 143 /// Integer literal constant. | 334 /// Integer literal constant. |
| 144 class IntConstantExpression extends PrimitiveConstantExpression { | 335 class IntConstantExpression extends PrimitiveConstantExpression { |
| 145 final int primitiveValue; | 336 final int primitiveValue; |
| 146 | 337 |
| 147 IntConstantExpression(this.primitiveValue, | 338 IntConstantExpression(this.primitiveValue, |
| 148 PrimitiveConstantValue value) : super(value); | 339 PrimitiveConstantValue value) : super(value); |
| 149 | 340 |
| 150 ConstantExpressionKind get kind => ConstantExpressionKind.INT; | 341 ConstantExpressionKind get kind => ConstantExpressionKind.INT; |
| 151 | 342 |
| 343 accept(ConstantExpressionVisitor visitor, [context]) { | |
| 344 return visitor.visitInt(this, context); | |
| 345 } | |
| 346 | |
| 152 @override | 347 @override |
| 153 int _computeHashCode() => 17 * primitiveValue.hashCode; | 348 int _computeHashCode() => 17 * primitiveValue.hashCode; |
| 154 | 349 |
| 155 @override | 350 @override |
| 156 bool _equals(IntConstantExpression other) { | 351 bool _equals(IntConstantExpression other) { |
| 157 return primitiveValue == other.primitiveValue; | 352 return primitiveValue == other.primitiveValue; |
| 158 } | 353 } |
| 159 } | 354 } |
| 160 | 355 |
| 161 /// Double literal constant. | 356 /// Double literal constant. |
| 162 class DoubleConstantExpression extends PrimitiveConstantExpression { | 357 class DoubleConstantExpression extends PrimitiveConstantExpression { |
| 163 final double primitiveValue; | 358 final double primitiveValue; |
| 164 | 359 |
| 165 DoubleConstantExpression(this.primitiveValue, | 360 DoubleConstantExpression(this.primitiveValue, |
| 166 PrimitiveConstantValue value) : super(value); | 361 PrimitiveConstantValue value) : super(value); |
| 167 | 362 |
| 168 ConstantExpressionKind get kind => ConstantExpressionKind.DOUBLE; | 363 ConstantExpressionKind get kind => ConstantExpressionKind.DOUBLE; |
| 169 | 364 |
| 365 accept(ConstantExpressionVisitor visitor, [context]) { | |
| 366 return visitor.visitDouble(this, context); | |
| 367 } | |
| 368 | |
| 170 @override | 369 @override |
| 171 int _computeHashCode() => 19 * primitiveValue.hashCode; | 370 int _computeHashCode() => 19 * primitiveValue.hashCode; |
| 172 | 371 |
| 173 @override | 372 @override |
| 174 bool _equals(DoubleConstantExpression other) { | 373 bool _equals(DoubleConstantExpression other) { |
| 175 return primitiveValue == other.primitiveValue; | 374 return primitiveValue == other.primitiveValue; |
| 176 } | 375 } |
| 177 } | 376 } |
| 178 | 377 |
| 179 /// String literal constant. | 378 /// String literal constant. |
| 180 class StringConstantExpression extends PrimitiveConstantExpression { | 379 class StringConstantExpression extends PrimitiveConstantExpression { |
| 181 final String primitiveValue; | 380 final String primitiveValue; |
| 182 | 381 |
| 183 StringConstantExpression(this.primitiveValue, | 382 StringConstantExpression(this.primitiveValue, |
| 184 PrimitiveConstantValue value) : super(value); | 383 PrimitiveConstantValue value) : super(value); |
| 185 | 384 |
| 186 ConstantExpressionKind get kind => ConstantExpressionKind.STRING; | 385 ConstantExpressionKind get kind => ConstantExpressionKind.STRING; |
| 187 | 386 |
| 387 accept(ConstantExpressionVisitor visitor, [context]) { | |
| 388 return visitor.visitString(this, context); | |
| 389 } | |
| 390 | |
| 188 @override | 391 @override |
| 189 int _computeHashCode() => 23 * primitiveValue.hashCode; | 392 int _computeHashCode() => 23 * primitiveValue.hashCode; |
| 190 | 393 |
| 191 @override | 394 @override |
| 192 bool _equals(StringConstantExpression other) { | 395 bool _equals(StringConstantExpression other) { |
| 193 return primitiveValue == other.primitiveValue; | 396 return primitiveValue == other.primitiveValue; |
| 194 } | 397 } |
| 195 } | 398 } |
| 196 | 399 |
| 197 /// Null literal constant. | 400 /// Null literal constant. |
| 198 class NullConstantExpression extends PrimitiveConstantExpression { | 401 class NullConstantExpression extends PrimitiveConstantExpression { |
| 199 NullConstantExpression(PrimitiveConstantValue value) : super(value); | 402 NullConstantExpression(PrimitiveConstantValue value) : super(value); |
| 200 | 403 |
| 201 ConstantExpressionKind get kind => ConstantExpressionKind.NULL; | 404 ConstantExpressionKind get kind => ConstantExpressionKind.NULL; |
| 202 | 405 |
| 406 accept(ConstantExpressionVisitor visitor, [context]) { | |
| 407 return visitor.visitNull(this, context); | |
| 408 } | |
| 409 | |
| 203 get primitiveValue => null; | 410 get primitiveValue => null; |
| 204 | 411 |
| 205 @override | 412 @override |
| 206 int _computeHashCode() => 29; | 413 int _computeHashCode() => 29; |
| 207 | 414 |
| 208 @override | 415 @override |
| 209 bool _equals(NullConstantExpression other) => true; | 416 bool _equals(NullConstantExpression other) => true; |
| 210 } | 417 } |
| 211 | 418 |
| 212 /// Literal list constant. | 419 /// Literal list constant. |
| 213 class ListConstantExpression extends ConstantExpression { | 420 class ListConstantExpression extends ConstantExpression { |
| 214 final ListConstantValue value; | 421 final ListConstantValue value; |
| 215 final InterfaceType type; | 422 final InterfaceType type; |
| 216 final List<ConstantExpression> values; | 423 final List<ConstantExpression> values; |
| 217 | 424 |
| 218 ListConstantExpression(this.value, this.type, this.values); | 425 ListConstantExpression(this.value, this.type, this.values); |
| 219 | 426 |
| 220 ConstantExpressionKind get kind => ConstantExpressionKind.LIST; | 427 ConstantExpressionKind get kind => ConstantExpressionKind.LIST; |
| 221 | 428 |
| 222 accept(ConstantExpressionVisitor visitor, [context]) { | 429 accept(ConstantExpressionVisitor visitor, [context]) { |
| 223 return visitor.visitList(this, context); | 430 return visitor.visitList(this, context); |
| 224 } | 431 } |
| 225 | 432 |
| 226 @override | 433 @override |
| 434 ConstantExpression apply(Arguments arguments) { | |
| 435 return new ListConstantExpression(null, type, | |
| 436 values.map((v) => v.apply(arguments)).toList()); | |
| 437 } | |
| 438 | |
| 227 int _computeHashCode() { | 439 int _computeHashCode() { |
| 228 int hashCode = 13 * type.hashCode + 17 * values.length; | 440 int hashCode = 13 * type.hashCode + 17 * values.length; |
| 229 for (ConstantExpression value in values) { | 441 for (ConstantExpression value in values) { |
| 230 hashCode ^= 19 * value.hashCode; | 442 hashCode ^= 19 * value.hashCode; |
| 231 } | 443 } |
| 232 return hashCode; | 444 return hashCode; |
| 233 } | 445 } |
| 234 | 446 |
| 235 @override | 447 @override |
| 236 bool _equals(ListConstantExpression other) { | 448 bool _equals(ListConstantExpression other) { |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 252 | 464 |
| 253 MapConstantExpression(this.value, this.type, this.keys, this.values); | 465 MapConstantExpression(this.value, this.type, this.keys, this.values); |
| 254 | 466 |
| 255 ConstantExpressionKind get kind => ConstantExpressionKind.MAP; | 467 ConstantExpressionKind get kind => ConstantExpressionKind.MAP; |
| 256 | 468 |
| 257 accept(ConstantExpressionVisitor visitor, [context]) { | 469 accept(ConstantExpressionVisitor visitor, [context]) { |
| 258 return visitor.visitMap(this, context); | 470 return visitor.visitMap(this, context); |
| 259 } | 471 } |
| 260 | 472 |
| 261 @override | 473 @override |
| 474 ConstantExpression apply(Arguments arguments) { | |
| 475 return new MapConstantExpression(null, type, | |
| 476 keys.map((k) => k.apply(arguments)).toList(), | |
| 477 values.map((v) => v.apply(arguments)).toList()); | |
| 478 } | |
| 479 | |
| 262 int _computeHashCode() { | 480 int _computeHashCode() { |
| 263 int hashCode = 13 * type.hashCode + 17 * values.length; | 481 int hashCode = 13 * type.hashCode + 17 * values.length; |
| 264 for (ConstantExpression value in values) { | 482 for (ConstantExpression value in values) { |
| 265 hashCode ^= 19 * value.hashCode; | 483 hashCode ^= 19 * value.hashCode; |
| 266 } | 484 } |
| 267 return hashCode; | 485 return hashCode; |
| 268 } | 486 } |
| 269 | 487 |
| 270 @override | 488 @override |
| 271 bool _equals(MapConstantExpression other) { | 489 bool _equals(MapConstantExpression other) { |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 287 final CallStructure callStructure; | 505 final CallStructure callStructure; |
| 288 final List<ConstantExpression> arguments; | 506 final List<ConstantExpression> arguments; |
| 289 | 507 |
| 290 ConstructedConstantExpression( | 508 ConstructedConstantExpression( |
| 291 this.value, | 509 this.value, |
| 292 this.type, | 510 this.type, |
| 293 this.target, | 511 this.target, |
| 294 this.callStructure, | 512 this.callStructure, |
| 295 this.arguments) { | 513 this.arguments) { |
| 296 assert(type.element == target.enclosingClass); | 514 assert(type.element == target.enclosingClass); |
| 515 assert(!arguments.contains(null)); | |
| 297 } | 516 } |
| 298 | 517 |
| 299 ConstantExpressionKind get kind => ConstantExpressionKind.CONSTRUCTED; | 518 ConstantExpressionKind get kind => ConstantExpressionKind.CONSTRUCTED; |
| 300 | 519 |
| 301 accept(ConstantExpressionVisitor visitor, [context]) { | 520 accept(ConstantExpressionVisitor visitor, [context]) { |
| 302 return visitor.visitConstructed(this, context); | 521 return visitor.visitConstructed(this, context); |
| 303 } | 522 } |
| 304 | 523 |
| 305 @override | 524 Map<FieldElement, ConstantExpression> computeInstanceFields() { |
|
karlklose
2015/05/11 10:23:19
Restore '@override'?
Johnni Winther
2015/05/11 12:24:57
Done.
| |
| 525 return target.constantConstructor.computeInstanceFields( | |
| 526 arguments, callStructure); | |
| 527 } | |
| 528 | |
| 529 InterfaceType computeInstanceType() { | |
| 530 return target.constantConstructor.computeInstanceType(type); | |
| 531 } | |
| 532 | |
| 533 ConstructedConstantExpression apply(Arguments arguments) { | |
| 534 return new ConstructedConstantExpression(null, | |
| 535 type, target, callStructure, | |
| 536 this.arguments.map((a) => a.apply(arguments)).toList()); | |
| 537 } | |
| 538 | |
| 306 int _computeHashCode() { | 539 int _computeHashCode() { |
| 307 int hashCode = | 540 int hashCode = |
| 308 13 * type.hashCode + | 541 13 * type.hashCode + |
| 309 17 * target.hashCode + | 542 17 * target.hashCode + |
| 310 19 * callStructure.hashCode; | 543 19 * callStructure.hashCode; |
| 311 for (ConstantExpression value in arguments) { | 544 for (ConstantExpression value in arguments) { |
| 312 hashCode ^= 23 * value.hashCode; | 545 hashCode ^= 23 * value.hashCode; |
| 313 } | 546 } |
| 314 return hashCode; | 547 return hashCode; |
| 315 } | 548 } |
| 316 | 549 |
| 317 @override | 550 @override |
| 318 bool _equals(ConstructedConstantExpression other) { | 551 bool _equals(ConstructedConstantExpression other) { |
| 319 if (type != other.type) return false; | 552 if (type != other.type) return false; |
| 320 if (target != other.target) return false; | 553 if (target != other.target) return false; |
| 321 if (callStructure != other.callStructure) return false; | 554 if (callStructure != other.callStructure) return false; |
| 322 for (int i = 0; i < arguments.length; i++) { | 555 for (int i = 0; i < arguments.length; i++) { |
| 323 if (arguments[i] != other.arguments[i]) return false; | 556 if (arguments[i] != other.arguments[i]) return false; |
| 324 } | 557 } |
| 325 return true; | 558 return true; |
| 326 } | 559 } |
| 327 } | 560 } |
| 328 | 561 |
| 329 /// String literal with juxtaposition and/or interpolations. | 562 /// String literal with juxtaposition and/or interpolations. |
| 330 class ConcatenateConstantExpression extends ConstantExpression { | 563 class ConcatenateConstantExpression extends ConstantExpression { |
| 331 final StringConstantValue value; | 564 final StringConstantValue value; |
| 332 final List<ConstantExpression> arguments; | 565 final List<ConstantExpression> expressions; |
| 333 | 566 |
| 334 ConcatenateConstantExpression(this.value, this.arguments); | 567 ConcatenateConstantExpression(this.value, this.expressions); |
| 335 | 568 |
| 336 ConstantExpressionKind get kind => ConstantExpressionKind.CONCATENATE; | 569 ConstantExpressionKind get kind => ConstantExpressionKind.CONCATENATE; |
| 337 | 570 |
| 338 accept(ConstantExpressionVisitor visitor, [context]) { | 571 accept(ConstantExpressionVisitor visitor, [context]) { |
| 339 return visitor.visitConcatenate(this, context); | 572 return visitor.visitConcatenate(this, context); |
| 340 } | 573 } |
| 341 | 574 |
| 575 ConstantExpression apply(Arguments arguments) { | |
| 576 return new ConcatenateConstantExpression(null, | |
| 577 expressions.map((a) => a.apply(arguments)).toList()); | |
| 578 } | |
| 579 | |
| 342 @override | 580 @override |
| 343 int _computeHashCode() { | 581 int _computeHashCode() { |
| 344 int hashCode = 17 * arguments.length; | 582 int hashCode = 17 * expressions.length; |
| 345 for (ConstantExpression value in arguments) { | 583 for (ConstantExpression value in expressions) { |
| 346 hashCode ^= 19 * value.hashCode; | 584 hashCode ^= 19 * value.hashCode; |
| 347 } | 585 } |
| 348 return hashCode; | 586 return hashCode; |
| 349 } | 587 } |
| 350 | 588 |
| 351 @override | 589 @override |
| 352 bool _equals(ConcatenateConstantExpression other) { | 590 bool _equals(ConcatenateConstantExpression other) { |
| 353 if (arguments.length != other.arguments.length) return false; | 591 if (expressions.length != other.expressions.length) return false; |
| 354 for (int i = 0; i < arguments.length; i++) { | 592 for (int i = 0; i < expressions.length; i++) { |
| 355 if (arguments[i] != other.arguments[i]) return false; | 593 if (expressions[i] != other.expressions[i]) return false; |
| 356 } | 594 } |
| 357 return true; | 595 return true; |
| 358 } | 596 } |
| 359 } | 597 } |
| 360 | 598 |
| 361 /// Symbol literal. | 599 /// Symbol literal. |
| 362 class SymbolConstantExpression extends ConstantExpression { | 600 class SymbolConstantExpression extends ConstantExpression { |
| 363 final ConstructedConstantValue value; | 601 final ConstructedConstantValue value; |
| 364 final String name; | 602 final String name; |
| 365 | 603 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 459 BinaryConstantExpression(this.value, this.left, this.operator, this.right) { | 697 BinaryConstantExpression(this.value, this.left, this.operator, this.right) { |
| 460 assert(PRECEDENCE_MAP[operator.kind] != null); | 698 assert(PRECEDENCE_MAP[operator.kind] != null); |
| 461 } | 699 } |
| 462 | 700 |
| 463 ConstantExpressionKind get kind => ConstantExpressionKind.BINARY; | 701 ConstantExpressionKind get kind => ConstantExpressionKind.BINARY; |
| 464 | 702 |
| 465 accept(ConstantExpressionVisitor visitor, [context]) { | 703 accept(ConstantExpressionVisitor visitor, [context]) { |
| 466 return visitor.visitBinary(this, context); | 704 return visitor.visitBinary(this, context); |
| 467 } | 705 } |
| 468 | 706 |
| 707 ConstantExpression apply(Arguments arguments) { | |
| 708 return new BinaryConstantExpression( | |
| 709 value, | |
| 710 left.apply(arguments), | |
| 711 operator, | |
| 712 right.apply(arguments)); | |
| 713 } | |
| 714 | |
| 469 int get precedence => PRECEDENCE_MAP[operator.kind]; | 715 int get precedence => PRECEDENCE_MAP[operator.kind]; |
| 470 | 716 |
| 471 @override | 717 @override |
| 472 int _computeHashCode() { | 718 int _computeHashCode() { |
| 473 return 13 * operator.hashCode + | 719 return 13 * operator.hashCode + |
| 474 17 * left.hashCode + | 720 17 * left.hashCode + |
| 475 19 * right.hashCode; | 721 19 * right.hashCode; |
| 476 } | 722 } |
| 477 | 723 |
| 478 @override | 724 @override |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 512 final ConstantExpression right; | 758 final ConstantExpression right; |
| 513 | 759 |
| 514 IdenticalConstantExpression(this.value, this.left, this.right); | 760 IdenticalConstantExpression(this.value, this.left, this.right); |
| 515 | 761 |
| 516 ConstantExpressionKind get kind => ConstantExpressionKind.IDENTICAL; | 762 ConstantExpressionKind get kind => ConstantExpressionKind.IDENTICAL; |
| 517 | 763 |
| 518 accept(ConstantExpressionVisitor visitor, [context]) { | 764 accept(ConstantExpressionVisitor visitor, [context]) { |
| 519 return visitor.visitIdentical(this, context); | 765 return visitor.visitIdentical(this, context); |
| 520 } | 766 } |
| 521 | 767 |
| 768 ConstantExpression apply(Arguments arguments) { | |
| 769 return new IdenticalConstantExpression( | |
| 770 value, | |
| 771 left.apply(arguments), | |
| 772 right.apply(arguments)); | |
| 773 } | |
| 774 | |
| 522 int get precedence => 15; | 775 int get precedence => 15; |
| 523 | 776 |
| 524 @override | 777 @override |
| 525 int _computeHashCode() { | 778 int _computeHashCode() { |
| 526 return 17 * left.hashCode + | 779 return 17 * left.hashCode + |
| 527 19 * right.hashCode; | 780 19 * right.hashCode; |
| 528 } | 781 } |
| 529 | 782 |
| 530 @override | 783 @override |
| 531 bool _equals(IdenticalConstantExpression other) { | 784 bool _equals(IdenticalConstantExpression other) { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 543 UnaryConstantExpression(this.value, this.operator, this.expression) { | 796 UnaryConstantExpression(this.value, this.operator, this.expression) { |
| 544 assert(PRECEDENCE_MAP[operator.kind] != null); | 797 assert(PRECEDENCE_MAP[operator.kind] != null); |
| 545 } | 798 } |
| 546 | 799 |
| 547 ConstantExpressionKind get kind => ConstantExpressionKind.UNARY; | 800 ConstantExpressionKind get kind => ConstantExpressionKind.UNARY; |
| 548 | 801 |
| 549 accept(ConstantExpressionVisitor visitor, [context]) { | 802 accept(ConstantExpressionVisitor visitor, [context]) { |
| 550 return visitor.visitUnary(this, context); | 803 return visitor.visitUnary(this, context); |
| 551 } | 804 } |
| 552 | 805 |
| 806 ConstantExpression apply(Arguments arguments) { | |
| 807 return new UnaryConstantExpression( | |
| 808 value, | |
| 809 operator, | |
| 810 expression.apply(arguments)); | |
| 811 } | |
| 812 | |
| 553 int get precedence => PRECEDENCE_MAP[operator.kind]; | 813 int get precedence => PRECEDENCE_MAP[operator.kind]; |
| 554 | 814 |
| 555 @override | 815 @override |
| 556 int _computeHashCode() { | 816 int _computeHashCode() { |
| 557 return 13 * operator.hashCode + | 817 return 13 * operator.hashCode + |
| 558 17 * expression.hashCode; | 818 17 * expression.hashCode; |
| 559 } | 819 } |
| 560 | 820 |
| 561 @override | 821 @override |
| 562 bool _equals(UnaryConstantExpression other) { | 822 bool _equals(UnaryConstantExpression other) { |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 582 this.condition, | 842 this.condition, |
| 583 this.trueExp, | 843 this.trueExp, |
| 584 this.falseExp); | 844 this.falseExp); |
| 585 | 845 |
| 586 ConstantExpressionKind get kind => ConstantExpressionKind.CONDITIONAL; | 846 ConstantExpressionKind get kind => ConstantExpressionKind.CONDITIONAL; |
| 587 | 847 |
| 588 accept(ConstantExpressionVisitor visitor, [context]) { | 848 accept(ConstantExpressionVisitor visitor, [context]) { |
| 589 return visitor.visitConditional(this, context); | 849 return visitor.visitConditional(this, context); |
| 590 } | 850 } |
| 591 | 851 |
| 852 ConstantExpression apply(Arguments arguments) { | |
| 853 return new ConditionalConstantExpression( | |
| 854 value, | |
| 855 condition.apply(arguments), | |
| 856 trueExp.apply(arguments), | |
| 857 falseExp.apply(arguments)); | |
| 858 } | |
| 859 | |
| 592 int get precedence => 3; | 860 int get precedence => 3; |
| 593 | 861 |
| 594 @override | 862 @override |
| 595 int _computeHashCode() { | 863 int _computeHashCode() { |
| 596 return 13 * condition.hashCode + | 864 return 13 * condition.hashCode + |
| 597 17 * trueExp.hashCode + | 865 17 * trueExp.hashCode + |
| 598 19 * falseExp.hashCode; | 866 19 * falseExp.hashCode; |
| 599 } | 867 } |
| 600 | 868 |
| 601 @override | 869 @override |
| 602 bool _equals(ConditionalConstantExpression other) { | 870 bool _equals(ConditionalConstantExpression other) { |
| 603 return condition == other.condition && | 871 return condition == other.condition && |
| 604 trueExp == other.trueExp && | 872 trueExp == other.trueExp && |
| 605 falseExp == other.falseExp; | 873 falseExp == other.falseExp; |
| 606 } | 874 } |
| 607 } | 875 } |
| 608 | 876 |
| 609 abstract class ConstantExpressionVisitor<C, R> { | 877 /// A reference to a position parameter. |
| 878 class PositionalArgumentReference extends ConstantExpression { | |
| 879 final int index; | |
| 880 | |
| 881 PositionalArgumentReference(this.index); | |
| 882 | |
| 883 ConstantExpressionKind get kind { | |
| 884 return ConstantExpressionKind.POSITIONAL_REFERENCE; | |
| 885 } | |
| 886 | |
| 887 accept(ConstantExpressionVisitor visitor, [context]) { | |
| 888 return visitor.visitPositional(this, context); | |
| 889 } | |
| 890 | |
| 891 ConstantValue get value { | |
| 892 throw new UnsupportedError('PositionalArgumentReference.value'); | |
| 893 } | |
| 894 | |
| 895 ConstantExpression apply(Arguments arguments) { | |
| 896 return arguments.getPositionalArgument(index); | |
| 897 } | |
| 898 | |
| 899 @override | |
| 900 int _computeHashCode() => 13 * index.hashCode; | |
| 901 | |
| 902 @override | |
| 903 bool _equals(PositionalArgumentReference other) => index == other.index; | |
| 904 } | |
| 905 | |
| 906 /// A reference to a named parameter. | |
| 907 class NamedArgumentReference extends ConstantExpression { | |
| 908 final String name; | |
| 909 | |
| 910 NamedArgumentReference(this.name); | |
| 911 | |
| 912 ConstantExpressionKind get kind { | |
| 913 return ConstantExpressionKind.NAMED_REFERENCE; | |
| 914 } | |
| 915 | |
| 916 accept(ConstantExpressionVisitor visitor, [context]) { | |
| 917 return visitor.visitNamed(this, context); | |
| 918 } | |
| 919 | |
| 920 ConstantValue get value { | |
| 921 throw new UnsupportedError('NamedArgumentReference.value'); | |
| 922 } | |
| 923 | |
| 924 ConstantExpression apply(Arguments arguments) { | |
| 925 return arguments.getNamedArgument(name); | |
| 926 } | |
| 927 | |
| 928 @override | |
| 929 int _computeHashCode() => 13 * name.hashCode; | |
| 930 | |
| 931 @override | |
| 932 bool _equals(NamedArgumentReference other) => name == other.name; | |
| 933 } | |
| 934 | |
| 935 abstract class FromEnvironmentConstantExpression extends ConstantExpression { | |
| 936 final ConstantValue value; | |
| 937 final String name; | |
| 938 final ConstantExpression defaultValue; | |
| 939 | |
| 940 FromEnvironmentConstantExpression(this.value, this.name, this.defaultValue); | |
| 941 | |
| 942 @override | |
| 943 int _computeHashCode() { | |
| 944 return 13 * name.hashCode + | |
| 945 17 * defaultValue.hashCode; | |
| 946 } | |
| 947 | |
| 948 @override | |
| 949 bool _equals(FromEnvironmentConstantExpression other) { | |
| 950 return name == other.name && | |
| 951 defaultValue == other.defaultValue; | |
| 952 } | |
| 953 } | |
| 954 | |
| 955 /// A `const bool.fromEnvironment` constant. | |
| 956 class BoolFromEnvironmentConstantExpression | |
| 957 extends FromEnvironmentConstantExpression { | |
| 958 | |
| 959 BoolFromEnvironmentConstantExpression( | |
| 960 ConstantValue value, | |
| 961 String name, | |
| 962 ConstantExpression defaultValue) | |
| 963 : super(value, name, defaultValue); | |
| 964 | |
| 965 ConstantExpressionKind get kind { | |
| 966 return ConstantExpressionKind.BOOL_FROM_ENVIRONMENT; | |
| 967 } | |
| 968 | |
| 969 accept(ConstantExpressionVisitor visitor, [context]) { | |
| 970 return visitor.visitBoolFromEnvironment(this, context); | |
| 971 } | |
| 972 | |
| 973 ConstantExpression apply(Arguments arguments) { | |
| 974 return new BoolFromEnvironmentConstantExpression( | |
| 975 null, name, defaultValue.apply(arguments)); | |
| 976 } | |
| 977 } | |
| 978 | |
| 979 /// A `const int.fromEnvironment` constant. | |
| 980 class IntFromEnvironmentConstantExpression | |
| 981 extends FromEnvironmentConstantExpression { | |
| 982 | |
| 983 IntFromEnvironmentConstantExpression( | |
| 984 ConstantValue value, | |
| 985 String name, | |
| 986 ConstantExpression defaultValue) | |
| 987 : super(value, name, defaultValue); | |
| 988 | |
| 989 ConstantExpressionKind get kind { | |
| 990 return ConstantExpressionKind.INT_FROM_ENVIRONMENT; | |
| 991 } | |
| 992 | |
| 993 accept(ConstantExpressionVisitor visitor, [context]) { | |
| 994 return visitor.visitIntFromEnvironment(this, context); | |
| 995 } | |
| 996 | |
| 997 ConstantExpression apply(Arguments arguments) { | |
| 998 return new IntFromEnvironmentConstantExpression( | |
| 999 null, name, defaultValue.apply(arguments)); | |
| 1000 } | |
| 1001 } | |
| 1002 | |
| 1003 /// A `const String.fromEnvironment` constant. | |
| 1004 class StringFromEnvironmentConstantExpression | |
| 1005 extends FromEnvironmentConstantExpression { | |
| 1006 | |
| 1007 StringFromEnvironmentConstantExpression( | |
| 1008 ConstantValue value, | |
| 1009 String name, | |
| 1010 ConstantExpression defaultValue) | |
| 1011 : super(value, name, defaultValue); | |
| 1012 | |
| 1013 ConstantExpressionKind get kind { | |
| 1014 return ConstantExpressionKind.STRING_FROM_ENVIRONMENT; | |
| 1015 } | |
| 1016 | |
| 1017 accept(ConstantExpressionVisitor visitor, [context]) { | |
| 1018 return visitor.visitStringFromEnvironment(this, context); | |
| 1019 } | |
| 1020 | |
| 1021 | |
| 1022 ConstantExpression apply(Arguments arguments) { | |
| 1023 return new StringFromEnvironmentConstantExpression( | |
| 1024 null, name, defaultValue.apply(arguments)); | |
| 1025 } | |
| 1026 } | |
| 1027 | |
| 1028 abstract class ConstantExpressionVisitor<R, A> { | |
| 610 const ConstantExpressionVisitor(); | 1029 const ConstantExpressionVisitor(); |
| 611 | 1030 |
| 612 R visit(ConstantExpression constant, C context) { | 1031 R visit(ConstantExpression constant, A context) { |
| 613 return constant.accept(this, context); | 1032 return constant.accept(this, context); |
| 614 } | 1033 } |
| 615 | 1034 |
| 616 R visitPrimitive(PrimitiveConstantExpression exp, C context); | 1035 R visitBool(BoolConstantExpression exp, A context); |
| 617 R visitList(ListConstantExpression exp, C context); | 1036 R visitInt(IntConstantExpression exp, A context); |
| 618 R visitMap(MapConstantExpression exp, C context); | 1037 R visitDouble(DoubleConstantExpression exp, A context); |
| 619 R visitConstructed(ConstructedConstantExpression exp, C context); | 1038 R visitString(StringConstantExpression exp, A context); |
| 620 R visitConcatenate(ConcatenateConstantExpression exp, C context); | 1039 R visitNull(NullConstantExpression exp, A context); |
| 621 R visitSymbol(SymbolConstantExpression exp, C context); | 1040 R visitList(ListConstantExpression exp, A context); |
| 622 R visitType(TypeConstantExpression exp, C context); | 1041 R visitMap(MapConstantExpression exp, A context); |
| 623 R visitVariable(VariableConstantExpression exp, C context); | 1042 R visitConstructed(ConstructedConstantExpression exp, A context); |
| 624 R visitFunction(FunctionConstantExpression exp, C context); | 1043 R visitConcatenate(ConcatenateConstantExpression exp, A context); |
| 625 R visitBinary(BinaryConstantExpression exp, C context); | 1044 R visitSymbol(SymbolConstantExpression exp, A context); |
| 626 R visitIdentical(IdenticalConstantExpression exp, C context); | 1045 R visitType(TypeConstantExpression exp, A context); |
| 627 R visitUnary(UnaryConstantExpression exp, C context); | 1046 R visitVariable(VariableConstantExpression exp, A context); |
| 628 R visitConditional(ConditionalConstantExpression exp, C context); | 1047 R visitFunction(FunctionConstantExpression exp, A context); |
| 1048 R visitBinary(BinaryConstantExpression exp, A context); | |
| 1049 R visitIdentical(IdenticalConstantExpression exp, A context); | |
| 1050 R visitUnary(UnaryConstantExpression exp, A context); | |
| 1051 R visitConditional(ConditionalConstantExpression exp, A context); | |
| 1052 R visitBoolFromEnvironment(BoolFromEnvironmentConstantExpression exp, | |
| 1053 A context); | |
| 1054 R visitIntFromEnvironment(IntFromEnvironmentConstantExpression exp, | |
| 1055 A context); | |
| 1056 R visitStringFromEnvironment(StringFromEnvironmentConstantExpression exp, | |
| 1057 A context); | |
| 1058 | |
| 1059 R visitPositional(PositionalArgumentReference exp, A context); | |
| 1060 R visitNamed(NamedArgumentReference exp, A context); | |
| 629 } | 1061 } |
| 630 | 1062 |
| 631 /// Represents the declaration of a constant [element] with value [expression]. | 1063 /// Represents the declaration of a constant [element] with value [expression]. |
| 632 // TODO(johnniwinther): Where does this class belong? | 1064 // TODO(johnniwinther): Where does this class belong? |
| 633 class ConstDeclaration { | 1065 class ConstDeclaration { |
| 634 final VariableElement element; | 1066 final VariableElement element; |
| 635 final ConstantExpression expression; | 1067 final ConstantExpression expression; |
| 636 | 1068 |
| 637 ConstDeclaration(this.element, this.expression); | 1069 ConstDeclaration(this.element, this.expression); |
| 638 } | 1070 } |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 665 needsComma = true; | 1097 needsComma = true; |
| 666 } | 1098 } |
| 667 sb.write('>'); | 1099 sb.write('>'); |
| 668 } | 1100 } |
| 669 | 1101 |
| 670 @override | 1102 @override |
| 671 void visit(ConstantExpression constant, [_]) { | 1103 void visit(ConstantExpression constant, [_]) { |
| 672 return constant.accept(this, null); | 1104 return constant.accept(this, null); |
| 673 } | 1105 } |
| 674 | 1106 |
| 675 @override | 1107 void visitPrimitive(PrimitiveConstantExpression exp) { |
| 676 void visitPrimitive(PrimitiveConstantExpression exp, [_]) { | 1108 sb.write(exp.primitiveValue); |
| 677 sb.write(exp.value.unparse()); | |
| 678 } | 1109 } |
| 679 | 1110 |
| 680 @override | 1111 @override |
| 1112 void visitBool(BoolConstantExpression exp, [_]) { | |
| 1113 visitPrimitive(exp); | |
| 1114 } | |
| 1115 | |
| 1116 @override | |
| 1117 void visitDouble(DoubleConstantExpression exp, [_]) { | |
| 1118 visitPrimitive(exp); | |
| 1119 } | |
| 1120 | |
| 1121 @override | |
| 1122 void visitInt(IntConstantExpression exp, [_]) { | |
| 1123 visitPrimitive(exp); | |
| 1124 } | |
| 1125 | |
| 1126 @override | |
| 1127 void visitNull(NullConstantExpression exp, [_]) { | |
| 1128 visitPrimitive(exp); | |
| 1129 } | |
| 1130 | |
| 1131 @override | |
| 1132 void visitString(StringConstantExpression exp, [_]) { | |
| 1133 // TODO(johnniwinther): Ensure correct escaping. | |
| 1134 sb.write('"${exp.primitiveValue}"'); | |
| 1135 } | |
| 1136 | |
| 1137 @override | |
| 681 void visitList(ListConstantExpression exp, [_]) { | 1138 void visitList(ListConstantExpression exp, [_]) { |
| 682 sb.write('const '); | 1139 sb.write('const '); |
| 683 writeTypeArguments(exp.type); | 1140 writeTypeArguments(exp.type); |
| 684 sb.write('['); | 1141 sb.write('['); |
| 685 bool needsComma = false; | 1142 bool needsComma = false; |
| 686 for (ConstantExpression value in exp.values) { | 1143 for (ConstantExpression value in exp.values) { |
| 687 if (needsComma) { | 1144 if (needsComma) { |
| 688 sb.write(', '); | 1145 sb.write(', '); |
| 689 } | 1146 } |
| 690 visit(value); | 1147 visit(value); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 801 | 1258 |
| 802 @override | 1259 @override |
| 803 void visitConditional(ConditionalConstantExpression exp, [_]) { | 1260 void visitConditional(ConditionalConstantExpression exp, [_]) { |
| 804 write(exp, exp.condition, leftAssociative: false); | 1261 write(exp, exp.condition, leftAssociative: false); |
| 805 sb.write(' ? '); | 1262 sb.write(' ? '); |
| 806 write(exp, exp.trueExp); | 1263 write(exp, exp.trueExp); |
| 807 sb.write(' : '); | 1264 sb.write(' : '); |
| 808 write(exp, exp.falseExp); | 1265 write(exp, exp.falseExp); |
| 809 } | 1266 } |
| 810 | 1267 |
| 1268 @override | |
| 1269 void visitPositional(PositionalArgumentReference exp, [_]) { | |
| 1270 // TODO(johnniwinther): Maybe this should throw. | |
| 1271 sb.write('args[${exp.index}]'); | |
| 1272 } | |
| 1273 | |
| 1274 @override | |
| 1275 void visitNamed(NamedArgumentReference exp, [_]) { | |
| 1276 // TODO(johnniwinther): Maybe this should throw. | |
| 1277 sb.write('args[${exp.name}]'); | |
| 1278 } | |
| 1279 | |
| 811 String toString() => sb.toString(); | 1280 String toString() => sb.toString(); |
| 1281 | |
| 1282 @override | |
| 1283 visitBoolFromEnvironment(BoolFromEnvironmentConstantExpression exp, [_]) { | |
| 1284 sb.write('const bool.fromEnvironment("${exp.name}", defaultValue: '); | |
| 1285 visit(exp.defaultValue); | |
| 1286 sb.write(')'); | |
| 1287 } | |
| 1288 | |
| 1289 @override | |
| 1290 visitIntFromEnvironment(IntFromEnvironmentConstantExpression exp, [_]) { | |
| 1291 sb.write('const int.fromEnvironment("${exp.name}", defaultValue: '); | |
| 1292 visit(exp.defaultValue); | |
| 1293 sb.write(')'); | |
| 1294 } | |
| 1295 | |
| 1296 @override | |
| 1297 visitStringFromEnvironment(StringFromEnvironmentConstantExpression exp, [_]) { | |
| 1298 sb.write('const String.fromEnvironment("${exp.name}", defaultValue: '); | |
| 1299 visit(exp.defaultValue); | |
| 1300 sb.write(')'); | |
| 1301 } | |
| 812 } | 1302 } |
| OLD | NEW |