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 // This code was auto-generated, is not intended to be edited, and is subject to | 5 // This code was auto-generated, is not intended to be edited, and is subject to |
6 // significant change. Please see the README file for more information. | 6 // significant change. Please see the README file for more information. |
7 | 7 |
8 library engine.constant; | 8 library engine.constant; |
9 | 9 |
10 import 'dart:collection'; | 10 import 'dart:collection'; |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 * Initialize a newly created evaluator to evaluate expressions in the given s
ource. | 212 * Initialize a newly created evaluator to evaluate expressions in the given s
ource. |
213 * | 213 * |
214 * @param source the source containing the expression(s) that will be evaluate
d | 214 * @param source the source containing the expression(s) that will be evaluate
d |
215 * @param typeProvider the type provider used to access known types | 215 * @param typeProvider the type provider used to access known types |
216 */ | 216 */ |
217 ConstantEvaluator(this._source, this._typeProvider); | 217 ConstantEvaluator(this._source, this._typeProvider); |
218 | 218 |
219 EvaluationResult evaluate(Expression expression) { | 219 EvaluationResult evaluate(Expression expression) { |
220 RecordingErrorListener errorListener = new RecordingErrorListener(); | 220 RecordingErrorListener errorListener = new RecordingErrorListener(); |
221 ErrorReporter errorReporter = new ErrorReporter(errorListener, _source); | 221 ErrorReporter errorReporter = new ErrorReporter(errorListener, _source); |
222 DartObjectImpl result = | 222 DartObjectImpl result = expression |
223 expression.accept(new ConstantVisitor.con1(_typeProvider, errorReporter)
); | 223 .accept(new ConstantVisitor.con1(_typeProvider, errorReporter)); |
224 if (result != null) { | 224 if (result != null) { |
225 return EvaluationResult.forValue(result); | 225 return EvaluationResult.forValue(result); |
226 } | 226 } |
227 return EvaluationResult.forErrors(errorListener.errors); | 227 return EvaluationResult.forErrors(errorListener.errors); |
228 } | 228 } |
229 } | 229 } |
230 | 230 |
231 /** | 231 /** |
232 * Instances of the class `ConstantFinder` are used to traverse the AST | 232 * Instances of the class `ConstantFinder` are used to traverse the AST |
233 * structures of all of the compilation units being resolved and build tables | 233 * structures of all of the compilation units being resolved and build tables |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 * @param unit the compilation unit defining the constants to be added | 397 * @param unit the compilation unit defining the constants to be added |
398 */ | 398 */ |
399 void add(CompilationUnit unit) { | 399 void add(CompilationUnit unit) { |
400 unit.accept(_constantFinder); | 400 unit.accept(_constantFinder); |
401 } | 401 } |
402 | 402 |
403 /** | 403 /** |
404 * This method is called just before computing the constant value associated w
ith an AST node. | 404 * This method is called just before computing the constant value associated w
ith an AST node. |
405 * Unit tests will override this method to introduce additional error checking
. | 405 * Unit tests will override this method to introduce additional error checking
. |
406 */ | 406 */ |
407 void beforeComputeValue(AstNode constNode) { | 407 void beforeComputeValue(AstNode constNode) {} |
408 } | |
409 | 408 |
410 /** | 409 /** |
411 * This method is called just before getting the constant initializers associa
ted with a | 410 * This method is called just before getting the constant initializers associa
ted with a |
412 * constructor AST node. Unit tests will override this method to introduce add
itional error | 411 * constructor AST node. Unit tests will override this method to introduce add
itional error |
413 * checking. | 412 * checking. |
414 */ | 413 */ |
415 void beforeGetConstantInitializers(ConstructorElement constructor) { | 414 void beforeGetConstantInitializers(ConstructorElement constructor) {} |
416 } | |
417 | 415 |
418 /** | 416 /** |
419 * This method is called just before getting a parameter's default value. Unit
tests will override | 417 * This method is called just before getting a parameter's default value. Unit
tests will override |
420 * this method to introduce additional error checking. | 418 * this method to introduce additional error checking. |
421 */ | 419 */ |
422 void beforeGetParameterDefault(ParameterElement parameter) { | 420 void beforeGetParameterDefault(ParameterElement parameter) {} |
423 } | |
424 | 421 |
425 /** | 422 /** |
426 * Compute values for all of the constants in the compilation units that were
added. | 423 * Compute values for all of the constants in the compilation units that were
added. |
427 */ | 424 */ |
428 void computeValues() { | 425 void computeValues() { |
429 _variableDeclarationMap = _constantFinder.variableMap; | 426 _variableDeclarationMap = _constantFinder.variableMap; |
430 constructorDeclarationMap = _constantFinder.constructorMap; | 427 constructorDeclarationMap = _constantFinder.constructorMap; |
431 _constructorInvocations = _constantFinder.constructorInvocations; | 428 _constructorInvocations = _constantFinder.constructorInvocations; |
432 _annotations = _constantFinder.annotations; | 429 _annotations = _constantFinder.annotations; |
433 _variableDeclarationMap.values.forEach((VariableDeclaration declaration) { | 430 _variableDeclarationMap.values.forEach((VariableDeclaration declaration) { |
434 ReferenceFinder referenceFinder = new ReferenceFinder( | 431 ReferenceFinder referenceFinder = new ReferenceFinder(declaration, |
435 declaration, | 432 referenceGraph, _variableDeclarationMap, constructorDeclarationMap); |
436 referenceGraph, | |
437 _variableDeclarationMap, | |
438 constructorDeclarationMap); | |
439 referenceGraph.addNode(declaration); | 433 referenceGraph.addNode(declaration); |
440 declaration.initializer.accept(referenceFinder); | 434 declaration.initializer.accept(referenceFinder); |
441 }); | 435 }); |
442 constructorDeclarationMap.forEach( | 436 constructorDeclarationMap.forEach( |
443 (ConstructorElement element, ConstructorDeclaration declaration) { | 437 (ConstructorElement element, ConstructorDeclaration declaration) { |
444 ReferenceFinder referenceFinder = new ReferenceFinder( | 438 ReferenceFinder referenceFinder = new ReferenceFinder(declaration, |
445 declaration, | 439 referenceGraph, _variableDeclarationMap, constructorDeclarationMap); |
446 referenceGraph, | |
447 _variableDeclarationMap, | |
448 constructorDeclarationMap); | |
449 referenceGraph.addNode(declaration); | 440 referenceGraph.addNode(declaration); |
450 bool superInvocationFound = false; | 441 bool superInvocationFound = false; |
451 NodeList<ConstructorInitializer> initializers = declaration.initializers; | 442 NodeList<ConstructorInitializer> initializers = declaration.initializers; |
452 for (ConstructorInitializer initializer in initializers) { | 443 for (ConstructorInitializer initializer in initializers) { |
453 if (initializer is SuperConstructorInvocation) { | 444 if (initializer is SuperConstructorInvocation) { |
454 superInvocationFound = true; | 445 superInvocationFound = true; |
455 } | 446 } |
456 initializer.accept(referenceFinder); | 447 initializer.accept(referenceFinder); |
457 } | 448 } |
458 if (!superInvocationFound) { | 449 if (!superInvocationFound) { |
(...skipping 11 matching lines...) Expand all Loading... |
470 } | 461 } |
471 } | 462 } |
472 } | 463 } |
473 for (FormalParameter parameter in declaration.parameters.parameters) { | 464 for (FormalParameter parameter in declaration.parameters.parameters) { |
474 referenceGraph.addNode(parameter); | 465 referenceGraph.addNode(parameter); |
475 referenceGraph.addEdge(declaration, parameter); | 466 referenceGraph.addEdge(declaration, parameter); |
476 if (parameter is DefaultFormalParameter) { | 467 if (parameter is DefaultFormalParameter) { |
477 Expression defaultValue = parameter.defaultValue; | 468 Expression defaultValue = parameter.defaultValue; |
478 if (defaultValue != null) { | 469 if (defaultValue != null) { |
479 ReferenceFinder parameterReferenceFinder = new ReferenceFinder( | 470 ReferenceFinder parameterReferenceFinder = new ReferenceFinder( |
480 parameter, | 471 parameter, referenceGraph, _variableDeclarationMap, |
481 referenceGraph, | |
482 _variableDeclarationMap, | |
483 constructorDeclarationMap); | 472 constructorDeclarationMap); |
484 defaultValue.accept(parameterReferenceFinder); | 473 defaultValue.accept(parameterReferenceFinder); |
485 } | 474 } |
486 } | 475 } |
487 } | 476 } |
488 }); | 477 }); |
489 for (InstanceCreationExpression expression in _constructorInvocations) { | 478 for (InstanceCreationExpression expression in _constructorInvocations) { |
490 referenceGraph.addNode(expression); | 479 referenceGraph.addNode(expression); |
491 ConstructorElement constructor = expression.staticElement; | 480 ConstructorElement constructor = expression.staticElement; |
492 if (constructor == null) { | 481 if (constructor == null) { |
493 continue; | 482 continue; |
494 } | 483 } |
495 constructor = _followConstantRedirectionChain(constructor); | 484 constructor = _followConstantRedirectionChain(constructor); |
496 ConstructorDeclaration declaration = | 485 ConstructorDeclaration declaration = |
497 findConstructorDeclaration(constructor); | 486 findConstructorDeclaration(constructor); |
498 // An instance creation expression depends both on the constructor and | 487 // An instance creation expression depends both on the constructor and |
499 // the arguments passed to it. | 488 // the arguments passed to it. |
500 ReferenceFinder referenceFinder = new ReferenceFinder( | 489 ReferenceFinder referenceFinder = new ReferenceFinder(expression, |
501 expression, | 490 referenceGraph, _variableDeclarationMap, constructorDeclarationMap); |
502 referenceGraph, | |
503 _variableDeclarationMap, | |
504 constructorDeclarationMap); | |
505 if (declaration != null) { | 491 if (declaration != null) { |
506 referenceGraph.addEdge(expression, declaration); | 492 referenceGraph.addEdge(expression, declaration); |
507 } | 493 } |
508 expression.argumentList.accept(referenceFinder); | 494 expression.argumentList.accept(referenceFinder); |
509 } | 495 } |
510 List<List<AstNode>> topologicalSort = | 496 List<List<AstNode>> topologicalSort = |
511 referenceGraph.computeTopologicalSort(); | 497 referenceGraph.computeTopologicalSort(); |
512 for (List<AstNode> constantsInCycle in topologicalSort) { | 498 for (List<AstNode> constantsInCycle in topologicalSort) { |
513 if (constantsInCycle.length == 1) { | 499 if (constantsInCycle.length == 1) { |
514 _computeValueFor(constantsInCycle[0]); | 500 _computeValueFor(constantsInCycle[0]); |
(...skipping 11 matching lines...) Expand all Loading... |
526 } | 512 } |
527 } | 513 } |
528 | 514 |
529 /** | 515 /** |
530 * Create the ConstantVisitor used to evaluate constants. Unit tests will over
ride this method to | 516 * Create the ConstantVisitor used to evaluate constants. Unit tests will over
ride this method to |
531 * introduce additional error checking. | 517 * introduce additional error checking. |
532 */ | 518 */ |
533 ConstantVisitor createConstantVisitor(ErrorReporter errorReporter) => | 519 ConstantVisitor createConstantVisitor(ErrorReporter errorReporter) => |
534 new ConstantVisitor.con1(typeProvider, errorReporter); | 520 new ConstantVisitor.con1(typeProvider, errorReporter); |
535 | 521 |
536 ConstructorDeclaration | 522 ConstructorDeclaration findConstructorDeclaration( |
537 findConstructorDeclaration(ConstructorElement constructor) => | 523 ConstructorElement constructor) => |
538 constructorDeclarationMap[_getConstructorBase(constructor)]; | 524 constructorDeclarationMap[_getConstructorBase(constructor)]; |
539 | 525 |
540 /** | 526 /** |
541 * Check that the arguments to a call to fromEnvironment() are correct. | 527 * Check that the arguments to a call to fromEnvironment() are correct. |
542 * | 528 * |
543 * @param arguments the AST nodes of the arguments. | 529 * @param arguments the AST nodes of the arguments. |
544 * @param argumentValues the values of the unnamed arguments. | 530 * @param argumentValues the values of the unnamed arguments. |
545 * @param namedArgumentValues the values of the named arguments. | 531 * @param namedArgumentValues the values of the named arguments. |
546 * @param expectedDefaultValueType the allowed type of the "defaultValue" para
meter (if present). | 532 * @param expectedDefaultValueType the allowed type of the "defaultValue" para
meter (if present). |
547 * Note: "defaultValue" is always allowed to be null. | 533 * Note: "defaultValue" is always allowed to be null. |
548 * @return true if the arguments are correct, false if there is an error. | 534 * @return true if the arguments are correct, false if there is an error. |
549 */ | 535 */ |
550 bool _checkFromEnvironmentArguments(NodeList<Expression> arguments, | 536 bool _checkFromEnvironmentArguments(NodeList<Expression> arguments, |
551 List<DartObjectImpl> argumentValues, HashMap<String, | 537 List<DartObjectImpl> argumentValues, |
552 DartObjectImpl> namedArgumentValues, InterfaceType expectedDefaultValueTyp
e) { | 538 HashMap<String, DartObjectImpl> namedArgumentValues, |
| 539 InterfaceType expectedDefaultValueType) { |
553 int argumentCount = arguments.length; | 540 int argumentCount = arguments.length; |
554 if (argumentCount < 1 || argumentCount > 2) { | 541 if (argumentCount < 1 || argumentCount > 2) { |
555 return false; | 542 return false; |
556 } | 543 } |
557 if (arguments[0] is NamedExpression) { | 544 if (arguments[0] is NamedExpression) { |
558 return false; | 545 return false; |
559 } | 546 } |
560 if (!identical(argumentValues[0].type, typeProvider.stringType)) { | 547 if (!identical(argumentValues[0].type, typeProvider.stringType)) { |
561 return false; | 548 return false; |
562 } | 549 } |
(...skipping 17 matching lines...) Expand all Loading... |
580 | 567 |
581 /** | 568 /** |
582 * Check that the arguments to a call to Symbol() are correct. | 569 * Check that the arguments to a call to Symbol() are correct. |
583 * | 570 * |
584 * @param arguments the AST nodes of the arguments. | 571 * @param arguments the AST nodes of the arguments. |
585 * @param argumentValues the values of the unnamed arguments. | 572 * @param argumentValues the values of the unnamed arguments. |
586 * @param namedArgumentValues the values of the named arguments. | 573 * @param namedArgumentValues the values of the named arguments. |
587 * @return true if the arguments are correct, false if there is an error. | 574 * @return true if the arguments are correct, false if there is an error. |
588 */ | 575 */ |
589 bool _checkSymbolArguments(NodeList<Expression> arguments, | 576 bool _checkSymbolArguments(NodeList<Expression> arguments, |
590 List<DartObjectImpl> argumentValues, HashMap<String, | 577 List<DartObjectImpl> argumentValues, |
591 DartObjectImpl> namedArgumentValues) { | 578 HashMap<String, DartObjectImpl> namedArgumentValues) { |
592 if (arguments.length != 1) { | 579 if (arguments.length != 1) { |
593 return false; | 580 return false; |
594 } | 581 } |
595 if (arguments[0] is NamedExpression) { | 582 if (arguments[0] is NamedExpression) { |
596 return false; | 583 return false; |
597 } | 584 } |
598 if (!identical(argumentValues[0].type, typeProvider.stringType)) { | 585 if (!identical(argumentValues[0].type, typeProvider.stringType)) { |
599 return false; | 586 return false; |
600 } | 587 } |
601 String name = argumentValues[0].stringValue; | 588 String name = argumentValues[0].stringValue; |
(...skipping 12 matching lines...) Expand all Loading... |
614 VariableElement element = declaration.element; | 601 VariableElement element = declaration.element; |
615 RecordingErrorListener errorListener = new RecordingErrorListener(); | 602 RecordingErrorListener errorListener = new RecordingErrorListener(); |
616 ErrorReporter errorReporter = | 603 ErrorReporter errorReporter = |
617 new ErrorReporter(errorListener, element.source); | 604 new ErrorReporter(errorListener, element.source); |
618 DartObjectImpl dartObject = | 605 DartObjectImpl dartObject = |
619 declaration.initializer.accept(createConstantVisitor(errorReporter)); | 606 declaration.initializer.accept(createConstantVisitor(errorReporter)); |
620 if (dartObject != null) { | 607 if (dartObject != null) { |
621 if (!_runtimeTypeMatch(dartObject, element.type)) { | 608 if (!_runtimeTypeMatch(dartObject, element.type)) { |
622 errorReporter.reportErrorForNode( | 609 errorReporter.reportErrorForNode( |
623 CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH, | 610 CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH, |
624 declaration, | 611 declaration, [dartObject.type, element.type]); |
625 [dartObject.type, element.type]); | |
626 } | 612 } |
627 } | 613 } |
628 (element as VariableElementImpl).evaluationResult = | 614 (element as VariableElementImpl).evaluationResult = |
629 new EvaluationResultImpl.con2(dartObject, errorListener.errors); | 615 new EvaluationResultImpl.con2(dartObject, errorListener.errors); |
630 } else if (constNode is InstanceCreationExpression) { | 616 } else if (constNode is InstanceCreationExpression) { |
631 InstanceCreationExpression expression = constNode; | 617 InstanceCreationExpression expression = constNode; |
632 ConstructorElement constructor = expression.staticElement; | 618 ConstructorElement constructor = expression.staticElement; |
633 if (constructor == null) { | 619 if (constructor == null) { |
634 // Couldn't resolve the constructor so we can't compute a value. | 620 // Couldn't resolve the constructor so we can't compute a value. |
635 // No problem - the error has already been reported. | 621 // No problem - the error has already been reported. |
636 // But we still need to store an evaluation result. | 622 // But we still need to store an evaluation result. |
637 expression.evaluationResult = new EvaluationResultImpl.con1(null); | 623 expression.evaluationResult = new EvaluationResultImpl.con1(null); |
638 return; | 624 return; |
639 } | 625 } |
640 RecordingErrorListener errorListener = new RecordingErrorListener(); | 626 RecordingErrorListener errorListener = new RecordingErrorListener(); |
641 CompilationUnit sourceCompilationUnit = | 627 CompilationUnit sourceCompilationUnit = |
642 expression.getAncestor((node) => node is CompilationUnit); | 628 expression.getAncestor((node) => node is CompilationUnit); |
643 ErrorReporter errorReporter = | 629 ErrorReporter errorReporter = new ErrorReporter( |
644 new ErrorReporter(errorListener, sourceCompilationUnit.element.source)
; | 630 errorListener, sourceCompilationUnit.element.source); |
645 ConstantVisitor constantVisitor = createConstantVisitor(errorReporter); | 631 ConstantVisitor constantVisitor = createConstantVisitor(errorReporter); |
646 DartObjectImpl result = _evaluateConstructorCall( | 632 DartObjectImpl result = _evaluateConstructorCall(constNode, |
647 constNode, | 633 expression.argumentList.arguments, constructor, constantVisitor, |
648 expression.argumentList.arguments, | |
649 constructor, | |
650 constantVisitor, | |
651 errorReporter); | 634 errorReporter); |
652 expression.evaluationResult = | 635 expression.evaluationResult = |
653 new EvaluationResultImpl.con2(result, errorListener.errors); | 636 new EvaluationResultImpl.con2(result, errorListener.errors); |
654 } else if (constNode is ConstructorDeclaration) { | 637 } else if (constNode is ConstructorDeclaration) { |
655 ConstructorDeclaration declaration = constNode; | 638 ConstructorDeclaration declaration = constNode; |
656 NodeList<ConstructorInitializer> initializers = declaration.initializers; | 639 NodeList<ConstructorInitializer> initializers = declaration.initializers; |
657 ConstructorElementImpl constructor = | 640 ConstructorElementImpl constructor = |
658 declaration.element as ConstructorElementImpl; | 641 declaration.element as ConstructorElementImpl; |
659 constructor.constantInitializers = | 642 constructor.constantInitializers = |
660 new ConstantValueComputer_InitializerCloner().cloneNodeList(initialize
rs); | 643 new ConstantValueComputer_InitializerCloner() |
| 644 .cloneNodeList(initializers); |
661 } else if (constNode is FormalParameter) { | 645 } else if (constNode is FormalParameter) { |
662 if (constNode is DefaultFormalParameter) { | 646 if (constNode is DefaultFormalParameter) { |
663 DefaultFormalParameter parameter = constNode; | 647 DefaultFormalParameter parameter = constNode; |
664 ParameterElement element = parameter.element; | 648 ParameterElement element = parameter.element; |
665 Expression defaultValue = parameter.defaultValue; | 649 Expression defaultValue = parameter.defaultValue; |
666 if (defaultValue != null) { | 650 if (defaultValue != null) { |
667 RecordingErrorListener errorListener = new RecordingErrorListener(); | 651 RecordingErrorListener errorListener = new RecordingErrorListener(); |
668 ErrorReporter errorReporter = | 652 ErrorReporter errorReporter = |
669 new ErrorReporter(errorListener, element.source); | 653 new ErrorReporter(errorListener, element.source); |
670 DartObjectImpl dartObject = | 654 DartObjectImpl dartObject = |
(...skipping 13 matching lines...) Expand all Loading... |
684 // The annotation is a reference to a compile-time constant variable. | 668 // The annotation is a reference to a compile-time constant variable. |
685 // Just copy the evaluation result. | 669 // Just copy the evaluation result. |
686 VariableElementImpl variableElement = | 670 VariableElementImpl variableElement = |
687 element.variable as VariableElementImpl; | 671 element.variable as VariableElementImpl; |
688 elementAnnotation.evaluationResult = variableElement.evaluationResult; | 672 elementAnnotation.evaluationResult = variableElement.evaluationResult; |
689 } else if (element is ConstructorElementImpl && | 673 } else if (element is ConstructorElementImpl && |
690 constNode.arguments != null) { | 674 constNode.arguments != null) { |
691 RecordingErrorListener errorListener = new RecordingErrorListener(); | 675 RecordingErrorListener errorListener = new RecordingErrorListener(); |
692 CompilationUnit sourceCompilationUnit = | 676 CompilationUnit sourceCompilationUnit = |
693 constNode.getAncestor((node) => node is CompilationUnit); | 677 constNode.getAncestor((node) => node is CompilationUnit); |
694 ErrorReporter errorReporter = | 678 ErrorReporter errorReporter = new ErrorReporter( |
695 new ErrorReporter(errorListener, sourceCompilationUnit.element.sou
rce); | 679 errorListener, sourceCompilationUnit.element.source); |
696 ConstantVisitor constantVisitor = | 680 ConstantVisitor constantVisitor = |
697 createConstantVisitor(errorReporter); | 681 createConstantVisitor(errorReporter); |
698 DartObjectImpl result = _evaluateConstructorCall( | 682 DartObjectImpl result = _evaluateConstructorCall(constNode, |
699 constNode, | 683 constNode.arguments.arguments, element, constantVisitor, |
700 constNode.arguments.arguments, | |
701 element, | |
702 constantVisitor, | |
703 errorReporter); | 684 errorReporter); |
704 elementAnnotation.evaluationResult = | 685 elementAnnotation.evaluationResult = |
705 new EvaluationResultImpl.con2(result, errorListener.errors); | 686 new EvaluationResultImpl.con2(result, errorListener.errors); |
706 } else { | 687 } else { |
707 // This may happen for invalid code (e.g. failing to pass arguments | 688 // This may happen for invalid code (e.g. failing to pass arguments |
708 // to an annotation which references a const constructor). The error | 689 // to an annotation which references a const constructor). The error |
709 // is detected elsewhere, so just silently ignore it here. | 690 // is detected elsewhere, so just silently ignore it here. |
710 elementAnnotation.evaluationResult = | 691 elementAnnotation.evaluationResult = |
711 new EvaluationResultImpl.con1(null); | 692 new EvaluationResultImpl.con1(null); |
712 } | 693 } |
713 } | 694 } |
714 } else { | 695 } else { |
715 // Should not happen. | 696 // Should not happen. |
716 AnalysisEngine.instance.logger.logError( | 697 AnalysisEngine.instance.logger.logError( |
717 "Constant value computer trying to compute the value of a node which i
s not a VariableDeclaration, InstanceCreationExpression, FormalParameter, or Con
structorDeclaration"); | 698 "Constant value computer trying to compute the value of a node which i
s not a VariableDeclaration, InstanceCreationExpression, FormalParameter, or Con
structorDeclaration"); |
718 return; | 699 return; |
719 } | 700 } |
720 } | 701 } |
721 | 702 |
722 /** | 703 /** |
723 * Evaluate a call to fromEnvironment() on the bool, int, or String class. | 704 * Evaluate a call to fromEnvironment() on the bool, int, or String class. |
724 * | 705 * |
725 * @param environmentValue Value fetched from the environment | 706 * @param environmentValue Value fetched from the environment |
726 * @param builtInDefaultValue Value that should be used as the default if no "
defaultValue" | 707 * @param builtInDefaultValue Value that should be used as the default if no "
defaultValue" |
727 * argument appears in [namedArgumentValues]. | 708 * argument appears in [namedArgumentValues]. |
728 * @param namedArgumentValues Named parameters passed to fromEnvironment() | 709 * @param namedArgumentValues Named parameters passed to fromEnvironment() |
729 * @return A [DartObjectImpl] object corresponding to the evaluated result | 710 * @return A [DartObjectImpl] object corresponding to the evaluated result |
730 */ | 711 */ |
731 DartObjectImpl _computeValueFromEnvironment(DartObject environmentValue, | 712 DartObjectImpl _computeValueFromEnvironment(DartObject environmentValue, |
732 DartObjectImpl builtInDefaultValue, HashMap<String, | 713 DartObjectImpl builtInDefaultValue, |
733 DartObjectImpl> namedArgumentValues) { | 714 HashMap<String, DartObjectImpl> namedArgumentValues) { |
734 DartObjectImpl value = environmentValue as DartObjectImpl; | 715 DartObjectImpl value = environmentValue as DartObjectImpl; |
735 if (value.isUnknown || value.isNull) { | 716 if (value.isUnknown || value.isNull) { |
736 // The name either doesn't exist in the environment or we couldn't parse | 717 // The name either doesn't exist in the environment or we couldn't parse |
737 // the corresponding value. | 718 // the corresponding value. |
738 // If the code supplied an explicit default, use it. | 719 // If the code supplied an explicit default, use it. |
739 if (namedArgumentValues.containsKey(_DEFAULT_VALUE_PARAM)) { | 720 if (namedArgumentValues.containsKey(_DEFAULT_VALUE_PARAM)) { |
740 value = namedArgumentValues[_DEFAULT_VALUE_PARAM]; | 721 value = namedArgumentValues[_DEFAULT_VALUE_PARAM]; |
741 } else if (value.isNull) { | 722 } else if (value.isNull) { |
742 // The code didn't supply an explicit default. | 723 // The code didn't supply an explicit default. |
743 // The name exists in the environment but we couldn't parse the | 724 // The name exists in the environment but we couldn't parse the |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
780 } | 761 } |
781 } | 762 } |
782 constructor = _followConstantRedirectionChain(constructor); | 763 constructor = _followConstantRedirectionChain(constructor); |
783 InterfaceType definingClass = constructor.returnType as InterfaceType; | 764 InterfaceType definingClass = constructor.returnType as InterfaceType; |
784 if (constructor.isFactory) { | 765 if (constructor.isFactory) { |
785 // We couldn't find a non-factory constructor. | 766 // We couldn't find a non-factory constructor. |
786 // See if it's because we reached an external const factory constructor | 767 // See if it's because we reached an external const factory constructor |
787 // that we can emulate. | 768 // that we can emulate. |
788 if (constructor.name == "fromEnvironment") { | 769 if (constructor.name == "fromEnvironment") { |
789 if (!_checkFromEnvironmentArguments( | 770 if (!_checkFromEnvironmentArguments( |
790 arguments, | 771 arguments, argumentValues, namedArgumentValues, definingClass)) { |
791 argumentValues, | |
792 namedArgumentValues, | |
793 definingClass)) { | |
794 errorReporter.reportErrorForNode( | 772 errorReporter.reportErrorForNode( |
795 CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, | 773 CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node); |
796 node); | |
797 return null; | 774 return null; |
798 } | 775 } |
799 String variableName = | 776 String variableName = |
800 argumentCount < 1 ? null : argumentValues[0].stringValue; | 777 argumentCount < 1 ? null : argumentValues[0].stringValue; |
801 if (identical(definingClass, typeProvider.boolType)) { | 778 if (identical(definingClass, typeProvider.boolType)) { |
802 DartObject valueFromEnvironment; | 779 DartObject valueFromEnvironment; |
803 valueFromEnvironment = | 780 valueFromEnvironment = |
804 _declaredVariables.getBool(typeProvider, variableName); | 781 _declaredVariables.getBool(typeProvider, variableName); |
805 return _computeValueFromEnvironment( | 782 return _computeValueFromEnvironment(valueFromEnvironment, |
806 valueFromEnvironment, | |
807 new DartObjectImpl(typeProvider.boolType, BoolState.FALSE_STATE), | 783 new DartObjectImpl(typeProvider.boolType, BoolState.FALSE_STATE), |
808 namedArgumentValues); | 784 namedArgumentValues); |
809 } else if (identical(definingClass, typeProvider.intType)) { | 785 } else if (identical(definingClass, typeProvider.intType)) { |
810 DartObject valueFromEnvironment; | 786 DartObject valueFromEnvironment; |
811 valueFromEnvironment = | 787 valueFromEnvironment = |
812 _declaredVariables.getInt(typeProvider, variableName); | 788 _declaredVariables.getInt(typeProvider, variableName); |
813 return _computeValueFromEnvironment( | 789 return _computeValueFromEnvironment(valueFromEnvironment, |
814 valueFromEnvironment, | |
815 new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE), | 790 new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE), |
816 namedArgumentValues); | 791 namedArgumentValues); |
817 } else if (identical(definingClass, typeProvider.stringType)) { | 792 } else if (identical(definingClass, typeProvider.stringType)) { |
818 DartObject valueFromEnvironment; | 793 DartObject valueFromEnvironment; |
819 valueFromEnvironment = | 794 valueFromEnvironment = |
820 _declaredVariables.getString(typeProvider, variableName); | 795 _declaredVariables.getString(typeProvider, variableName); |
821 return _computeValueFromEnvironment( | 796 return _computeValueFromEnvironment(valueFromEnvironment, |
822 valueFromEnvironment, | |
823 new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE), | 797 new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE), |
824 namedArgumentValues); | 798 namedArgumentValues); |
825 } | 799 } |
826 } else if (constructor.name == "" && | 800 } else if (constructor.name == "" && |
827 identical(definingClass, typeProvider.symbolType) && | 801 identical(definingClass, typeProvider.symbolType) && |
828 argumentCount == 1) { | 802 argumentCount == 1) { |
829 if (!_checkSymbolArguments( | 803 if (!_checkSymbolArguments( |
830 arguments, | 804 arguments, argumentValues, namedArgumentValues)) { |
831 argumentValues, | |
832 namedArgumentValues)) { | |
833 errorReporter.reportErrorForNode( | 805 errorReporter.reportErrorForNode( |
834 CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, | 806 CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node); |
835 node); | |
836 return null; | 807 return null; |
837 } | 808 } |
838 String argumentValue = argumentValues[0].stringValue; | 809 String argumentValue = argumentValues[0].stringValue; |
839 return new DartObjectImpl( | 810 return new DartObjectImpl( |
840 definingClass, | 811 definingClass, new SymbolState(argumentValue)); |
841 new SymbolState(argumentValue)); | |
842 } | 812 } |
843 // Either it's an external const factory constructor that we can't | 813 // Either it's an external const factory constructor that we can't |
844 // emulate, or an error occurred (a cycle, or a const constructor trying | 814 // emulate, or an error occurred (a cycle, or a const constructor trying |
845 // to delegate to a non-const constructor). | 815 // to delegate to a non-const constructor). |
846 // In the former case, the best we can do is consider it an unknown value. | 816 // In the former case, the best we can do is consider it an unknown value. |
847 // In the latter case, the error has already been reported, so considering | 817 // In the latter case, the error has already been reported, so considering |
848 // it an unknown value will suppress further errors. | 818 // it an unknown value will suppress further errors. |
849 return constantVisitor._validWithUnknownValue(definingClass); | 819 return constantVisitor._validWithUnknownValue(definingClass); |
850 } | 820 } |
851 beforeGetConstantInitializers(constructor); | 821 beforeGetConstantInitializers(constructor); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
898 // No default was provided, so the default value is null. | 868 // No default was provided, so the default value is null. |
899 argumentValue = constantVisitor.null2; | 869 argumentValue = constantVisitor.null2; |
900 } else if (evaluationResult.value != null) { | 870 } else if (evaluationResult.value != null) { |
901 argumentValue = evaluationResult.value; | 871 argumentValue = evaluationResult.value; |
902 } | 872 } |
903 } | 873 } |
904 if (argumentValue != null) { | 874 if (argumentValue != null) { |
905 if (!_runtimeTypeMatch(argumentValue, parameter.type)) { | 875 if (!_runtimeTypeMatch(argumentValue, parameter.type)) { |
906 errorReporter.reportErrorForNode( | 876 errorReporter.reportErrorForNode( |
907 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMA
TCH, | 877 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMA
TCH, |
908 errorTarget, | 878 errorTarget, [argumentValue.type, parameter.type]); |
909 [argumentValue.type, parameter.type]); | |
910 } | 879 } |
911 if (baseParameter.isInitializingFormal) { | 880 if (baseParameter.isInitializingFormal) { |
912 FieldElement field = (parameter as FieldFormalParameterElement).field; | 881 FieldElement field = (parameter as FieldFormalParameterElement).field; |
913 if (field != null) { | 882 if (field != null) { |
914 DartType fieldType = field.type; | 883 DartType fieldType = field.type; |
915 if (fieldType != parameter.type) { | 884 if (fieldType != parameter.type) { |
916 // We've already checked that the argument can be assigned to the | 885 // We've already checked that the argument can be assigned to the |
917 // parameter; we also need to check that it can be assigned to | 886 // parameter; we also need to check that it can be assigned to |
918 // the field. | 887 // the field. |
919 if (!_runtimeTypeMatch(argumentValue, fieldType)) { | 888 if (!_runtimeTypeMatch(argumentValue, fieldType)) { |
920 errorReporter.reportErrorForNode( | 889 errorReporter.reportErrorForNode( |
921 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE
_MISMATCH, | 890 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE
_MISMATCH, |
922 errorTarget, | 891 errorTarget, [argumentValue.type, fieldType]); |
923 [argumentValue.type, fieldType]); | |
924 } | 892 } |
925 } | 893 } |
926 String fieldName = field.name; | 894 String fieldName = field.name; |
927 fieldMap[fieldName] = argumentValue; | 895 fieldMap[fieldName] = argumentValue; |
928 } | 896 } |
929 } else { | 897 } else { |
930 String name = baseParameter.name; | 898 String name = baseParameter.name; |
931 parameterMap[name] = argumentValue; | 899 parameterMap[name] = argumentValue; |
932 } | 900 } |
933 } | 901 } |
(...skipping 11 matching lines...) Expand all Loading... |
945 initializerExpression.accept(initializerVisitor); | 913 initializerExpression.accept(initializerVisitor); |
946 if (evaluationResult != null) { | 914 if (evaluationResult != null) { |
947 String fieldName = constructorFieldInitializer.fieldName.name; | 915 String fieldName = constructorFieldInitializer.fieldName.name; |
948 fieldMap[fieldName] = evaluationResult; | 916 fieldMap[fieldName] = evaluationResult; |
949 PropertyAccessorElement getter = definingClass.getGetter(fieldName); | 917 PropertyAccessorElement getter = definingClass.getGetter(fieldName); |
950 if (getter != null) { | 918 if (getter != null) { |
951 PropertyInducingElement field = getter.variable; | 919 PropertyInducingElement field = getter.variable; |
952 if (!_runtimeTypeMatch(evaluationResult, field.type)) { | 920 if (!_runtimeTypeMatch(evaluationResult, field.type)) { |
953 errorReporter.reportErrorForNode( | 921 errorReporter.reportErrorForNode( |
954 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_M
ISMATCH, | 922 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_M
ISMATCH, |
955 node, | 923 node, [evaluationResult.type, fieldName, field.type]); |
956 [evaluationResult.type, fieldName, field.type]); | |
957 } | 924 } |
958 } | 925 } |
959 } | 926 } |
960 } else if (initializer is SuperConstructorInvocation) { | 927 } else if (initializer is SuperConstructorInvocation) { |
961 SuperConstructorInvocation superConstructorInvocation = initializer; | 928 SuperConstructorInvocation superConstructorInvocation = initializer; |
962 SimpleIdentifier name = superConstructorInvocation.constructorName; | 929 SimpleIdentifier name = superConstructorInvocation.constructorName; |
963 if (name != null) { | 930 if (name != null) { |
964 superName = name.name; | 931 superName = name.name; |
965 } | 932 } |
966 superArguments = superConstructorInvocation.argumentList.arguments; | 933 superArguments = superConstructorInvocation.argumentList.arguments; |
967 } else if (initializer is RedirectingConstructorInvocation) { | 934 } else if (initializer is RedirectingConstructorInvocation) { |
968 // This is a redirecting constructor, so just evaluate the constructor | 935 // This is a redirecting constructor, so just evaluate the constructor |
969 // it redirects to. | 936 // it redirects to. |
970 ConstructorElement constructor = initializer.staticElement; | 937 ConstructorElement constructor = initializer.staticElement; |
971 if (constructor != null && constructor.isConst) { | 938 if (constructor != null && constructor.isConst) { |
972 return _evaluateConstructorCall( | 939 return _evaluateConstructorCall(node, |
973 node, | 940 initializer.argumentList.arguments, constructor, |
974 initializer.argumentList.arguments, | 941 initializerVisitor, errorReporter); |
975 constructor, | |
976 initializerVisitor, | |
977 errorReporter); | |
978 } | 942 } |
979 } | 943 } |
980 } | 944 } |
981 // Evaluate explicit or implicit call to super(). | 945 // Evaluate explicit or implicit call to super(). |
982 InterfaceType superclass = definingClass.superclass; | 946 InterfaceType superclass = definingClass.superclass; |
983 if (superclass != null && !superclass.isObject) { | 947 if (superclass != null && !superclass.isObject) { |
984 ConstructorElement superConstructor = | 948 ConstructorElement superConstructor = |
985 superclass.lookUpConstructor(superName, constructor.library); | 949 superclass.lookUpConstructor(superName, constructor.library); |
986 if (superConstructor != null) { | 950 if (superConstructor != null) { |
987 if (superArguments == null) { | 951 if (superArguments == null) { |
988 superArguments = new NodeList<Expression>(null); | 952 superArguments = new NodeList<Expression>(null); |
989 } | 953 } |
990 _evaluateSuperConstructorCall( | 954 _evaluateSuperConstructorCall(node, fieldMap, superConstructor, |
991 node, | 955 superArguments, initializerVisitor, errorReporter); |
992 fieldMap, | |
993 superConstructor, | |
994 superArguments, | |
995 initializerVisitor, | |
996 errorReporter); | |
997 } | 956 } |
998 } | 957 } |
999 return new DartObjectImpl(definingClass, new GenericState(fieldMap)); | 958 return new DartObjectImpl(definingClass, new GenericState(fieldMap)); |
1000 } | 959 } |
1001 | 960 |
1002 void _evaluateSuperConstructorCall(AstNode node, HashMap<String, | 961 void _evaluateSuperConstructorCall(AstNode node, |
1003 DartObjectImpl> fieldMap, ConstructorElement superConstructor, | 962 HashMap<String, DartObjectImpl> fieldMap, |
1004 NodeList<Expression> superArguments, ConstantVisitor initializerVisitor, | 963 ConstructorElement superConstructor, NodeList<Expression> superArguments, |
1005 ErrorReporter errorReporter) { | 964 ConstantVisitor initializerVisitor, ErrorReporter errorReporter) { |
1006 if (superConstructor != null && superConstructor.isConst) { | 965 if (superConstructor != null && superConstructor.isConst) { |
1007 DartObjectImpl evaluationResult = _evaluateConstructorCall( | 966 DartObjectImpl evaluationResult = _evaluateConstructorCall(node, |
1008 node, | 967 superArguments, superConstructor, initializerVisitor, errorReporter); |
1009 superArguments, | |
1010 superConstructor, | |
1011 initializerVisitor, | |
1012 errorReporter); | |
1013 if (evaluationResult != null) { | 968 if (evaluationResult != null) { |
1014 fieldMap[GenericState.SUPERCLASS_FIELD] = evaluationResult; | 969 fieldMap[GenericState.SUPERCLASS_FIELD] = evaluationResult; |
1015 } | 970 } |
1016 } | 971 } |
1017 } | 972 } |
1018 | 973 |
1019 /** | 974 /** |
1020 * Attempt to follow the chain of factory redirections until a constructor is
reached which is not | 975 * Attempt to follow the chain of factory redirections until a constructor is
reached which is not |
1021 * a const factory constructor. | 976 * a const factory constructor. |
1022 * | 977 * |
1023 * @return the constant constructor which terminates the chain of factory redi
rections, if the | 978 * @return the constant constructor which terminates the chain of factory redi
rections, if the |
1024 * chain terminates. If there is a problem (e.g. a redirection can't b
e found, or a cycle | 979 * chain terminates. If there is a problem (e.g. a redirection can't b
e found, or a cycle |
1025 * is encountered), the chain will be followed as far as possible and
then a const factory | 980 * is encountered), the chain will be followed as far as possible and
then a const factory |
1026 * constructor will be returned. | 981 * constructor will be returned. |
1027 */ | 982 */ |
1028 ConstructorElement | 983 ConstructorElement _followConstantRedirectionChain( |
1029 _followConstantRedirectionChain(ConstructorElement constructor) { | 984 ConstructorElement constructor) { |
1030 HashSet<ConstructorElement> constructorsVisited = | 985 HashSet<ConstructorElement> constructorsVisited = |
1031 new HashSet<ConstructorElement>(); | 986 new HashSet<ConstructorElement>(); |
1032 while (constructor.isFactory) { | 987 while (constructor.isFactory) { |
1033 if (identical( | 988 if (identical( |
1034 constructor.enclosingElement.type, | 989 constructor.enclosingElement.type, typeProvider.symbolType)) { |
1035 typeProvider.symbolType)) { | |
1036 // The dart:core.Symbol has a const factory constructor that redirects | 990 // The dart:core.Symbol has a const factory constructor that redirects |
1037 // to dart:_internal.Symbol. That in turn redirects to an external | 991 // to dart:_internal.Symbol. That in turn redirects to an external |
1038 // const constructor, which we won't be able to evaluate. | 992 // const constructor, which we won't be able to evaluate. |
1039 // So stop following the chain of redirections at dart:core.Symbol, and | 993 // So stop following the chain of redirections at dart:core.Symbol, and |
1040 // let [evaluateInstanceCreationExpression] handle it specially. | 994 // let [evaluateInstanceCreationExpression] handle it specially. |
1041 break; | 995 break; |
1042 } | 996 } |
1043 constructorsVisited.add(constructor); | 997 constructorsVisited.add(constructor); |
1044 ConstructorElement redirectedConstructor = | 998 ConstructorElement redirectedConstructor = |
1045 constructor.redirectedConstructor; | 999 constructor.redirectedConstructor; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1094 if (type.isUndefined) { | 1048 if (type.isUndefined) { |
1095 return false; | 1049 return false; |
1096 } | 1050 } |
1097 return obj.type.isSubtypeOf(type); | 1051 return obj.type.isSubtypeOf(type); |
1098 } | 1052 } |
1099 | 1053 |
1100 /** | 1054 /** |
1101 * Determine whether the given string is a valid name for a public symbol (i.e
. whether it is | 1055 * Determine whether the given string is a valid name for a public symbol (i.e
. whether it is |
1102 * allowed for a call to the Symbol constructor). | 1056 * allowed for a call to the Symbol constructor). |
1103 */ | 1057 */ |
1104 static bool isValidPublicSymbol(String name) => | 1058 static bool isValidPublicSymbol(String name) => name.isEmpty || |
1105 name.isEmpty || | 1059 name == "void" || |
1106 name == "void" || | 1060 new JavaPatternMatcher(_PUBLIC_SYMBOL_PATTERN, name).matches(); |
1107 new JavaPatternMatcher(_PUBLIC_SYMBOL_PATTERN, name).matches(); | |
1108 } | 1061 } |
1109 | 1062 |
1110 /** | 1063 /** |
1111 * A `ConstantValueComputer_InitializerCloner` is an [AstCloner] that copies the | 1064 * A `ConstantValueComputer_InitializerCloner` is an [AstCloner] that copies the |
1112 * necessary information from the AST to allow const constructor initializers to | 1065 * necessary information from the AST to allow const constructor initializers to |
1113 * be evaluated. | 1066 * be evaluated. |
1114 */ | 1067 */ |
1115 class ConstantValueComputer_InitializerCloner extends AstCloner { | 1068 class ConstantValueComputer_InitializerCloner extends AstCloner { |
1116 // TODO(brianwilkerson) Investigate replacing uses of this class with uses of | 1069 // TODO(brianwilkerson) Investigate replacing uses of this class with uses of |
1117 // AstCloner and ResolutionCopier. | 1070 // AstCloner and ResolutionCopier. |
1118 | 1071 |
1119 ConstantValueComputer_InitializerCloner() : super(true); | 1072 ConstantValueComputer_InitializerCloner() : super(true); |
1120 | 1073 |
1121 @override | 1074 @override |
1122 InstanceCreationExpression | 1075 InstanceCreationExpression visitInstanceCreationExpression( |
1123 visitInstanceCreationExpression(InstanceCreationExpression node) { | 1076 InstanceCreationExpression node) { |
1124 InstanceCreationExpression expression = | 1077 InstanceCreationExpression expression = |
1125 super.visitInstanceCreationExpression(node); | 1078 super.visitInstanceCreationExpression(node); |
1126 expression.evaluationResult = node.evaluationResult; | 1079 expression.evaluationResult = node.evaluationResult; |
1127 return expression; | 1080 return expression; |
1128 } | 1081 } |
1129 | 1082 |
1130 @override | 1083 @override |
1131 RedirectingConstructorInvocation | 1084 RedirectingConstructorInvocation visitRedirectingConstructorInvocation( |
1132 visitRedirectingConstructorInvocation(RedirectingConstructorInvocation nod
e) { | 1085 RedirectingConstructorInvocation node) { |
1133 RedirectingConstructorInvocation invocation = | 1086 RedirectingConstructorInvocation invocation = |
1134 super.visitRedirectingConstructorInvocation(node); | 1087 super.visitRedirectingConstructorInvocation(node); |
1135 invocation.staticElement = node.staticElement; | 1088 invocation.staticElement = node.staticElement; |
1136 return invocation; | 1089 return invocation; |
1137 } | 1090 } |
1138 | 1091 |
1139 @override | 1092 @override |
1140 SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) { | 1093 SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) { |
1141 SimpleIdentifier identifier = super.visitSimpleIdentifier(node); | 1094 SimpleIdentifier identifier = super.visitSimpleIdentifier(node); |
1142 identifier.staticElement = node.staticElement; | 1095 identifier.staticElement = node.staticElement; |
1143 return identifier; | 1096 return identifier; |
1144 } | 1097 } |
1145 | 1098 |
1146 @override | 1099 @override |
1147 SuperConstructorInvocation | 1100 SuperConstructorInvocation visitSuperConstructorInvocation( |
1148 visitSuperConstructorInvocation(SuperConstructorInvocation node) { | 1101 SuperConstructorInvocation node) { |
1149 SuperConstructorInvocation invocation = | 1102 SuperConstructorInvocation invocation = |
1150 super.visitSuperConstructorInvocation(node); | 1103 super.visitSuperConstructorInvocation(node); |
1151 invocation.staticElement = node.staticElement; | 1104 invocation.staticElement = node.staticElement; |
1152 return invocation; | 1105 return invocation; |
1153 } | 1106 } |
1154 } | 1107 } |
1155 | 1108 |
1156 /** | 1109 /** |
1157 * Instances of the class `ConstantVisitor` evaluate constant expressions to pro
duce their | 1110 * Instances of the class `ConstantVisitor` evaluate constant expressions to pro
duce their |
1158 * compile-time value. According to the Dart Language Specification: <blockquote
> A constant | 1111 * compile-time value. According to the Dart Language Specification: <blockquote
> A constant |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1232 new DartObjectComputer(_errorReporter, _typeProvider); | 1185 new DartObjectComputer(_errorReporter, _typeProvider); |
1233 } | 1186 } |
1234 | 1187 |
1235 /** | 1188 /** |
1236 * Initialize a newly created constant visitor. | 1189 * Initialize a newly created constant visitor. |
1237 * | 1190 * |
1238 * @param typeProvider the type provider used to access known types | 1191 * @param typeProvider the type provider used to access known types |
1239 * @param lexicalEnvironment values which should override simpleIdentifiers, o
r null if no | 1192 * @param lexicalEnvironment values which should override simpleIdentifiers, o
r null if no |
1240 * overriding is necessary. | 1193 * overriding is necessary. |
1241 */ | 1194 */ |
1242 ConstantVisitor.con2(this._typeProvider, HashMap<String, | 1195 ConstantVisitor.con2(this._typeProvider, |
1243 DartObjectImpl> lexicalEnvironment, this._errorReporter) { | 1196 HashMap<String, DartObjectImpl> lexicalEnvironment, this._errorReporter) { |
1244 this._lexicalEnvironment = lexicalEnvironment; | 1197 this._lexicalEnvironment = lexicalEnvironment; |
1245 this._dartObjectComputer = | 1198 this._dartObjectComputer = |
1246 new DartObjectComputer(_errorReporter, _typeProvider); | 1199 new DartObjectComputer(_errorReporter, _typeProvider); |
1247 } | 1200 } |
1248 | 1201 |
1249 /** | 1202 /** |
1250 * Return an object representing the value 'null'. | 1203 * Return an object representing the value 'null'. |
1251 * | 1204 * |
1252 * @return an object representing the value 'null' | 1205 * @return an object representing the value 'null' |
1253 */ | 1206 */ |
1254 DartObjectImpl get null2 { | 1207 DartObjectImpl get null2 { |
1255 if (_nullObject == null) { | 1208 if (_nullObject == null) { |
1256 _nullObject = | 1209 _nullObject = |
1257 new DartObjectImpl(_typeProvider.nullType, NullState.NULL_STATE); | 1210 new DartObjectImpl(_typeProvider.nullType, NullState.NULL_STATE); |
1258 } | 1211 } |
1259 return _nullObject; | 1212 return _nullObject; |
1260 } | 1213 } |
1261 | 1214 |
1262 /** | 1215 /** |
1263 * This method is called just before retrieving an evaluation result from an A
ST node. Unit tests | 1216 * This method is called just before retrieving an evaluation result from an A
ST node. Unit tests |
1264 * will override it to introduce additional error checking. | 1217 * will override it to introduce additional error checking. |
1265 */ | 1218 */ |
1266 void beforeGetEvaluationResult(AstNode node) { | 1219 void beforeGetEvaluationResult(AstNode node) {} |
1267 } | |
1268 | 1220 |
1269 /** | 1221 /** |
1270 * Return `true` if the given [element] represents the `length` getter in | 1222 * Return `true` if the given [element] represents the `length` getter in |
1271 * class [String]. | 1223 * class [String]. |
1272 */ | 1224 */ |
1273 bool isStringLength(Element element) { | 1225 bool isStringLength(Element element) { |
1274 if (element is PropertyAccessorElement) { | 1226 if (element is PropertyAccessorElement) { |
1275 if (element.isGetter && element.name == 'length') { | 1227 if (element.isGetter && element.name == 'length') { |
1276 return element.enclosingElement == _typeProvider.stringType.element; | 1228 return element.enclosingElement == _typeProvider.stringType.element; |
1277 } | 1229 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1319 } else if (operatorType == TokenType.BAR_BAR) { | 1271 } else if (operatorType == TokenType.BAR_BAR) { |
1320 return _dartObjectComputer.logicalOr(node, leftResult, rightResult); | 1272 return _dartObjectComputer.logicalOr(node, leftResult, rightResult); |
1321 } else if (operatorType == TokenType.CARET) { | 1273 } else if (operatorType == TokenType.CARET) { |
1322 return _dartObjectComputer.bitXor(node, leftResult, rightResult); | 1274 return _dartObjectComputer.bitXor(node, leftResult, rightResult); |
1323 } else if (operatorType == TokenType.EQ_EQ) { | 1275 } else if (operatorType == TokenType.EQ_EQ) { |
1324 return _dartObjectComputer.equalEqual(node, leftResult, rightResult); | 1276 return _dartObjectComputer.equalEqual(node, leftResult, rightResult); |
1325 } else if (operatorType == TokenType.GT) { | 1277 } else if (operatorType == TokenType.GT) { |
1326 return _dartObjectComputer.greaterThan(node, leftResult, rightResult); | 1278 return _dartObjectComputer.greaterThan(node, leftResult, rightResult); |
1327 } else if (operatorType == TokenType.GT_EQ) { | 1279 } else if (operatorType == TokenType.GT_EQ) { |
1328 return _dartObjectComputer.greaterThanOrEqual( | 1280 return _dartObjectComputer.greaterThanOrEqual( |
1329 node, | 1281 node, leftResult, rightResult); |
1330 leftResult, | |
1331 rightResult); | |
1332 } else if (operatorType == TokenType.GT_GT) { | 1282 } else if (operatorType == TokenType.GT_GT) { |
1333 return _dartObjectComputer.shiftRight(node, leftResult, rightResult); | 1283 return _dartObjectComputer.shiftRight(node, leftResult, rightResult); |
1334 } else if (operatorType == TokenType.LT) { | 1284 } else if (operatorType == TokenType.LT) { |
1335 return _dartObjectComputer.lessThan(node, leftResult, rightResult); | 1285 return _dartObjectComputer.lessThan(node, leftResult, rightResult); |
1336 } else if (operatorType == TokenType.LT_EQ) { | 1286 } else if (operatorType == TokenType.LT_EQ) { |
1337 return _dartObjectComputer.lessThanOrEqual( | 1287 return _dartObjectComputer.lessThanOrEqual( |
1338 node, | 1288 node, leftResult, rightResult); |
1339 leftResult, | |
1340 rightResult); | |
1341 } else if (operatorType == TokenType.LT_LT) { | 1289 } else if (operatorType == TokenType.LT_LT) { |
1342 return _dartObjectComputer.shiftLeft(node, leftResult, rightResult); | 1290 return _dartObjectComputer.shiftLeft(node, leftResult, rightResult); |
1343 } else if (operatorType == TokenType.MINUS) { | 1291 } else if (operatorType == TokenType.MINUS) { |
1344 return _dartObjectComputer.minus(node, leftResult, rightResult); | 1292 return _dartObjectComputer.minus(node, leftResult, rightResult); |
1345 } else if (operatorType == TokenType.PERCENT) { | 1293 } else if (operatorType == TokenType.PERCENT) { |
1346 return _dartObjectComputer.remainder(node, leftResult, rightResult); | 1294 return _dartObjectComputer.remainder(node, leftResult, rightResult); |
1347 } else if (operatorType == TokenType.PLUS) { | 1295 } else if (operatorType == TokenType.PLUS) { |
1348 return _dartObjectComputer.add(node, leftResult, rightResult); | 1296 return _dartObjectComputer.add(node, leftResult, rightResult); |
1349 } else if (operatorType == TokenType.STAR) { | 1297 } else if (operatorType == TokenType.STAR) { |
1350 return _dartObjectComputer.times(node, leftResult, rightResult); | 1298 return _dartObjectComputer.times(node, leftResult, rightResult); |
(...skipping 17 matching lines...) Expand all Loading... |
1368 @override | 1316 @override |
1369 DartObjectImpl visitConditionalExpression(ConditionalExpression node) { | 1317 DartObjectImpl visitConditionalExpression(ConditionalExpression node) { |
1370 Expression condition = node.condition; | 1318 Expression condition = node.condition; |
1371 DartObjectImpl conditionResult = condition.accept(this); | 1319 DartObjectImpl conditionResult = condition.accept(this); |
1372 DartObjectImpl thenResult = node.thenExpression.accept(this); | 1320 DartObjectImpl thenResult = node.thenExpression.accept(this); |
1373 DartObjectImpl elseResult = node.elseExpression.accept(this); | 1321 DartObjectImpl elseResult = node.elseExpression.accept(this); |
1374 if (conditionResult == null) { | 1322 if (conditionResult == null) { |
1375 return conditionResult; | 1323 return conditionResult; |
1376 } else if (!conditionResult.isBool) { | 1324 } else if (!conditionResult.isBool) { |
1377 _errorReporter.reportErrorForNode( | 1325 _errorReporter.reportErrorForNode( |
1378 CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, | 1326 CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, condition); |
1379 condition); | |
1380 return null; | 1327 return null; |
1381 } else if (thenResult == null) { | 1328 } else if (thenResult == null) { |
1382 return thenResult; | 1329 return thenResult; |
1383 } else if (elseResult == null) { | 1330 } else if (elseResult == null) { |
1384 return elseResult; | 1331 return elseResult; |
1385 } | 1332 } |
1386 conditionResult = | 1333 conditionResult = |
1387 _dartObjectComputer.applyBooleanConversion(condition, conditionResult); | 1334 _dartObjectComputer.applyBooleanConversion(condition, conditionResult); |
1388 if (conditionResult == null) { | 1335 if (conditionResult == null) { |
1389 return conditionResult; | 1336 return conditionResult; |
1390 } | 1337 } |
1391 if (conditionResult.isTrue) { | 1338 if (conditionResult.isTrue) { |
1392 return thenResult; | 1339 return thenResult; |
1393 } else if (conditionResult.isFalse) { | 1340 } else if (conditionResult.isFalse) { |
1394 return elseResult; | 1341 return elseResult; |
1395 } | 1342 } |
1396 ParameterizedType thenType = thenResult.type; | 1343 ParameterizedType thenType = thenResult.type; |
1397 ParameterizedType elseType = elseResult.type; | 1344 ParameterizedType elseType = elseResult.type; |
1398 return _validWithUnknownValue( | 1345 return _validWithUnknownValue( |
1399 thenType.getLeastUpperBound(elseType) as InterfaceType); | 1346 thenType.getLeastUpperBound(elseType) as InterfaceType); |
1400 } | 1347 } |
1401 | 1348 |
1402 @override | 1349 @override |
1403 DartObjectImpl visitDoubleLiteral(DoubleLiteral node) => | 1350 DartObjectImpl visitDoubleLiteral(DoubleLiteral node) => |
1404 new DartObjectImpl(_typeProvider.doubleType, new DoubleState(node.value)); | 1351 new DartObjectImpl(_typeProvider.doubleType, new DoubleState(node.value)); |
1405 | 1352 |
1406 @override | 1353 @override |
1407 DartObjectImpl | 1354 DartObjectImpl visitInstanceCreationExpression( |
1408 visitInstanceCreationExpression(InstanceCreationExpression node) { | 1355 InstanceCreationExpression node) { |
1409 if (!node.isConst) { | 1356 if (!node.isConst) { |
1410 // TODO(brianwilkerson) Figure out which error to report. | 1357 // TODO(brianwilkerson) Figure out which error to report. |
1411 _error(node, null); | 1358 _error(node, null); |
1412 return null; | 1359 return null; |
1413 } | 1360 } |
1414 beforeGetEvaluationResult(node); | 1361 beforeGetEvaluationResult(node); |
1415 EvaluationResultImpl result = node.evaluationResult; | 1362 EvaluationResultImpl result = node.evaluationResult; |
1416 if (result != null) { | 1363 if (result != null) { |
1417 return result.value; | 1364 return result.value; |
1418 } | 1365 } |
(...skipping 17 matching lines...) Expand all Loading... |
1436 } | 1383 } |
1437 | 1384 |
1438 @override | 1385 @override |
1439 DartObjectImpl visitInterpolationString(InterpolationString node) => | 1386 DartObjectImpl visitInterpolationString(InterpolationString node) => |
1440 new DartObjectImpl(_typeProvider.stringType, new StringState(node.value)); | 1387 new DartObjectImpl(_typeProvider.stringType, new StringState(node.value)); |
1441 | 1388 |
1442 @override | 1389 @override |
1443 DartObjectImpl visitListLiteral(ListLiteral node) { | 1390 DartObjectImpl visitListLiteral(ListLiteral node) { |
1444 if (node.constKeyword == null) { | 1391 if (node.constKeyword == null) { |
1445 _errorReporter.reportErrorForNode( | 1392 _errorReporter.reportErrorForNode( |
1446 CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL, | 1393 CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL, node); |
1447 node); | |
1448 return null; | 1394 return null; |
1449 } | 1395 } |
1450 bool errorOccurred = false; | 1396 bool errorOccurred = false; |
1451 List<DartObjectImpl> elements = new List<DartObjectImpl>(); | 1397 List<DartObjectImpl> elements = new List<DartObjectImpl>(); |
1452 for (Expression element in node.elements) { | 1398 for (Expression element in node.elements) { |
1453 DartObjectImpl elementResult = element.accept(this); | 1399 DartObjectImpl elementResult = element.accept(this); |
1454 if (elementResult == null) { | 1400 if (elementResult == null) { |
1455 errorOccurred = true; | 1401 errorOccurred = true; |
1456 } else { | 1402 } else { |
1457 elements.add(elementResult); | 1403 elements.add(elementResult); |
(...skipping 11 matching lines...) Expand all Loading... |
1469 } | 1415 } |
1470 } | 1416 } |
1471 InterfaceType listType = _typeProvider.listType.substitute4([elementType]); | 1417 InterfaceType listType = _typeProvider.listType.substitute4([elementType]); |
1472 return new DartObjectImpl(listType, new ListState(elements)); | 1418 return new DartObjectImpl(listType, new ListState(elements)); |
1473 } | 1419 } |
1474 | 1420 |
1475 @override | 1421 @override |
1476 DartObjectImpl visitMapLiteral(MapLiteral node) { | 1422 DartObjectImpl visitMapLiteral(MapLiteral node) { |
1477 if (node.constKeyword == null) { | 1423 if (node.constKeyword == null) { |
1478 _errorReporter.reportErrorForNode( | 1424 _errorReporter.reportErrorForNode( |
1479 CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL, | 1425 CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL, node); |
1480 node); | |
1481 return null; | 1426 return null; |
1482 } | 1427 } |
1483 bool errorOccurred = false; | 1428 bool errorOccurred = false; |
1484 HashMap<DartObjectImpl, DartObjectImpl> map = | 1429 HashMap<DartObjectImpl, DartObjectImpl> map = |
1485 new HashMap<DartObjectImpl, DartObjectImpl>(); | 1430 new HashMap<DartObjectImpl, DartObjectImpl>(); |
1486 for (MapLiteralEntry entry in node.entries) { | 1431 for (MapLiteralEntry entry in node.entries) { |
1487 DartObjectImpl keyResult = entry.key.accept(this); | 1432 DartObjectImpl keyResult = entry.key.accept(this); |
1488 DartObjectImpl valueResult = entry.value.accept(this); | 1433 DartObjectImpl valueResult = entry.value.accept(this); |
1489 if (keyResult == null || valueResult == null) { | 1434 if (keyResult == null || valueResult == null) { |
1490 errorOccurred = true; | 1435 errorOccurred = true; |
(...skipping 30 matching lines...) Expand all Loading... |
1521 if (function.name == "identical") { | 1466 if (function.name == "identical") { |
1522 NodeList<Expression> arguments = node.argumentList.arguments; | 1467 NodeList<Expression> arguments = node.argumentList.arguments; |
1523 if (arguments.length == 2) { | 1468 if (arguments.length == 2) { |
1524 Element enclosingElement = function.enclosingElement; | 1469 Element enclosingElement = function.enclosingElement; |
1525 if (enclosingElement is CompilationUnitElement) { | 1470 if (enclosingElement is CompilationUnitElement) { |
1526 LibraryElement library = enclosingElement.library; | 1471 LibraryElement library = enclosingElement.library; |
1527 if (library.isDartCore) { | 1472 if (library.isDartCore) { |
1528 DartObjectImpl leftArgument = arguments[0].accept(this); | 1473 DartObjectImpl leftArgument = arguments[0].accept(this); |
1529 DartObjectImpl rightArgument = arguments[1].accept(this); | 1474 DartObjectImpl rightArgument = arguments[1].accept(this); |
1530 return _dartObjectComputer.isIdentical( | 1475 return _dartObjectComputer.isIdentical( |
1531 node, | 1476 node, leftArgument, rightArgument); |
1532 leftArgument, | |
1533 rightArgument); | |
1534 } | 1477 } |
1535 } | 1478 } |
1536 } | 1479 } |
1537 } | 1480 } |
1538 } | 1481 } |
1539 // TODO(brianwilkerson) Figure out which error to report. | 1482 // TODO(brianwilkerson) Figure out which error to report. |
1540 _error(node, null); | 1483 _error(node, null); |
1541 return null; | 1484 return null; |
1542 } | 1485 } |
1543 | 1486 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1649 DartObjectImpl visitSymbolLiteral(SymbolLiteral node) { | 1592 DartObjectImpl visitSymbolLiteral(SymbolLiteral node) { |
1650 StringBuffer buffer = new StringBuffer(); | 1593 StringBuffer buffer = new StringBuffer(); |
1651 List<Token> components = node.components; | 1594 List<Token> components = node.components; |
1652 for (int i = 0; i < components.length; i++) { | 1595 for (int i = 0; i < components.length; i++) { |
1653 if (i > 0) { | 1596 if (i > 0) { |
1654 buffer.writeCharCode(0x2E); | 1597 buffer.writeCharCode(0x2E); |
1655 } | 1598 } |
1656 buffer.write(components[i].lexeme); | 1599 buffer.write(components[i].lexeme); |
1657 } | 1600 } |
1658 return new DartObjectImpl( | 1601 return new DartObjectImpl( |
1659 _typeProvider.symbolType, | 1602 _typeProvider.symbolType, new SymbolState(buffer.toString())); |
1660 new SymbolState(buffer.toString())); | |
1661 } | 1603 } |
1662 | 1604 |
1663 /** | 1605 /** |
1664 * Create an error associated with the given node. | 1606 * Create an error associated with the given node. |
1665 * | 1607 * |
1666 * @param node the AST node associated with the error | 1608 * @param node the AST node associated with the error |
1667 * @param code the error code indicating the nature of the error | 1609 * @param code the error code indicating the nature of the error |
1668 */ | 1610 */ |
1669 void _error(AstNode node, ErrorCode code) { | 1611 void _error(AstNode node, ErrorCode code) { |
1670 _errorReporter.reportErrorForNode( | 1612 _errorReporter.reportErrorForNode( |
1671 code == null ? CompileTimeErrorCode.INVALID_CONSTANT : code, | 1613 code == null ? CompileTimeErrorCode.INVALID_CONSTANT : code, node); |
1672 node); | |
1673 } | 1614 } |
1674 | 1615 |
1675 /** | 1616 /** |
1676 * Return the constant value of the static constant represented by the given e
lement. | 1617 * Return the constant value of the static constant represented by the given e
lement. |
1677 * | 1618 * |
1678 * @param node the node to be used if an error needs to be reported | 1619 * @param node the node to be used if an error needs to be reported |
1679 * @param element the element whose value is to be returned | 1620 * @param element the element whose value is to be returned |
1680 * @return the constant value of the static constant | 1621 * @return the constant value of the static constant |
1681 */ | 1622 */ |
1682 DartObjectImpl _getConstantValue(AstNode node, Element element) { | 1623 DartObjectImpl _getConstantValue(AstNode node, Element element) { |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1851 } | 1792 } |
1852 return null; | 1793 return null; |
1853 } | 1794 } |
1854 | 1795 |
1855 /** | 1796 /** |
1856 * Return the result of applying boolean conversion to this result. | 1797 * Return the result of applying boolean conversion to this result. |
1857 * | 1798 * |
1858 * @param node the node against which errors should be reported | 1799 * @param node the node against which errors should be reported |
1859 * @return the result of applying boolean conversion to the given value | 1800 * @return the result of applying boolean conversion to the given value |
1860 */ | 1801 */ |
1861 DartObjectImpl applyBooleanConversion(AstNode node, | 1802 DartObjectImpl applyBooleanConversion( |
1862 DartObjectImpl evaluationResult) { | 1803 AstNode node, DartObjectImpl evaluationResult) { |
1863 if (evaluationResult != null) { | 1804 if (evaluationResult != null) { |
1864 try { | 1805 try { |
1865 return evaluationResult.convertToBool(_typeProvider); | 1806 return evaluationResult.convertToBool(_typeProvider); |
1866 } on EvaluationException catch (exception) { | 1807 } on EvaluationException catch (exception) { |
1867 _errorReporter.reportErrorForNode(exception.errorCode, node); | 1808 _errorReporter.reportErrorForNode(exception.errorCode, node); |
1868 } | 1809 } |
1869 } | 1810 } |
1870 return null; | 1811 return null; |
1871 } | 1812 } |
1872 | 1813 |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2088 if (leftOperand != null && rightOperand != null) { | 2029 if (leftOperand != null && rightOperand != null) { |
2089 try { | 2030 try { |
2090 return leftOperand.notEqual(_typeProvider, rightOperand); | 2031 return leftOperand.notEqual(_typeProvider, rightOperand); |
2091 } on EvaluationException catch (exception) { | 2032 } on EvaluationException catch (exception) { |
2092 _errorReporter.reportErrorForNode(exception.errorCode, node); | 2033 _errorReporter.reportErrorForNode(exception.errorCode, node); |
2093 } | 2034 } |
2094 } | 2035 } |
2095 return null; | 2036 return null; |
2096 } | 2037 } |
2097 | 2038 |
2098 DartObjectImpl performToString(AstNode node, | 2039 DartObjectImpl performToString( |
2099 DartObjectImpl evaluationResult) { | 2040 AstNode node, DartObjectImpl evaluationResult) { |
2100 if (evaluationResult != null) { | 2041 if (evaluationResult != null) { |
2101 try { | 2042 try { |
2102 return evaluationResult.performToString(_typeProvider); | 2043 return evaluationResult.performToString(_typeProvider); |
2103 } on EvaluationException catch (exception) { | 2044 } on EvaluationException catch (exception) { |
2104 _errorReporter.reportErrorForNode(exception.errorCode, node); | 2045 _errorReporter.reportErrorForNode(exception.errorCode, node); |
2105 } | 2046 } |
2106 } | 2047 } |
2107 return null; | 2048 return null; |
2108 } | 2049 } |
2109 | 2050 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2142 } | 2083 } |
2143 return null; | 2084 return null; |
2144 } | 2085 } |
2145 | 2086 |
2146 /** | 2087 /** |
2147 * Return the result of invoking the 'length' getter on this result. | 2088 * Return the result of invoking the 'length' getter on this result. |
2148 * | 2089 * |
2149 * @param node the node against which errors should be reported | 2090 * @param node the node against which errors should be reported |
2150 * @return the result of invoking the 'length' getter on this result | 2091 * @return the result of invoking the 'length' getter on this result |
2151 */ | 2092 */ |
2152 EvaluationResultImpl stringLength(Expression node, | 2093 EvaluationResultImpl stringLength( |
2153 EvaluationResultImpl evaluationResult) { | 2094 Expression node, EvaluationResultImpl evaluationResult) { |
2154 if (evaluationResult.value != null) { | 2095 if (evaluationResult.value != null) { |
2155 try { | 2096 try { |
2156 return new EvaluationResultImpl.con1( | 2097 return new EvaluationResultImpl.con1( |
2157 evaluationResult.value.stringLength(_typeProvider)); | 2098 evaluationResult.value.stringLength(_typeProvider)); |
2158 } on EvaluationException catch (exception) { | 2099 } on EvaluationException catch (exception) { |
2159 _errorReporter.reportErrorForNode(exception.errorCode, node); | 2100 _errorReporter.reportErrorForNode(exception.errorCode, node); |
2160 } | 2101 } |
2161 } | 2102 } |
2162 return new EvaluationResultImpl.con1(null); | 2103 return new EvaluationResultImpl.con1(null); |
2163 } | 2104 } |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2316 } | 2257 } |
2317 | 2258 |
2318 /** | 2259 /** |
2319 * Return the result of invoking the '&' operator on this object with the give
n argument. | 2260 * Return the result of invoking the '&' operator on this object with the give
n argument. |
2320 * | 2261 * |
2321 * @param typeProvider the type provider used to find known types | 2262 * @param typeProvider the type provider used to find known types |
2322 * @param rightOperand the right-hand operand of the operation | 2263 * @param rightOperand the right-hand operand of the operation |
2323 * @return the result of invoking the '&' operator on this object with the giv
en argument | 2264 * @return the result of invoking the '&' operator on this object with the giv
en argument |
2324 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2265 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2325 */ | 2266 */ |
2326 DartObjectImpl bitAnd(TypeProvider typeProvider, | 2267 DartObjectImpl bitAnd( |
2327 DartObjectImpl rightOperand) => | 2268 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2328 new DartObjectImpl(typeProvider.intType, _state.bitAnd(rightOperand._state
)); | 2269 new DartObjectImpl( |
| 2270 typeProvider.intType, _state.bitAnd(rightOperand._state)); |
2329 | 2271 |
2330 /** | 2272 /** |
2331 * Return the result of invoking the '~' operator on this object. | 2273 * Return the result of invoking the '~' operator on this object. |
2332 * | 2274 * |
2333 * @param typeProvider the type provider used to find known types | 2275 * @param typeProvider the type provider used to find known types |
2334 * @return the result of invoking the '~' operator on this object | 2276 * @return the result of invoking the '~' operator on this object |
2335 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2277 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2336 */ | 2278 */ |
2337 DartObjectImpl bitNot(TypeProvider typeProvider) => | 2279 DartObjectImpl bitNot(TypeProvider typeProvider) => |
2338 new DartObjectImpl(typeProvider.intType, _state.bitNot()); | 2280 new DartObjectImpl(typeProvider.intType, _state.bitNot()); |
2339 | 2281 |
2340 /** | 2282 /** |
2341 * Return the result of invoking the '|' operator on this object with the give
n argument. | 2283 * Return the result of invoking the '|' operator on this object with the give
n argument. |
2342 * | 2284 * |
2343 * @param typeProvider the type provider used to find known types | 2285 * @param typeProvider the type provider used to find known types |
2344 * @param rightOperand the right-hand operand of the operation | 2286 * @param rightOperand the right-hand operand of the operation |
2345 * @return the result of invoking the '|' operator on this object with the giv
en argument | 2287 * @return the result of invoking the '|' operator on this object with the giv
en argument |
2346 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2288 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2347 */ | 2289 */ |
2348 DartObjectImpl bitOr(TypeProvider typeProvider, | 2290 DartObjectImpl bitOr( |
2349 DartObjectImpl rightOperand) => | 2291 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2350 new DartObjectImpl(typeProvider.intType, _state.bitOr(rightOperand._state)
); | 2292 new DartObjectImpl( |
| 2293 typeProvider.intType, _state.bitOr(rightOperand._state)); |
2351 | 2294 |
2352 /** | 2295 /** |
2353 * Return the result of invoking the '^' operator on this object with the give
n argument. | 2296 * Return the result of invoking the '^' operator on this object with the give
n argument. |
2354 * | 2297 * |
2355 * @param typeProvider the type provider used to find known types | 2298 * @param typeProvider the type provider used to find known types |
2356 * @param rightOperand the right-hand operand of the operation | 2299 * @param rightOperand the right-hand operand of the operation |
2357 * @return the result of invoking the '^' operator on this object with the giv
en argument | 2300 * @return the result of invoking the '^' operator on this object with the giv
en argument |
2358 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2301 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2359 */ | 2302 */ |
2360 DartObjectImpl bitXor(TypeProvider typeProvider, | 2303 DartObjectImpl bitXor( |
2361 DartObjectImpl rightOperand) => | 2304 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2362 new DartObjectImpl(typeProvider.intType, _state.bitXor(rightOperand._state
)); | 2305 new DartObjectImpl( |
| 2306 typeProvider.intType, _state.bitXor(rightOperand._state)); |
2363 | 2307 |
2364 /** | 2308 /** |
2365 * Return the result of invoking the ' ' operator on this object with the give
n argument. | 2309 * Return the result of invoking the ' ' operator on this object with the give
n argument. |
2366 * | 2310 * |
2367 * @param typeProvider the type provider used to find known types | 2311 * @param typeProvider the type provider used to find known types |
2368 * @param rightOperand the right-hand operand of the operation | 2312 * @param rightOperand the right-hand operand of the operation |
2369 * @return the result of invoking the ' ' operator on this object with the giv
en argument | 2313 * @return the result of invoking the ' ' operator on this object with the giv
en argument |
2370 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2314 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2371 */ | 2315 */ |
2372 DartObjectImpl concatenate(TypeProvider typeProvider, | 2316 DartObjectImpl concatenate( |
2373 DartObjectImpl rightOperand) => | 2317 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2374 new DartObjectImpl( | 2318 new DartObjectImpl( |
2375 typeProvider.stringType, | 2319 typeProvider.stringType, _state.concatenate(rightOperand._state)); |
2376 _state.concatenate(rightOperand._state)); | |
2377 | 2320 |
2378 /** | 2321 /** |
2379 * Return the result of applying boolean conversion to this object. | 2322 * Return the result of applying boolean conversion to this object. |
2380 * | 2323 * |
2381 * @param typeProvider the type provider used to find known types | 2324 * @param typeProvider the type provider used to find known types |
2382 * @return the result of applying boolean conversion to this object | 2325 * @return the result of applying boolean conversion to this object |
2383 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2326 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2384 */ | 2327 */ |
2385 DartObjectImpl convertToBool(TypeProvider typeProvider) { | 2328 DartObjectImpl convertToBool(TypeProvider typeProvider) { |
2386 InterfaceType boolType = typeProvider.boolType; | 2329 InterfaceType boolType = typeProvider.boolType; |
2387 if (identical(type, boolType)) { | 2330 if (identical(type, boolType)) { |
2388 return this; | 2331 return this; |
2389 } | 2332 } |
2390 return new DartObjectImpl(boolType, _state.convertToBool()); | 2333 return new DartObjectImpl(boolType, _state.convertToBool()); |
2391 } | 2334 } |
2392 | 2335 |
2393 /** | 2336 /** |
2394 * Return the result of invoking the '/' operator on this object with the give
n argument. | 2337 * Return the result of invoking the '/' operator on this object with the give
n argument. |
2395 * | 2338 * |
2396 * @param typeProvider the type provider used to find known types | 2339 * @param typeProvider the type provider used to find known types |
2397 * @param rightOperand the right-hand operand of the operation | 2340 * @param rightOperand the right-hand operand of the operation |
2398 * @return the result of invoking the '/' operator on this object with the giv
en argument | 2341 * @return the result of invoking the '/' operator on this object with the giv
en argument |
2399 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2342 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2400 */ | 2343 */ |
2401 DartObjectImpl divide(TypeProvider typeProvider, | 2344 DartObjectImpl divide( |
2402 DartObjectImpl rightOperand) { | 2345 TypeProvider typeProvider, DartObjectImpl rightOperand) { |
2403 InstanceState result = _state.divide(rightOperand._state); | 2346 InstanceState result = _state.divide(rightOperand._state); |
2404 if (result is IntState) { | 2347 if (result is IntState) { |
2405 return new DartObjectImpl(typeProvider.intType, result); | 2348 return new DartObjectImpl(typeProvider.intType, result); |
2406 } else if (result is DoubleState) { | 2349 } else if (result is DoubleState) { |
2407 return new DartObjectImpl(typeProvider.doubleType, result); | 2350 return new DartObjectImpl(typeProvider.doubleType, result); |
2408 } else if (result is NumState) { | 2351 } else if (result is NumState) { |
2409 return new DartObjectImpl(typeProvider.numType, result); | 2352 return new DartObjectImpl(typeProvider.numType, result); |
2410 } | 2353 } |
2411 // We should never get here. | 2354 // We should never get here. |
2412 throw new IllegalStateException("divide returned a ${result.runtimeType}"); | 2355 throw new IllegalStateException("divide returned a ${result.runtimeType}"); |
2413 } | 2356 } |
2414 | 2357 |
2415 /** | 2358 /** |
2416 * Return the result of invoking the '==' operator on this object with the giv
en argument. | 2359 * Return the result of invoking the '==' operator on this object with the giv
en argument. |
2417 * | 2360 * |
2418 * @param typeProvider the type provider used to find known types | 2361 * @param typeProvider the type provider used to find known types |
2419 * @param rightOperand the right-hand operand of the operation | 2362 * @param rightOperand the right-hand operand of the operation |
2420 * @return the result of invoking the '==' operator on this object with the gi
ven argument | 2363 * @return the result of invoking the '==' operator on this object with the gi
ven argument |
2421 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2364 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2422 */ | 2365 */ |
2423 DartObjectImpl equalEqual(TypeProvider typeProvider, | 2366 DartObjectImpl equalEqual( |
2424 DartObjectImpl rightOperand) { | 2367 TypeProvider typeProvider, DartObjectImpl rightOperand) { |
2425 if (type != rightOperand.type) { | 2368 if (type != rightOperand.type) { |
2426 String typeName = type.name; | 2369 String typeName = type.name; |
2427 if (!(typeName == "bool" || | 2370 if (!(typeName == "bool" || |
2428 typeName == "double" || | 2371 typeName == "double" || |
2429 typeName == "int" || | 2372 typeName == "int" || |
2430 typeName == "num" || | 2373 typeName == "num" || |
2431 typeName == "String" || | 2374 typeName == "String" || |
2432 typeName == "Null" || | 2375 typeName == "Null" || |
2433 type.isDynamic)) { | 2376 type.isDynamic)) { |
2434 throw new EvaluationException( | 2377 throw new EvaluationException( |
2435 CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING); | 2378 CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING); |
2436 } | 2379 } |
2437 } | 2380 } |
2438 return new DartObjectImpl( | 2381 return new DartObjectImpl( |
2439 typeProvider.boolType, | 2382 typeProvider.boolType, _state.equalEqual(rightOperand._state)); |
2440 _state.equalEqual(rightOperand._state)); | |
2441 } | 2383 } |
2442 | 2384 |
2443 /** | 2385 /** |
2444 * Return the result of invoking the '>' operator on this object with the g
iven argument. | 2386 * Return the result of invoking the '>' operator on this object with the g
iven argument. |
2445 * | 2387 * |
2446 * @param typeProvider the type provider used to find known types | 2388 * @param typeProvider the type provider used to find known types |
2447 * @param rightOperand the right-hand operand of the operation | 2389 * @param rightOperand the right-hand operand of the operation |
2448 * @return the result of invoking the '>' operator on this object with the
given argument | 2390 * @return the result of invoking the '>' operator on this object with the
given argument |
2449 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2391 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2450 */ | 2392 */ |
2451 DartObjectImpl greaterThan(TypeProvider typeProvider, | 2393 DartObjectImpl greaterThan( |
2452 DartObjectImpl rightOperand) => | 2394 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2453 new DartObjectImpl( | 2395 new DartObjectImpl( |
2454 typeProvider.boolType, | 2396 typeProvider.boolType, _state.greaterThan(rightOperand._state)); |
2455 _state.greaterThan(rightOperand._state)); | |
2456 | 2397 |
2457 /** | 2398 /** |
2458 * Return the result of invoking the '>=' operator on this object with the
given argument. | 2399 * Return the result of invoking the '>=' operator on this object with the
given argument. |
2459 * | 2400 * |
2460 * @param typeProvider the type provider used to find known types | 2401 * @param typeProvider the type provider used to find known types |
2461 * @param rightOperand the right-hand operand of the operation | 2402 * @param rightOperand the right-hand operand of the operation |
2462 * @return the result of invoking the '>=' operator on this object with the
given argument | 2403 * @return the result of invoking the '>=' operator on this object with the
given argument |
2463 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2404 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2464 */ | 2405 */ |
2465 DartObjectImpl greaterThanOrEqual(TypeProvider typeProvider, | 2406 DartObjectImpl greaterThanOrEqual(TypeProvider typeProvider, |
2466 DartObjectImpl rightOperand) => | 2407 DartObjectImpl rightOperand) => new DartObjectImpl( |
2467 new DartObjectImpl( | 2408 typeProvider.boolType, _state.greaterThanOrEqual(rightOperand._state)); |
2468 typeProvider.boolType, | |
2469 _state.greaterThanOrEqual(rightOperand._state)); | |
2470 | 2409 |
2471 /** | 2410 /** |
2472 * Return the result of invoking the '~/' operator on this object with the giv
en argument. | 2411 * Return the result of invoking the '~/' operator on this object with the giv
en argument. |
2473 * | 2412 * |
2474 * @param typeProvider the type provider used to find known types | 2413 * @param typeProvider the type provider used to find known types |
2475 * @param rightOperand the right-hand operand of the operation | 2414 * @param rightOperand the right-hand operand of the operation |
2476 * @return the result of invoking the '~/' operator on this object with the gi
ven argument | 2415 * @return the result of invoking the '~/' operator on this object with the gi
ven argument |
2477 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2416 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2478 */ | 2417 */ |
2479 DartObjectImpl integerDivide(TypeProvider typeProvider, | 2418 DartObjectImpl integerDivide( |
2480 DartObjectImpl rightOperand) => | 2419 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2481 new DartObjectImpl( | 2420 new DartObjectImpl( |
2482 typeProvider.intType, | 2421 typeProvider.intType, _state.integerDivide(rightOperand._state)); |
2483 _state.integerDivide(rightOperand._state)); | |
2484 | 2422 |
2485 /** | 2423 /** |
2486 * Return the result of invoking the identical function on this object with | 2424 * Return the result of invoking the identical function on this object with |
2487 * the given argument. | 2425 * the given argument. |
2488 * | 2426 * |
2489 * @param typeProvider the type provider used to find known types | 2427 * @param typeProvider the type provider used to find known types |
2490 * @param rightOperand the right-hand operand of the operation | 2428 * @param rightOperand the right-hand operand of the operation |
2491 * @return the result of invoking the identical function on this object with | 2429 * @return the result of invoking the identical function on this object with |
2492 * the given argument | 2430 * the given argument |
2493 */ | 2431 */ |
2494 DartObjectImpl isIdentical(TypeProvider typeProvider, | 2432 DartObjectImpl isIdentical( |
2495 DartObjectImpl rightOperand) { | 2433 TypeProvider typeProvider, DartObjectImpl rightOperand) { |
2496 return new DartObjectImpl( | 2434 return new DartObjectImpl( |
2497 typeProvider.boolType, | 2435 typeProvider.boolType, _state.isIdentical(rightOperand._state)); |
2498 _state.isIdentical(rightOperand._state)); | |
2499 } | 2436 } |
2500 | 2437 |
2501 /** | 2438 /** |
2502 * Return the result of invoking the '<' operator on this object with the g
iven argument. | 2439 * Return the result of invoking the '<' operator on this object with the g
iven argument. |
2503 * | 2440 * |
2504 * @param typeProvider the type provider used to find known types | 2441 * @param typeProvider the type provider used to find known types |
2505 * @param rightOperand the right-hand operand of the operation | 2442 * @param rightOperand the right-hand operand of the operation |
2506 * @return the result of invoking the '<' operator on this object with the
given argument | 2443 * @return the result of invoking the '<' operator on this object with the
given argument |
2507 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2444 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2508 */ | 2445 */ |
2509 DartObjectImpl lessThan(TypeProvider typeProvider, | 2446 DartObjectImpl lessThan( |
2510 DartObjectImpl rightOperand) => | 2447 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2511 new DartObjectImpl(typeProvider.boolType, _state.lessThan(rightOperand._st
ate)); | 2448 new DartObjectImpl( |
| 2449 typeProvider.boolType, _state.lessThan(rightOperand._state)); |
2512 | 2450 |
2513 /** | 2451 /** |
2514 * Return the result of invoking the '<=' operator on this object with the
given argument. | 2452 * Return the result of invoking the '<=' operator on this object with the
given argument. |
2515 * | 2453 * |
2516 * @param typeProvider the type provider used to find known types | 2454 * @param typeProvider the type provider used to find known types |
2517 * @param rightOperand the right-hand operand of the operation | 2455 * @param rightOperand the right-hand operand of the operation |
2518 * @return the result of invoking the '<=' operator on this object with the
given argument | 2456 * @return the result of invoking the '<=' operator on this object with the
given argument |
2519 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2457 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2520 */ | 2458 */ |
2521 DartObjectImpl lessThanOrEqual(TypeProvider typeProvider, | 2459 DartObjectImpl lessThanOrEqual( |
2522 DartObjectImpl rightOperand) => | 2460 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2523 new DartObjectImpl( | 2461 new DartObjectImpl( |
2524 typeProvider.boolType, | 2462 typeProvider.boolType, _state.lessThanOrEqual(rightOperand._state)); |
2525 _state.lessThanOrEqual(rightOperand._state)); | |
2526 | 2463 |
2527 /** | 2464 /** |
2528 * Return the result of invoking the '&&' operator on this object with the giv
en argument. | 2465 * Return the result of invoking the '&&' operator on this object with the giv
en argument. |
2529 * | 2466 * |
2530 * @param typeProvider the type provider used to find known types | 2467 * @param typeProvider the type provider used to find known types |
2531 * @param rightOperand the right-hand operand of the operation | 2468 * @param rightOperand the right-hand operand of the operation |
2532 * @return the result of invoking the '&&' operator on this object with the gi
ven argument | 2469 * @return the result of invoking the '&&' operator on this object with the gi
ven argument |
2533 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2470 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2534 */ | 2471 */ |
2535 DartObjectImpl logicalAnd(TypeProvider typeProvider, | 2472 DartObjectImpl logicalAnd( |
2536 DartObjectImpl rightOperand) => | 2473 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2537 new DartObjectImpl( | 2474 new DartObjectImpl( |
2538 typeProvider.boolType, | 2475 typeProvider.boolType, _state.logicalAnd(rightOperand._state)); |
2539 _state.logicalAnd(rightOperand._state)); | |
2540 | 2476 |
2541 /** | 2477 /** |
2542 * Return the result of invoking the '!' operator on this object. | 2478 * Return the result of invoking the '!' operator on this object. |
2543 * | 2479 * |
2544 * @param typeProvider the type provider used to find known types | 2480 * @param typeProvider the type provider used to find known types |
2545 * @return the result of invoking the '!' operator on this object | 2481 * @return the result of invoking the '!' operator on this object |
2546 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2482 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2547 */ | 2483 */ |
2548 DartObjectImpl logicalNot(TypeProvider typeProvider) => | 2484 DartObjectImpl logicalNot(TypeProvider typeProvider) => |
2549 new DartObjectImpl(typeProvider.boolType, _state.logicalNot()); | 2485 new DartObjectImpl(typeProvider.boolType, _state.logicalNot()); |
2550 | 2486 |
2551 /** | 2487 /** |
2552 * Return the result of invoking the '||' operator on this object with the giv
en argument. | 2488 * Return the result of invoking the '||' operator on this object with the giv
en argument. |
2553 * | 2489 * |
2554 * @param typeProvider the type provider used to find known types | 2490 * @param typeProvider the type provider used to find known types |
2555 * @param rightOperand the right-hand operand of the operation | 2491 * @param rightOperand the right-hand operand of the operation |
2556 * @return the result of invoking the '||' operator on this object with the gi
ven argument | 2492 * @return the result of invoking the '||' operator on this object with the gi
ven argument |
2557 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2493 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2558 */ | 2494 */ |
2559 DartObjectImpl logicalOr(TypeProvider typeProvider, | 2495 DartObjectImpl logicalOr( |
2560 DartObjectImpl rightOperand) => | 2496 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2561 new DartObjectImpl( | 2497 new DartObjectImpl( |
2562 typeProvider.boolType, | 2498 typeProvider.boolType, _state.logicalOr(rightOperand._state)); |
2563 _state.logicalOr(rightOperand._state)); | |
2564 | 2499 |
2565 /** | 2500 /** |
2566 * Return the result of invoking the '-' operator on this object with the give
n argument. | 2501 * Return the result of invoking the '-' operator on this object with the give
n argument. |
2567 * | 2502 * |
2568 * @param typeProvider the type provider used to find known types | 2503 * @param typeProvider the type provider used to find known types |
2569 * @param rightOperand the right-hand operand of the operation | 2504 * @param rightOperand the right-hand operand of the operation |
2570 * @return the result of invoking the '-' operator on this object with the giv
en argument | 2505 * @return the result of invoking the '-' operator on this object with the giv
en argument |
2571 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2506 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2572 */ | 2507 */ |
2573 DartObjectImpl minus(TypeProvider typeProvider, DartObjectImpl rightOperand) { | 2508 DartObjectImpl minus(TypeProvider typeProvider, DartObjectImpl rightOperand) { |
(...skipping 30 matching lines...) Expand all Loading... |
2604 } | 2539 } |
2605 | 2540 |
2606 /** | 2541 /** |
2607 * Return the result of invoking the '!=' operator on this object with the giv
en argument. | 2542 * Return the result of invoking the '!=' operator on this object with the giv
en argument. |
2608 * | 2543 * |
2609 * @param typeProvider the type provider used to find known types | 2544 * @param typeProvider the type provider used to find known types |
2610 * @param rightOperand the right-hand operand of the operation | 2545 * @param rightOperand the right-hand operand of the operation |
2611 * @return the result of invoking the '!=' operator on this object with the gi
ven argument | 2546 * @return the result of invoking the '!=' operator on this object with the gi
ven argument |
2612 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2547 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2613 */ | 2548 */ |
2614 DartObjectImpl notEqual(TypeProvider typeProvider, | 2549 DartObjectImpl notEqual( |
2615 DartObjectImpl rightOperand) { | 2550 TypeProvider typeProvider, DartObjectImpl rightOperand) { |
2616 if (type != rightOperand.type) { | 2551 if (type != rightOperand.type) { |
2617 String typeName = type.name; | 2552 String typeName = type.name; |
2618 if (typeName != "bool" && | 2553 if (typeName != "bool" && |
2619 typeName != "double" && | 2554 typeName != "double" && |
2620 typeName != "int" && | 2555 typeName != "int" && |
2621 typeName != "num" && | 2556 typeName != "num" && |
2622 typeName != "String") { | 2557 typeName != "String") { |
2623 return new DartObjectImpl(typeProvider.boolType, BoolState.TRUE_STATE); | 2558 return new DartObjectImpl(typeProvider.boolType, BoolState.TRUE_STATE); |
2624 } | 2559 } |
2625 } | 2560 } |
2626 return new DartObjectImpl( | 2561 return new DartObjectImpl(typeProvider.boolType, |
2627 typeProvider.boolType, | |
2628 _state.equalEqual(rightOperand._state).logicalNot()); | 2562 _state.equalEqual(rightOperand._state).logicalNot()); |
2629 } | 2563 } |
2630 | 2564 |
2631 /** | 2565 /** |
2632 * Return the result of converting this object to a String. | 2566 * Return the result of converting this object to a String. |
2633 * | 2567 * |
2634 * @param typeProvider the type provider used to find known types | 2568 * @param typeProvider the type provider used to find known types |
2635 * @return the result of converting this object to a String | 2569 * @return the result of converting this object to a String |
2636 * @throws EvaluationException if the object cannot be converted to a String | 2570 * @throws EvaluationException if the object cannot be converted to a String |
2637 */ | 2571 */ |
2638 DartObjectImpl performToString(TypeProvider typeProvider) { | 2572 DartObjectImpl performToString(TypeProvider typeProvider) { |
2639 InterfaceType stringType = typeProvider.stringType; | 2573 InterfaceType stringType = typeProvider.stringType; |
2640 if (identical(type, stringType)) { | 2574 if (identical(type, stringType)) { |
2641 return this; | 2575 return this; |
2642 } | 2576 } |
2643 return new DartObjectImpl(stringType, _state.convertToString()); | 2577 return new DartObjectImpl(stringType, _state.convertToString()); |
2644 } | 2578 } |
2645 | 2579 |
2646 /** | 2580 /** |
2647 * Return the result of invoking the '%' operator on this object with the give
n argument. | 2581 * Return the result of invoking the '%' operator on this object with the give
n argument. |
2648 * | 2582 * |
2649 * @param typeProvider the type provider used to find known types | 2583 * @param typeProvider the type provider used to find known types |
2650 * @param rightOperand the right-hand operand of the operation | 2584 * @param rightOperand the right-hand operand of the operation |
2651 * @return the result of invoking the '%' operator on this object with the giv
en argument | 2585 * @return the result of invoking the '%' operator on this object with the giv
en argument |
2652 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2586 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2653 */ | 2587 */ |
2654 DartObjectImpl remainder(TypeProvider typeProvider, | 2588 DartObjectImpl remainder( |
2655 DartObjectImpl rightOperand) { | 2589 TypeProvider typeProvider, DartObjectImpl rightOperand) { |
2656 InstanceState result = _state.remainder(rightOperand._state); | 2590 InstanceState result = _state.remainder(rightOperand._state); |
2657 if (result is IntState) { | 2591 if (result is IntState) { |
2658 return new DartObjectImpl(typeProvider.intType, result); | 2592 return new DartObjectImpl(typeProvider.intType, result); |
2659 } else if (result is DoubleState) { | 2593 } else if (result is DoubleState) { |
2660 return new DartObjectImpl(typeProvider.doubleType, result); | 2594 return new DartObjectImpl(typeProvider.doubleType, result); |
2661 } else if (result is NumState) { | 2595 } else if (result is NumState) { |
2662 return new DartObjectImpl(typeProvider.numType, result); | 2596 return new DartObjectImpl(typeProvider.numType, result); |
2663 } | 2597 } |
2664 // We should never get here. | 2598 // We should never get here. |
2665 throw new IllegalStateException( | 2599 throw new IllegalStateException( |
2666 "remainder returned a ${result.runtimeType}"); | 2600 "remainder returned a ${result.runtimeType}"); |
2667 } | 2601 } |
2668 | 2602 |
2669 /** | 2603 /** |
2670 * Return the result of invoking the '<<' operator on this object with t
he given argument. | 2604 * Return the result of invoking the '<<' operator on this object with t
he given argument. |
2671 * | 2605 * |
2672 * @param typeProvider the type provider used to find known types | 2606 * @param typeProvider the type provider used to find known types |
2673 * @param rightOperand the right-hand operand of the operation | 2607 * @param rightOperand the right-hand operand of the operation |
2674 * @return the result of invoking the '<<' operator on this object with
the given argument | 2608 * @return the result of invoking the '<<' operator on this object with
the given argument |
2675 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2609 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2676 */ | 2610 */ |
2677 DartObjectImpl shiftLeft(TypeProvider typeProvider, | 2611 DartObjectImpl shiftLeft( |
2678 DartObjectImpl rightOperand) => | 2612 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2679 new DartObjectImpl(typeProvider.intType, _state.shiftLeft(rightOperand._st
ate)); | 2613 new DartObjectImpl( |
| 2614 typeProvider.intType, _state.shiftLeft(rightOperand._state)); |
2680 | 2615 |
2681 /** | 2616 /** |
2682 * Return the result of invoking the '>>' operator on this object with t
he given argument. | 2617 * Return the result of invoking the '>>' operator on this object with t
he given argument. |
2683 * | 2618 * |
2684 * @param typeProvider the type provider used to find known types | 2619 * @param typeProvider the type provider used to find known types |
2685 * @param rightOperand the right-hand operand of the operation | 2620 * @param rightOperand the right-hand operand of the operation |
2686 * @return the result of invoking the '>>' operator on this object with
the given argument | 2621 * @return the result of invoking the '>>' operator on this object with
the given argument |
2687 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2622 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2688 */ | 2623 */ |
2689 DartObjectImpl shiftRight(TypeProvider typeProvider, | 2624 DartObjectImpl shiftRight( |
2690 DartObjectImpl rightOperand) => | 2625 TypeProvider typeProvider, DartObjectImpl rightOperand) => |
2691 new DartObjectImpl( | 2626 new DartObjectImpl( |
2692 typeProvider.intType, | 2627 typeProvider.intType, _state.shiftRight(rightOperand._state)); |
2693 _state.shiftRight(rightOperand._state)); | |
2694 | 2628 |
2695 /** | 2629 /** |
2696 * Return the result of invoking the 'length' getter on this object. | 2630 * Return the result of invoking the 'length' getter on this object. |
2697 * | 2631 * |
2698 * @param typeProvider the type provider used to find known types | 2632 * @param typeProvider the type provider used to find known types |
2699 * @return the result of invoking the 'length' getter on this object | 2633 * @return the result of invoking the 'length' getter on this object |
2700 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind | 2634 * @throws EvaluationException if the operator is not appropriate for an objec
t of this kind |
2701 */ | 2635 */ |
2702 DartObjectImpl stringLength(TypeProvider typeProvider) => | 2636 DartObjectImpl stringLength(TypeProvider typeProvider) => |
2703 new DartObjectImpl(typeProvider.intType, _state.stringLength()); | 2637 new DartObjectImpl(typeProvider.intType, _state.stringLength()); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2798 * name interpreted as a String value. If the variable is not defined (or [var
iableName] is | 2732 * name interpreted as a String value. If the variable is not defined (or [var
iableName] is |
2799 * null), a DartObject representing "unknown" is returned. | 2733 * null), a DartObject representing "unknown" is returned. |
2800 * | 2734 * |
2801 * @param typeProvider the type provider used to find the type 'String' | 2735 * @param typeProvider the type provider used to find the type 'String' |
2802 * @param variableName the name of the variable whose value is to be returned | 2736 * @param variableName the name of the variable whose value is to be returned |
2803 */ | 2737 */ |
2804 DartObject getString(TypeProvider typeProvider, String variableName) { | 2738 DartObject getString(TypeProvider typeProvider, String variableName) { |
2805 String value = _declaredVariables[variableName]; | 2739 String value = _declaredVariables[variableName]; |
2806 if (value == null) { | 2740 if (value == null) { |
2807 return new DartObjectImpl( | 2741 return new DartObjectImpl( |
2808 typeProvider.stringType, | 2742 typeProvider.stringType, StringState.UNKNOWN_VALUE); |
2809 StringState.UNKNOWN_VALUE); | |
2810 } | 2743 } |
2811 return new DartObjectImpl(typeProvider.stringType, new StringState(value)); | 2744 return new DartObjectImpl(typeProvider.stringType, new StringState(value)); |
2812 } | 2745 } |
2813 } | 2746 } |
2814 | 2747 |
2815 /** | 2748 /** |
2816 * Instances of the class `DoubleState` represent the state of an object represe
nting a | 2749 * Instances of the class `DoubleState` represent the state of an object represe
nting a |
2817 * double. | 2750 * double. |
2818 */ | 2751 */ |
2819 class DoubleState extends NumState { | 2752 class DoubleState extends NumState { |
(...skipping 2127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4947 final DirectedGraph<AstNode> _referenceGraph; | 4880 final DirectedGraph<AstNode> _referenceGraph; |
4948 | 4881 |
4949 /** | 4882 /** |
4950 * A table mapping constant variables to the declarations of those variables. | 4883 * A table mapping constant variables to the declarations of those variables. |
4951 */ | 4884 */ |
4952 final HashMap<VariableElement, VariableDeclaration> _variableDeclarationMap; | 4885 final HashMap<VariableElement, VariableDeclaration> _variableDeclarationMap; |
4953 | 4886 |
4954 /** | 4887 /** |
4955 * A table mapping constant constructors to the declarations of those construc
tors. | 4888 * A table mapping constant constructors to the declarations of those construc
tors. |
4956 */ | 4889 */ |
4957 final HashMap<ConstructorElement, ConstructorDeclaration> | 4890 final HashMap<ConstructorElement, ConstructorDeclaration> _constructorDeclarat
ionMap; |
4958 _constructorDeclarationMap; | |
4959 | 4891 |
4960 /** | 4892 /** |
4961 * Initialize a newly created reference finder to find references from the giv
en variable to other | 4893 * Initialize a newly created reference finder to find references from the giv
en variable to other |
4962 * variables and to add those references to the given graph. | 4894 * variables and to add those references to the given graph. |
4963 * | 4895 * |
4964 * @param source the element representing the variable whose initializer will
be visited | 4896 * @param source the element representing the variable whose initializer will
be visited |
4965 * @param referenceGraph a graph recording which variables (heads) reference w
hich other variables | 4897 * @param referenceGraph a graph recording which variables (heads) reference w
hich other variables |
4966 * (tails) in their initializers | 4898 * (tails) in their initializers |
4967 * @param variableDeclarationMap A table mapping constant variables to the dec
larations of those | 4899 * @param variableDeclarationMap A table mapping constant variables to the dec
larations of those |
4968 * variables. | 4900 * variables. |
4969 * @param constructorDeclarationMap A table mapping constant constructors to t
he declarations of | 4901 * @param constructorDeclarationMap A table mapping constant constructors to t
he declarations of |
4970 * those constructors. | 4902 * those constructors. |
4971 */ | 4903 */ |
4972 ReferenceFinder(this._source, this._referenceGraph, | 4904 ReferenceFinder(this._source, this._referenceGraph, |
4973 this._variableDeclarationMap, this._constructorDeclarationMap); | 4905 this._variableDeclarationMap, this._constructorDeclarationMap); |
4974 | 4906 |
4975 @override | 4907 @override |
4976 Object visitInstanceCreationExpression(InstanceCreationExpression node) { | 4908 Object visitInstanceCreationExpression(InstanceCreationExpression node) { |
4977 if (node.isConst) { | 4909 if (node.isConst) { |
4978 _referenceGraph.addEdge(_source, node); | 4910 _referenceGraph.addEdge(_source, node); |
4979 } | 4911 } |
4980 return null; | 4912 return null; |
4981 } | 4913 } |
4982 | 4914 |
4983 @override | 4915 @override |
4984 Object | 4916 Object visitRedirectingConstructorInvocation( |
4985 visitRedirectingConstructorInvocation(RedirectingConstructorInvocation nod
e) { | 4917 RedirectingConstructorInvocation node) { |
4986 super.visitRedirectingConstructorInvocation(node); | 4918 super.visitRedirectingConstructorInvocation(node); |
4987 ConstructorElement target = node.staticElement; | 4919 ConstructorElement target = node.staticElement; |
4988 if (target != null && target.isConst) { | 4920 if (target != null && target.isConst) { |
4989 ConstructorDeclaration targetDeclaration = | 4921 ConstructorDeclaration targetDeclaration = |
4990 _constructorDeclarationMap[target]; | 4922 _constructorDeclarationMap[target]; |
4991 if (targetDeclaration != null) { | 4923 if (targetDeclaration != null) { |
4992 _referenceGraph.addEdge(_source, targetDeclaration); | 4924 _referenceGraph.addEdge(_source, targetDeclaration); |
4993 } | 4925 } |
4994 } | 4926 } |
4995 return null; | 4927 return null; |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5253 return BoolState.from(_element == rightElement); | 5185 return BoolState.from(_element == rightElement); |
5254 } else if (rightOperand is DynamicState) { | 5186 } else if (rightOperand is DynamicState) { |
5255 return BoolState.UNKNOWN_VALUE; | 5187 return BoolState.UNKNOWN_VALUE; |
5256 } | 5188 } |
5257 return BoolState.FALSE_STATE; | 5189 return BoolState.FALSE_STATE; |
5258 } | 5190 } |
5259 | 5191 |
5260 @override | 5192 @override |
5261 String toString() => _element == null ? "-unknown-" : _element.name; | 5193 String toString() => _element == null ? "-unknown-" : _element.name; |
5262 } | 5194 } |
OLD | NEW |