OLD | NEW |
---|---|
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library analyzer.src.dart.element.element; | 5 library analyzer.src.dart.element.element; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 import 'dart:math' show min; | 8 import 'dart:math' show min; |
9 | 9 |
10 import 'package:analyzer/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
(...skipping 3914 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3925 int get nameOffset { | 3925 int get nameOffset { |
3926 int offset = super.nameOffset; | 3926 int offset = super.nameOffset; |
3927 if (offset == 0 && serializedExecutable != null) { | 3927 if (offset == 0 && serializedExecutable != null) { |
3928 return serializedExecutable.nameOffset; | 3928 return serializedExecutable.nameOffset; |
3929 } | 3929 } |
3930 return offset; | 3930 return offset; |
3931 } | 3931 } |
3932 | 3932 |
3933 @override | 3933 @override |
3934 List<ParameterElement> get parameters { | 3934 List<ParameterElement> get parameters { |
3935 if (serializedExecutable != null) { | 3935 if (_parameters == null) { |
3936 _parameters ??= ParameterElementImpl.resynthesizeList( | 3936 if (_kernel != null) { |
3937 serializedExecutable.parameters, this); | 3937 _parameters = |
3938 ParameterElementImpl.forKernelFunction(this, _kernel.function); | |
3939 } | |
3940 if (serializedExecutable != null) { | |
3941 _parameters = ParameterElementImpl.resynthesizeList( | |
3942 serializedExecutable.parameters, this); | |
3943 } | |
3938 } | 3944 } |
3939 return _parameters ?? const <ParameterElement>[]; | 3945 return _parameters ?? const <ParameterElement>[]; |
3940 } | 3946 } |
3941 | 3947 |
3942 /** | 3948 /** |
3943 * Set the parameters defined by this executable element to the given | 3949 * Set the parameters defined by this executable element to the given |
3944 * [parameters]. | 3950 * [parameters]. |
3945 */ | 3951 */ |
3946 void set parameters(List<ParameterElement> parameters) { | 3952 void set parameters(List<ParameterElement> parameters) { |
3947 _assertNotResynthesized(serializedExecutable); | 3953 _assertNotResynthesized(serializedExecutable); |
(...skipping 3424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7372 */ | 7378 */ |
7373 class ParameterElementImpl extends VariableElementImpl | 7379 class ParameterElementImpl extends VariableElementImpl |
7374 with ParameterElementMixin | 7380 with ParameterElementMixin |
7375 implements ParameterElement { | 7381 implements ParameterElement { |
7376 /** | 7382 /** |
7377 * The unlinked representation of the parameter in the summary. | 7383 * The unlinked representation of the parameter in the summary. |
7378 */ | 7384 */ |
7379 final UnlinkedParam _unlinkedParam; | 7385 final UnlinkedParam _unlinkedParam; |
7380 | 7386 |
7381 /** | 7387 /** |
7388 * The kernel of the element; | |
7389 */ | |
7390 final kernel.VariableDeclaration _kernel; | |
7391 | |
7392 /** | |
7382 * A list containing all of the parameters defined by this parameter element. | 7393 * A list containing all of the parameters defined by this parameter element. |
7383 * There will only be parameters if this parameter is a function typed | 7394 * There will only be parameters if this parameter is a function typed |
7384 * parameter. | 7395 * parameter. |
7385 */ | 7396 */ |
7386 List<ParameterElement> _parameters = ParameterElement.EMPTY_LIST; | 7397 List<ParameterElement> _parameters = ParameterElement.EMPTY_LIST; |
7387 | 7398 |
7388 /** | 7399 /** |
7389 * A list containing all of the type parameters defined for this parameter | 7400 * A list containing all of the type parameters defined for this parameter |
7390 * element. There will only be parameters if this parameter is a function | 7401 * element. There will only be parameters if this parameter is a function |
7391 * typed parameter. | 7402 * typed parameter. |
(...skipping 22 matching lines...) Expand all Loading... | |
7414 int _visibleRangeLength = -1; | 7425 int _visibleRangeLength = -1; |
7415 | 7426 |
7416 bool _inheritsCovariant = false; | 7427 bool _inheritsCovariant = false; |
7417 | 7428 |
7418 /** | 7429 /** |
7419 * Initialize a newly created parameter element to have the given [name] and | 7430 * Initialize a newly created parameter element to have the given [name] and |
7420 * [nameOffset]. | 7431 * [nameOffset]. |
7421 */ | 7432 */ |
7422 ParameterElementImpl(String name, int nameOffset) | 7433 ParameterElementImpl(String name, int nameOffset) |
7423 : _unlinkedParam = null, | 7434 : _unlinkedParam = null, |
7435 _kernel = null, | |
7424 super(name, nameOffset); | 7436 super(name, nameOffset); |
7425 | 7437 |
7426 /** | 7438 /** |
7439 * Initialize using the given kernel. | |
7440 */ | |
7441 ParameterElementImpl.forKernel( | |
7442 ElementImpl enclosingElement, this._kernel, this._parameterKind) | |
7443 : _unlinkedParam = null, | |
7444 super.forSerialized(enclosingElement); | |
7445 | |
7446 /** | |
7427 * Initialize a newly created parameter element to have the given [name]. | 7447 * Initialize a newly created parameter element to have the given [name]. |
7428 */ | 7448 */ |
7429 ParameterElementImpl.forNode(Identifier name) | 7449 ParameterElementImpl.forNode(Identifier name) |
7430 : _unlinkedParam = null, | 7450 : _unlinkedParam = null, |
7451 _kernel = null, | |
7431 super.forNode(name); | 7452 super.forNode(name); |
7432 | 7453 |
7433 /** | 7454 /** |
7434 * Initialize using the given serialized information. | 7455 * Initialize using the given serialized information. |
7435 */ | 7456 */ |
7436 ParameterElementImpl.forSerialized( | 7457 ParameterElementImpl.forSerialized( |
7437 this._unlinkedParam, ElementImpl enclosingElement) | 7458 this._unlinkedParam, ElementImpl enclosingElement) |
7438 : super.forSerialized(enclosingElement); | 7459 : _kernel = null, |
7460 super.forSerialized(enclosingElement); | |
7439 | 7461 |
7440 /** | 7462 /** |
7441 * Initialize using the given serialized information. | 7463 * Initialize using the given serialized information. |
7442 */ | 7464 */ |
7443 factory ParameterElementImpl.forSerializedFactory( | 7465 factory ParameterElementImpl.forSerializedFactory( |
7444 UnlinkedParam unlinkedParameter, ElementImpl enclosingElement, | 7466 UnlinkedParam unlinkedParameter, ElementImpl enclosingElement, |
7445 {bool synthetic: false}) { | 7467 {bool synthetic: false}) { |
7446 ParameterElementImpl element; | 7468 ParameterElementImpl element; |
7447 if (unlinkedParameter.isInitializingFormal) { | 7469 if (unlinkedParameter.isInitializingFormal) { |
7448 if (unlinkedParameter.kind == UnlinkedParamKind.required) { | 7470 if (unlinkedParameter.kind == UnlinkedParamKind.required) { |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7567 * Set the function representing this variable's initializer to the given | 7589 * Set the function representing this variable's initializer to the given |
7568 * [function]. | 7590 * [function]. |
7569 */ | 7591 */ |
7570 void set initializer(FunctionElement function) { | 7592 void set initializer(FunctionElement function) { |
7571 _assertNotResynthesized(_unlinkedParam); | 7593 _assertNotResynthesized(_unlinkedParam); |
7572 super.initializer = function; | 7594 super.initializer = function; |
7573 } | 7595 } |
7574 | 7596 |
7575 @override | 7597 @override |
7576 bool get isConst { | 7598 bool get isConst { |
7599 if (_kernel != null) { | |
7600 return false; | |
7601 } | |
7577 if (_unlinkedParam != null) { | 7602 if (_unlinkedParam != null) { |
7578 return false; | 7603 return false; |
7579 } | 7604 } |
7580 return super.isConst; | 7605 return super.isConst; |
7581 } | 7606 } |
7582 | 7607 |
7583 @override | 7608 @override |
7584 void set isConst(bool isConst) { | 7609 void set isConst(bool isConst) { |
7585 _assertNotResynthesized(_unlinkedParam); | 7610 _assertNotResynthesized(_unlinkedParam); |
7586 super.isConst = isConst; | 7611 super.isConst = isConst; |
(...skipping 25 matching lines...) Expand all Loading... | |
7612 /** | 7637 /** |
7613 * Set whether this variable parameter is explicitly marked as being covariant . | 7638 * Set whether this variable parameter is explicitly marked as being covariant . |
7614 */ | 7639 */ |
7615 void set isExplicitlyCovariant(bool isCovariant) { | 7640 void set isExplicitlyCovariant(bool isCovariant) { |
7616 _assertNotResynthesized(_unlinkedParam); | 7641 _assertNotResynthesized(_unlinkedParam); |
7617 setModifier(Modifier.COVARIANT, isCovariant); | 7642 setModifier(Modifier.COVARIANT, isCovariant); |
7618 } | 7643 } |
7619 | 7644 |
7620 @override | 7645 @override |
7621 bool get isFinal { | 7646 bool get isFinal { |
7647 if (_kernel != null) { | |
7648 return _kernel.isFinal; | |
7649 } | |
7622 if (_unlinkedParam != null) { | 7650 if (_unlinkedParam != null) { |
7623 return _unlinkedParam.isFinal; | 7651 return _unlinkedParam.isFinal; |
7624 } | 7652 } |
7625 return super.isFinal; | 7653 return super.isFinal; |
7626 } | 7654 } |
7627 | 7655 |
7628 @override | 7656 @override |
7629 void set isFinal(bool isFinal) { | 7657 void set isFinal(bool isFinal) { |
7630 _assertNotResynthesized(_unlinkedParam); | 7658 _assertNotResynthesized(_unlinkedParam); |
7631 super.isFinal = isFinal; | 7659 super.isFinal = isFinal; |
(...skipping 15 matching lines...) Expand all Loading... | |
7647 List<ElementAnnotation> get metadata { | 7675 List<ElementAnnotation> get metadata { |
7648 if (_unlinkedParam != null) { | 7676 if (_unlinkedParam != null) { |
7649 return _metadata ??= | 7677 return _metadata ??= |
7650 _buildAnnotations(enclosingUnit, _unlinkedParam.annotations); | 7678 _buildAnnotations(enclosingUnit, _unlinkedParam.annotations); |
7651 } | 7679 } |
7652 return super.metadata; | 7680 return super.metadata; |
7653 } | 7681 } |
7654 | 7682 |
7655 @override | 7683 @override |
7656 String get name { | 7684 String get name { |
7685 if (_kernel != null) { | |
7686 return _kernel.name; | |
7687 } | |
7657 if (_unlinkedParam != null) { | 7688 if (_unlinkedParam != null) { |
7658 return _unlinkedParam.name; | 7689 return _unlinkedParam.name; |
7659 } | 7690 } |
7660 return super.name; | 7691 return super.name; |
7661 } | 7692 } |
7662 | 7693 |
7663 @override | 7694 @override |
7664 int get nameOffset { | 7695 int get nameOffset { |
7665 int offset = super.nameOffset; | 7696 int offset = super.nameOffset; |
7666 if (offset == 0 && _unlinkedParam != null) { | 7697 if (offset == 0 && _unlinkedParam != null) { |
7667 if (isSynthetic || | 7698 if (isSynthetic || |
7668 (_unlinkedParam.name.isEmpty && | 7699 (_unlinkedParam.name.isEmpty && |
7669 _unlinkedParam.kind != UnlinkedParamKind.named && | 7700 _unlinkedParam.kind != UnlinkedParamKind.named && |
7670 enclosingElement is GenericFunctionTypeElement)) { | 7701 enclosingElement is GenericFunctionTypeElement)) { |
7671 return -1; | 7702 return -1; |
7672 } | 7703 } |
7673 return _unlinkedParam.nameOffset; | 7704 return _unlinkedParam.nameOffset; |
7674 } | 7705 } |
7675 return offset; | 7706 return offset; |
7676 } | 7707 } |
7677 | 7708 |
7678 @override | 7709 @override |
7679 ParameterKind get parameterKind { | 7710 ParameterKind get parameterKind { |
7680 if (_unlinkedParam != null && _parameterKind == null) { | 7711 if (_parameterKind == null && _unlinkedParam != null) { |
Paul Berry
2017/07/17 16:56:32
What's the purpose of swapping these? Consider re
| |
7681 switch (_unlinkedParam.kind) { | 7712 switch (_unlinkedParam.kind) { |
7682 case UnlinkedParamKind.named: | 7713 case UnlinkedParamKind.named: |
7683 _parameterKind = ParameterKind.NAMED; | 7714 _parameterKind = ParameterKind.NAMED; |
7684 break; | 7715 break; |
7685 case UnlinkedParamKind.positional: | 7716 case UnlinkedParamKind.positional: |
7686 _parameterKind = ParameterKind.POSITIONAL; | 7717 _parameterKind = ParameterKind.POSITIONAL; |
7687 break; | 7718 break; |
7688 case UnlinkedParamKind.required: | 7719 case UnlinkedParamKind.required: |
7689 _parameterKind = ParameterKind.REQUIRED; | 7720 _parameterKind = ParameterKind.REQUIRED; |
7690 break; | 7721 break; |
(...skipping 19 matching lines...) Expand all Loading... | |
7710 */ | 7741 */ |
7711 void set parameters(List<ParameterElement> parameters) { | 7742 void set parameters(List<ParameterElement> parameters) { |
7712 for (ParameterElement parameter in parameters) { | 7743 for (ParameterElement parameter in parameters) { |
7713 (parameter as ParameterElementImpl).enclosingElement = this; | 7744 (parameter as ParameterElementImpl).enclosingElement = this; |
7714 } | 7745 } |
7715 this._parameters = parameters; | 7746 this._parameters = parameters; |
7716 } | 7747 } |
7717 | 7748 |
7718 @override | 7749 @override |
7719 DartType get type { | 7750 DartType get type { |
7751 if (_kernel != null) { | |
7752 return _type ??= enclosingUnit._kernelContext.getType(this, _kernel.type); | |
7753 } | |
7720 _resynthesizeTypeAndParameters(); | 7754 _resynthesizeTypeAndParameters(); |
7721 return super.type; | 7755 return super.type; |
7722 } | 7756 } |
7723 | 7757 |
7724 @override | 7758 @override |
7725 TopLevelInferenceError get typeInferenceError { | 7759 TopLevelInferenceError get typeInferenceError { |
7726 if (_unlinkedParam != null) { | 7760 if (_unlinkedParam != null) { |
7727 return enclosingUnit.resynthesizerContext | 7761 return enclosingUnit.resynthesizerContext |
7728 .getTypeInferenceError(_unlinkedParam.inferredTypeSlot); | 7762 .getTypeInferenceError(_unlinkedParam.inferredTypeSlot); |
7729 } | 7763 } |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7851 } else { | 7885 } else { |
7852 _type = enclosingUnit.resynthesizerContext | 7886 _type = enclosingUnit.resynthesizerContext |
7853 .resolveLinkedType(this, _unlinkedParam.inferredTypeSlot); | 7887 .resolveLinkedType(this, _unlinkedParam.inferredTypeSlot); |
7854 declaredType = enclosingUnit.resynthesizerContext | 7888 declaredType = enclosingUnit.resynthesizerContext |
7855 .resolveTypeRef(this, _unlinkedParam.type, declaredType: true); | 7889 .resolveTypeRef(this, _unlinkedParam.type, declaredType: true); |
7856 } | 7890 } |
7857 } | 7891 } |
7858 } | 7892 } |
7859 | 7893 |
7860 /** | 7894 /** |
7895 * Create and return [ParameterElement]s for the given [function]. | |
7896 */ | |
7897 static List<ParameterElement> forKernelFunction( | |
7898 ElementImpl enclosingElement, kernel.FunctionNode function) { | |
7899 if (function.positionalParameters.isNotEmpty || | |
7900 function.namedParameters.isNotEmpty) { | |
7901 var parameters = <ParameterElement>[]; | |
7902 for (int i = 0; i < function.positionalParameters.length; i++) { | |
7903 parameters.add(new ParameterElementImpl.forKernel( | |
7904 enclosingElement, | |
7905 function.positionalParameters[i], | |
7906 i < function.requiredParameterCount | |
7907 ? ParameterKind.REQUIRED | |
7908 : ParameterKind.POSITIONAL)); | |
7909 } | |
7910 for (var k in function.namedParameters) { | |
7911 parameters.add(new ParameterElementImpl.forKernel( | |
7912 enclosingElement, k, ParameterKind.NAMED)); | |
7913 } | |
7914 return parameters; | |
7915 } else { | |
7916 return const <ParameterElement>[]; | |
7917 } | |
7918 } | |
7919 | |
7920 /** | |
7861 * Create and return [ParameterElement]s for the given [unlinkedParameters]. | 7921 * Create and return [ParameterElement]s for the given [unlinkedParameters]. |
7862 */ | 7922 */ |
7863 static List<ParameterElement> resynthesizeList( | 7923 static List<ParameterElement> resynthesizeList( |
7864 List<UnlinkedParam> unlinkedParameters, ElementImpl enclosingElement, | 7924 List<UnlinkedParam> unlinkedParameters, ElementImpl enclosingElement, |
7865 {bool synthetic: false}) { | 7925 {bool synthetic: false}) { |
7866 int length = unlinkedParameters.length; | 7926 int length = unlinkedParameters.length; |
7867 if (length != 0) { | 7927 if (length != 0) { |
7868 List<ParameterElement> parameters = new List<ParameterElement>(length); | 7928 List<ParameterElement> parameters = new List<ParameterElement>(length); |
7869 for (int i = 0; i < length; i++) { | 7929 for (int i = 0; i < length; i++) { |
7870 parameters[i] = new ParameterElementImpl.forSerializedFactory( | 7930 parameters[i] = new ParameterElementImpl.forSerializedFactory( |
(...skipping 1332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9203 | 9263 |
9204 @override | 9264 @override |
9205 DartObject computeConstantValue() => null; | 9265 DartObject computeConstantValue() => null; |
9206 | 9266 |
9207 @override | 9267 @override |
9208 void visitChildren(ElementVisitor visitor) { | 9268 void visitChildren(ElementVisitor visitor) { |
9209 super.visitChildren(visitor); | 9269 super.visitChildren(visitor); |
9210 _initializer?.accept(visitor); | 9270 _initializer?.accept(visitor); |
9211 } | 9271 } |
9212 } | 9272 } |
OLD | NEW |