Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library 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'; |
| 11 import 'package:analyzer/dart/ast/token.dart'; | 11 import 'package:analyzer/dart/ast/token.dart'; |
| 12 import 'package:analyzer/dart/constant/value.dart'; | 12 import 'package:analyzer/dart/constant/value.dart'; |
| 13 import 'package:analyzer/dart/element/element.dart'; | 13 import 'package:analyzer/dart/element/element.dart'; |
| 14 import 'package:analyzer/dart/element/type.dart'; | 14 import 'package:analyzer/dart/element/type.dart'; |
| 15 import 'package:analyzer/dart/element/visitor.dart'; | 15 import 'package:analyzer/dart/element/visitor.dart'; |
| 16 import 'package:analyzer/src/dart/ast/utilities.dart'; | 16 import 'package:analyzer/src/dart/ast/utilities.dart'; |
| 17 import 'package:analyzer/src/dart/constant/value.dart'; | |
| 17 import 'package:analyzer/src/dart/element/handle.dart'; | 18 import 'package:analyzer/src/dart/element/handle.dart'; |
| 18 import 'package:analyzer/src/dart/element/type.dart'; | 19 import 'package:analyzer/src/dart/element/type.dart'; |
| 19 import 'package:analyzer/src/generated/constant.dart' show EvaluationResultImpl; | 20 import 'package:analyzer/src/generated/constant.dart' show EvaluationResultImpl; |
| 20 import 'package:analyzer/src/generated/engine.dart' | 21 import 'package:analyzer/src/generated/engine.dart' |
| 21 show AnalysisContext, AnalysisEngine; | 22 show AnalysisContext, AnalysisEngine; |
| 22 import 'package:analyzer/src/generated/error.dart' show CompileTimeErrorCode; | 23 import 'package:analyzer/src/generated/error.dart' show CompileTimeErrorCode; |
| 23 import 'package:analyzer/src/generated/java_core.dart'; | 24 import 'package:analyzer/src/generated/java_core.dart'; |
| 24 import 'package:analyzer/src/generated/java_engine.dart'; | 25 import 'package:analyzer/src/generated/java_engine.dart'; |
| 25 import 'package:analyzer/src/generated/resolver.dart'; | 26 import 'package:analyzer/src/generated/resolver.dart'; |
| 26 import 'package:analyzer/src/generated/sdk.dart' show DartSdk; | 27 import 'package:analyzer/src/generated/sdk.dart' show DartSdk; |
| (...skipping 1753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1780 | 1781 |
| 1781 /** | 1782 /** |
| 1782 * Initialize using the given serialized information. | 1783 * Initialize using the given serialized information. |
| 1783 */ | 1784 */ |
| 1784 ConstFieldElementImpl.forSerialized( | 1785 ConstFieldElementImpl.forSerialized( |
| 1785 UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement) | 1786 UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement) |
| 1786 : super.forSerialized(unlinkedVariable, enclosingElement); | 1787 : super.forSerialized(unlinkedVariable, enclosingElement); |
| 1787 } | 1788 } |
| 1788 | 1789 |
| 1789 /** | 1790 /** |
| 1791 * A value field of an enum. | |
|
Brian Wilkerson
2016/06/06 13:39:50
This wasn't clear to me; I had to read more code t
scheglov
2016/06/06 15:31:43
Done.
| |
| 1792 */ | |
| 1793 class ConstFieldElementImpl_EnumValue extends ConstFieldElementImpl_ofEnum { | |
| 1794 final UnlinkedEnumValue _unlinkedEnumValue; | |
| 1795 final int _index; | |
| 1796 | |
| 1797 ConstFieldElementImpl_EnumValue( | |
| 1798 EnumElementImpl enumElement, this._unlinkedEnumValue, this._index) | |
| 1799 : super(enumElement); | |
| 1800 | |
| 1801 @override | |
| 1802 SourceRange get docRange { | |
| 1803 if (_unlinkedEnumValue != null) { | |
| 1804 UnlinkedDocumentationComment comment = | |
| 1805 _unlinkedEnumValue.documentationComment; | |
| 1806 return comment != null | |
| 1807 ? new SourceRange(comment.offset, comment.length) | |
| 1808 : null; | |
| 1809 } | |
| 1810 return super.docRange; | |
| 1811 } | |
| 1812 | |
| 1813 @override | |
| 1814 String get documentationComment { | |
| 1815 if (_unlinkedEnumValue != null) { | |
| 1816 return _unlinkedEnumValue?.documentationComment?.text; | |
| 1817 } | |
| 1818 return super.documentationComment; | |
| 1819 } | |
| 1820 | |
| 1821 @override | |
| 1822 EvaluationResultImpl get evaluationResult { | |
| 1823 if (_evaluationResult == null) { | |
| 1824 Map<String, DartObjectImpl> fieldMap = <String, DartObjectImpl>{ | |
| 1825 name: new DartObjectImpl( | |
| 1826 context.typeProvider.intType, new IntState(_index)) | |
| 1827 }; | |
| 1828 DartObjectImpl value = | |
| 1829 new DartObjectImpl(type, new GenericState(fieldMap)); | |
| 1830 _evaluationResult = new EvaluationResultImpl(value); | |
| 1831 } | |
| 1832 return _evaluationResult; | |
| 1833 } | |
| 1834 | |
| 1835 @override | |
| 1836 String get name { | |
| 1837 if (_unlinkedEnumValue != null) { | |
| 1838 return _unlinkedEnumValue.name; | |
| 1839 } | |
| 1840 return super.name; | |
| 1841 } | |
| 1842 | |
| 1843 @override | |
| 1844 int get nameOffset { | |
| 1845 if (_unlinkedEnumValue != null) { | |
| 1846 return _unlinkedEnumValue.nameOffset; | |
| 1847 } | |
| 1848 return super.nameOffset; | |
| 1849 } | |
| 1850 | |
| 1851 @override | |
| 1852 InterfaceType get type => _enum.type; | |
| 1853 } | |
| 1854 | |
| 1855 /** | |
| 1856 * The synthetic `values` field of an enum. | |
| 1857 */ | |
| 1858 class ConstFieldElementImpl_EnumValues extends ConstFieldElementImpl_ofEnum { | |
| 1859 ConstFieldElementImpl_EnumValues(EnumElementImpl enumElement) | |
| 1860 : super(enumElement) { | |
| 1861 synthetic = true; | |
| 1862 } | |
| 1863 | |
| 1864 @override | |
| 1865 EvaluationResultImpl get evaluationResult { | |
| 1866 if (_evaluationResult == null) { | |
| 1867 List<DartObjectImpl> constantValues = <DartObjectImpl>[]; | |
| 1868 for (FieldElement field in _enum.fields) { | |
| 1869 if (field is ConstFieldElementImpl_EnumValue) { | |
| 1870 constantValues.add(field.evaluationResult.value); | |
| 1871 } | |
| 1872 } | |
| 1873 _evaluationResult = new EvaluationResultImpl( | |
| 1874 new DartObjectImpl(type, new ListState(constantValues))); | |
| 1875 } | |
| 1876 return _evaluationResult; | |
| 1877 } | |
| 1878 | |
| 1879 @override | |
| 1880 String get name => 'values'; | |
| 1881 | |
| 1882 @override | |
| 1883 InterfaceType get type { | |
| 1884 if (_type == null) { | |
| 1885 InterfaceType listType = context.typeProvider.listType; | |
| 1886 return _type = listType.instantiate(<DartType>[_enum.type]); | |
| 1887 } | |
| 1888 return _type; | |
| 1889 } | |
| 1890 } | |
| 1891 | |
| 1892 /** | |
| 1893 * An abstract constant field of an enum. | |
| 1894 */ | |
| 1895 abstract class ConstFieldElementImpl_ofEnum extends ConstFieldElementImpl { | |
| 1896 final EnumElementImpl _enum; | |
| 1897 | |
| 1898 ConstFieldElementImpl_ofEnum(this._enum) : super(null, -1) { | |
| 1899 enclosingElement = _enum; | |
| 1900 } | |
| 1901 | |
| 1902 @override | |
| 1903 void set const3(bool isConst) { | |
| 1904 assert(false); | |
| 1905 } | |
| 1906 | |
| 1907 @override | |
| 1908 void set evaluationResult(_) { | |
| 1909 assert(false); | |
| 1910 } | |
| 1911 | |
| 1912 @override | |
| 1913 void set final2(bool isFinal) { | |
| 1914 assert(false); | |
| 1915 } | |
| 1916 | |
| 1917 @override | |
| 1918 bool get isConst => true; | |
| 1919 | |
| 1920 @override | |
| 1921 bool get isStatic => true; | |
| 1922 | |
| 1923 @override | |
| 1924 void set static(bool isStatic) { | |
| 1925 assert(false); | |
| 1926 } | |
| 1927 | |
| 1928 void set type(DartType type) { | |
| 1929 assert(false); | |
| 1930 } | |
| 1931 } | |
| 1932 | |
| 1933 /** | |
| 1790 * A [LocalVariableElement] for a local 'const' variable that has an | 1934 * A [LocalVariableElement] for a local 'const' variable that has an |
| 1791 * initializer. | 1935 * initializer. |
| 1792 */ | 1936 */ |
| 1793 class ConstLocalVariableElementImpl extends LocalVariableElementImpl | 1937 class ConstLocalVariableElementImpl extends LocalVariableElementImpl |
| 1794 with ConstVariableElement { | 1938 with ConstVariableElement { |
| 1795 /** | 1939 /** |
| 1796 * Initialize a newly created local variable element to have the given [name] | 1940 * Initialize a newly created local variable element to have the given [name] |
| 1797 * and [offset]. | 1941 * and [offset]. |
| 1798 */ | 1942 */ |
| 1799 ConstLocalVariableElementImpl(String name, int offset) : super(name, offset); | 1943 ConstLocalVariableElementImpl(String name, int offset) : super(name, offset); |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2159 * If this element represents a constant variable, and it has an initializer, | 2303 * If this element represents a constant variable, and it has an initializer, |
| 2160 * a copy of the initializer for the constant. Otherwise `null`. | 2304 * a copy of the initializer for the constant. Otherwise `null`. |
| 2161 * | 2305 * |
| 2162 * Note that in correct Dart code, all constant variables must have | 2306 * Note that in correct Dart code, all constant variables must have |
| 2163 * initializers. However, analyzer also needs to handle incorrect Dart code, | 2307 * initializers. However, analyzer also needs to handle incorrect Dart code, |
| 2164 * in which case there might be some constant variables that lack | 2308 * in which case there might be some constant variables that lack |
| 2165 * initializers. | 2309 * initializers. |
| 2166 */ | 2310 */ |
| 2167 Expression _constantInitializer; | 2311 Expression _constantInitializer; |
| 2168 | 2312 |
| 2169 @override | 2313 EvaluationResultImpl _evaluationResult; |
| 2170 EvaluationResultImpl evaluationResult; | |
| 2171 | 2314 |
| 2172 Expression get constantInitializer { | 2315 Expression get constantInitializer { |
| 2173 if (_constantInitializer == null && _unlinkedConst != null) { | 2316 if (_constantInitializer == null && _unlinkedConst != null) { |
| 2174 _constantInitializer = enclosingUnit.resynthesizerContext | 2317 _constantInitializer = enclosingUnit.resynthesizerContext |
| 2175 .buildExpression(this, _unlinkedConst); | 2318 .buildExpression(this, _unlinkedConst); |
| 2176 } | 2319 } |
| 2177 return _constantInitializer; | 2320 return _constantInitializer; |
| 2178 } | 2321 } |
| 2179 | 2322 |
| 2180 void set constantInitializer(Expression constantInitializer) { | 2323 void set constantInitializer(Expression constantInitializer) { |
| 2181 assert(_unlinkedConst == null); | 2324 assert(_unlinkedConst == null); |
| 2182 _constantInitializer = constantInitializer; | 2325 _constantInitializer = constantInitializer; |
| 2183 } | 2326 } |
| 2184 | 2327 |
| 2328 EvaluationResultImpl get evaluationResult => _evaluationResult; | |
| 2329 | |
| 2330 void set evaluationResult(EvaluationResultImpl evaluationResult) { | |
| 2331 _evaluationResult = evaluationResult; | |
| 2332 } | |
| 2333 | |
| 2185 /** | 2334 /** |
| 2186 * If this element is resynthesized from the summary, return the unlinked | 2335 * If this element is resynthesized from the summary, return the unlinked |
| 2187 * initializer, otherwise return `null`. | 2336 * initializer, otherwise return `null`. |
| 2188 */ | 2337 */ |
| 2189 UnlinkedConst get _unlinkedConst; | 2338 UnlinkedConst get _unlinkedConst; |
| 2190 | 2339 |
| 2191 /** | 2340 /** |
| 2192 * Return a representation of the value of this variable, forcing the value | 2341 * Return a representation of the value of this variable, forcing the value |
| 2193 * to be computed if it had not previously been computed, or `null` if either | 2342 * to be computed if it had not previously been computed, or `null` if either |
| 2194 * this variable was not declared with the 'const' modifier or if the value of | 2343 * this variable was not declared with the 'const' modifier or if the value of |
| (...skipping 989 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3184 : super.forSerialized(enclosingUnit); | 3333 : super.forSerialized(enclosingUnit); |
| 3185 | 3334 |
| 3186 /** | 3335 /** |
| 3187 * Set whether this class is abstract. | 3336 * Set whether this class is abstract. |
| 3188 */ | 3337 */ |
| 3189 void set abstract(bool isAbstract) { | 3338 void set abstract(bool isAbstract) { |
| 3190 assert(_unlinkedEnum == null); | 3339 assert(_unlinkedEnum == null); |
| 3191 } | 3340 } |
| 3192 | 3341 |
| 3193 @override | 3342 @override |
| 3343 List<PropertyAccessorElement> get accessors { | |
| 3344 if (_unlinkedEnum != null && _accessors == null) { | |
| 3345 _resynthesizeFieldsAndPropertyAccessors(); | |
| 3346 } | |
| 3347 return _accessors ?? const <PropertyAccessorElement>[]; | |
| 3348 } | |
| 3349 | |
| 3350 @override | |
| 3351 void set accessors(List<PropertyAccessorElement> accessors) { | |
| 3352 assert(_unlinkedEnum == null); | |
| 3353 super.accessors = accessors; | |
| 3354 } | |
| 3355 | |
| 3356 @override | |
| 3194 List<InterfaceType> get allSupertypes => <InterfaceType>[supertype]; | 3357 List<InterfaceType> get allSupertypes => <InterfaceType>[supertype]; |
| 3195 | 3358 |
| 3196 @override | 3359 @override |
| 3197 int get codeLength { | 3360 int get codeLength { |
| 3198 if (_unlinkedEnum != null) { | 3361 if (_unlinkedEnum != null) { |
| 3199 return _unlinkedEnum.codeRange?.length; | 3362 return _unlinkedEnum.codeRange?.length; |
| 3200 } | 3363 } |
| 3201 return super.codeLength; | 3364 return super.codeLength; |
| 3202 } | 3365 } |
| 3203 | 3366 |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 3231 | 3394 |
| 3232 @override | 3395 @override |
| 3233 String get documentationComment { | 3396 String get documentationComment { |
| 3234 if (_unlinkedEnum != null) { | 3397 if (_unlinkedEnum != null) { |
| 3235 return _unlinkedEnum?.documentationComment?.text; | 3398 return _unlinkedEnum?.documentationComment?.text; |
| 3236 } | 3399 } |
| 3237 return super.documentationComment; | 3400 return super.documentationComment; |
| 3238 } | 3401 } |
| 3239 | 3402 |
| 3240 @override | 3403 @override |
| 3404 List<FieldElement> get fields { | |
| 3405 if (_unlinkedEnum != null && _fields == null) { | |
| 3406 _resynthesizeFieldsAndPropertyAccessors(); | |
| 3407 } | |
| 3408 return _fields ?? const <FieldElement>[]; | |
| 3409 } | |
| 3410 | |
| 3411 @override | |
| 3412 void set fields(List<FieldElement> fields) { | |
| 3413 assert(_unlinkedEnum == null); | |
| 3414 super.fields = fields; | |
| 3415 } | |
| 3416 | |
| 3417 @override | |
| 3241 bool get hasNonFinalField => false; | 3418 bool get hasNonFinalField => false; |
| 3242 | 3419 |
| 3243 @override | 3420 @override |
| 3244 bool get hasReferenceToSuper => false; | 3421 bool get hasReferenceToSuper => false; |
| 3245 | 3422 |
| 3246 @override | 3423 @override |
| 3247 bool get hasStaticMember => true; | 3424 bool get hasStaticMember => true; |
| 3248 | 3425 |
| 3249 @override | 3426 @override |
| 3250 List<InterfaceType> get interfaces => const <InterfaceType>[]; | 3427 List<InterfaceType> get interfaces => const <InterfaceType>[]; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3330 } | 3507 } |
| 3331 | 3508 |
| 3332 @override | 3509 @override |
| 3333 MethodElement getMethod(String name) => null; | 3510 MethodElement getMethod(String name) => null; |
| 3334 | 3511 |
| 3335 @override | 3512 @override |
| 3336 ConstructorElement getNamedConstructor(String name) => null; | 3513 ConstructorElement getNamedConstructor(String name) => null; |
| 3337 | 3514 |
| 3338 @override | 3515 @override |
| 3339 bool isSuperConstructorAccessible(ConstructorElement constructor) => false; | 3516 bool isSuperConstructorAccessible(ConstructorElement constructor) => false; |
| 3517 | |
| 3518 void _resynthesizeFieldsAndPropertyAccessors() { | |
| 3519 List<FieldElementImpl> fields = <FieldElementImpl>[]; | |
| 3520 // Build the 'index' field. | |
| 3521 fields.add(new FieldElementImpl('index', -1) | |
| 3522 ..enclosingElement = this | |
| 3523 ..synthetic = true | |
| 3524 ..final2 = true | |
| 3525 ..type = context.typeProvider.intType); | |
| 3526 // Build the 'values' field. | |
| 3527 fields.add(new ConstFieldElementImpl_EnumValues(this)); | |
| 3528 // Build fields for all enum constants. | |
| 3529 for (int i = 0; i < _unlinkedEnum.values.length; i++) { | |
| 3530 UnlinkedEnumValue unlinkedValue = _unlinkedEnum.values[i]; | |
| 3531 ConstFieldElementImpl_EnumValue field = | |
| 3532 new ConstFieldElementImpl_EnumValue(this, unlinkedValue, i); | |
| 3533 fields.add(field); | |
| 3534 } | |
| 3535 // done | |
| 3536 _fields = fields; | |
| 3537 _accessors = fields | |
| 3538 .map((FieldElementImpl field) => | |
| 3539 new PropertyAccessorElementImpl_ImplicitGetter(field) | |
| 3540 ..enclosingElement = this) | |
| 3541 .toList(growable: false); | |
| 3542 } | |
| 3340 } | 3543 } |
| 3341 | 3544 |
| 3342 /** | 3545 /** |
| 3343 * A base class for concrete implementations of an [ExecutableElement]. | 3546 * A base class for concrete implementations of an [ExecutableElement]. |
| 3344 */ | 3547 */ |
| 3345 abstract class ExecutableElementImpl extends ElementImpl | 3548 abstract class ExecutableElementImpl extends ElementImpl |
| 3346 with TypeParameterizedElementMixin | 3549 with TypeParameterizedElementMixin |
| 3347 implements ExecutableElement { | 3550 implements ExecutableElement { |
| 3348 /** | 3551 /** |
| 3349 * The unlinked representation of the executable in the summary. | 3552 * The unlinked representation of the executable in the summary. |
| (...skipping 4070 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7420 */ | 7623 */ |
| 7421 class PropertyAccessorElementImpl_ImplicitGetter | 7624 class PropertyAccessorElementImpl_ImplicitGetter |
| 7422 extends PropertyAccessorElementImpl { | 7625 extends PropertyAccessorElementImpl { |
| 7423 /** | 7626 /** |
| 7424 * Create the implicit getter and bind it to the [property]. | 7627 * Create the implicit getter and bind it to the [property]. |
| 7425 */ | 7628 */ |
| 7426 PropertyAccessorElementImpl_ImplicitGetter( | 7629 PropertyAccessorElementImpl_ImplicitGetter( |
| 7427 PropertyInducingElementImpl property) | 7630 PropertyInducingElementImpl property) |
| 7428 : super.forVariable(property) { | 7631 : super.forVariable(property) { |
| 7429 property.getter = this; | 7632 property.getter = this; |
| 7633 enclosingElement = property.enclosingElement; | |
| 7430 } | 7634 } |
| 7431 | 7635 |
| 7432 @override | 7636 @override |
| 7433 bool get hasImplicitReturnType => variable.hasImplicitType; | 7637 bool get hasImplicitReturnType => variable.hasImplicitType; |
| 7434 | 7638 |
| 7435 @override | 7639 @override |
| 7436 bool get isGetter => true; | 7640 bool get isGetter => true; |
| 7437 | 7641 |
| 7438 @override | 7642 @override |
| 7439 DartType get returnType => variable.type; | 7643 DartType get returnType => variable.type; |
| (...skipping 796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8236 | 8440 |
| 8237 @override | 8441 @override |
| 8238 void visitElement(Element element) { | 8442 void visitElement(Element element) { |
| 8239 int offset = element.nameOffset; | 8443 int offset = element.nameOffset; |
| 8240 if (offset != -1) { | 8444 if (offset != -1) { |
| 8241 map[offset] = element; | 8445 map[offset] = element; |
| 8242 } | 8446 } |
| 8243 super.visitElement(element); | 8447 super.visitElement(element); |
| 8244 } | 8448 } |
| 8245 } | 8449 } |
| OLD | NEW |