Chromium Code Reviews| Index: pkg/analyzer/lib/src/dart/element/element.dart |
| diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart |
| index 9563b27f54ee02b4b848e4d9d07c6670b114ce1d..44bf2ad6e5072c0e4c8f8e8e765ccff552a30423 100644 |
| --- a/pkg/analyzer/lib/src/dart/element/element.dart |
| +++ b/pkg/analyzer/lib/src/dart/element/element.dart |
| @@ -1909,6 +1909,13 @@ class ConstFieldElementImpl extends FieldElementImpl with ConstVariableElement { |
| ConstFieldElementImpl(String name, int offset) : super(name, offset); |
| /** |
| + * Initialize using the given kernel. |
| + */ |
| + ConstFieldElementImpl.forKernel( |
| + ElementImpl enclosingElement, kernel.Field kernel) |
| + : super.forKernel(enclosingElement, kernel); |
| + |
| + /** |
| * Initialize a newly created field element to have the given [name]. |
| */ |
| ConstFieldElementImpl.forNode(Identifier name) : super.forNode(name); |
| @@ -1919,13 +1926,6 @@ class ConstFieldElementImpl extends FieldElementImpl with ConstVariableElement { |
| ConstFieldElementImpl.forSerialized( |
| UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement) |
| : super.forSerialized(unlinkedVariable, enclosingElement); |
| - |
| - /** |
| - * Initialize using the given kernel. |
| - */ |
| - ConstFieldElementImpl.forKernel( |
| - ElementImpl enclosingElement, kernel.Field kernel) |
| - : super.forKernel(enclosingElement, kernel); |
| } |
| /** |
| @@ -2551,6 +2551,13 @@ class DefaultFieldFormalParameterElementImpl |
| : super(name, nameOffset); |
| /** |
| + * Initialize using the given kernel. |
| + */ |
| + DefaultFieldFormalParameterElementImpl.forKernel(ElementImpl enclosingElement, |
| + kernel.VariableDeclaration kernel, ParameterKind parameterKind) |
| + : super.forKernel(enclosingElement, kernel, parameterKind); |
| + |
| + /** |
| * Initialize a newly created parameter element to have the given [name]. |
| */ |
| DefaultFieldFormalParameterElementImpl.forNode(Identifier name) |
| @@ -2577,6 +2584,13 @@ class DefaultParameterElementImpl extends ParameterElementImpl |
| : super(name, nameOffset); |
| /** |
| + * Initialize using the given kernel. |
| + */ |
| + DefaultParameterElementImpl.forKernel(ElementImpl enclosingElement, |
| + kernel.VariableDeclaration kernel, ParameterKind parameterKind) |
| + : super.forKernel(enclosingElement, kernel, parameterKind); |
| + |
| + /** |
| * Initialize a newly created parameter element to have the given [name]. |
| */ |
| DefaultParameterElementImpl.forNode(Identifier name) : super.forNode(name); |
| @@ -4441,6 +4455,13 @@ class FieldFormalParameterElementImpl extends ParameterElementImpl |
| : super(name, nameOffset); |
| /** |
| + * Initialize using the given kernel. |
| + */ |
| + FieldFormalParameterElementImpl.forKernel(ElementImpl enclosingElement, |
| + kernel.VariableDeclaration kernel, ParameterKind parameterKind) |
| + : super.forKernel(enclosingElement, kernel, parameterKind); |
| + |
| + /** |
| * Initialize a newly created parameter element to have the given [name]. |
| */ |
| FieldFormalParameterElementImpl.forNode(Identifier name) |
| @@ -7937,19 +7958,59 @@ class ParameterElementImpl extends VariableElementImpl |
| ElementImpl enclosingElement, kernel.FunctionNode function) { |
| if (function.positionalParameters.isNotEmpty || |
| function.namedParameters.isNotEmpty) { |
| + // Prepare all field formal parameters if a constructor. |
| + var fieldFormalParameters = <kernel.VariableDeclaration>[]; |
| + { |
| + var procedure = function.parent; |
| + if (procedure is kernel.Constructor) { |
| + for (kernel.Initializer initializer in procedure.initializers) { |
| + if (initializer is kernel.FieldInitializer) { |
| + kernel.Expression value = initializer.value; |
| + if (value is kernel.VariableGet) { |
| + fieldFormalParameters.add(value.variable); |
|
Paul Berry
2017/07/19 22:11:59
It looks like what you're doing is: if you see `C(
|
| + } |
| + } |
| + } |
| + } |
| + } |
| + |
| var parameters = <ParameterElement>[]; |
| + |
| + // Add positional required and optional parameters. |
| for (int i = 0; i < function.positionalParameters.length; i++) { |
| - parameters.add(new ParameterElementImpl.forKernel( |
| - enclosingElement, |
| - function.positionalParameters[i], |
| - i < function.requiredParameterCount |
| - ? ParameterKind.REQUIRED |
| - : ParameterKind.POSITIONAL)); |
| + kernel.VariableDeclaration parameter = function.positionalParameters[i]; |
| + bool isFieldFormal = fieldFormalParameters.contains(parameter); |
| + if (i < function.requiredParameterCount) { |
| + if (isFieldFormal) { |
| + parameters.add(new FieldFormalParameterElementImpl.forKernel( |
| + enclosingElement, parameter, ParameterKind.REQUIRED)); |
| + } else { |
| + parameters.add(new ParameterElementImpl.forKernel( |
| + enclosingElement, parameter, ParameterKind.REQUIRED)); |
| + } |
| + } else { |
| + if (isFieldFormal) { |
| + parameters.add(new DefaultFieldFormalParameterElementImpl.forKernel( |
| + enclosingElement, parameter, ParameterKind.POSITIONAL)); |
| + } else { |
| + parameters.add(new DefaultParameterElementImpl.forKernel( |
| + enclosingElement, parameter, ParameterKind.POSITIONAL)); |
| + } |
| + } |
| } |
| + |
| + // Add named parameters. |
| for (var k in function.namedParameters) { |
| - parameters.add(new ParameterElementImpl.forKernel( |
| - enclosingElement, k, ParameterKind.NAMED)); |
| + bool isFieldFormal = fieldFormalParameters.contains(k); |
| + if (isFieldFormal) { |
| + parameters.add(new DefaultFieldFormalParameterElementImpl.forKernel( |
| + enclosingElement, k, ParameterKind.NAMED)); |
| + } else { |
| + parameters.add(new DefaultParameterElementImpl.forKernel( |
| + enclosingElement, k, ParameterKind.NAMED)); |
| + } |
| } |
| + |
| return parameters; |
| } else { |
| return const <ParameterElement>[]; |