| 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 0c295a4e7bf1c0a870b0df95b4297eef713b36c6..3034b9591f679088e062a1bafa79998b85d1baf1 100644
|
| --- a/pkg/analyzer/lib/src/dart/element/element.dart
|
| +++ b/pkg/analyzer/lib/src/dart/element/element.dart
|
| @@ -1613,9 +1613,13 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl
|
| @override
|
| List<TopLevelVariableElement> get topLevelVariables {
|
| if (_kernelContext != null) {
|
| - return _variables ??= _kernelContext.library.fields
|
| - .map((k) => new TopLevelVariableElementImpl.forKernel(this, k))
|
| - .toList(growable: false);
|
| + return _variables ??= _kernelContext.library.fields.map((k) {
|
| + if (k.isConst && k.initializer != null) {
|
| + return new ConstTopLevelVariableElementImpl.forKernel(this, k);
|
| + } else {
|
| + return new TopLevelVariableElementImpl.forKernel(this, k);
|
| + }
|
| + }).toList(growable: false);
|
| }
|
| if (_unlinkedUnit != null) {
|
| if (_variables == null) {
|
| @@ -2381,6 +2385,13 @@ class ConstTopLevelVariableElementImpl extends TopLevelVariableElementImpl
|
| : super(name, offset);
|
|
|
| /**
|
| + * Initialize using the given kernel.
|
| + */
|
| + ConstTopLevelVariableElementImpl.forKernel(
|
| + ElementImpl enclosingElement, kernel.Field kernel)
|
| + : super.forKernel(enclosingElement, kernel);
|
| +
|
| + /**
|
| * Initialize a newly created top-level variable element to have the given
|
| * [name].
|
| */
|
| @@ -2422,9 +2433,15 @@ abstract class ConstVariableElement
|
| EvaluationResultImpl _evaluationResult;
|
|
|
| Expression get constantInitializer {
|
| - if (_constantInitializer == null && _unlinkedConst != null) {
|
| - _constantInitializer = enclosingUnit.resynthesizerContext
|
| - .buildExpression(this, _unlinkedConst);
|
| + if (_constantInitializer == null) {
|
| + if (_kernelInitializer != null) {
|
| + _constantInitializer =
|
| + enclosingUnit._kernelContext.getExpression(_kernelInitializer);
|
| + }
|
| + if (_unlinkedConst != null) {
|
| + _constantInitializer = enclosingUnit.resynthesizerContext
|
| + .buildExpression(this, _unlinkedConst);
|
| + }
|
| }
|
| return _constantInitializer;
|
| }
|
| @@ -2441,6 +2458,12 @@ abstract class ConstVariableElement
|
| }
|
|
|
| /**
|
| + * If this element is resynthesized from Kernel, return the Kernel
|
| + * initializer, otherwise return `null`.
|
| + */
|
| + kernel.Expression get _kernelInitializer;
|
| +
|
| + /**
|
| * If this element is resynthesized from the summary, return the unlinked
|
| * initializer, otherwise return `null`.
|
| */
|
| @@ -5668,6 +5691,11 @@ abstract class KernelLibraryResynthesizerContext {
|
| kernel.Library get library;
|
|
|
| /**
|
| + * Return the [Expression] for the given kernel.
|
| + */
|
| + Expression getExpression(kernel.Expression expression);
|
| +
|
| + /**
|
| * Return the [InterfaceType] for the given Kernel [type], or `null` if the
|
| * [type] does not correspond to an [InterfaceType].
|
| */
|
| @@ -7381,6 +7409,11 @@ abstract class NonParameterVariableElementImpl extends VariableElementImpl {
|
| }
|
|
|
| /**
|
| + * Subclasses need this getter, see [ConstVariableElement._kernelInitializer].
|
| + */
|
| + kernel.Expression get _kernelInitializer => _kernel?.initializer;
|
| +
|
| + /**
|
| * Subclasses need this getter, see [ConstVariableElement._unlinkedConst].
|
| */
|
| UnlinkedExpr get _unlinkedConst => _unlinkedVariable?.initializer?.bodyExpr;
|
| @@ -7808,6 +7841,11 @@ class ParameterElementImpl extends VariableElementImpl
|
| }
|
|
|
| /**
|
| + * Subclasses need this getter, see [ConstVariableElement._kernelInitializer].
|
| + */
|
| + kernel.Expression get _kernelInitializer => _kernel?.initializer;
|
| +
|
| + /**
|
| * Subclasses need this getter, see [ConstVariableElement._unlinkedConst].
|
| */
|
| UnlinkedExpr get _unlinkedConst => _unlinkedParam?.initializer?.bodyExpr;
|
|
|