Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: pkg/analyzer/lib/src/dart/element/element.dart

Issue 2979133002: Resynthesize parameters from Kernel. (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698