| Index: pkg/compiler/lib/src/tree/nodes.dart
 | 
| diff --git a/pkg/compiler/lib/src/tree/nodes.dart b/pkg/compiler/lib/src/tree/nodes.dart
 | 
| index 744bdfe62a7ba6005864941db4dbab9f54016db4..216b51cb26890ce297327b1059aee58f9f48f8a1 100644
 | 
| --- a/pkg/compiler/lib/src/tree/nodes.dart
 | 
| +++ b/pkg/compiler/lib/src/tree/nodes.dart
 | 
| @@ -6,8 +6,6 @@ import 'dart:collection' show IterableMixin;
 | 
|  
 | 
|  import '../common.dart';
 | 
|  import '../elements/elements.dart' show MetadataAnnotation;
 | 
| -import '../resolution/secret_tree_element.dart'
 | 
| -    show NullTreeElementMixin, StoredTreeElementMixin;
 | 
|  import 'package:front_end/src/fasta/scanner/precedence.dart' as Precedence
 | 
|      show FUNCTION_INFO;
 | 
|  import 'package:front_end/src/fasta/scanner.dart' show BeginGroupToken, Token;
 | 
| @@ -3224,3 +3222,62 @@ class ErrorNode extends Node
 | 
|    get formals => null;
 | 
|    get typedefKeyword => null;
 | 
|  }
 | 
| +
 | 
| +/**
 | 
| + * Encapsulates the field [TreeElementMixin._element].
 | 
| + *
 | 
| + * This library is an implementation detail of dart2js, and should not
 | 
| + * be imported except by resolution and tree node libraries, or for
 | 
| + * testing.
 | 
| + *
 | 
| + * We have taken great care to ensure AST nodes can be cached between
 | 
| + * compiler instances.  Part of this requires that we always access
 | 
| + * resolution results through TreeElements.
 | 
| + *
 | 
| + * So please, do not add additional elements to this library, and do
 | 
| + * not import it.
 | 
| + */
 | 
| +/// Interface for associating
 | 
| +abstract class TreeElementMixin {
 | 
| +  Object get _element;
 | 
| +  void set _element(Object value);
 | 
| +}
 | 
| +
 | 
| +/// Null implementation of [TreeElementMixin] which does not allow association
 | 
| +/// of elements.
 | 
| +///
 | 
| +/// This class is the superclass of all AST nodes.
 | 
| +abstract class NullTreeElementMixin implements TreeElementMixin, Spannable {
 | 
| +  // Deliberately using [Object] here to thwart code completion.
 | 
| +  // You're not really supposed to access this field anyways.
 | 
| +  Object get _element => null;
 | 
| +  set _element(_) {
 | 
| +    assert(invariant(this, false,
 | 
| +        message: "Elements cannot be associated with ${runtimeType}."));
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +/// Actual implementation of [TreeElementMixin] which stores the associated
 | 
| +/// element in the private field [_element].
 | 
| +///
 | 
| +/// This class is mixed into the node classes that are actually associated with
 | 
| +/// elements.
 | 
| +abstract class StoredTreeElementMixin implements TreeElementMixin {
 | 
| +  Object _element;
 | 
| +}
 | 
| +
 | 
| +/**
 | 
| + * Do not call this method directly.  Instead, use an instance of
 | 
| + * TreeElements.
 | 
| + *
 | 
| + * Using [Object] as return type to thwart code completion.
 | 
| + */
 | 
| +Object getTreeElement(TreeElementMixin node) => node._element;
 | 
| +
 | 
| +/**
 | 
| + * Do not call this method directly.  Instead, use an instance of
 | 
| + * TreeElements.
 | 
| + */
 | 
| +void setTreeElement(TreeElementMixin node, Object value) {
 | 
| +  node._element = value;
 | 
| +}
 | 
| 
 |