Elements. Use less VariableFragmentImpl.type

Change-Id: I80e3c41a7acf5bc00d2f36bf3a9ad77c1413f7ea
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439440
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 1160688..00678fe 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -510,7 +510,7 @@
                   ),
                 )
                 ..element = formalParameterElement
-                ..setPseudoExpressionStaticType(formalParameterFragment.type),
+                ..setPseudoExpressionStaticType(formalParameterElement.type),
             );
           }
 
@@ -10432,7 +10432,7 @@
   Constant? evaluationResult;
 
   @override
-  ConstantInitializer? get constantInitializer {
+  ConstantInitializerImpl? get constantInitializer {
     if (_constantInitializer case var result?) {
       return result;
     }
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 6968c00..4e5e5b9 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -1851,7 +1851,7 @@
   }
 
   void _verifyExtensionElementImplements(
-    ExtensionTypeFragmentImpl declaredElement,
+    ExtensionTypeFragmentImpl declaredFragment,
     NamedTypeImpl node,
     TypeImpl type,
   ) {
@@ -1866,6 +1866,7 @@
       return;
     }
 
+    var declaredElement = declaredFragment.element;
     var declaredRepresentation = declaredElement.representation.type;
     if (typeSystem.isSubtypeOf(declaredRepresentation, type)) {
       return;
@@ -1887,7 +1888,7 @@
               implementedRepresentation,
               type.element.name ?? '',
               declaredRepresentation,
-              declaredElement.name ?? '',
+              declaredFragment.name ?? '',
             ],
           );
         }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 8a3c4ab..e413d7a 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -3425,8 +3425,9 @@
 
   void _checkForExtensionTypeRepresentationTypeBottom(
     ExtensionTypeDeclarationImpl node,
-    ExtensionTypeFragmentImpl element,
+    ExtensionTypeFragmentImpl fragment,
   ) {
+    var element = fragment.element;
     var representationType = element.representation.type;
     if (representationType.isBottom) {
       diagnosticReporter.atNode(
@@ -4733,7 +4734,8 @@
       return;
     }
 
-    var representationType = fragment.representation.type;
+    var element = fragment.element;
+    var representationType = element.representation.type;
 
     for (var typeParameterNode in typeParameters) {
       var typeParameterElement = typeParameterNode.declaredFragment!.element;
@@ -5836,9 +5838,10 @@
         if (!typeParameter.isLegacyCovariant) {
           var fields = node.fields;
           var fieldFragment = fields.variables.first.declaredFragment!;
+          var fieldElement = fieldFragment.element;
           var fieldName = fields.variables.first.name;
           Variance fieldVariance = typeParameter.computeVarianceInType(
-            fieldFragment.type,
+            fieldElement.type,
           );
 
           _checkForWrongVariancePosition(
@@ -5894,7 +5897,8 @@
       var methodParameters = method.parameters?.parameters;
       if (methodParameters != null) {
         for (var methodParameter in methodParameters) {
-          var methodParameterElement = methodParameter.declaredFragment!;
+          var methodParameterFragment = methodParameter.declaredFragment!;
+          var methodParameterElement = methodParameterFragment.element;
           if (methodParameterElement.isCovariant) {
             continue;
           }
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index ea40ab9..503a7f7 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -435,8 +435,8 @@
       parameter.declaredFragment = fragment;
     }
     node.declaredFragment = fragment;
-    fragment.element.type = nonDefaultElement.type;
-    fragment.type = nonDefaultElement.type;
+    fragment.element.type = nonDefaultElement.element.type;
+    fragment.type = nonDefaultElement.element.type;
 
     return node;
   }
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index a16df91..6c4904d 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -898,7 +898,8 @@
   void _storeForLoopParts(ForLoopParts node) {}
 
   void _storeFormalParameter(FormalParameterImpl node) {
-    var element = node.declaredFragment!;
+    var fragment = node.declaredFragment!;
+    var element = fragment.element;
     _writeActualType(_sink, element.type);
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
index 6980385..26bcd9a 100644
--- a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -10,7 +9,7 @@
 import 'package:analyzer/src/summary2/library_builder.dart';
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/linking_node_scope.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
+import 'package:analyzer/src/utilities/extensions/object.dart';
 
 class DefaultValueResolver {
   final Linker _linker;
@@ -21,26 +20,42 @@
     : _typeSystem = _libraryBuilder.element.typeSystem;
 
   void resolve() {
-    for (var libraryFragment in _libraryBuilder.element.fragments) {
-      _UnitContext(libraryFragment)
-        ..forEach(libraryFragment.classes, _interface)
-        ..forEach(libraryFragment.enums, _interface)
-        ..forEach(libraryFragment.extensions, _extension)
-        ..forEach(libraryFragment.extensionTypes, _interface)
-        ..forEach(libraryFragment.functions, _executable)
-        ..forEach(libraryFragment.mixins, _interface);
+    var libraryElement = _libraryBuilder.element;
+    var instanceElementListList = [
+      libraryElement.classes,
+      libraryElement.enums,
+      libraryElement.extensions,
+      libraryElement.extensionTypes,
+      libraryElement.mixins,
+    ];
+    for (var instanceElementList in instanceElementListList) {
+      for (var instanceElement in instanceElementList) {
+        for (var method in instanceElement.methods) {
+          _executableElement(
+            method,
+            enclosingInterfaceElement: instanceElement.ifTypeOrNull(),
+          );
+        }
+        if (instanceElement case InterfaceElementImpl interfaceElement) {
+          for (var constructor in interfaceElement.constructors) {
+            _executableElement(
+              constructor,
+              enclosingInterfaceElement: interfaceElement,
+            );
+          }
+        }
+      }
+    }
+
+    for (var topLevelFunction in libraryElement.topLevelFunctions) {
+      _executableElement(topLevelFunction, enclosingInterfaceElement: null);
     }
   }
 
-  void _constructor(_ClassContext context, ConstructorFragmentImpl element) {
-    if (element.isSynthetic) return;
-    _executable(context, element);
-  }
-
-  DefaultFormalParameterImpl? _defaultParameter(
-    FormalParameterFragmentImpl element,
+  DefaultFormalParameterImpl? _defaultParameterNode(
+    FormalParameterFragmentImpl fragment,
   ) {
-    var node = _linker.getLinkingNode(element);
+    var node = _linker.getLinkingNode(fragment);
     if (node?.parent case DefaultFormalParameterImpl defaultParent) {
       if (defaultParent.defaultValue != null) {
         return defaultParent;
@@ -49,110 +64,44 @@
     return null;
   }
 
-  void _executable(_Context context, ExecutableFragmentImpl element) {
-    _ExecutableContext(
-      enclosingContext: context,
-      executableElement: element,
-      scope: _scopeFromElement(element),
-    ).forEach(element.parameters, _parameter);
+  void _executableElement(
+    ExecutableElementImpl element, {
+    required InterfaceElementImpl? enclosingInterfaceElement,
+  }) {
+    for (var formalParameter in element.formalParameters) {
+      _formalParameterElement(
+        formalParameter as FormalParameterElementImpl,
+        enclosingInterfaceElement: enclosingInterfaceElement,
+        enclosingExecutableElement: element,
+      );
+    }
   }
 
-  void _extension(_UnitContext context, ExtensionFragmentImpl element) {
-    context.forEach(element.methods, _executable);
-  }
+  void _formalParameterElement(
+    FormalParameterElementImpl formalParameter, {
+    required InterfaceElementImpl? enclosingInterfaceElement,
+    required ExecutableElementImpl enclosingExecutableElement,
+  }) {
+    var firstFragment = formalParameter.firstFragment;
+    var firstNode = _defaultParameterNode(firstFragment);
+    if (firstNode == null) {
+      return;
+    }
 
-  void _interface(_UnitContext context, InterfaceFragmentImpl element) {
-    _ClassContext(context, element)
-      ..forEach(element.constructors, _constructor)
-      ..forEach(element.methods, _executable);
-  }
-
-  void _parameter(
-    _ExecutableContext context,
-    FormalParameterFragmentImpl parameter,
-  ) {
-    // If a function typed parameter, process nested parameters.
-    context.forEach(parameter.parameters, _parameter);
-
-    var node = _defaultParameter(parameter);
-    if (node == null) return;
-
-    var contextType = _typeSystem.eliminateTypeVariables(parameter.type);
+    var contextType = _typeSystem.eliminateTypeVariables(formalParameter.type);
 
     var analysisOptions = _libraryBuilder.kind.file.analysisOptions;
     var astResolver = AstResolver(
       _linker,
-      context.libraryFragment,
-      context.scope,
+      firstFragment.libraryFragment as LibraryFragmentImpl,
+      LinkingNodeContext.get(firstNode).scope,
       analysisOptions,
-      enclosingClassElement: context.classElement?.asElement2,
-      enclosingExecutableElement: context.executableElement.asElement2,
+      enclosingClassElement: enclosingInterfaceElement,
+      enclosingExecutableElement: enclosingExecutableElement,
     );
     astResolver.resolveExpression(
-      () => node.defaultValue!,
+      () => firstNode.defaultValue!,
       contextType: contextType,
     );
   }
-
-  Scope _scopeFromElement(FragmentImpl element) {
-    var node = _linker.getLinkingNode(element)!;
-    return LinkingNodeContext.get(node).scope;
-  }
-}
-
-class _ClassContext extends _Context {
-  final _UnitContext unitContext;
-
-  @override
-  final InterfaceFragmentImpl classElement;
-
-  _ClassContext(this.unitContext, this.classElement);
-
-  @override
-  LibraryFragmentImpl get libraryFragment {
-    return unitContext.libraryFragment;
-  }
-}
-
-abstract class _Context {
-  InterfaceFragmentImpl? get classElement => null;
-
-  LibraryFragmentImpl get libraryFragment;
-}
-
-class _ExecutableContext extends _Context {
-  final _Context enclosingContext;
-  final ExecutableFragmentImpl executableElement;
-  final Scope scope;
-
-  _ExecutableContext({
-    required this.enclosingContext,
-    required this.executableElement,
-    required this.scope,
-  });
-
-  @override
-  InterfaceFragmentImpl? get classElement {
-    return enclosingContext.classElement;
-  }
-
-  @override
-  LibraryFragmentImpl get libraryFragment {
-    return enclosingContext.libraryFragment;
-  }
-}
-
-class _UnitContext extends _Context {
-  @override
-  final LibraryFragmentImpl libraryFragment;
-
-  _UnitContext(this.libraryFragment);
-}
-
-extension _ContextExtension<C extends _Context> on C {
-  void forEach<T>(List<T> elements, void Function(C context, T element) f) {
-    for (var element in elements) {
-      f(this, element);
-    }
-  }
 }
diff --git a/pkg/analyzer/lib/src/summary2/extension_type.dart b/pkg/analyzer/lib/src/summary2/extension_type.dart
index e81638c..eed092b 100644
--- a/pkg/analyzer/lib/src/summary2/extension_type.dart
+++ b/pkg/analyzer/lib/src/summary2/extension_type.dart
@@ -86,7 +86,7 @@
     isEvaluated = true;
     element.hasImplementsSelfReference = true;
 
-    var representationType = element.firstFragment.representation.type;
+    var representationType = element.representation.type;
     var typeSystem = element.library.typeSystem;
 
     var superInterface =
diff --git a/pkg/analyzer/lib/src/summary2/instance_member_inferrer.dart b/pkg/analyzer/lib/src/summary2/instance_member_inferrer.dart
index f3d7067..c4ea7e5 100644
--- a/pkg/analyzer/lib/src/summary2/instance_member_inferrer.dart
+++ b/pkg/analyzer/lib/src/summary2/instance_member_inferrer.dart
@@ -416,7 +416,10 @@
 
     var classElement = constructor.enclosingElement;
     if (classElement is ClassFragmentImpl && classElement.isMixinApplication) {
-      _inferMixinApplicationConstructor(classElement, constructor);
+      _inferMixinApplicationConstructor(
+        classElement.element,
+        constructor.element,
+      );
     }
   }
 
@@ -523,40 +526,38 @@
   }
 
   void _inferMixinApplicationConstructor(
-    ClassFragmentImpl classElement,
-    ConstructorFragmentImpl constructor,
+    ClassElementImpl classElement,
+    ConstructorElementImpl constructor,
   ) {
     var superType = classElement.supertype;
     if (superType != null) {
       var index = classElement.constructors.indexOf(constructor);
       var superConstructors =
-          superType.elementImpl.constructors
-              .where(
-                (element) =>
-                    element.asElement2.isAccessibleIn(classElement.library),
-              )
+          superType.element.constructors
+              .where((element) => element.isAccessibleIn(classElement.library))
               .toList();
       if (index < superConstructors.length) {
         var baseConstructor = superConstructors[index];
         var substitution = Substitution.fromInterfaceType(superType);
         forCorrespondingPairs<
-          FormalParameterFragmentImpl,
-          FormalParameterFragmentImpl
-        >(constructor.parameters, baseConstructor.parameters, (
-          parameter,
-          baseParameter,
-        ) {
-          var type = substitution.substituteType(baseParameter.type);
-          parameter.element.type = type;
-          parameter.type = type;
-        });
+          FormalParameterElementImpl,
+          FormalParameterElementImpl
+        >(
+          constructor.formalParameters.cast(),
+          baseConstructor.formalParameters.cast(),
+          (parameter, baseParameter) {
+            var type = substitution.substituteType(baseParameter.type);
+            parameter.type = type;
+            parameter.firstFragment.type = type;
+          },
+        );
         // Update arguments of `SuperConstructorInvocation` to have the types
         // (which we have just set) of the corresponding formal parameters.
         // MixinApp(x, y) : super(x, y);
         var initializers = constructor.constantInitializers;
         var initializer = initializers.single as SuperConstructorInvocation;
-        forCorrespondingPairs<FormalParameterFragmentImpl, Expression>(
-          constructor.parameters,
+        forCorrespondingPairs<FormalParameterElementImpl, Expression>(
+          constructor.formalParameters.cast(),
           initializer.argumentList.arguments,
           (parameter, argument) {
             (argument as SimpleIdentifierImpl).setPseudoExpressionStaticType(
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 0a1cbd2..b0b754f 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -138,6 +138,7 @@
 
   @override
   void visitDefaultFormalParameter(DefaultFormalParameter node) {
+    LinkingNodeContext(node, scope);
     node.parameter.accept(this);
   }
 
@@ -164,9 +165,11 @@
     node.members.accept(this);
     nodesToBuildType.addDeclaration(node);
 
-    for (var constant in fragment.constants) {
-      var node = linker.elementNodes[constant]!;
-      LinkingNodeContext(node, scope);
+    for (var field in fragment.fields) {
+      var node = linker.elementNodes[field];
+      if (node != null) {
+        LinkingNodeContext(node, scope);
+      }
     }
 
     scope = outerScope;
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index c197aaa..3c9337b 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/element/scope.dart';
+import 'package:analyzer/src/dart/analysis/analysis_options.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -22,68 +22,64 @@
 class ConstantInitializersResolver {
   final Linker linker;
 
-  late LibraryBuilder _libraryBuilder;
-  late LibraryFragmentImpl _libraryFragment;
-  late LibraryElementImpl _library;
-  late Scope _scope;
-
   ConstantInitializersResolver(this.linker);
 
   void perform() {
     for (var builder in linker.builders.values) {
-      _library = builder.element;
-      _libraryBuilder = builder;
-      for (var libraryFragment in _library.fragments) {
-        _libraryFragment = libraryFragment;
-        libraryFragment.classes.forEach(_resolveInterfaceFields);
-        libraryFragment.enums.forEach(_resolveInterfaceFields);
-        libraryFragment.extensions.forEach(_resolveExtensionFields);
-        libraryFragment.extensionTypes.forEach(_resolveInterfaceFields);
-        libraryFragment.mixins.forEach(_resolveInterfaceFields);
+      var analysisOptions = builder.kind.file.analysisOptions;
+      var libraryElement = builder.element;
 
-        _scope = libraryFragment.scope;
-        libraryFragment.topLevelVariables.forEach(_resolveVariable);
+      var instanceElementListList = [
+        libraryElement.classes,
+        libraryElement.enums,
+        libraryElement.extensions,
+        libraryElement.extensionTypes,
+        libraryElement.mixins,
+      ];
+      for (var instanceElementList in instanceElementListList) {
+        for (var instanceElement in instanceElementList) {
+          for (var field in instanceElement.fields) {
+            _resolveVariable(analysisOptions, field);
+          }
+        }
+      }
+
+      for (var variable in libraryElement.topLevelVariables) {
+        _resolveVariable(analysisOptions, variable);
       }
     }
   }
 
-  void _resolveExtensionFields(ExtensionFragmentImpl extension_) {
-    var node = linker.getLinkingNode(extension_)!;
-    _scope = LinkingNodeContext.get(node).scope;
-    extension_.fields.forEach(_resolveVariable);
-  }
-
-  void _resolveInterfaceFields(InterfaceFragmentImpl class_) {
-    var node = linker.getLinkingNode(class_)!;
-    _scope = LinkingNodeContext.get(node).scope;
-    class_.fields.forEach(_resolveVariable);
-  }
-
-  void _resolveVariable(PropertyInducingFragmentImpl element) {
-    if (element is FieldFragmentImpl && element.isEnumConstant) {
+  void _resolveVariable(
+    AnalysisOptionsImpl analysisOptions,
+    PropertyInducingElementImpl element,
+  ) {
+    if (element is FieldElementImpl && element.isEnumConstant) {
       return;
     }
 
-    if (element.constantInitializer == null) return;
+    var constantInitializer = element.constantInitializer;
+    if (constantInitializer == null) {
+      return;
+    }
 
-    var variable = linker.getLinkingNode(element);
-    if (variable is! VariableDeclarationImpl) return;
-    if (variable.initializer == null) return;
+    var fragment = constantInitializer.fragment;
+    var node = linker.elementNodes[fragment] as VariableDeclarationImpl;
+    var scope = LinkingNodeContext.get(node).scope;
 
-    var analysisOptions = _libraryBuilder.kind.file.analysisOptions;
     var astResolver = AstResolver(
       linker,
-      _libraryFragment,
-      _scope,
+      fragment.libraryFragment as LibraryFragmentImpl,
+      scope,
       analysisOptions,
     );
     astResolver.resolveExpression(
-      () => variable.initializer!,
+      () => node.initializer!,
       contextType: element.type,
     );
 
     // We could have rewritten the initializer.
-    element.constantInitializer = variable.initializer;
+    fragment.constantInitializer = node.initializer;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index c2c2e0e..2a3c72d 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -192,7 +192,8 @@
                   as FormalParameterElementImpl?;
           var valueNode =
               node.functionExpression.parameters?.parameters.firstOrNull;
-          var valueNodeType = valueNode?.declaredFragment!.type;
+          var valueNodeElement = valueNode?.declaredFragment!.element;
+          var valueNodeType = valueNodeElement?.type;
           var valueType = valueNodeType ?? InvalidTypeImpl.instance;
           valueElement?.type = valueType;
           valueElement?.firstFragment.type = valueType;
@@ -239,7 +240,8 @@
               element.formalParameters.singleOrNull
                   as FormalParameterElementImpl?;
           var valueNode = node.parameters?.parameters.firstOrNull;
-          var valueNodeType = valueNode?.declaredFragment!.type;
+          var valueNodeElement = valueNode?.declaredFragment!.element;
+          var valueNodeType = valueNodeElement?.type;
           var valueType = valueNodeType ?? InvalidTypeImpl.instance;
           valueElement?.type = valueType;
           valueElement?.firstFragment.type = valueType;
diff --git a/pkg/analyzer/test/src/summary/elements/types_test.dart b/pkg/analyzer/test/src/summary/elements/types_test.dart
index e3507f6..685abdf 100644
--- a/pkg/analyzer/test/src/summary/elements/types_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/types_test.dart
@@ -126,7 +126,7 @@
           type: FutureOr<int>
       returnType: void
 ''');
-    var variables = library.definingCompilationUnit.topLevelVariables;
+    var variables = library.topLevelVariables;
     expect(variables, hasLength(1));
     _assertTypeStr(variables[0].type, 'FutureOr<int>');
   }
@@ -171,11 +171,11 @@
       returnType: Type
       variable: <testLibrary>::@topLevelVariable::x
 ''');
-    var variables = library.definingCompilationUnit.topLevelVariables;
+    var variables = library.topLevelVariables;
     expect(variables, hasLength(1));
     var x = variables[0];
     _assertTypeStr(x.type, 'Type');
-    expect(x.constantInitializer.toString(), 'FutureOr');
+    expect(x.constantInitializer?.expression.toString(), 'FutureOr');
   }
 
   test_futureOr_inferred() async {
@@ -266,7 +266,7 @@
       firstFragment: #F9
       returnType: FutureOr<int>
 ''');
-    var variables = library.definingCompilationUnit.topLevelVariables;
+    var variables = library.topLevelVariables;
     expect(variables, hasLength(2));
     var x = variables[0];
     expect(x.name, 'x');