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 4c8b9c74ad6bb34f7ba2b0e23ca2c3231ef9a941..ee0739bc5b894bb97ea4835698f69885fd5b40e1 100644 |
--- a/pkg/analyzer/lib/src/dart/element/element.dart |
+++ b/pkg/analyzer/lib/src/dart/element/element.dart |
@@ -3932,9 +3932,15 @@ abstract class ExecutableElementImpl extends ElementImpl |
@override |
List<ParameterElement> get parameters { |
- if (serializedExecutable != null) { |
- _parameters ??= ParameterElementImpl.resynthesizeList( |
- serializedExecutable.parameters, this); |
+ if (_parameters == null) { |
+ if (_kernel != null) { |
+ _parameters = |
+ ParameterElementImpl.forKernelFunction(this, _kernel.function); |
+ } |
+ if (serializedExecutable != null) { |
+ _parameters = ParameterElementImpl.resynthesizeList( |
+ serializedExecutable.parameters, this); |
+ } |
} |
return _parameters ?? const <ParameterElement>[]; |
} |
@@ -7379,6 +7385,11 @@ class ParameterElementImpl extends VariableElementImpl |
final UnlinkedParam _unlinkedParam; |
/** |
+ * The kernel of the element; |
+ */ |
+ final kernel.VariableDeclaration _kernel; |
+ |
+ /** |
* A list containing all of the parameters defined by this parameter element. |
* There will only be parameters if this parameter is a function typed |
* parameter. |
@@ -7421,13 +7432,23 @@ class ParameterElementImpl extends VariableElementImpl |
*/ |
ParameterElementImpl(String name, int nameOffset) |
: _unlinkedParam = null, |
+ _kernel = null, |
super(name, nameOffset); |
/** |
+ * Initialize using the given kernel. |
+ */ |
+ ParameterElementImpl.forKernel( |
+ ElementImpl enclosingElement, this._kernel, this._parameterKind) |
+ : _unlinkedParam = null, |
+ super.forSerialized(enclosingElement); |
+ |
+ /** |
* Initialize a newly created parameter element to have the given [name]. |
*/ |
ParameterElementImpl.forNode(Identifier name) |
: _unlinkedParam = null, |
+ _kernel = null, |
super.forNode(name); |
/** |
@@ -7435,7 +7456,8 @@ class ParameterElementImpl extends VariableElementImpl |
*/ |
ParameterElementImpl.forSerialized( |
this._unlinkedParam, ElementImpl enclosingElement) |
- : super.forSerialized(enclosingElement); |
+ : _kernel = null, |
+ super.forSerialized(enclosingElement); |
/** |
* Initialize using the given serialized information. |
@@ -7574,6 +7596,9 @@ class ParameterElementImpl extends VariableElementImpl |
@override |
bool get isConst { |
+ if (_kernel != null) { |
+ return false; |
+ } |
if (_unlinkedParam != null) { |
return false; |
} |
@@ -7619,6 +7644,9 @@ class ParameterElementImpl extends VariableElementImpl |
@override |
bool get isFinal { |
+ if (_kernel != null) { |
+ return _kernel.isFinal; |
+ } |
if (_unlinkedParam != null) { |
return _unlinkedParam.isFinal; |
} |
@@ -7654,6 +7682,9 @@ class ParameterElementImpl extends VariableElementImpl |
@override |
String get name { |
+ if (_kernel != null) { |
+ return _kernel.name; |
+ } |
if (_unlinkedParam != null) { |
return _unlinkedParam.name; |
} |
@@ -7677,7 +7708,7 @@ class ParameterElementImpl extends VariableElementImpl |
@override |
ParameterKind get parameterKind { |
- if (_unlinkedParam != null && _parameterKind == null) { |
+ if (_parameterKind == null && _unlinkedParam != null) { |
Paul Berry
2017/07/17 16:56:32
What's the purpose of swapping these? Consider re
|
switch (_unlinkedParam.kind) { |
case UnlinkedParamKind.named: |
_parameterKind = ParameterKind.NAMED; |
@@ -7717,6 +7748,9 @@ class ParameterElementImpl extends VariableElementImpl |
@override |
DartType get type { |
+ if (_kernel != null) { |
+ return _type ??= enclosingUnit._kernelContext.getType(this, _kernel.type); |
+ } |
_resynthesizeTypeAndParameters(); |
return super.type; |
} |
@@ -7858,6 +7892,32 @@ class ParameterElementImpl extends VariableElementImpl |
} |
/** |
+ * Create and return [ParameterElement]s for the given [function]. |
+ */ |
+ static List<ParameterElement> forKernelFunction( |
+ ElementImpl enclosingElement, kernel.FunctionNode function) { |
+ if (function.positionalParameters.isNotEmpty || |
+ function.namedParameters.isNotEmpty) { |
+ var parameters = <ParameterElement>[]; |
+ 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)); |
+ } |
+ for (var k in function.namedParameters) { |
+ parameters.add(new ParameterElementImpl.forKernel( |
+ enclosingElement, k, ParameterKind.NAMED)); |
+ } |
+ return parameters; |
+ } else { |
+ return const <ParameterElement>[]; |
+ } |
+ } |
+ |
+ /** |
* Create and return [ParameterElement]s for the given [unlinkedParameters]. |
*/ |
static List<ParameterElement> resynthesizeList( |