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 1616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1627 LibraryElement get enclosingElement => | 1627 LibraryElement get enclosingElement => |
1628 super.enclosingElement as LibraryElement; | 1628 super.enclosingElement as LibraryElement; |
1629 | 1629 |
1630 @override | 1630 @override |
1631 CompilationUnitElementImpl get enclosingUnit { | 1631 CompilationUnitElementImpl get enclosingUnit { |
1632 return this; | 1632 return this; |
1633 } | 1633 } |
1634 | 1634 |
1635 @override | 1635 @override |
1636 List<ClassElement> get enums { | 1636 List<ClassElement> get enums { |
| 1637 if (_kernelContext != null) { |
| 1638 _enums ??= _kernelContext.library.classes |
| 1639 .where((k) => k.isEnum) |
| 1640 .map((k) => new EnumElementImpl.forKernel(this, k)) |
| 1641 .toList(growable: false); |
| 1642 } |
1637 if (_unlinkedUnit != null) { | 1643 if (_unlinkedUnit != null) { |
1638 _enums ??= _unlinkedUnit.enums | 1644 _enums ??= _unlinkedUnit.enums |
1639 .map((e) => new EnumElementImpl.forSerialized(e, this)) | 1645 .map((e) => new EnumElementImpl.forSerialized(e, this)) |
1640 .toList(growable: false); | 1646 .toList(growable: false); |
1641 } | 1647 } |
1642 return _enums ?? const <ClassElement>[]; | 1648 return _enums ?? const <ClassElement>[]; |
1643 } | 1649 } |
1644 | 1650 |
1645 /** | 1651 /** |
1646 * Set the enums contained in this compilation unit to the given [enums]. | 1652 * Set the enums contained in this compilation unit to the given [enums]. |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1786 this._typeAliases = typeAliases; | 1792 this._typeAliases = typeAliases; |
1787 } | 1793 } |
1788 | 1794 |
1789 @override | 1795 @override |
1790 TypeParameterizedElementMixin get typeParameterContext => null; | 1796 TypeParameterizedElementMixin get typeParameterContext => null; |
1791 | 1797 |
1792 @override | 1798 @override |
1793 List<ClassElement> get types { | 1799 List<ClassElement> get types { |
1794 if (_kernelContext != null) { | 1800 if (_kernelContext != null) { |
1795 _types ??= _kernelContext.library.classes | 1801 _types ??= _kernelContext.library.classes |
1796 .where((k) => !k.isSyntheticMixinImplementation) | 1802 .where((k) => !k.isEnum && !k.isSyntheticMixinImplementation) |
1797 .map((k) => new ClassElementImpl.forKernel(this, k)) | 1803 .map((k) => new ClassElementImpl.forKernel(this, k)) |
1798 .toList(growable: false); | 1804 .toList(growable: false); |
1799 } | 1805 } |
1800 if (_unlinkedUnit != null) { | 1806 if (_unlinkedUnit != null) { |
1801 _types ??= _unlinkedUnit.classes | 1807 _types ??= _unlinkedUnit.classes |
1802 .map((c) => new ClassElementImpl.forSerialized(c, this)) | 1808 .map((c) => new ClassElementImpl.forSerialized(c, this)) |
1803 .toList(growable: false); | 1809 .toList(growable: false); |
1804 } | 1810 } |
1805 return _types ?? const <ClassElement>[]; | 1811 return _types ?? const <ClassElement>[]; |
1806 } | 1812 } |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1994 ConstFieldElementImpl.forSerialized( | 2000 ConstFieldElementImpl.forSerialized( |
1995 UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement) | 2001 UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement) |
1996 : super.forSerialized(unlinkedVariable, enclosingElement); | 2002 : super.forSerialized(unlinkedVariable, enclosingElement); |
1997 } | 2003 } |
1998 | 2004 |
1999 /** | 2005 /** |
2000 * A field element representing an enum constant. | 2006 * A field element representing an enum constant. |
2001 */ | 2007 */ |
2002 class ConstFieldElementImpl_EnumValue extends ConstFieldElementImpl_ofEnum { | 2008 class ConstFieldElementImpl_EnumValue extends ConstFieldElementImpl_ofEnum { |
2003 final UnlinkedEnumValue _unlinkedEnumValue; | 2009 final UnlinkedEnumValue _unlinkedEnumValue; |
| 2010 final kernel.Field _kernelEnumValue; |
2004 final int _index; | 2011 final int _index; |
2005 | 2012 |
2006 ConstFieldElementImpl_EnumValue( | 2013 ConstFieldElementImpl_EnumValue(EnumElementImpl enumElement, |
2007 EnumElementImpl enumElement, this._unlinkedEnumValue, this._index) | 2014 this._unlinkedEnumValue, this._kernelEnumValue, this._index) |
2008 : super(enumElement); | 2015 : super(enumElement); |
2009 | 2016 |
2010 @override | 2017 @override |
2011 String get documentationComment { | 2018 String get documentationComment { |
| 2019 if (_kernelEnumValue != null) { |
| 2020 return _kernelEnumValue.documentationComment; |
| 2021 } |
2012 if (_unlinkedEnumValue != null) { | 2022 if (_unlinkedEnumValue != null) { |
2013 return _unlinkedEnumValue?.documentationComment?.text; | 2023 return _unlinkedEnumValue?.documentationComment?.text; |
2014 } | 2024 } |
2015 return super.documentationComment; | 2025 return super.documentationComment; |
2016 } | 2026 } |
2017 | 2027 |
2018 @override | 2028 @override |
2019 EvaluationResultImpl get evaluationResult { | 2029 EvaluationResultImpl get evaluationResult { |
2020 if (_evaluationResult == null) { | 2030 if (_evaluationResult == null) { |
2021 Map<String, DartObjectImpl> fieldMap = <String, DartObjectImpl>{ | 2031 Map<String, DartObjectImpl> fieldMap = <String, DartObjectImpl>{ |
2022 name: new DartObjectImpl( | 2032 name: new DartObjectImpl( |
2023 context.typeProvider.intType, new IntState(_index)) | 2033 context.typeProvider.intType, new IntState(_index)) |
2024 }; | 2034 }; |
2025 DartObjectImpl value = | 2035 DartObjectImpl value = |
2026 new DartObjectImpl(type, new GenericState(fieldMap)); | 2036 new DartObjectImpl(type, new GenericState(fieldMap)); |
2027 _evaluationResult = new EvaluationResultImpl(value); | 2037 _evaluationResult = new EvaluationResultImpl(value); |
2028 } | 2038 } |
2029 return _evaluationResult; | 2039 return _evaluationResult; |
2030 } | 2040 } |
2031 | 2041 |
2032 @override | 2042 @override |
2033 String get name { | 2043 String get name { |
| 2044 if (_kernelEnumValue != null) { |
| 2045 return _kernelEnumValue.name.name; |
| 2046 } |
2034 if (_unlinkedEnumValue != null) { | 2047 if (_unlinkedEnumValue != null) { |
2035 return _unlinkedEnumValue.name; | 2048 return _unlinkedEnumValue.name; |
2036 } | 2049 } |
2037 return super.name; | 2050 return super.name; |
2038 } | 2051 } |
2039 | 2052 |
2040 @override | 2053 @override |
2041 int get nameOffset { | 2054 int get nameOffset { |
2042 int offset = super.nameOffset; | 2055 int offset = super.nameOffset; |
2043 if (offset == -1 && _unlinkedEnumValue != null) { | 2056 if (offset == -1 && _unlinkedEnumValue != null) { |
(...skipping 1576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3620 /** | 3633 /** |
3621 * An [AbstractClassElementImpl] which is an enum. | 3634 * An [AbstractClassElementImpl] which is an enum. |
3622 */ | 3635 */ |
3623 class EnumElementImpl extends AbstractClassElementImpl { | 3636 class EnumElementImpl extends AbstractClassElementImpl { |
3624 /** | 3637 /** |
3625 * The unlinked representation of the enum in the summary. | 3638 * The unlinked representation of the enum in the summary. |
3626 */ | 3639 */ |
3627 final UnlinkedEnum _unlinkedEnum; | 3640 final UnlinkedEnum _unlinkedEnum; |
3628 | 3641 |
3629 /** | 3642 /** |
| 3643 * The kernel of the element. |
| 3644 */ |
| 3645 final kernel.Class _kernel; |
| 3646 |
| 3647 /** |
3630 * The type defined by the enum. | 3648 * The type defined by the enum. |
3631 */ | 3649 */ |
3632 InterfaceType _type; | 3650 InterfaceType _type; |
3633 | 3651 |
3634 /** | 3652 /** |
3635 * Initialize a newly created class element to have the given [name] at the | 3653 * Initialize a newly created class element to have the given [name] at the |
3636 * given [offset] in the file that contains the declaration of this element. | 3654 * given [offset] in the file that contains the declaration of this element. |
3637 */ | 3655 */ |
3638 EnumElementImpl(String name, int offset) | 3656 EnumElementImpl(String name, int offset) |
3639 : _unlinkedEnum = null, | 3657 : _unlinkedEnum = null, |
| 3658 _kernel = null, |
3640 super(name, offset); | 3659 super(name, offset); |
3641 | 3660 |
3642 /** | 3661 /** |
| 3662 * Initialize using the given kernel. |
| 3663 */ |
| 3664 EnumElementImpl.forKernel( |
| 3665 CompilationUnitElementImpl enclosingUnit, this._kernel) |
| 3666 : _unlinkedEnum = null, |
| 3667 super.forSerialized(enclosingUnit); |
| 3668 |
| 3669 /** |
3643 * Initialize a newly created class element to have the given [name]. | 3670 * Initialize a newly created class element to have the given [name]. |
3644 */ | 3671 */ |
3645 EnumElementImpl.forNode(Identifier name) | 3672 EnumElementImpl.forNode(Identifier name) |
3646 : _unlinkedEnum = null, | 3673 : _unlinkedEnum = null, |
| 3674 _kernel = null, |
3647 super.forNode(name); | 3675 super.forNode(name); |
3648 | 3676 |
3649 /** | 3677 /** |
3650 * Initialize using the given serialized information. | 3678 * Initialize using the given serialized information. |
3651 */ | 3679 */ |
3652 EnumElementImpl.forSerialized( | 3680 EnumElementImpl.forSerialized( |
3653 this._unlinkedEnum, CompilationUnitElementImpl enclosingUnit) | 3681 this._unlinkedEnum, CompilationUnitElementImpl enclosingUnit) |
3654 : super.forSerialized(enclosingUnit); | 3682 : _kernel = null, |
| 3683 super.forSerialized(enclosingUnit); |
3655 | 3684 |
3656 /** | 3685 /** |
3657 * Set whether this class is abstract. | 3686 * Set whether this class is abstract. |
3658 */ | 3687 */ |
3659 void set abstract(bool isAbstract) { | 3688 void set abstract(bool isAbstract) { |
3660 _assertNotResynthesized(_unlinkedEnum); | 3689 _assertNotResynthesized(_unlinkedEnum); |
3661 } | 3690 } |
3662 | 3691 |
3663 @override | 3692 @override |
3664 List<PropertyAccessorElement> get accessors { | 3693 List<PropertyAccessorElement> get accessors { |
3665 if (_unlinkedEnum != null && _accessors == null) { | 3694 if (_accessors == null) { |
3666 _resynthesizeFieldsAndPropertyAccessors(); | 3695 if (_kernel != null || _unlinkedEnum != null) { |
| 3696 _resynthesizeFieldsAndPropertyAccessors(); |
| 3697 } |
3667 } | 3698 } |
3668 return _accessors ?? const <PropertyAccessorElement>[]; | 3699 return _accessors ?? const <PropertyAccessorElement>[]; |
3669 } | 3700 } |
3670 | 3701 |
3671 @override | 3702 @override |
3672 void set accessors(List<PropertyAccessorElement> accessors) { | 3703 void set accessors(List<PropertyAccessorElement> accessors) { |
3673 _assertNotResynthesized(_unlinkedEnum); | 3704 _assertNotResynthesized(_unlinkedEnum); |
3674 super.accessors = accessors; | 3705 super.accessors = accessors; |
3675 } | 3706 } |
3676 | 3707 |
(...skipping 20 matching lines...) Expand all Loading... |
3697 List<ConstructorElement> get constructors { | 3728 List<ConstructorElement> get constructors { |
3698 // The equivalent code for enums in the spec shows a single constructor, | 3729 // The equivalent code for enums in the spec shows a single constructor, |
3699 // but that constructor is not callable (since it is a compile-time error | 3730 // but that constructor is not callable (since it is a compile-time error |
3700 // to subclass, mix-in, implement, or explicitly instantiate an enum). | 3731 // to subclass, mix-in, implement, or explicitly instantiate an enum). |
3701 // So we represent this as having no constructors. | 3732 // So we represent this as having no constructors. |
3702 return const <ConstructorElement>[]; | 3733 return const <ConstructorElement>[]; |
3703 } | 3734 } |
3704 | 3735 |
3705 @override | 3736 @override |
3706 String get documentationComment { | 3737 String get documentationComment { |
| 3738 if (_kernel != null) { |
| 3739 return _kernel.documentationComment; |
| 3740 } |
3707 if (_unlinkedEnum != null) { | 3741 if (_unlinkedEnum != null) { |
3708 return _unlinkedEnum?.documentationComment?.text; | 3742 return _unlinkedEnum?.documentationComment?.text; |
3709 } | 3743 } |
3710 return super.documentationComment; | 3744 return super.documentationComment; |
3711 } | 3745 } |
3712 | 3746 |
3713 @override | 3747 @override |
3714 List<FieldElement> get fields { | 3748 List<FieldElement> get fields { |
3715 if (_unlinkedEnum != null && _fields == null) { | 3749 if (_fields == null) { |
3716 _resynthesizeFieldsAndPropertyAccessors(); | 3750 if (_kernel != null || _unlinkedEnum != null) { |
| 3751 _resynthesizeFieldsAndPropertyAccessors(); |
| 3752 } |
3717 } | 3753 } |
3718 return _fields ?? const <FieldElement>[]; | 3754 return _fields ?? const <FieldElement>[]; |
3719 } | 3755 } |
3720 | 3756 |
3721 @override | 3757 @override |
3722 void set fields(List<FieldElement> fields) { | 3758 void set fields(List<FieldElement> fields) { |
3723 _assertNotResynthesized(_unlinkedEnum); | 3759 _assertNotResynthesized(_unlinkedEnum); |
3724 super.fields = fields; | 3760 super.fields = fields; |
3725 } | 3761 } |
3726 | 3762 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3764 } | 3800 } |
3765 | 3801 |
3766 @override | 3802 @override |
3767 List<MethodElement> get methods => const <MethodElement>[]; | 3803 List<MethodElement> get methods => const <MethodElement>[]; |
3768 | 3804 |
3769 @override | 3805 @override |
3770 List<InterfaceType> get mixins => const <InterfaceType>[]; | 3806 List<InterfaceType> get mixins => const <InterfaceType>[]; |
3771 | 3807 |
3772 @override | 3808 @override |
3773 String get name { | 3809 String get name { |
| 3810 if (_kernel != null) { |
| 3811 return _kernel.name; |
| 3812 } |
3774 if (_unlinkedEnum != null) { | 3813 if (_unlinkedEnum != null) { |
3775 return _unlinkedEnum.name; | 3814 return _unlinkedEnum.name; |
3776 } | 3815 } |
3777 return super.name; | 3816 return super.name; |
3778 } | 3817 } |
3779 | 3818 |
3780 @override | 3819 @override |
3781 int get nameOffset { | 3820 int get nameOffset { |
3782 int offset = super.nameOffset; | 3821 int offset = super.nameOffset; |
3783 if (offset == 0 && _unlinkedEnum != null && _unlinkedEnum.nameOffset != 0) { | 3822 if (offset == 0 && _unlinkedEnum != null && _unlinkedEnum.nameOffset != 0) { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3830 List<FieldElementImpl> fields = <FieldElementImpl>[]; | 3869 List<FieldElementImpl> fields = <FieldElementImpl>[]; |
3831 // Build the 'index' field. | 3870 // Build the 'index' field. |
3832 fields.add(new FieldElementImpl('index', -1) | 3871 fields.add(new FieldElementImpl('index', -1) |
3833 ..enclosingElement = this | 3872 ..enclosingElement = this |
3834 ..isSynthetic = true | 3873 ..isSynthetic = true |
3835 ..isFinal = true | 3874 ..isFinal = true |
3836 ..type = context.typeProvider.intType); | 3875 ..type = context.typeProvider.intType); |
3837 // Build the 'values' field. | 3876 // Build the 'values' field. |
3838 fields.add(new ConstFieldElementImpl_EnumValues(this)); | 3877 fields.add(new ConstFieldElementImpl_EnumValues(this)); |
3839 // Build fields for all enum constants. | 3878 // Build fields for all enum constants. |
3840 for (int i = 0; i < _unlinkedEnum.values.length; i++) { | 3879 if (_kernel != null) { |
3841 UnlinkedEnumValue unlinkedValue = _unlinkedEnum.values[i]; | 3880 for (int i = 0; i < _kernel.fields.length; i++) { |
3842 ConstFieldElementImpl_EnumValue field = | 3881 kernel.Field kernelField = _kernel.fields[i]; |
3843 new ConstFieldElementImpl_EnumValue(this, unlinkedValue, i); | 3882 if (kernelField.name.name == 'index' || |
3844 fields.add(field); | 3883 kernelField.name.name == 'values') { |
| 3884 continue; |
| 3885 } |
| 3886 ConstFieldElementImpl_EnumValue field = |
| 3887 new ConstFieldElementImpl_EnumValue(this, null, kernelField, i); |
| 3888 fields.add(field); |
| 3889 } |
| 3890 } |
| 3891 if (_unlinkedEnum != null) { |
| 3892 for (int i = 0; i < _unlinkedEnum.values.length; i++) { |
| 3893 UnlinkedEnumValue unlinkedValue = _unlinkedEnum.values[i]; |
| 3894 ConstFieldElementImpl_EnumValue field = |
| 3895 new ConstFieldElementImpl_EnumValue(this, unlinkedValue, null, i); |
| 3896 fields.add(field); |
| 3897 } |
3845 } | 3898 } |
3846 // done | 3899 // done |
3847 _fields = fields; | 3900 _fields = fields; |
3848 _accessors = fields | 3901 _accessors = fields |
3849 .map((FieldElementImpl field) => | 3902 .map((FieldElementImpl field) => |
3850 new PropertyAccessorElementImpl_ImplicitGetter(field) | 3903 new PropertyAccessorElementImpl_ImplicitGetter(field) |
3851 ..enclosingElement = this) | 3904 ..enclosingElement = this) |
3852 .toList(growable: false); | 3905 .toList(growable: false); |
3853 } | 3906 } |
3854 } | 3907 } |
(...skipping 2812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6667 } | 6720 } |
6668 for (ExportElement exportElement in exports) { | 6721 for (ExportElement exportElement in exports) { |
6669 ExportElementImpl exportElementImpl = exportElement; | 6722 ExportElementImpl exportElementImpl = exportElement; |
6670 if (exportElementImpl.identifier == identifier) { | 6723 if (exportElementImpl.identifier == identifier) { |
6671 return exportElementImpl; | 6724 return exportElementImpl; |
6672 } | 6725 } |
6673 } | 6726 } |
6674 return null; | 6727 return null; |
6675 } | 6728 } |
6676 | 6729 |
| 6730 ClassElement getEnum(String name) { |
| 6731 ClassElement element = _definingCompilationUnit.getEnum(name); |
| 6732 if (element != null) { |
| 6733 return element; |
| 6734 } |
| 6735 for (CompilationUnitElement part in _parts) { |
| 6736 element = part.getEnum(name); |
| 6737 if (element != null) { |
| 6738 return element; |
| 6739 } |
| 6740 } |
| 6741 return null; |
| 6742 } |
| 6743 |
6677 @override | 6744 @override |
6678 List<ImportElement> getImportsWithPrefix(PrefixElement prefixElement) { | 6745 List<ImportElement> getImportsWithPrefix(PrefixElement prefixElement) { |
6679 var imports = this.imports; | 6746 var imports = this.imports; |
6680 int count = imports.length; | 6747 int count = imports.length; |
6681 List<ImportElement> importList = new List<ImportElement>(); | 6748 List<ImportElement> importList = new List<ImportElement>(); |
6682 for (int i = 0; i < count; i++) { | 6749 for (int i = 0; i < count; i++) { |
6683 if (identical(imports[i].prefix, prefixElement)) { | 6750 if (identical(imports[i].prefix, prefixElement)) { |
6684 importList.add(imports[i]); | 6751 importList.add(imports[i]); |
6685 } | 6752 } |
6686 } | 6753 } |
(...skipping 3020 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9707 | 9774 |
9708 @override | 9775 @override |
9709 DartObject computeConstantValue() => null; | 9776 DartObject computeConstantValue() => null; |
9710 | 9777 |
9711 @override | 9778 @override |
9712 void visitChildren(ElementVisitor visitor) { | 9779 void visitChildren(ElementVisitor visitor) { |
9713 super.visitChildren(visitor); | 9780 super.visitChildren(visitor); |
9714 _initializer?.accept(visitor); | 9781 _initializer?.accept(visitor); |
9715 } | 9782 } |
9716 } | 9783 } |
OLD | NEW |