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; |