| 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 Element, | 10 Element, |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 accept(ConstantExpressionVisitor visitor, [context]) { | 249 accept(ConstantExpressionVisitor visitor, [context]) { |
| 250 return visitor.visitConditional(this, context); | 250 return visitor.visitConditional(this, context); |
| 251 } | 251 } |
| 252 | 252 |
| 253 int get precedence => 3; | 253 int get precedence => 3; |
| 254 } | 254 } |
| 255 | 255 |
| 256 abstract class ConstantExpressionVisitor<C, R> { | 256 abstract class ConstantExpressionVisitor<C, R> { |
| 257 const ConstantExpressionVisitor(); | 257 const ConstantExpressionVisitor(); |
| 258 | 258 |
| 259 R visit(ConstantExpression constant, [C context]) { | 259 R visit(ConstantExpression constant, C context) { |
| 260 return constant.accept(this, context); | 260 return constant.accept(this, context); |
| 261 } | 261 } |
| 262 | 262 |
| 263 R visitPrimitive(PrimitiveConstantExpression exp, [C context]); | 263 R visitPrimitive(PrimitiveConstantExpression exp, C context); |
| 264 R visitList(ListConstantExpression exp, [C context]); | 264 R visitList(ListConstantExpression exp, C context); |
| 265 R visitMap(MapConstantExpression exp, [C context]); | 265 R visitMap(MapConstantExpression exp, C context); |
| 266 R visitConstructed(ConstructedConstantExpresssion exp, [C context]); | 266 R visitConstructed(ConstructedConstantExpresssion exp, C context); |
| 267 R visitConcatenate(ConcatenateConstantExpression exp, [C context]); | 267 R visitConcatenate(ConcatenateConstantExpression exp, C context); |
| 268 R visitSymbol(SymbolConstantExpression exp, [C context]); | 268 R visitSymbol(SymbolConstantExpression exp, C context); |
| 269 R visitType(TypeConstantExpression exp, [C context]); | 269 R visitType(TypeConstantExpression exp, C context); |
| 270 R visitVariable(VariableConstantExpression exp, [C context]); | 270 R visitVariable(VariableConstantExpression exp, C context); |
| 271 R visitFunction(FunctionConstantExpression exp, [C context]); | 271 R visitFunction(FunctionConstantExpression exp, C context); |
| 272 R visitBinary(BinaryConstantExpression exp, [C context]); | 272 R visitBinary(BinaryConstantExpression exp, C context); |
| 273 R visitUnary(UnaryConstantExpression exp, [C context]); | 273 R visitUnary(UnaryConstantExpression exp, C context); |
| 274 R visitConditional(ConditionalConstantExpression exp, [C context]); | 274 R visitConditional(ConditionalConstantExpression exp, C context); |
| 275 } | 275 } |
| 276 | 276 |
| 277 /// Represents the declaration of a constant [element] with value [expression]. | 277 /// Represents the declaration of a constant [element] with value [expression]. |
| 278 // TODO(johnniwinther): Where does this class belong? | 278 // TODO(johnniwinther): Where does this class belong? |
| 279 class ConstDeclaration { | 279 class ConstDeclaration { |
| 280 final VariableElement element; | 280 final VariableElement element; |
| 281 final ConstantExpression expression; | 281 final ConstantExpression expression; |
| 282 | 282 |
| 283 ConstDeclaration(this.element, this.expression); | 283 ConstDeclaration(this.element, this.expression); |
| 284 } | 284 } |
| 285 | 285 |
| 286 class ConstExpPrinter extends ConstantExpressionVisitor { | 286 class ConstExpPrinter extends ConstantExpressionVisitor { |
| 287 final StringBuffer sb = new StringBuffer(); | 287 final StringBuffer sb = new StringBuffer(); |
| 288 | 288 |
| 289 write(ConstantExpression parent, | 289 void write(ConstantExpression parent, |
| 290 ConstantExpression child, | 290 ConstantExpression child, |
| 291 {bool leftAssociative: true}) { | 291 {bool leftAssociative: true}) { |
| 292 if (child.precedence < parent.precedence || | 292 if (child.precedence < parent.precedence || |
| 293 !leftAssociative && child.precedence == parent.precedence) { | 293 !leftAssociative && child.precedence == parent.precedence) { |
| 294 sb.write('('); | 294 sb.write('('); |
| 295 child.accept(this); | 295 child.accept(this); |
| 296 sb.write(')'); | 296 sb.write(')'); |
| 297 } else { | 297 } else { |
| 298 child.accept(this); | 298 child.accept(this); |
| 299 } | 299 } |
| 300 } | 300 } |
| 301 | 301 |
| 302 writeTypeArguments(InterfaceType type) { | 302 void writeTypeArguments(InterfaceType type) { |
| 303 if (type.treatAsRaw) return; | 303 if (type.treatAsRaw) return; |
| 304 sb.write('<'); | 304 sb.write('<'); |
| 305 bool needsComma = false; | 305 bool needsComma = false; |
| 306 for (DartType value in type.typeArguments) { | 306 for (DartType value in type.typeArguments) { |
| 307 if (needsComma) { | 307 if (needsComma) { |
| 308 sb.write(', '); | 308 sb.write(', '); |
| 309 } | 309 } |
| 310 sb.write(value); | 310 sb.write(value); |
| 311 needsComma = true; | 311 needsComma = true; |
| 312 } | 312 } |
| 313 sb.write('>'); | 313 sb.write('>'); |
| 314 } | 314 } |
| 315 | 315 |
| 316 visitPrimitive(PrimitiveConstantExpression exp, [_]) { | 316 @override |
| 317 void visit(ConstantExpression constant, [_]) { |
| 318 return constant.accept(this, null); |
| 319 } |
| 320 |
| 321 @override |
| 322 void visitPrimitive(PrimitiveConstantExpression exp, [_]) { |
| 317 sb.write(exp.value.unparse()); | 323 sb.write(exp.value.unparse()); |
| 318 } | 324 } |
| 319 | 325 |
| 320 visitList(ListConstantExpression exp, [_]) { | 326 @override |
| 327 void visitList(ListConstantExpression exp, [_]) { |
| 321 sb.write('const '); | 328 sb.write('const '); |
| 322 writeTypeArguments(exp.type); | 329 writeTypeArguments(exp.type); |
| 323 sb.write('['); | 330 sb.write('['); |
| 324 bool needsComma = false; | 331 bool needsComma = false; |
| 325 for (ConstantExpression value in exp.values) { | 332 for (ConstantExpression value in exp.values) { |
| 326 if (needsComma) { | 333 if (needsComma) { |
| 327 sb.write(', '); | 334 sb.write(', '); |
| 328 } | 335 } |
| 329 visit(value); | 336 visit(value); |
| 330 needsComma = true; | 337 needsComma = true; |
| 331 } | 338 } |
| 332 sb.write(']'); | 339 sb.write(']'); |
| 333 } | 340 } |
| 334 | 341 |
| 335 visitMap(MapConstantExpression exp, [_]) { | 342 @override |
| 343 void visitMap(MapConstantExpression exp, [_]) { |
| 336 sb.write('const '); | 344 sb.write('const '); |
| 337 writeTypeArguments(exp.type); | 345 writeTypeArguments(exp.type); |
| 338 sb.write('{'); | 346 sb.write('{'); |
| 339 for (int index = 0; index < exp.keys.length; index++) { | 347 for (int index = 0; index < exp.keys.length; index++) { |
| 340 if (index > 0) { | 348 if (index > 0) { |
| 341 sb.write(', '); | 349 sb.write(', '); |
| 342 } | 350 } |
| 343 visit(exp.keys[index]); | 351 visit(exp.keys[index]); |
| 344 sb.write(': '); | 352 sb.write(': '); |
| 345 visit(exp.values[index]); | 353 visit(exp.values[index]); |
| 346 } | 354 } |
| 347 sb.write('}'); | 355 sb.write('}'); |
| 348 } | 356 } |
| 349 | 357 |
| 350 visitConstructed(ConstructedConstantExpresssion exp, [_]) { | 358 @override |
| 359 void visitConstructed(ConstructedConstantExpresssion exp, [_]) { |
| 351 sb.write('const '); | 360 sb.write('const '); |
| 352 sb.write(exp.target.enclosingClass.name); | 361 sb.write(exp.target.enclosingClass.name); |
| 353 if (exp.target.name != '') { | 362 if (exp.target.name != '') { |
| 354 sb.write('.'); | 363 sb.write('.'); |
| 355 sb.write(exp.target.name); | 364 sb.write(exp.target.name); |
| 356 } | 365 } |
| 357 writeTypeArguments(exp.type); | 366 writeTypeArguments(exp.type); |
| 358 sb.write('('); | 367 sb.write('('); |
| 359 bool needsComma = false; | 368 bool needsComma = false; |
| 360 | 369 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 371 sb.write(', '); | 380 sb.write(', '); |
| 372 } | 381 } |
| 373 sb.write(exp.selector.namedArguments[index]); | 382 sb.write(exp.selector.namedArguments[index]); |
| 374 sb.write(': '); | 383 sb.write(': '); |
| 375 visit(exp.arguments[namedOffset + index]); | 384 visit(exp.arguments[namedOffset + index]); |
| 376 needsComma = true; | 385 needsComma = true; |
| 377 } | 386 } |
| 378 sb.write(')'); | 387 sb.write(')'); |
| 379 } | 388 } |
| 380 | 389 |
| 381 visitConcatenate(ConcatenateConstantExpression exp, [_]) { | 390 @override |
| 391 void visitConcatenate(ConcatenateConstantExpression exp, [_]) { |
| 382 sb.write(exp.value.unparse()); | 392 sb.write(exp.value.unparse()); |
| 383 } | 393 } |
| 384 | 394 |
| 385 visitSymbol(SymbolConstantExpression exp, [_]) { | 395 @override |
| 396 void visitSymbol(SymbolConstantExpression exp, [_]) { |
| 386 sb.write('#'); | 397 sb.write('#'); |
| 387 sb.write(exp.name); | 398 sb.write(exp.name); |
| 388 } | 399 } |
| 389 | 400 |
| 390 visitType(TypeConstantExpression exp, [_]) { | 401 @override |
| 402 void visitType(TypeConstantExpression exp, [_]) { |
| 391 sb.write(exp.type.name); | 403 sb.write(exp.type.name); |
| 392 } | 404 } |
| 393 | 405 |
| 394 visitVariable(VariableConstantExpression exp, [_]) { | 406 @override |
| 407 void visitVariable(VariableConstantExpression exp, [_]) { |
| 395 if (exp.element.isStatic) { | 408 if (exp.element.isStatic) { |
| 396 sb.write(exp.element.enclosingClass.name); | 409 sb.write(exp.element.enclosingClass.name); |
| 397 sb.write('.'); | 410 sb.write('.'); |
| 398 } | 411 } |
| 399 sb.write(exp.element.name); | 412 sb.write(exp.element.name); |
| 400 } | 413 } |
| 401 | 414 |
| 402 visitFunction(FunctionConstantExpression exp, [_]) { | 415 @override |
| 416 void visitFunction(FunctionConstantExpression exp, [_]) { |
| 403 if (exp.element.isStatic) { | 417 if (exp.element.isStatic) { |
| 404 sb.write(exp.element.enclosingClass.name); | 418 sb.write(exp.element.enclosingClass.name); |
| 405 sb.write('.'); | 419 sb.write('.'); |
| 406 } | 420 } |
| 407 sb.write(exp.element.name); | 421 sb.write(exp.element.name); |
| 408 } | 422 } |
| 409 | 423 |
| 410 visitBinary(BinaryConstantExpression exp, [_]) { | 424 @override |
| 425 void visitBinary(BinaryConstantExpression exp, [_]) { |
| 411 if (exp.operator == 'identical') { | 426 if (exp.operator == 'identical') { |
| 412 sb.write('identical('); | 427 sb.write('identical('); |
| 413 visit(exp.left); | 428 visit(exp.left); |
| 414 sb.write(', '); | 429 sb.write(', '); |
| 415 visit(exp.right); | 430 visit(exp.right); |
| 416 sb.write(')'); | 431 sb.write(')'); |
| 417 } else { | 432 } else { |
| 418 write(exp, exp.left); | 433 write(exp, exp.left); |
| 419 sb.write(' '); | 434 sb.write(' '); |
| 420 sb.write(exp.operator); | 435 sb.write(exp.operator); |
| 421 sb.write(' '); | 436 sb.write(' '); |
| 422 write(exp, exp.right); | 437 write(exp, exp.right); |
| 423 } | 438 } |
| 424 } | 439 } |
| 425 | 440 |
| 426 visitUnary(UnaryConstantExpression exp, [_]) { | 441 @override |
| 442 void visitUnary(UnaryConstantExpression exp, [_]) { |
| 427 sb.write(exp.operator); | 443 sb.write(exp.operator); |
| 428 write(exp, exp.expression); | 444 write(exp, exp.expression); |
| 429 } | 445 } |
| 430 | 446 |
| 431 visitConditional(ConditionalConstantExpression exp, [_]) { | 447 @override |
| 448 void visitConditional(ConditionalConstantExpression exp, [_]) { |
| 432 write(exp, exp.condition, leftAssociative: false); | 449 write(exp, exp.condition, leftAssociative: false); |
| 433 sb.write(' ? '); | 450 sb.write(' ? '); |
| 434 write(exp, exp.trueExp); | 451 write(exp, exp.trueExp); |
| 435 sb.write(' : '); | 452 sb.write(' : '); |
| 436 write(exp, exp.falseExp); | 453 write(exp, exp.falseExp); |
| 437 } | 454 } |
| 438 | 455 |
| 439 String toString() => sb.toString(); | 456 String toString() => sb.toString(); |
| 440 } | 457 } |
| OLD | NEW |