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 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 } | 564 } |
565 if (_kernel != null && _constructors == null) { | 565 if (_kernel != null && _constructors == null) { |
566 var constructors = _kernel.constructors | 566 var constructors = _kernel.constructors |
567 .map((k) => new ConstructorElementImpl.forKernel(this, k, null)); | 567 .map((k) => new ConstructorElementImpl.forKernel(this, k, null)); |
568 var factories = _kernel.procedures | 568 var factories = _kernel.procedures |
569 .where((k) => k.isFactory) | 569 .where((k) => k.isFactory) |
570 .map((k) => new ConstructorElementImpl.forKernel(this, null, k)); | 570 .map((k) => new ConstructorElementImpl.forKernel(this, null, k)); |
571 _constructors = <ConstructorElement>[] | 571 _constructors = <ConstructorElement>[] |
572 ..addAll(constructors) | 572 ..addAll(constructors) |
573 ..addAll(factories); | 573 ..addAll(factories); |
| 574 _constructors.sort((a, b) => a.nameOffset - b.nameOffset); |
574 } | 575 } |
575 if (_unlinkedClass != null && _constructors == null) { | 576 if (_unlinkedClass != null && _constructors == null) { |
576 _constructors = _unlinkedClass.executables | 577 _constructors = _unlinkedClass.executables |
577 .where((e) => e.kind == UnlinkedExecutableKind.constructor) | 578 .where((e) => e.kind == UnlinkedExecutableKind.constructor) |
578 .map((e) => new ConstructorElementImpl.forSerialized(e, this)) | 579 .map((e) => new ConstructorElementImpl.forSerialized(e, this)) |
579 .toList(growable: false); | 580 .toList(growable: false); |
580 // Ensure at least implicit default constructor. | 581 // Ensure at least implicit default constructor. |
581 if (_constructors.isEmpty) { | 582 if (_constructors.isEmpty) { |
582 ConstructorElementImpl constructor = new ConstructorElementImpl('', -1); | 583 ConstructorElementImpl constructor = new ConstructorElementImpl('', -1); |
583 constructor.isSynthetic = true; | 584 constructor.isSynthetic = true; |
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1287 void _resynthesizeFieldsAndPropertyAccessors() { | 1288 void _resynthesizeFieldsAndPropertyAccessors() { |
1288 assert(_fields == null); | 1289 assert(_fields == null); |
1289 assert(_accessors == null); | 1290 assert(_accessors == null); |
1290 var explicitFields = <FieldElement>[]; | 1291 var explicitFields = <FieldElement>[]; |
1291 var implicitAccessors = <PropertyAccessorElement>[]; | 1292 var implicitAccessors = <PropertyAccessorElement>[]; |
1292 var explicitAccessors = <PropertyAccessorElement>[]; | 1293 var explicitAccessors = <PropertyAccessorElement>[]; |
1293 var implicitFields = <String, FieldElementImpl>{}; | 1294 var implicitFields = <String, FieldElementImpl>{}; |
1294 if (_kernel != null) { | 1295 if (_kernel != null) { |
1295 // Build explicit fields and implicit property accessors. | 1296 // Build explicit fields and implicit property accessors. |
1296 for (var k in _kernel.fields) { | 1297 for (var k in _kernel.fields) { |
| 1298 if (k.name.name.startsWith('_redirecting#')) { |
| 1299 continue; |
| 1300 } |
1297 var field = new FieldElementImpl.forKernelFactory(this, k); | 1301 var field = new FieldElementImpl.forKernelFactory(this, k); |
1298 explicitFields.add(field); | 1302 explicitFields.add(field); |
1299 implicitAccessors.add( | 1303 implicitAccessors.add( |
1300 new PropertyAccessorElementImpl_ImplicitGetter(field) | 1304 new PropertyAccessorElementImpl_ImplicitGetter(field) |
1301 ..enclosingElement = this); | 1305 ..enclosingElement = this); |
1302 if (!field.isConst && !field.isFinal) { | 1306 if (!field.isConst && !field.isFinal) { |
1303 implicitAccessors.add( | 1307 implicitAccessors.add( |
1304 new PropertyAccessorElementImpl_ImplicitSetter(field) | 1308 new PropertyAccessorElementImpl_ImplicitSetter(field) |
1305 ..enclosingElement = this); | 1309 ..enclosingElement = this); |
1306 } | 1310 } |
(...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2210 _kernelFactory = null, | 2214 _kernelFactory = null, |
2211 super.forSerialized(serializedExecutable, enclosingClass); | 2215 super.forSerialized(serializedExecutable, enclosingClass); |
2212 | 2216 |
2213 /** | 2217 /** |
2214 * Return the constant initializers for this element, which will be empty if | 2218 * Return the constant initializers for this element, which will be empty if |
2215 * there are no initializers, or `null` if there was an error in the source. | 2219 * there are no initializers, or `null` if there was an error in the source. |
2216 */ | 2220 */ |
2217 List<ConstructorInitializer> get constantInitializers { | 2221 List<ConstructorInitializer> get constantInitializers { |
2218 if (_constantInitializers == null) { | 2222 if (_constantInitializers == null) { |
2219 if (_kernelConstructor != null) { | 2223 if (_kernelConstructor != null) { |
2220 var context = enclosingUnit._kernelContext; | 2224 if (_kernelConstructor.isConst) { |
2221 _constantInitializers = _kernelConstructor.initializers | 2225 var context = enclosingUnit._kernelContext; |
2222 .map((k) => context.getConstructorInitializer(this, k)) | 2226 _constantInitializers = _kernelConstructor.initializers |
2223 .where((i) => i != null) | 2227 .map((k) => context.getConstructorInitializer(this, k)) |
2224 .toList(); | 2228 .where((i) => i != null) |
| 2229 .toList(); |
| 2230 } else { |
| 2231 _constantInitializers = const <ConstructorInitializer>[]; |
| 2232 } |
2225 } | 2233 } |
2226 if (serializedExecutable != null) { | 2234 if (serializedExecutable != null) { |
2227 _constantInitializers = serializedExecutable.constantInitializers | 2235 _constantInitializers = serializedExecutable.constantInitializers |
2228 .map((i) => _buildConstructorInitializer(i)) | 2236 .map((i) => _buildConstructorInitializer(i)) |
2229 .toList(growable: false); | 2237 .toList(growable: false); |
2230 } | 2238 } |
2231 } | 2239 } |
2232 return _constantInitializers; | 2240 return _constantInitializers; |
2233 } | 2241 } |
2234 | 2242 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2352 } | 2360 } |
2353 | 2361 |
2354 void set periodOffset(int periodOffset) { | 2362 void set periodOffset(int periodOffset) { |
2355 _assertNotResynthesized(serializedExecutable); | 2363 _assertNotResynthesized(serializedExecutable); |
2356 _periodOffset = periodOffset; | 2364 _periodOffset = periodOffset; |
2357 } | 2365 } |
2358 | 2366 |
2359 @override | 2367 @override |
2360 ConstructorElement get redirectedConstructor { | 2368 ConstructorElement get redirectedConstructor { |
2361 if (_redirectedConstructor == null) { | 2369 if (_redirectedConstructor == null) { |
2362 if (_kernelConstructor != null) { | 2370 if (_kernelConstructor != null || _kernelFactory != null) { |
2363 for (var initializer in _kernelConstructor.initializers) { | 2371 _redirectedConstructor = enclosingUnit._kernelContext |
2364 if (initializer is kernel.RedirectingInitializer) { | 2372 .getRedirectedConstructor(_kernelConstructor, _kernelFactory); |
2365 return _redirectedConstructor = enclosingUnit._kernelContext | |
2366 .getElement(initializer.targetReference) | |
2367 as ConstructorElementImpl; | |
2368 } | |
2369 } | |
2370 } | 2373 } |
2371 if (serializedExecutable != null) { | 2374 if (serializedExecutable != null) { |
2372 if (serializedExecutable.isRedirectedConstructor) { | 2375 if (serializedExecutable.isRedirectedConstructor) { |
2373 if (serializedExecutable.isFactory) { | 2376 if (serializedExecutable.isFactory) { |
2374 _redirectedConstructor = enclosingUnit.resynthesizerContext | 2377 _redirectedConstructor = enclosingUnit.resynthesizerContext |
2375 .resolveConstructorRef(enclosingElement, | 2378 .resolveConstructorRef(enclosingElement, |
2376 serializedExecutable.redirectedConstructor); | 2379 serializedExecutable.redirectedConstructor); |
2377 } else { | 2380 } else { |
2378 _redirectedConstructor = enclosingElement.getNamedConstructor( | 2381 _redirectedConstructor = enclosingElement.getNamedConstructor( |
2379 serializedExecutable.redirectedConstructorName); | 2382 serializedExecutable.redirectedConstructorName); |
(...skipping 1711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4091 } | 4094 } |
4092 if (serializedExecutable != null) { | 4095 if (serializedExecutable != null) { |
4093 return serializedExecutable.name; | 4096 return serializedExecutable.name; |
4094 } | 4097 } |
4095 return super.name; | 4098 return super.name; |
4096 } | 4099 } |
4097 | 4100 |
4098 @override | 4101 @override |
4099 int get nameOffset { | 4102 int get nameOffset { |
4100 int offset = super.nameOffset; | 4103 int offset = super.nameOffset; |
| 4104 if (_kernel != null) { |
| 4105 return _kernel.fileOffset; |
| 4106 } |
4101 if (offset == 0 && serializedExecutable != null) { | 4107 if (offset == 0 && serializedExecutable != null) { |
4102 return serializedExecutable.nameOffset; | 4108 return serializedExecutable.nameOffset; |
4103 } | 4109 } |
4104 return offset; | 4110 return offset; |
4105 } | 4111 } |
4106 | 4112 |
4107 @override | 4113 @override |
4108 List<ParameterElement> get parameters { | 4114 List<ParameterElement> get parameters { |
4109 if (_parameters == null) { | 4115 if (_parameters == null) { |
4110 if (_kernel != null) { | 4116 if (_kernel != null) { |
(...skipping 1780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5891 kernel.Library get library; | 5897 kernel.Library get library; |
5892 | 5898 |
5893 /** | 5899 /** |
5894 * Return the resynthesized [ConstructorInitializer] for the given Kernel | 5900 * Return the resynthesized [ConstructorInitializer] for the given Kernel |
5895 * [initializer], or `null` if synthetic. | 5901 * [initializer], or `null` if synthetic. |
5896 */ | 5902 */ |
5897 ConstructorInitializer getConstructorInitializer( | 5903 ConstructorInitializer getConstructorInitializer( |
5898 ConstructorElementImpl constructor, kernel.Initializer initializer); | 5904 ConstructorElementImpl constructor, kernel.Initializer initializer); |
5899 | 5905 |
5900 /** | 5906 /** |
5901 * Return the [Element] referenced by the given [reference]. | |
5902 */ | |
5903 ElementImpl getElement(kernel.Reference reference); | |
5904 | |
5905 /** | |
5906 * Return the [Expression] for the given kernel. | 5907 * Return the [Expression] for the given kernel. |
5907 */ | 5908 */ |
5908 Expression getExpression(kernel.Expression expression); | 5909 Expression getExpression(kernel.Expression expression); |
5909 | 5910 |
5910 /** | 5911 /** |
5911 * Return the [InterfaceType] for the given Kernel [type], or `null` if the | 5912 * Return the [InterfaceType] for the given Kernel [type], or `null` if the |
5912 * [type] does not correspond to an [InterfaceType]. | 5913 * [type] does not correspond to an [InterfaceType]. |
5913 */ | 5914 */ |
5914 InterfaceType getInterfaceType(ElementImpl context, kernel.Supertype type); | 5915 InterfaceType getInterfaceType(ElementImpl context, kernel.Supertype type); |
5915 | 5916 |
5916 /** | 5917 /** |
5917 * Return the [LibraryElement] for the given absolute [uriStr]. | 5918 * Return the [LibraryElement] for the given absolute [uriStr]. |
5918 */ | 5919 */ |
5919 LibraryElement getLibrary(String uriStr); | 5920 LibraryElement getLibrary(String uriStr); |
5920 | 5921 |
5921 /** | 5922 /** |
| 5923 * Return the [ConstructorElementImpl] to which the given [kernelConstructor] |
| 5924 * or [kernelFactory] redirects. |
| 5925 */ |
| 5926 ConstructorElementImpl getRedirectedConstructor( |
| 5927 kernel.Constructor kernelConstructor, kernel.Procedure kernelFactory); |
| 5928 |
| 5929 /** |
5922 * Return the [DartType] for the given Kernel [type], or `null` if the [type] | 5930 * Return the [DartType] for the given Kernel [type], or `null` if the [type] |
5923 * does not correspond to a [DartType]. | 5931 * does not correspond to a [DartType]. |
5924 */ | 5932 */ |
5925 DartType getType(ElementImpl context, kernel.DartType type); | 5933 DartType getType(ElementImpl context, kernel.DartType type); |
5926 } | 5934 } |
5927 | 5935 |
5928 /** | 5936 /** |
5929 * A concrete implementation of a [LabelElement]. | 5937 * A concrete implementation of a [LabelElement]. |
5930 */ | 5938 */ |
5931 class LabelElementImpl extends ElementImpl implements LabelElement { | 5939 class LabelElementImpl extends ElementImpl implements LabelElement { |
(...skipping 2414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8346 /** | 8354 /** |
8347 * Initialize a newly created method element to have the given [name] and | 8355 * Initialize a newly created method element to have the given [name] and |
8348 * [nameOffset]. | 8356 * [nameOffset]. |
8349 */ | 8357 */ |
8350 PrefixElementImpl(String name, int nameOffset) | 8358 PrefixElementImpl(String name, int nameOffset) |
8351 : _unlinkedImport = null, | 8359 : _unlinkedImport = null, |
8352 _kernel = null, | 8360 _kernel = null, |
8353 super(name, nameOffset); | 8361 super(name, nameOffset); |
8354 | 8362 |
8355 /** | 8363 /** |
| 8364 * Initialize using the given kernel. |
| 8365 */ |
| 8366 PrefixElementImpl.forKernel(LibraryElementImpl enclosingLibrary, this._kernel) |
| 8367 : _unlinkedImport = null, |
| 8368 super.forSerialized(enclosingLibrary); |
| 8369 |
| 8370 /** |
8356 * Initialize a newly created prefix element to have the given [name]. | 8371 * Initialize a newly created prefix element to have the given [name]. |
8357 */ | 8372 */ |
8358 PrefixElementImpl.forNode(Identifier name) | 8373 PrefixElementImpl.forNode(Identifier name) |
8359 : _unlinkedImport = null, | 8374 : _unlinkedImport = null, |
8360 _kernel = null, | 8375 _kernel = null, |
8361 super.forNode(name); | 8376 super.forNode(name); |
8362 | 8377 |
8363 /** | 8378 /** |
8364 * Initialize using the given serialized information. | 8379 * Initialize using the given serialized information. |
8365 */ | 8380 */ |
8366 PrefixElementImpl.forSerialized( | 8381 PrefixElementImpl.forSerialized( |
8367 this._unlinkedImport, LibraryElementImpl enclosingLibrary) | 8382 this._unlinkedImport, LibraryElementImpl enclosingLibrary) |
8368 : _kernel = null, | 8383 : _kernel = null, |
8369 super.forSerialized(enclosingLibrary); | 8384 super.forSerialized(enclosingLibrary); |
8370 | 8385 |
8371 /** | |
8372 * Initialize using the given kernel. | |
8373 */ | |
8374 PrefixElementImpl.forKernel(LibraryElementImpl enclosingLibrary, this._kernel) | |
8375 : _unlinkedImport = null, | |
8376 super.forSerialized(enclosingLibrary); | |
8377 | |
8378 @override | 8386 @override |
8379 String get displayName => name; | 8387 String get displayName => name; |
8380 | 8388 |
8381 @override | 8389 @override |
8382 LibraryElement get enclosingElement => | 8390 LibraryElement get enclosingElement => |
8383 super.enclosingElement as LibraryElement; | 8391 super.enclosingElement as LibraryElement; |
8384 | 8392 |
8385 @override | 8393 @override |
8386 String get identifier => "_${super.identifier}"; | 8394 String get identifier => "_${super.identifier}"; |
8387 | 8395 |
(...skipping 1236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9624 | 9632 |
9625 @override | 9633 @override |
9626 DartObject computeConstantValue() => null; | 9634 DartObject computeConstantValue() => null; |
9627 | 9635 |
9628 @override | 9636 @override |
9629 void visitChildren(ElementVisitor visitor) { | 9637 void visitChildren(ElementVisitor visitor) { |
9630 super.visitChildren(visitor); | 9638 super.visitChildren(visitor); |
9631 _initializer?.accept(visitor); | 9639 _initializer?.accept(visitor); |
9632 } | 9640 } |
9633 } | 9641 } |
OLD | NEW |