diff --git a/pkg/_js_interop_checks/lib/js_interop_checks.dart b/pkg/_js_interop_checks/lib/js_interop_checks.dart
index 2355b50..9cb71f9 100644
--- a/pkg/_js_interop_checks/lib/js_interop_checks.dart
+++ b/pkg/_js_interop_checks/lib/js_interop_checks.dart
@@ -35,11 +35,11 @@
     if (!procedure.isExternal || !isJSInteropMember(procedure)) return;
 
     if (!procedure.isStatic &&
-        (procedure.name.name == '[]=' || procedure.name.name == '[]')) {
+        (procedure.name.text == '[]=' || procedure.name.text == '[]')) {
       _diagnosticsReporter.report(
           messageJsInteropIndexNotSupported,
           procedure.fileOffset,
-          procedure.name.name.length,
+          procedure.name.text.length,
           procedure.location.file);
     }
 
@@ -73,7 +73,7 @@
       _diagnosticsReporter.report(
           messageJsInteropNonExternalConstructor,
           constructor.fileOffset,
-          constructor.name.name.length,
+          constructor.name.text.length,
           constructor.location.file);
     }
 
@@ -99,7 +99,7 @@
     var enclosingClass = m.enclosingClass;
     if (enclosingClass != null && !hasJSInteropAnnotation(enclosingClass)) {
       _diagnosticsReporter.report(messageJsInteropEnclosingClassJSAnnotation,
-          m.fileOffset, m.name.name.length, m.location.file,
+          m.fileOffset, m.name.text.length, m.location.file,
           context: <LocatedMessage>[
             messageJsInteropEnclosingClassJSAnnotationContext.withLocation(
                 enclosingClass.location.file,
diff --git a/pkg/compiler/lib/src/io/kernel_source_information.dart b/pkg/compiler/lib/src/io/kernel_source_information.dart
index f8d5341..6600d21 100644
--- a/pkg/compiler/lib/src/io/kernel_source_information.dart
+++ b/pkg/compiler/lib/src/io/kernel_source_information.dart
@@ -93,7 +93,7 @@
         } else {
           extensionName = extension.name;
         }
-        String memberName = descriptor.name.name;
+        String memberName = descriptor.name.text;
         return '$extensionName.$memberName';
       }
     }
diff --git a/pkg/compiler/lib/src/ir/annotations.dart b/pkg/compiler/lib/src/ir/annotations.dart
index 637bd63..fa04392 100644
--- a/pkg/compiler/lib/src/ir/annotations.dart
+++ b/pkg/compiler/lib/src/ir/annotations.dart
@@ -77,7 +77,7 @@
     _jsInteropLibraryNames.forEach((ir.Library library, _) {
       for (ir.Member member in library.members) {
         if (member.isExternal) {
-          f(member, _jsInteropMemberNames[member] ?? member.name.name);
+          f(member, _jsInteropMemberNames[member] ?? member.name.text);
         }
       }
     });
@@ -86,7 +86,7 @@
         if (member is ir.Field) continue;
         String name = _jsInteropMemberNames[member];
         if (member.isExternal) {
-          name ??= member.name.name;
+          name ??= member.name.text;
         }
         f(member, name);
       }
@@ -99,7 +99,7 @@
           f) {
     for (ir.Member node in _nativeMembers) {
       if (node is! ir.Field) {
-        String name = _nativeMemberNames[node] ?? node.name.name;
+        String name = _nativeMemberNames[node] ?? node.name.text;
         f(node, name, getCreatesAnnotations(node), getReturnsAnnotations(node));
       }
     }
@@ -112,7 +112,7 @@
     for (ir.Class cls in _nativeClassNames.keys) {
       for (ir.Field field in cls.fields) {
         if (field.isInstanceMember) {
-          String name = _nativeMemberNames[field] ?? field.name.name;
+          String name = _nativeMemberNames[field] ?? field.name.text;
           f(field, name, getCreatesAnnotations(field),
               getReturnsAnnotations(field));
         }
@@ -348,9 +348,9 @@
     ir.Constant optionsValue;
     value.fieldValues.forEach((ir.Reference reference, ir.Constant fieldValue) {
       ir.Field field = reference.asField;
-      if (field.name.name == 'name') {
+      if (field.name.text == 'name') {
         nameValue = fieldValue;
-      } else if (field.name.name == 'options') {
+      } else if (field.name.text == 'options') {
         optionsValue = fieldValue;
       }
     });
diff --git a/pkg/compiler/lib/src/ir/debug.dart b/pkg/compiler/lib/src/ir/debug.dart
index 27fad8e..01fc1f0 100644
--- a/pkg/compiler/lib/src/ir/debug.dart
+++ b/pkg/compiler/lib/src/ir/debug.dart
@@ -29,7 +29,7 @@
   @override
   void visitName(Name node) {
     openAndCloseNode(node, '${node.runtimeType}',
-        {'name': node.name, 'library': node.library?.name});
+        {'name': node.text, 'library': node.library?.name});
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index c176e35..60dc75f3 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -542,7 +542,7 @@
             positionArguments, namedArguments, typeArguments);
         // TODO(johnniwinther): Avoid treating a known function call as a
         // dynamic call when CFE provides a way to distinguish the two.
-        if (operatorFromString(node.name.name) == null &&
+        if (operatorFromString(node.name.text) == null &&
             receiverType is ir.DynamicType) {
           // We might implicitly call a getter that returns a function.
           registerFunctionInvocation(const ir.DynamicType(), positionArguments,
diff --git a/pkg/compiler/lib/src/ir/runtime_type_analysis.dart b/pkg/compiler/lib/src/ir/runtime_type_analysis.dart
index d7e1d75..b62aafc 100644
--- a/pkg/compiler/lib/src/ir/runtime_type_analysis.dart
+++ b/pkg/compiler/lib/src/ir/runtime_type_analysis.dart
@@ -84,7 +84,7 @@
 
   /// Returns `true` if [node] is of the form `e.runtimeType`.
   bool isGetRuntimeType(ir.TreeNode node) {
-    return node is ir.PropertyGet && node.name.name == Identifiers.runtimeType_;
+    return node is ir.PropertyGet && node.name.text == Identifiers.runtimeType_;
   }
 
   /// Returns [node] if [node] is of the form `e.runtimeType` and `null`
@@ -95,7 +95,7 @@
 
   /// Returns `true` if [node] is of the form `e.toString()`.
   bool isInvokeToString(ir.TreeNode node) {
-    return node is ir.MethodInvocation && node.name.name == 'toString';
+    return node is ir.MethodInvocation && node.name.text == 'toString';
   }
 
   assert(isGetRuntimeType(node));
@@ -141,7 +141,7 @@
       } else if (nullAware.parent is ir.MethodInvocation) {
         ir.MethodInvocation methodInvocation = nullAware.parent;
         if (methodInvocation.receiver == nullAware.let &&
-            methodInvocation.name.name == '==') {
+            methodInvocation.name.text == '==') {
           // Detected
           //
           //  e0?.runtimeType == other
@@ -202,7 +202,7 @@
       } else if (nullAware.parent is ir.Arguments &&
           nullAware.parent.parent is ir.MethodInvocation) {
         ir.MethodInvocation methodInvocation = nullAware.parent.parent;
-        if (methodInvocation.name.name == '==' &&
+        if (methodInvocation.name.text == '==' &&
             methodInvocation.arguments.positional.first == nullAware.let) {
           // [nullAware] is the right hand side of ==.
 
@@ -290,7 +290,7 @@
     }
   } else if (node.parent is ir.MethodInvocation) {
     ir.MethodInvocation methodInvocation = node.parent;
-    if (methodInvocation.name.name == '==' &&
+    if (methodInvocation.name.text == '==' &&
         methodInvocation.receiver == node) {
       // [node] is the left hand side of ==.
 
@@ -340,7 +340,7 @@
   } else if (node.parent is ir.Arguments &&
       node.parent.parent is ir.MethodInvocation) {
     ir.MethodInvocation methodInvocation = node.parent.parent;
-    if (methodInvocation.name.name == '==' &&
+    if (methodInvocation.name.text == '==' &&
         methodInvocation.arguments.positional.first == node) {
       // [node] is the right hand side of ==.
       ir.PropertyGet otherGetRuntimeType =
diff --git a/pkg/compiler/lib/src/ir/scope_visitor.dart b/pkg/compiler/lib/src/ir/scope_visitor.dart
index 7ef94b7..27d9b0b 100644
--- a/pkg/compiler/lib/src/ir/scope_visitor.dart
+++ b/pkg/compiler/lib/src/ir/scope_visitor.dart
@@ -1228,7 +1228,7 @@
         sb.write('eager');
         if (fields != null) {
           sb.write('&fields=[');
-          List<String> names = fields.map((f) => f.name.name).toList()..sort();
+          List<String> names = fields.map((f) => f.name.text).toList()..sort();
           sb.write(names.join(','));
           sb.write(']');
         }
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 33079f9..a5ab288 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -233,7 +233,7 @@
           .substituteType(interfaceTarget.getterType);
     }
     // Treat the properties of Object specially.
-    String nameString = node.name.name;
+    String nameString = node.name.text;
     if (nameString == 'hashCode') {
       return typeEnvironment.coreTypes.intNonNullableRawType;
     } else if (nameString == 'runtimeType') {
@@ -255,7 +255,7 @@
         _computePropertyGetType(node, receiverType);
     receiverType = _narrowInstanceReceiver(node.interfaceTarget, receiverType);
     handlePropertyGet(node, receiverType, resultType);
-    if (node.name.name == Identifiers.runtimeType_) {
+    if (node.name.text == Identifiers.runtimeType_) {
       RuntimeTypeUseData data =
           computeRuntimeTypeUse(_pendingRuntimeTypeUseData, node);
       if (data.leftRuntimeTypeExpression == node) {
@@ -391,7 +391,7 @@
 
   ir.Member _getMember(ir.Class cls, String name) {
     for (ir.Member member in cls.members) {
-      if (member.name.name == name) return member;
+      if (member.name.text == name) return member;
     }
     throw fail("Member '$name' not found in $cls");
   }
@@ -599,7 +599,7 @@
     // TODO(34602): Remove when `interfaceTarget` is set on synthetic calls to
     // ==.
     if (interfaceTarget == null &&
-        node.name.name == '==' &&
+        node.name.text == '==' &&
         node.arguments.types.isEmpty &&
         node.arguments.positional.length == 1 &&
         node.arguments.named.isEmpty) {
@@ -647,7 +647,7 @@
         return const ir.DynamicType();
       }
     }
-    if (node.name.name == 'call') {
+    if (node.name.text == 'call') {
       if (receiverType is ir.FunctionType) {
         if (receiverType.typeParameters.length != node.arguments.types.length) {
           return const DoesNotCompleteType();
@@ -657,7 +657,7 @@
             .substituteType(receiverType.returnType);
       }
     }
-    if (node.name.name == '==') {
+    if (node.name.text == '==') {
       // We use this special case to simplify generation of '==' checks.
       return typeEnvironment.coreTypes.boolNonNullableRawType;
     }
@@ -701,7 +701,7 @@
     ir.DartType returnType =
         _computeMethodInvocationType(node, receiverType, argumentTypes);
     receiverType = _narrowInstanceReceiver(node.interfaceTarget, receiverType);
-    if (node.name.name == '==') {
+    if (node.name.text == '==') {
       ir.Expression left = node.receiver;
       ir.Expression right = node.arguments.positional[0];
       TypeMap afterInvocation = typeMap;
diff --git a/pkg/compiler/lib/src/ir/util.dart b/pkg/compiler/lib/src/ir/util.dart
index 7132491..d963863 100644
--- a/pkg/compiler/lib/src/ir/util.dart
+++ b/pkg/compiler/lib/src/ir/util.dart
@@ -120,7 +120,7 @@
         body.then is ir.NullLiteral) {
       ir.MethodInvocation invocation = body.condition;
       ir.Expression receiver = invocation.receiver;
-      if (invocation.name.name == '==' &&
+      if (invocation.name.text == '==' &&
           receiver is ir.VariableGet &&
           receiver.variable == node.variable &&
           invocation.arguments.positional.single is ir.NullLiteral) {
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index 20f91bd..5a3de9a 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -820,7 +820,7 @@
     while (superclass != null) {
       JClassEnv env = classes.getEnv(superclass);
       MemberEntity superMember =
-          env.lookupMember(this, name.name, setter: setter);
+          env.lookupMember(this, name.text, setter: setter);
       if (superMember != null) {
         if (!superMember.isInstanceMember) return null;
         if (!superMember.isAbstract) {
@@ -1243,7 +1243,7 @@
   @override
   Name getName(ir.Name name) {
     return new Name(
-        name.name, name.isPrivate ? getLibrary(name.library) : null);
+        name.text, name.isPrivate ? getLibrary(name.library) : null);
   }
 
   @override
@@ -1302,13 +1302,13 @@
 
   Selector getGetterSelector(ir.Name irName) {
     Name name = new Name(
-        irName.name, irName.isPrivate ? getLibrary(irName.library) : null);
+        irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
     return new Selector.getter(name);
   }
 
   Selector getSetterSelector(ir.Name irName) {
     Name name = new Name(
-        irName.name, irName.isPrivate ? getLibrary(irName.library) : null);
+        irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
     return new Selector.setter(name);
   }
 
@@ -2140,7 +2140,7 @@
         if (node.kind == ir.ProcedureKind.Factory) {
           parts.add(utils.reconstructConstructorName(getMember(node)));
         } else {
-          parts.add(utils.operatorNameToIdentifier(node.name.name));
+          parts.add(utils.operatorNameToIdentifier(node.name.text));
         }
       } else if (node is ir.Constructor) {
         parts.add(utils.reconstructConstructorName(getMember(node)));
diff --git a/pkg/compiler/lib/src/kernel/deferred_load.dart b/pkg/compiler/lib/src/kernel/deferred_load.dart
index 9ca9bcf..37ca71d 100644
--- a/pkg/compiler/lib/src/kernel/deferred_load.dart
+++ b/pkg/compiler/lib/src/kernel/deferred_load.dart
@@ -53,7 +53,7 @@
     ir.Member node = _elementMap.getMemberNode(element);
     return _findImportsTo(
         node is ir.Constructor ? node.enclosingClass : node,
-        node is ir.Constructor ? node.enclosingClass.name : node.name.name,
+        node is ir.Constructor ? node.enclosingClass.name : node.name.text,
         node.enclosingLibrary,
         library);
   }
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 76e5139..46d5a3a 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -439,7 +439,7 @@
     while (superclass != null) {
       KClassEnv env = classes.getEnv(superclass);
       MemberEntity superMember =
-          env.lookupMember(this, name.name, setter: setter);
+          env.lookupMember(this, name.text, setter: setter);
       if (superMember != null) {
         if (!superMember.isInstanceMember) return null;
         if (!superMember.isAbstract) {
@@ -826,7 +826,7 @@
   @override
   Name getName(ir.Name name) {
     return new Name(
-        name.name, name.isPrivate ? getLibrary(name.library) : null);
+        name.text, name.isPrivate ? getLibrary(name.library) : null);
   }
 
   @override
@@ -887,13 +887,13 @@
 
   Selector getGetterSelector(ir.Name irName) {
     Name name = new Name(
-        irName.name, irName.isPrivate ? getLibrary(irName.library) : null);
+        irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
     return new Selector.getter(name);
   }
 
   Selector getSetterSelector(ir.Name irName) {
     Name name = new Name(
-        irName.name, irName.isPrivate ? getLibrary(irName.library) : null);
+        irName.text, irName.isPrivate ? getLibrary(irName.library) : null);
     return new Selector.setter(name);
   }
 
@@ -1534,7 +1534,7 @@
   @override
   ForeignKind getForeignKind(ir.StaticInvocation node) {
     if (commonElements.isForeignHelper(getMember(node.target))) {
-      switch (node.target.name.name) {
+      switch (node.target.name.text) {
         case Identifiers.JS:
           return ForeignKind.JS;
         case Identifiers.JS_BUILTIN:
@@ -2037,7 +2037,7 @@
   /// defaulting to the Dart name.
   void _setNativeName(ir.Member node, IrAnnotationData annotationData) {
     String name = _findJsNameFromAnnotation(node, annotationData);
-    name ??= node.name.name;
+    name ??= node.name.text;
     _nativeDataBuilder.setNativeMemberName(_elementMap.getMember(node), name);
   }
 
@@ -2052,7 +2052,7 @@
   void _setNativeNameForStaticMethod(
       ir.Member node, IrAnnotationData annotationData) {
     String name = _findJsNameFromAnnotation(node, annotationData);
-    name ??= node.name.name;
+    name ??= node.name.text;
     if (_isIdentifier(name)) {
       ClassEntity cls = _elementMap.getClass(node.enclosingClass);
       List<String> nativeNames = _nativeBasicData.getNativeTagsOfClass(cls);
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index 23a170d..36f4dad 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -125,14 +125,14 @@
         }
         if (member is ir.Procedure) {
           if (member.kind == ir.ProcedureKind.Setter) {
-            _setterMap[member.name.name] = member;
+            _setterMap[member.name.text] = member;
           } else {
-            _memberMap[member.name.name] = member;
+            _memberMap[member.name.text] = member;
           }
         } else if (member is ir.Field) {
-          _memberMap[member.name.name] = member;
+          _memberMap[member.name.text] = member;
           if (member.isMutable) {
-            _setterMap[member.name.name] = member;
+            _setterMap[member.name.text] = member;
           }
         } else {
           failedAt(
@@ -379,7 +379,7 @@
     void addField(ir.Field member, {bool includeStatic}) {
       if (!includeStatic && member.isStatic) return;
       if (isRedirectingFactoryField(member)) return;
-      var name = member.name.name;
+      var name = member.name.text;
       _memberMap[name] = member;
       if (member.isMutable) {
         _setterMap[name] = member;
@@ -399,7 +399,7 @@
           return;
         }
       }
-      var name = member.name.name;
+      var name = member.name.text;
       if (member.kind == ir.ProcedureKind.Factory) {
         if (isRedirectingFactory(member)) {
           // Don't include redirecting factories.
@@ -420,7 +420,7 @@
 
     void addConstructors(ir.Class c) {
       for (ir.Constructor member in c.constructors) {
-        var name = member.name.name;
+        var name = member.name.text;
         _constructorMap[name] = member;
       }
     }
@@ -487,7 +487,7 @@
         var forwardingConstructor = _buildForwardingConstructor(
             superclassCloner, superclassConstructor);
         cls.addMember(forwardingConstructor);
-        _constructorMap[forwardingConstructor.name.name] =
+        _constructorMap[forwardingConstructor.name.text] =
             forwardingConstructor;
       }
     }
diff --git a/pkg/compiler/lib/src/kernel/no_such_method_resolver.dart b/pkg/compiler/lib/src/kernel/no_such_method_resolver.dart
index 32f6721..2e347e0 100644
--- a/pkg/compiler/lib/src/kernel/no_such_method_resolver.dart
+++ b/pkg/compiler/lib/src/kernel/no_such_method_resolver.dart
@@ -32,7 +32,7 @@
       expr = asExpression.operand;
     }
     if (expr is ir.SuperMethodInvocation &&
-        expr.name.name == Identifiers.noSuchMethod_) {
+        expr.name.text == Identifiers.noSuchMethod_) {
       ir.Arguments arguments = expr.arguments;
       if (arguments.positional.length == 1 &&
           arguments.named.isEmpty &&
diff --git a/pkg/compiler/lib/src/serialization/member_data.dart b/pkg/compiler/lib/src/serialization/member_data.dart
index a014c58..72b2148 100644
--- a/pkg/compiler/lib/src/serialization/member_data.dart
+++ b/pkg/compiler/lib/src/serialization/member_data.dart
@@ -36,7 +36,7 @@
     // other libraries.
     return null;
   }
-  String name = member.name.name;
+  String name = member.name.text;
   if (member is ir.Constructor) {
     name = '.$name';
   } else if (member is ir.Procedure) {
diff --git a/pkg/compiler/lib/src/serialization/mixins.dart b/pkg/compiler/lib/src/serialization/mixins.dart
index c65a05c..3718e25 100644
--- a/pkg/compiler/lib/src/serialization/mixins.dart
+++ b/pkg/compiler/lib/src/serialization/mixins.dart
@@ -763,7 +763,7 @@
 
   @override
   void writeName(ir.Name value) {
-    writeString(value.name);
+    writeString(value.text);
     writeValueOrNull(value.library, writeLibraryNode);
   }
 
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 2c6cf53..6dbf003 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -4239,7 +4239,7 @@
       return '$count ${adjective}arguments';
     }
 
-    String name() => invocation.target.name.name;
+    String name() => invocation.target.name.text;
 
     ir.Arguments arguments = invocation.arguments;
     bool bad = false;
diff --git a/pkg/compiler/test/model/cfe_annotations_test.dart b/pkg/compiler/test/model/cfe_annotations_test.dart
index 20e0c2b..e84ee78 100644
--- a/pkg/compiler/test/model/cfe_annotations_test.dart
+++ b/pkg/compiler/test/model/cfe_annotations_test.dart
@@ -206,7 +206,7 @@
         void testMember(String idPrefix, ir.Member member,
             {bool implicitJsInteropMember, bool implicitNativeMember}) {
           if (memberIsIgnorable(member)) return;
-          String memberId = '$idPrefix::${member.name.name}';
+          String memberId = '$idPrefix::${member.name.text}';
           MemberEntity memberEntity = elementMap.getMember(member);
 
           String expectedJsInteropMemberName =
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 96029ef..d6ee556 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -472,7 +472,7 @@
     // publicly exposed JS API for a library.
 
     var node = export.node;
-    if (node is Procedure && node.name.name == 'main') {
+    if (node is Procedure && node.name.text == 'main') {
       // Don't allow redefining names from this library.
       var name = _emitTopLevelName(export.node);
       moduleItems.add(js.statement(
@@ -868,7 +868,7 @@
         _currentUri = ctor.enclosingClass.fileUri;
         var jsParams = _emitParameters(ctor.function, isForwarding: true);
         _currentUri = savedUri;
-        var name = ctor.name.name;
+        var name = ctor.name.text;
         var ctorBody = [
           if (mixinCtor != null) mixinCtor,
           if (name != '' || hasUnnamedSuper)
@@ -1006,7 +1006,7 @@
     var fields = c.fields;
     for (var ctor in c.constructors) {
       if (ctor.isExternal) continue;
-      addConstructor(ctor.name.name, _emitConstructor(ctor, fields, className));
+      addConstructor(ctor.name.text, _emitConstructor(ctor, fields, className));
     }
 
     // If classElement has only factory constructors, and it can be mixed in,
@@ -1144,7 +1144,7 @@
       // We know enum fields can be safely emitted as const fields, as long
       // as the `values` field is emitted last.
       var classRef = _emitTopLevelName(c);
-      var valueField = fields.firstWhere((f) => f.name.name == 'values');
+      var valueField = fields.firstWhere((f) => f.name.text == 'values');
       fields.remove(valueField);
       fields.add(valueField);
       for (var f in fields) {
@@ -1152,13 +1152,13 @@
         body.add(defineValueOnClass(
                 c,
                 classRef,
-                _emitStaticMemberName(f.name.name),
+                _emitStaticMemberName(f.name.text),
                 _visitInitializer(f.initializer, f.annotations))
             .toStatement());
       }
     } else if (fields.isNotEmpty) {
       body.add(_emitLazyFields(_emitTopLevelName(c), fields,
-          (n) => _emitStaticMemberName(n.name.name)));
+          (n) => _emitStaticMemberName(n.name.text)));
     }
   }
 
@@ -1261,7 +1261,7 @@
       // nor can they be torn off.
       if (member.isStatic) continue;
 
-      var name = member.name.name;
+      var name = member.name.text;
       var reifiedType = _memberRuntimeType(member, c) as FunctionType;
 
       // Don't add redundant signatures for inherited methods whose signature
@@ -1408,7 +1408,7 @@
     // Also for const constructors we need to ensure default values are
     // available for use by top-level constant initializers.
     var fn = node.function;
-    var body = _emitArgumentInitializers(fn, node.name.name);
+    var body = _emitArgumentInitializers(fn, node.name.text);
 
     // Redirecting constructors: these are not allowed to have initializers,
     // and the redirecting ctor invocation runs before field initializers.
@@ -1456,7 +1456,7 @@
     // derived class constructor with the same name.
     return js.statement('#.#.call(this, #);', [
       className,
-      _constructorName(ctor.name.name),
+      _constructorName(ctor.name.text),
       _emitArgumentList(node.arguments, types: false)
     ]);
   }
@@ -1478,10 +1478,10 @@
     // We can skip the super call if it's empty. Most commonly this happens for
     // things that extend Object, and don't have any field initializers or their
     // own default constructor.
-    if (ctor.name.name == '' && !_hasUnnamedSuperConstructor(c)) {
+    if (ctor.name.text == '' && !_hasUnnamedSuperConstructor(c)) {
       return null;
     }
-    return _emitSuperConstructorCall(className, ctor.name.name, args);
+    return _emitSuperConstructorCall(className, ctor.name.text, args);
   }
 
   js_ast.Statement _emitSuperConstructorCall(
@@ -1655,9 +1655,9 @@
     for (var m in c.procedures) {
       if (m.isAbstract) continue;
       if (m.isGetter) {
-        getters[m.name.name] = m;
+        getters[m.name.text] = m;
       } else if (m.isSetter) {
-        setters[m.name.name] = m;
+        setters[m.name.text] = m;
       }
     }
 
@@ -1684,7 +1684,7 @@
       } else if (m.isAccessor) {
         jsMethods.add(_emitMethodDeclaration(m));
         jsMethods.add(_emitSuperAccessorWrapper(m, getters, setters));
-        if (!hasJsPeer && m.isGetter && m.name.name == 'iterator') {
+        if (!hasJsPeer && m.isGetter && m.name.text == 'iterator') {
           hasIterator = true;
           jsMethods.add(_emitIterable(c));
         }
@@ -1748,7 +1748,7 @@
       }
       fn = _emitNativeFunctionBody(member);
     } else {
-      fn = _emitFunction(member.function, member.name.name);
+      fn = _emitFunction(member.function, member.name.text);
     }
 
     return js_ast.Method(_declareMemberName(member), fn,
@@ -1759,7 +1759,7 @@
   }
 
   js_ast.Fun _emitNativeFunctionBody(Procedure node) {
-    var name = _annotationName(node, isJSAnnotation) ?? node.name.name;
+    var name = _annotationName(node, isJSAnnotation) ?? node.name.text;
     if (node.isGetter) {
       return js_ast.Fun([], js.block('{ return this.#; }', [name]));
     } else if (node.isSetter) {
@@ -1879,7 +1879,7 @@
     /// If a future Dart version allows factory constructors to take their
     /// own type parameters, this will need to be changed to call
     /// [_emitFunction] instead.
-    var name = node.name.name;
+    var name = node.name.text;
     var jsBody = _emitSyncFunctionBody(function, name);
 
     return js_ast.Method(
@@ -1938,7 +1938,7 @@
     var jsMethods = <js_ast.Method>[];
     assert(!field.isStatic);
 
-    var name = _annotationName(field, isJSName) ?? field.name.name;
+    var name = _annotationName(field, isJSName) ?? field.name.text;
     // Generate getter
     var fn = js_ast.Fun([], js.block('{ return this.#; }', [name]));
     var method = js_ast.Method(_declareMemberName(field), fn, isGetter: true);
@@ -1965,7 +1965,7 @@
       Map<String, Procedure> getters, Map<String, Procedure> setters) {
     if (member.isAbstract) return null;
 
-    var name = member.name.name;
+    var name = member.name.text;
     var memberName = _declareMemberName(member);
     if (member.isGetter) {
       if (!setters.containsKey(name) &&
@@ -2097,7 +2097,7 @@
         ..sourceInformation = _hoverComment(
             js_ast.PropertyAccess(objExpr, access),
             field.fileOffset,
-            field.name.name.length));
+            field.name.text.length));
 
       // TODO(jmesserly): currently uses a dummy setter to indicate writable.
       if (!field.isFinal && !field.isConst) {
@@ -2146,7 +2146,7 @@
   /// Unlike call sites, we always have an element available, so we can use it
   /// directly rather than computing the relevant options for [_emitMemberName].
   js_ast.Expression _declareMemberName(Member m, {bool useExtension}) {
-    return _emitMemberName(m.name.name,
+    return _emitMemberName(m.name.text,
         isStatic: m is Field ? m.isStatic : (m as Procedure).isStatic,
         useExtension:
             useExtension ?? _extensionTypes.isNativeClass(m.enclosingClass),
@@ -2377,8 +2377,8 @@
     if (m is Procedure) {
       if (m.isExternal) return true;
       if (m.isNoSuchMethodForwarder) {
-        if (renamedJsMembers.contains(m.name.name)) {
-          return _hasExternalProcedure(m.enclosingClass, m.name.name);
+        if (renamedJsMembers.contains(m.name.text)) {
+          return _hasExternalProcedure(m.enclosingClass, m.name.text);
         }
       }
     }
@@ -2402,7 +2402,7 @@
       ];
       classes.addAll(classesToCheck);
       for (var procedure in c.procedures) {
-        if (procedure.name.name == name && !procedure.isNoSuchMethodForwarder) {
+        if (procedure.name.text == name && !procedure.isNoSuchMethodForwarder) {
           return procedure.isExternal;
         }
       }
@@ -2459,9 +2459,9 @@
     _staticTypeContext.enterMember(node);
     _currentUri = node.fileUri;
 
-    var name = node.name.name;
+    var name = node.name.text;
     var result = js_ast.Method(
-        propertyName(name), _emitFunction(node.function, node.name.name),
+        propertyName(name), _emitFunction(node.function, node.name.text),
         isGetter: node.isGetter, isSetter: node.isSetter)
       ..sourceInformation = _nodeEnd(node.fileEndOffset);
 
@@ -2476,7 +2476,7 @@
     _currentUri = p.fileUri;
 
     var body = <js_ast.Statement>[];
-    var fn = _emitFunction(p.function, p.name.name)
+    var fn = _emitFunction(p.function, p.name.text)
       ..sourceInformation = _nodeEnd(p.fileEndOffset);
 
     if (_currentLibrary.importUri.scheme == 'dart' &&
@@ -2486,7 +2486,7 @@
 
     var nameExpr = _emitTopLevelName(p);
     body.add(js.statement('# = #',
-        [nameExpr, js_ast.NamedFunction(_emitTemporaryId(p.name.name), fn)]));
+        [nameExpr, js_ast.NamedFunction(_emitTemporaryId(p.name.text), fn)]));
 
     _currentUri = savedUri;
     _staticTypeContext.leaveMember(p);
@@ -2900,7 +2900,7 @@
   js_ast.Expression _emitConstructorName(InterfaceType type, Member c) {
     return _emitJSInterop(type.classNode) ??
         js_ast.PropertyAccess(
-            _emitConstructorAccess(type), _constructorName(c.name.name));
+            _emitConstructorAccess(type), _constructorName(c.name.text));
   }
 
   /// Emits an expression that lets you access statics on an [c] from code.
@@ -3043,7 +3043,7 @@
       // assign directly to [virtualField].  If the latter, copy the old
       // variable to [virtualField].
       var symbol = emitClassPrivateNameSymbol(c.enclosingLibrary,
-          getLocalClassName(c), field.name.name, virtualField);
+          getLocalClassName(c), field.name.text, virtualField);
       if (symbol != virtualField) {
         body.add(js.statement('const # = #;', [virtualField, symbol]));
       }
@@ -3823,7 +3823,7 @@
         _emitConstructorName(
             streamIterator,
             _asyncStreamIteratorClass.procedures
-                .firstWhere((p) => p.isFactory && p.name.name == '')),
+                .firstWhere((p) => p.isFactory && p.name.text == '')),
         [_visitExpression(node.iterable)]);
 
     var iter = _emitTemporaryId('iter');
@@ -4201,13 +4201,13 @@
   @override
   js_ast.Expression visitPropertyGet(PropertyGet node) {
     return _emitPropertyGet(
-        node.receiver, node.interfaceTarget, node.name.name);
+        node.receiver, node.interfaceTarget, node.name.text);
   }
 
   @override
   js_ast.Expression visitPropertySet(PropertySet node) {
     return _emitPropertySet(
-        node.receiver, node.interfaceTarget, node.value, node.name.name);
+        node.receiver, node.interfaceTarget, node.value, node.name.text);
   }
 
   @override
@@ -4222,7 +4222,7 @@
 
   js_ast.Expression _emitPropertyGet(Expression receiver, Member member,
       [String memberName]) {
-    memberName ??= member.name.name;
+    memberName ??= member.name.text;
     // TODO(jmesserly): should tearoff of `.call` on a function type be
     // encoded as a different node, or possibly eliminated?
     // (Regardless, we'll still need to handle the callable JS interop classes.)
@@ -4273,7 +4273,7 @@
       Expression receiver, Member member, Expression value,
       [String memberName]) {
     var jsName =
-        _emitMemberName(memberName ?? member.name.name, member: member);
+        _emitMemberName(memberName ?? member.name.text, member: member);
 
     if (member != null && isJsMember(member)) {
       value = _assertInterop(value);
@@ -4345,7 +4345,7 @@
 
   js_ast.Expression _emitMethodCall(Expression receiver, Member target,
       Arguments arguments, InvocationExpression node) {
-    var name = node.name.name;
+    var name = node.name.text;
     if (isOperatorMethodName(name) && arguments.named.isEmpty) {
       var argLength = arguments.positional.length;
       if (argLength == 0) {
@@ -4454,7 +4454,7 @@
 
   js_ast.Expression _emitUnaryOperator(
       Expression expr, Member target, InvocationExpression node) {
-    var op = node.name.name;
+    var op = node.name.text;
     if (target != null) {
       var dispatchType = _coreTypes.legacyRawType(target.enclosingClass);
       if (_typeRep.unaryOperationIsPrimitive(dispatchType)) {
@@ -4492,7 +4492,7 @@
     // comparison, e.g.  `a & ~b == 0`.
     if (parent is InvocationExpression &&
         parent.arguments.positional.length == 1) {
-      var op = parent.name.name;
+      var op = parent.name.text;
       var left = getInvocationReceiver(parent);
       var right = parent.arguments.positional[0];
       if (left != null && op == '==') {
@@ -4511,7 +4511,7 @@
   }
 
   bool _nodeIsBitwiseOperation(InvocationExpression node) {
-    switch (node.name.name) {
+    switch (node.name.text) {
       case '&':
       case '|':
       case '^':
@@ -4545,7 +4545,7 @@
     var parent = node.parent;
     if (parent == null) return false;
     if (parent is InvocationExpression && _nodeIsBitwiseOperation(parent)) {
-      if (parent.name.name == '&' && parent.arguments.positional.length == 1) {
+      if (parent.name.text == '&' && parent.arguments.positional.length == 1) {
         var left = getInvocationReceiver(parent);
         var right = parent.arguments.positional[0];
         final MAX = (1 << width) - 1;
@@ -4575,7 +4575,7 @@
         var left = getInvocationReceiver(expr);
         var right = expr.arguments.positional[0];
         if (left != null) {
-          switch (expr.name.name) {
+          switch (expr.name.text) {
             case '&':
               return min(bitWidth(left, depth), bitWidth(right, depth));
 
@@ -4619,7 +4619,7 @@
 
   js_ast.Expression _emitBinaryOperator(Expression left, Member target,
       Expression right, InvocationExpression node) {
-    var op = node.name.name;
+    var op = node.name.text;
     if (op == '==') return _emitEqualityOperator(left, target, right);
 
     // TODO(jmesserly): using the target type here to work around:
@@ -4816,7 +4816,7 @@
   /// Emits the [js_ast.PropertyAccess] for accessors or method calls to
   /// [jsTarget].[jsName], replacing `super` if it is not allowed in scope.
   js_ast.PropertyAccess _emitSuperTarget(Member member, {bool setter = false}) {
-    var jsName = _emitMemberName(member.name.name, member: member);
+    var jsName = _emitMemberName(member.name.text, member: member);
     if (member is Field && !_virtualFields.isVirtual(member)) {
       return js_ast.PropertyAccess(js_ast.This(), jsName);
     }
@@ -4824,7 +4824,7 @@
 
     // If we can't emit `super` in this context, generate a helper that does it
     // for us, and call the helper.
-    var name = member.name.name;
+    var name = member.name.text;
     var jsMethod = _superHelpers.putIfAbsent(name, () {
       var isAccessor = member is Procedure ? member.isAccessor : true;
       if (isAccessor) {
@@ -4865,7 +4865,7 @@
 
     // Optimize some internal SDK calls.
     if (isSdkInternalRuntime(target.enclosingLibrary)) {
-      var name = target.name.name;
+      var name = target.name.text;
       if (node.arguments.positional.isEmpty) {
         if (name == 'typeRep') {
           return _emitType(node.arguments.types.single);
@@ -4932,7 +4932,7 @@
   }
 
   bool _isDebuggerCall(Procedure target) {
-    return target.name.name == 'debugger' &&
+    return target.name.text == 'debugger' &&
         target.enclosingLibrary.importUri.toString() == 'dart:developer';
   }
 
@@ -4984,12 +4984,12 @@
         var nativeName = _extensionTypes.getNativePeers(c);
         if (nativeName.isNotEmpty) {
           var memberName = _annotationName(target, isJSName) ??
-              _emitStaticMemberName(target.name.name, target);
+              _emitStaticMemberName(target.name.text, target);
           return runtimeCall('global.#.#', [nativeName[0], memberName]);
         }
       }
       return js_ast.PropertyAccess(_emitStaticClassName(c),
-          _emitStaticMemberName(target.name.name, target));
+          _emitStaticMemberName(target.name.text, target));
     }
     return _emitTopLevelName(target);
   }
@@ -5169,9 +5169,9 @@
         case 'Map':
         case 'HashMap':
         case 'LinkedHashMap':
-          if (ctor.name.name == '') {
+          if (ctor.name.text == '') {
             return js.call('new #.new()', _emitMapImplType(type));
-          } else if (ctor.name.name == 'identity') {
+          } else if (ctor.name.text == 'identity') {
             return js.call(
                 'new #.new()', _emitMapImplType(type, identity: true));
           }
@@ -5179,15 +5179,15 @@
         case 'Set':
         case 'HashSet':
         case 'LinkedHashSet':
-          if (ctor.name.name == '') {
+          if (ctor.name.text == '') {
             return js.call('new #.new()', _emitSetImplType(type));
-          } else if (ctor.name.name == 'identity') {
+          } else if (ctor.name.text == 'identity') {
             return js.call(
                 'new #.new()', _emitSetImplType(type, identity: true));
           }
           break;
         case 'List':
-          if (ctor.name.name == '' && type is InterfaceType) {
+          if (ctor.name.text == '' && type is InterfaceType) {
             return _emitList(type.typeArguments[0], []);
           }
           break;
@@ -5240,11 +5240,11 @@
   @override
   js_ast.Expression visitNot(Not node) {
     var operand = node.operand;
-    if (operand is MethodInvocation && operand.name.name == '==') {
+    if (operand is MethodInvocation && operand.name.text == '==') {
       return _emitEqualityOperator(operand.receiver, operand.interfaceTarget,
           operand.arguments.positional[0],
           negated: true);
-    } else if (operand is DirectMethodInvocation && operand.name.name == '==') {
+    } else if (operand is DirectMethodInvocation && operand.name.text == '==') {
       return _emitEqualityOperator(
           operand.receiver, operand.target, operand.arguments.positional[0],
           negated: true);
@@ -5825,9 +5825,9 @@
       // directly.  Otherwise, use a private symbol in case the field
       // was overridden.
       var symbol = cls.isEnum
-          ? _emitMemberName(member.name.name, member: member)
+          ? _emitMemberName(member.name.text, member: member)
           : emitClassPrivateNameSymbol(
-              cls.enclosingLibrary, getLocalClassName(cls), member.name.name);
+              cls.enclosingLibrary, getLocalClassName(cls), member.name.text);
       return js_ast.Property(symbol, constant);
     }
 
diff --git a/pkg/dev_compiler/lib/src/kernel/constants.dart b/pkg/dev_compiler/lib/src/kernel/constants.dart
index 69ba4a5..5400577 100644
--- a/pkg/dev_compiler/lib/src/kernel/constants.dart
+++ b/pkg/dev_compiler/lib/src/kernel/constants.dart
@@ -46,7 +46,7 @@
       var constant = node.constant;
       if (constant is InstanceConstant) {
         var value = constant.fieldValues.entries
-            .firstWhere((e) => e.key.asField.name.name == name,
+            .firstWhere((e) => e.key.asField.name.text == name,
                 orElse: () => null)
             ?.value;
         if (value is PrimitiveConstant) return value.value;
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
index 2b26a3f..47d0805 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
@@ -177,28 +177,28 @@
   @override
   void visitFieldReference(Field node) {
     if (node.name.isPrivate) {
-      privateFields[node.name.name] = node.name.library.importUri.toString();
+      privateFields[node.name.text] = node.name.library.importUri.toString();
     }
   }
 
   @override
   void visitField(Field node) {
     if (node.name.isPrivate) {
-      privateFields[node.name.name] = node.name.library.importUri.toString();
+      privateFields[node.name.text] = node.name.library.importUri.toString();
     }
   }
 
   @override
   void visitPropertyGet(PropertyGet node) {
     if (node.name.isPrivate) {
-      privateFields[node.name.name] = node.name.library.importUri.toString();
+      privateFields[node.name.text] = node.name.library.importUri.toString();
     }
   }
 
   @override
   void visitPropertySet(PropertySet node) {
     if (node.name.isPrivate) {
-      privateFields[node.name.name] = node.name.library.importUri.toString();
+      privateFields[node.name.text] = node.name.library.importUri.toString();
     }
   }
 }
diff --git a/pkg/dev_compiler/lib/src/kernel/js_interop.dart b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
index 2f929ab..9c01d89 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_interop.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_interop.dart
@@ -35,7 +35,7 @@
   if (node is StaticInvocation) {
     var target = node.target;
     return _isLibrary(target.enclosingLibrary, ['dart:js']) &&
-        target.name.name == 'allowInterop';
+        target.name.text == 'allowInterop';
   }
   return false;
 }
@@ -80,7 +80,7 @@
 /// Whether [i] is a `spread` invocation (to be used on function arguments
 /// to have them compiled as `...` spread args in ES6 outputs).
 bool isJSSpreadInvocation(Procedure target) =>
-    target.name.name == 'spread' && _isJSLibrary(target.enclosingLibrary);
+    target.name.text == 'spread' && _isJSLibrary(target.enclosingLibrary);
 
 bool isJSName(Expression value) =>
     isBuiltinAnnotation(value, '_js_helper', 'JSName');
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index 81776ac..0cac386 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -8,7 +8,7 @@
 import 'package:kernel/kernel.dart';
 
 Constructor unnamedConstructor(Class c) =>
-    c.constructors.firstWhere((c) => c.name.name == '', orElse: () => null);
+    c.constructors.firstWhere((c) => c.name.text == '', orElse: () => null);
 
 /// Returns the enclosing library for reference [node].
 Library getLibrary(NamedNode node) {
@@ -47,10 +47,10 @@
 String getTypeParameterName(TypeParameter node) => escapeIdentifier(node.name);
 
 String getTopLevelName(NamedNode n) {
-  if (n is Procedure) return n.name.name;
+  if (n is Procedure) return n.name.text;
   if (n is Class) return n.name;
   if (n is Typedef) return n.name;
-  if (n is Field) return n.name.name;
+  if (n is Field) return n.name.text;
   return n.canonicalName?.name;
 }
 
@@ -152,7 +152,7 @@
 bool isFromEnvironmentInvocation(CoreTypes coreTypes, StaticInvocation node) {
   var target = node.target;
   return node.isConst &&
-      target.name.name == 'fromEnvironment' &&
+      target.name.text == 'fromEnvironment' &&
       target.enclosingLibrary == coreTypes.coreLibrary;
 }
 
@@ -197,7 +197,7 @@
 
 bool isInlineJS(Member e) =>
     e is Procedure &&
-    e.name.name == 'JS' &&
+    e.name.text == 'JS' &&
     e.enclosingLibrary.importUri.toString() == 'dart:_foreign_helper';
 
 /// Whether the parameter [p] is covariant (either explicitly `covariant` or
diff --git a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
index 363f13a..1040ac9 100644
--- a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
+++ b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
@@ -110,15 +110,15 @@
 
   @override
   bool visitMethodInvocation(MethodInvocation node) => _invocationIsNullable(
-      node.interfaceTarget, node.name.name, node.receiver);
+      node.interfaceTarget, node.name.text, node.receiver);
 
   @override
   bool visitDirectMethodInvocation(DirectMethodInvocation node) =>
-      _invocationIsNullable(node.target, node.name.name, node.receiver);
+      _invocationIsNullable(node.target, node.name.text, node.receiver);
 
   @override
   bool visitSuperMethodInvocation(SuperMethodInvocation node) =>
-      _invocationIsNullable(node.interfaceTarget, node.name.name);
+      _invocationIsNullable(node.interfaceTarget, node.name.text);
 
   bool _invocationIsNullable(Member target, String name,
       [Expression receiver]) {
@@ -127,7 +127,7 @@
     // https://github.com/dart-lang/sdk/issues/31854
     if (name == '==') return false;
     if (target == null) return true; // dynamic call
-    if (target.name.name == 'toString' &&
+    if (target.name.text == 'toString' &&
         receiver != null &&
         receiver.getStaticType(_staticTypeContext) ==
             coreTypes.stringLegacyRawType) {
@@ -188,7 +188,7 @@
             typeString.split('|').contains('Null');
       }
     }
-    return _invocationIsNullable(target, node.name.name);
+    return _invocationIsNullable(target, node.name.text);
   }
 
   @override
@@ -274,7 +274,7 @@
     if (node is StaticGet) {
       var t = node.target;
       return t is Field &&
-          t.name.name == fieldName &&
+          t.name.text == fieldName &&
           _isInternalSdkAnnotation(t.enclosingLibrary);
     }
     return false;
diff --git a/pkg/dev_compiler/lib/src/kernel/property_model.dart b/pkg/dev_compiler/lib/src/kernel/property_model.dart
index a0d28e0..cee7fb9 100644
--- a/pkg/dev_compiler/lib/src/kernel/property_model.dart
+++ b/pkg/dev_compiler/lib/src/kernel/property_model.dart
@@ -85,7 +85,7 @@
     Map<String, Field> getInstanceFieldMap(Class c) {
       var instanceFields = c.fields.where((f) => !f.isStatic);
       return HashMap.fromIterables(
-          instanceFields.map((f) => f.name.name), instanceFields);
+          instanceFields.map((f) => f.name.text), instanceFields);
     }
 
     var allFields =
@@ -129,7 +129,7 @@
 
         // Look in all super classes to see if we're overriding a field in our
         // library, if so mark that field as overridden.
-        var name = member.name.name;
+        var name = member.name.text;
         _overriddenPrivateFields.addAll(superclasses
             .map((c) => allFields[c][name])
             .where((f) => f != null));
@@ -228,7 +228,7 @@
           continue;
         }
 
-        var name = member.name.name;
+        var name = member.name.text;
         if (member is Field) {
           inheritedGetters.add(name);
           if (!member.isFinal) inheritedSetters.add(name);
@@ -253,7 +253,7 @@
       // Also ignore abstract fields.
       if (field.isAbstract || field.isStatic) continue;
 
-      var name = field.name.name;
+      var name = field.name.text;
       if (virtualAccessorNames.contains(name) ||
           fieldModel.isVirtual(field) ||
           field.isCovariant ||
@@ -328,7 +328,7 @@
     // we've seen, and visit starting from the class, then mixins in
     // reverse order, then superclasses.
     for (var m in c.members) {
-      var name = m.name.name;
+      var name = m.name.text;
       if (m.isAbstract || m is Constructor) continue;
       if (m is Procedure) {
         if (m.isStatic) continue;
@@ -352,7 +352,7 @@
       for (var m in c.members) {
         if (!m.name.isPrivate &&
             (m is Procedure && !m.isStatic || m is Field && !m.isStatic)) {
-          members.add(m.name.name);
+          members.add(m.name.text);
         }
       }
     }
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 8a54269..d2fc5e5 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -181,7 +181,7 @@
       var ctor = coreTypes.index
           .getClass('dart:core', '_Invocation')
           .constructors
-          .firstWhere((c) => c.name.name == name);
+          .firstWhere((c) => c.name.text == name);
       return ConstructorInvocation(ctor, Arguments(positional));
     }
 
diff --git a/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart b/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart
index ed9062f..c208be1 100644
--- a/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart
+++ b/pkg/front_end/lib/src/api_prototype/lowering_predicates.dart
@@ -28,8 +28,8 @@
 bool isLateLoweredField(Field node) {
   return node.isInternalImplementation &&
       node.name != null &&
-      node.name.name.startsWith(lateFieldPrefix) &&
-      !node.name.name.endsWith(lateIsSetSuffix);
+      node.name.text.startsWith(lateFieldPrefix) &&
+      !node.name.text.endsWith(lateIsSetSuffix);
 }
 
 /// Returns `true` if [node] is the field holding the marker for whether a
@@ -55,8 +55,8 @@
 bool isLateLoweredIsSetField(Field node) {
   return node.isInternalImplementation &&
       node.name != null &&
-      node.name.name.startsWith(lateFieldPrefix) &&
-      node.name.name.endsWith(lateIsSetSuffix);
+      node.name.text.startsWith(lateFieldPrefix) &&
+      node.name.text.endsWith(lateIsSetSuffix);
 }
 
 /// Returns `true` if [node] is the getter for reading the value of a lowered
@@ -84,11 +84,11 @@
     if (parent is Class) {
       return parent.fields.any((Field field) =>
           isLateLoweredField(field) &&
-          field.name.name.endsWith(node.name.name));
+          field.name.text.endsWith(node.name.text));
     } else if (parent is Library) {
       return parent.fields.any((Field field) =>
           isLateLoweredField(field) &&
-          field.name.name.endsWith(node.name.name));
+          field.name.text.endsWith(node.name.text));
     }
   }
   return false;
@@ -119,11 +119,11 @@
     if (parent is Class) {
       return parent.fields.any((Field field) =>
           isLateLoweredField(field) &&
-          field.name.name.endsWith(node.name.name));
+          field.name.text.endsWith(node.name.text));
     } else if (parent is Library) {
       return parent.fields.any((Field field) =>
           isLateLoweredField(field) &&
-          field.name.name.endsWith(node.name.name));
+          field.name.text.endsWith(node.name.text));
     }
   }
   return false;
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 1a6eb5d..4c5b699 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -755,7 +755,7 @@
         : procedure.isSetter
             ? 'set:'
             : '';
-    String invocationName = prefix + procedure.name.name;
+    String invocationName = prefix + procedure.name.text;
     if (procedure.isSetter) invocationName += '=';
     Expression invocation = target.backendTarget.instantiateInvocation(
         target.loader.coreTypes,
diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
index 5dbfb12..b361811 100644
--- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
@@ -119,7 +119,7 @@
   Builder lookupLocalMemberByName(Name name,
       {bool setter: false, bool required: false}) {
     Builder builder =
-        lookupLocalMember(name.name, setter: setter, required: required);
+        lookupLocalMember(name.text, setter: setter, required: required);
     if (builder != null && name.isPrivate && library.library != name.library) {
       builder = null;
     }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index 73003a2..b8afcf7 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -73,7 +73,7 @@
 
   void addMember(Member member) {
     DillMemberBuilder builder = new DillMemberBuilder(member, this);
-    String name = member.name.name;
+    String name = member.name.text;
     if (builder.isConstructor || builder.isFactory) {
       constructorScopeBuilder.addMember(name, builder);
     } else if (builder.isSetter) {
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
index 803ebd2..86aaa4d 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart
@@ -52,12 +52,12 @@
         case ExtensionMemberKind.Operator:
         case ExtensionMemberKind.Field:
           Member member = descriptor.member.asMember;
-          scopeBuilder.addMember(name.name,
+          scopeBuilder.addMember(name.text,
               new DillExtensionMemberBuilder(member, descriptor, this));
           break;
         case ExtensionMemberKind.Setter:
           Member member = descriptor.member.asMember;
-          scopeBuilder.addSetter(name.name,
+          scopeBuilder.addSetter(name.text,
               new DillExtensionMemberBuilder(member, descriptor, this));
           break;
       }
@@ -65,7 +65,7 @@
     _methods.forEach((Name name, ExtensionMemberDescriptor descriptor) {
       Member member = descriptor.member.asMember;
       scopeBuilder.addMember(
-          name.name,
+          name.text,
           new DillExtensionMemberBuilder(
               member, descriptor, this, _tearOffs[name]));
     });
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index 07ed03c..e36d001 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -187,7 +187,7 @@
   }
 
   void addMember(Member member) {
-    String name = member.name.name;
+    String name = member.name.text;
     if (name == "_exports#") {
       Field field = member;
       String stringValue;
@@ -327,11 +327,11 @@
           name = node.name;
         } else if (node is Procedure) {
           libraryUri = node.enclosingLibrary.importUri;
-          name = node.name.name;
+          name = node.name.text;
           isSetter = node.isSetter;
         } else if (node is Member) {
           libraryUri = node.enclosingLibrary.importUri;
-          name = node.name.name;
+          name = node.name.text;
         } else if (node is Typedef) {
           libraryUri = node.enclosingLibrary.importUri;
           name = node.name;
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index 2426266..ca51796 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -33,7 +33,7 @@
 
   String get debugName => "DillMemberBuilder";
 
-  String get name => member.name.name;
+  String get name => member.name.text;
 
   bool get isConstructor => member is Constructor;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index b009d4a..713947d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1181,7 +1181,7 @@
       Member resolvedTarget = redirectionTarget?.target;
 
       if (resolvedTarget == null) {
-        String name = constructorNameForDiagnostics(initialTarget.name.name,
+        String name = constructorNameForDiagnostics(initialTarget.name.text,
             className: initialTarget.enclosingClass.name);
         // TODO(dmitryas): Report this error earlier.
         replacementNode = buildProblem(
@@ -1470,7 +1470,7 @@
                   builder.charOffset, const <TypeParameter>[]) !=
               null) {
         String superclass = classBuilder.supertypeBuilder.fullNameForErrors;
-        int length = constructor.name.name.length;
+        int length = constructor.name.text.length;
         if (length == 0) {
           length = (constructor.parent as Class).name.length;
         }
@@ -1847,7 +1847,7 @@
             .withArguments(candidate.enclosingClass.name);
       } else {
         if (candidate is Constructor) {
-          if (candidate.name.name == '') {
+          if (candidate.name.text == '') {
             length = candidate.enclosingClass.name.length;
           } else {
             // Assume no spaces around the dot. Not perfect, but probably the
@@ -1887,10 +1887,10 @@
       bool reportWarning: true,
       List<LocatedMessage> context}) {
     Message message = isSuper
-        ? fasta.templateSuperclassHasNoGetter.withArguments(name.name)
-        : fasta.templateGetterNotFound.withArguments(name.name);
+        ? fasta.templateSuperclassHasNoGetter.withArguments(name.text)
+        : fasta.templateGetterNotFound.withArguments(name.text);
     if (reportWarning) {
-      addProblemErrorIfConst(message, charOffset, name.name.length,
+      addProblemErrorIfConst(message, charOffset, name.text.length,
           context: context);
     }
     return message;
@@ -1902,10 +1902,10 @@
       bool reportWarning: true,
       List<LocatedMessage> context}) {
     Message message = isSuper
-        ? fasta.templateSuperclassHasNoSetter.withArguments(name.name)
-        : fasta.templateSetterNotFound.withArguments(name.name);
+        ? fasta.templateSuperclassHasNoSetter.withArguments(name.text)
+        : fasta.templateSetterNotFound.withArguments(name.text);
     if (reportWarning) {
-      addProblemErrorIfConst(message, charOffset, name.name.length,
+      addProblemErrorIfConst(message, charOffset, name.text.length,
           context: context);
     }
     return message;
@@ -1916,7 +1916,7 @@
       {bool isSuper: false,
       bool reportWarning: true,
       List<LocatedMessage> context}) {
-    String plainName = name.name;
+    String plainName = name.text;
     int dotIndex = plainName.lastIndexOf(".");
     if (dotIndex != -1) {
       plainName = plainName.substring(dotIndex + 1);
@@ -1928,8 +1928,8 @@
       length = 1;
     }
     Message message = isSuper
-        ? fasta.templateSuperclassHasNoMethod.withArguments(name.name)
-        : fasta.templateMethodNotFound.withArguments(name.name);
+        ? fasta.templateSuperclassHasNoMethod.withArguments(name.text)
+        : fasta.templateMethodNotFound.withArguments(name.text);
     if (reportWarning) {
       addProblemErrorIfConst(message, charOffset, length, context: context);
     }
@@ -3989,7 +3989,7 @@
         target.function, arguments, charOffset, typeParameters);
     if (argMessage != null) {
       return throwNoSuchMethodError(forest.createNullLiteral(charOffset),
-          target.name.name, arguments, charOffset,
+          target.name.text, arguments, charOffset,
           candidate: target, message: argMessage);
     }
 
@@ -4064,7 +4064,7 @@
         target.function, arguments, fileOffset, typeParameters);
     if (argMessage != null) {
       return throwNoSuchMethodError(forest.createNullLiteral(fileOffset),
-          target.name.name, arguments, fileOffset,
+          target.name.text, arguments, fileOffset,
           candidate: target, message: argMessage);
     }
 
@@ -5979,7 +5979,7 @@
       [int charOffset = -1]) {
     if (member.isConst && !constructor.isConst) {
       addProblem(fasta.messageConstConstructorWithNonConstSuper, charOffset,
-          constructor.name.name.length);
+          constructor.name.text.length);
     }
     needsImplicitSuperInitializer = false;
     return new SuperInitializer(constructor, arguments)
@@ -5992,8 +5992,8 @@
       Constructor constructor, Arguments arguments,
       [int charOffset = -1]) {
     if (classBuilder.checkConstructorCyclic(
-        member.name, constructor.name.name)) {
-      int length = constructor.name.name.length;
+        member.name, constructor.name.text)) {
+      int length = constructor.name.text.length;
       if (length == 0) length = "this".length;
       addProblem(fasta.messageConstructorCyclic, charOffset, length);
       // TODO(askesc): Produce invalid initializer.
@@ -6146,7 +6146,7 @@
           fasta.templateNotConstantExpression
               .withArguments('Method invocation'),
           offset,
-          name.name.length);
+          name.text.length);
     }
     if (isSuper) {
       // We can ignore [isNullAware] on super sends.
@@ -6160,9 +6160,9 @@
           target = null;
           addProblemErrorIfConst(
               fasta.templateSuperclassMethodArgumentMismatch
-                  .withArguments(name.name),
+                  .withArguments(name.text),
               offset,
-              name.name.length);
+              name.text.length);
         }
         return new SuperMethodInvocation(name, arguments, target)
           ..fileOffset = offset;
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index b7a9d24..13c33ac 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -581,9 +581,9 @@
     if (declaration?.isStatic ?? true) return null;
     if (declaration.isDuplicate) {
       library?.addProblem(
-          templateDuplicatedDeclarationUse.withArguments(name.name),
+          templateDuplicatedDeclarationUse.withArguments(name.text),
           charOffset,
-          name.name.length,
+          name.text.length,
           library.fileUri);
       return null;
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index a15f7be..926b2f8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -1585,7 +1585,7 @@
               unevaluatedArguments(arguments, {}, node.arguments.types)));
     }
 
-    final String op = node.name.name;
+    final String op = node.name.text;
 
     // Handle == and != first (it's common between all types). Since `a != b` is
     // parsed as `!(a == b)` it is handled implicitly through ==.
@@ -1835,7 +1835,7 @@
     }
 
     final Constant receiver = _evaluateSubexpression(node.receiver);
-    if (receiver is StringConstant && node.name.name == 'length') {
+    if (receiver is StringConstant && node.name.text == 'length') {
       return canonicalize(intFolder.makeIntConstant(receiver.value.length));
     } else if (shouldBeUnevaluated) {
       return unevaluated(node,
@@ -1846,7 +1846,7 @@
     return report(
         node,
         templateConstEvalInvalidPropertyGet.withArguments(
-            node.name.name, receiver, isNonNullableByDefault));
+            node.name.text, receiver, isNonNullableByDefault));
   }
 
   @override
@@ -1910,7 +1910,7 @@
         return report(
             node,
             templateConstEvalInvalidStaticInvocation
-                .withArguments(target.name.name));
+                .withArguments(target.name.text));
       } else if (target is Procedure) {
         if (target.kind == ProcedureKind.Method) {
           return canonicalize(new TearOffConstant(target));
@@ -1918,7 +1918,7 @@
         return report(
             node,
             templateConstEvalInvalidStaticInvocation
-                .withArguments(target.name.name));
+                .withArguments(target.name.text));
       } else {
         reportInvalid(
             node, 'No support for ${target.runtimeType} in a static-get.');
@@ -2064,13 +2064,13 @@
       if (target.isConst &&
           target.enclosingLibrary == coreTypes.coreLibrary &&
           positionals.length == 1 &&
-          (target.name.name == "fromEnvironment" ||
-              target.name.name == "hasEnvironment")) {
+          (target.name.text == "fromEnvironment" ||
+              target.name.text == "hasEnvironment")) {
         if (environmentDefines != null) {
           // Evaluate environment constant.
           Constant name = positionals.single;
           if (name is StringConstant) {
-            if (target.name.name == "fromEnvironment") {
+            if (target.name.text == "fromEnvironment") {
               return _handleFromEnvironment(target, name, named);
             } else {
               return _handleHasEnvironment(name);
@@ -2087,7 +2087,7 @@
                   isConst: true));
         }
       }
-    } else if (target.name.name == 'identical') {
+    } else if (target.name.text == 'identical') {
       // Ensure the "identical()" function comes from dart:core.
       final TreeNode parent = target.parent;
       if (parent is Library && parent == coreTypes.coreLibrary) {
@@ -2123,7 +2123,7 @@
       return report(node, messageConstEvalExtension);
     }
 
-    String name = target.name.name;
+    String name = target.name.text;
     if (target is Procedure && target.isFactory) {
       if (name.isEmpty) {
         name = target.enclosingClass.name;
@@ -2325,7 +2325,7 @@
     if (cached != null) return cached;
     for (Procedure procedure in klass.procedures) {
       if (procedure.kind == ProcedureKind.Operator &&
-          procedure.name.name == '==' &&
+          procedure.name.text == '==' &&
           !procedure.isAbstract &&
           !procedure.isForwardingStub) {
         return primitiveEqualCache[klass] = false;
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index ec809d6..659754b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -471,7 +471,7 @@
   String get _debugName => "PropertyAccessGenerator";
 
   @override
-  String get _plainNameForRead => name.name;
+  String get _plainNameForRead => name.text;
 
   @override
   Expression doInvocation(
@@ -486,7 +486,7 @@
     sink.write(", receiver: ");
     printNodeOn(receiver, sink, syntheticNames: syntheticNames);
     sink.write(", name: ");
-    sink.write(name.name);
+    sink.write(name.text);
   }
 
   @override
@@ -624,7 +624,7 @@
   String get _debugName => "ThisPropertyAccessGenerator";
 
   @override
-  String get _plainNameForRead => name.name;
+  String get _plainNameForRead => name.text;
 
   @override
   Expression buildSimpleRead() {
@@ -715,7 +715,7 @@
   @override
   void printOn(StringSink sink) {
     sink.write(", name: ");
-    sink.write(name.name);
+    sink.write(name.text);
   }
 }
 
@@ -738,7 +738,7 @@
   Expression receiverAccess() => new VariableGet(receiver);
 
   @override
-  String get _plainNameForRead => name.name;
+  String get _plainNameForRead => name.text;
 
   @override
   Expression buildSimpleRead() {
@@ -823,7 +823,7 @@
     sink.write(", receiverExpression: ");
     printNodeOn(receiverExpression, sink, syntheticNames: syntheticNames);
     sink.write(", name: ");
-    sink.write(name.name);
+    sink.write(name.text);
   }
 }
 
@@ -842,7 +842,7 @@
   String get _debugName => "SuperPropertyAccessGenerator";
 
   @override
-  String get _plainNameForRead => name.name;
+  String get _plainNameForRead => name.text;
 
   @override
   Expression buildSimpleRead() {
@@ -936,7 +936,7 @@
   void printOn(StringSink sink) {
     NameSystem syntheticNames = new NameSystem();
     sink.write(", name: ");
-    sink.write(name.name);
+    sink.write(name.text);
     sink.write(", getter: ");
     printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
     sink.write(", setter: ");
@@ -1458,11 +1458,11 @@
       return _helper.buildProblem(
           templateNotConstantExpression.withArguments('Method invocation'),
           offset,
-          readTarget?.name?.name?.length ?? 0);
+          readTarget?.name?.text?.length ?? 0);
     }
     if (readTarget == null || isFieldOrGetter(readTarget)) {
       return _helper.forest.createExpressionInvocation(
-          offset + (readTarget?.name?.name?.length ?? 0),
+          offset + (readTarget?.name?.text?.length ?? 0),
           buildSimpleRead(),
           arguments);
     } else {
@@ -1935,7 +1935,7 @@
   String get _debugName => "ExplicitExtensionIndexedAccessGenerator";
 
   @override
-  String get _plainNameForRead => targetName.name;
+  String get _plainNameForRead => targetName.text;
 
   List<DartType> _createExtensionTypeArguments() {
     return explicitTypeArguments ?? const <DartType>[];
@@ -3079,7 +3079,7 @@
     if (declarationBuilder is DeclarationBuilder) {
       DeclarationBuilder declaration = declarationBuilder;
       Builder member = declaration.findStaticBuilder(
-          name.name, offsetForToken(send.token), _uri, _helper.libraryBuilder);
+          name.text, offsetForToken(send.token), _uri, _helper.libraryBuilder);
 
       Generator generator;
       if (member == null) {
@@ -3092,7 +3092,7 @@
               send.token,
               send.token,
               arguments,
-              name.name,
+              name.text,
               send.typeArguments,
               token.charOffset,
               Constness.implicit,
@@ -3100,7 +3100,7 @@
         }
       } else if (member is AmbiguousBuilder) {
         return _helper.buildProblem(
-            member.message, member.charOffset, name.name.length);
+            member.message, member.charOffset, name.text.length);
       } else {
         Builder setter;
         if (member.isSetter) {
@@ -3108,13 +3108,13 @@
           member = null;
         } else if (member.isGetter) {
           setter = declaration.findStaticBuilder(
-              name.name, fileOffset, _uri, _helper.libraryBuilder,
+              name.text, fileOffset, _uri, _helper.libraryBuilder,
               isSetter: true);
         } else if (member.isField) {
           MemberBuilder fieldBuilder = member;
           if (!fieldBuilder.isAssignable) {
             setter = declaration.findStaticBuilder(
-                name.name, fileOffset, _uri, _helper.libraryBuilder,
+                name.text, fileOffset, _uri, _helper.libraryBuilder,
                 isSetter: true);
           } else {
             setter = member;
@@ -3122,7 +3122,7 @@
         }
         generator = new StaticAccessGenerator.fromBuilder(
             _helper,
-            name.name,
+            name.text,
             send.token,
             member is MemberBuilder ? member : null,
             setter is MemberBuilder ? setter : null);
@@ -3338,7 +3338,7 @@
   Name get name => unsupported("name", fileOffset, _uri);
 
   @override
-  String get _plainNameForRead => name.name;
+  String get _plainNameForRead => name.text;
 
   withReceiver(Object receiver, int operatorOffset, {bool isNullAware}) => this;
 
@@ -3454,7 +3454,7 @@
 
   factory UnresolvedNameGenerator(
       ExpressionGeneratorHelper helper, Token token, Name name) {
-    if (name.name.isEmpty) {
+    if (name.text.isEmpty) {
       unhandled("empty", "name", offsetForToken(token), helper.uri);
     }
     return new UnresolvedNameGenerator.internal(helper, token, name);
@@ -3511,7 +3511,7 @@
   @override
   void printOn(StringSink sink) {
     sink.write(", name: ");
-    sink.write(name.name);
+    sink.write(name.text);
   }
 
   Expression _buildUnresolvedVariableAssignment(
@@ -3719,7 +3719,7 @@
   @override
   void printOn(StringSink sink) {
     sink.write(", binaryOperator: ");
-    sink.write(binaryOperator.name);
+    sink.write(binaryOperator.text);
   }
 }
 
@@ -3801,8 +3801,8 @@
   /* Expression | Generator */ buildPropertyAccess(
       IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
     if (send is IncompleteSendGenerator) {
-      assert(send.name.name == send.token.lexeme,
-          "'${send.name.name}' != ${send.token.lexeme}");
+      assert(send.name.text == send.token.lexeme,
+          "'${send.name.text}' != ${send.token.lexeme}");
       Object result = qualifiedLookup(send.token);
       if (send is SendAccessGenerator) {
         result = _helper.finishSend(
@@ -4265,7 +4265,7 @@
           constructor.function, arguments, offset, <TypeParameter>[]);
     } else {
       String fullName =
-          _helper.constructorNameForDiagnostics(name.name, isSuper: isSuper);
+          _helper.constructorNameForDiagnostics(name.text, isSuper: isSuper);
       message = (isSuper
               ? templateSuperclassHasNoConstructor
               : templateConstructorNotFound)
@@ -4276,7 +4276,7 @@
       return _helper.buildInvalidInitializer(
           _helper.throwNoSuchMethodError(
               _forest.createNullLiteral(offset),
-              _helper.constructorNameForDiagnostics(name.name,
+              _helper.constructorNameForDiagnostics(name.text,
                   isSuper: isSuper),
               arguments,
               offset,
@@ -4434,7 +4434,7 @@
     assert(arguments != null);
   }
 
-  String get _plainNameForRead => name.name;
+  String get _plainNameForRead => name.text;
 
   String get _debugName => "SendAccessGenerator";
 
@@ -4494,7 +4494,7 @@
   @override
   void printOn(StringSink sink) {
     sink.write(", name: ");
-    sink.write(name.name);
+    sink.write(name.text);
     sink.write(", arguments: ");
     Arguments node = arguments;
     if (node is Node) {
@@ -4513,7 +4513,7 @@
       ExpressionGeneratorHelper helper, Token token, this.name)
       : super(helper, token);
 
-  String get _plainNameForRead => name.name;
+  String get _plainNameForRead => name.text;
 
   String get _debugName => "IncompletePropertyAccessGenerator";
 
@@ -4572,7 +4572,7 @@
   @override
   void printOn(StringSink sink) {
     sink.write(", name: ");
-    sink.write(name.name);
+    sink.write(name.text);
   }
 }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
index 0ed93a7..9daa3e6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -92,7 +92,7 @@
     Procedure referenceFrom;
     if (classBuilder.referencesFromIndexed != null) {
       referenceFrom = classBuilder.referencesFromIndexed
-          .lookupProcedureNotSetter(name.name);
+          .lookupProcedureNotSetter(name.text);
     }
     return new Procedure(name, kind, new FunctionNode(null, returnType: type),
         isAbstract: true,
@@ -115,7 +115,7 @@
     Procedure referenceFrom;
     if (classBuilder.referencesFromIndexed != null) {
       referenceFrom =
-          classBuilder.referencesFromIndexed.lookupProcedureSetter(name.name);
+          classBuilder.referencesFromIndexed.lookupProcedureSetter(name.text);
     }
     return new Procedure(
         name,
@@ -216,7 +216,7 @@
       Procedure referenceFrom;
       if (classBuilder.referencesFromIndexed != null) {
         referenceFrom = classBuilder.referencesFromIndexed
-            .lookupProcedureNotSetter(name.name);
+            .lookupProcedureNotSetter(name.text);
       }
       List<VariableDeclaration> positionalParameters = [];
       for (int i = 0; i < function.positionalParameters.length; i++) {
@@ -776,10 +776,10 @@
     if (classBuilder.referencesFromIndexed != null) {
       if (kind == ProcedureKind.Setter) {
         referenceFrom =
-            classBuilder.referencesFromIndexed.lookupProcedureSetter(name.name);
+            classBuilder.referencesFromIndexed.lookupProcedureSetter(name.text);
       } else {
         referenceFrom = classBuilder.referencesFromIndexed
-            .lookupProcedureNotSetter(name.name);
+            .lookupProcedureNotSetter(name.text);
       }
     }
     return new Procedure(name, kind, function,
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index f823190..e606538 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -3725,9 +3725,9 @@
           inferrer.helper.wrapInProblem(
               binary,
               templateNullableOperatorCallError.withArguments(
-                  binaryName.name, leftType, inferrer.isNonNullableByDefault),
+                  binaryName.text, leftType, inferrer.isNonNullableByDefault),
               binary.fileOffset,
-              binaryName.name.length));
+              binaryName.text.length));
     }
     return new ExpressionInferenceResult(binaryType, binary);
   }
@@ -3823,10 +3823,10 @@
           unaryType,
           inferrer.helper.wrapInProblem(
               unary,
-              templateNullableOperatorCallError.withArguments(unaryName.name,
+              templateNullableOperatorCallError.withArguments(unaryName.text,
                   expressionType, inferrer.isNonNullableByDefault),
               unary.fileOffset,
-              unaryName == unaryMinusName ? 1 : unaryName.name.length));
+              unaryName == unaryMinusName ? 1 : unaryName.text.length));
     }
     return new ExpressionInferenceResult(unaryType, unary);
   }
@@ -3909,7 +3909,7 @@
           readType,
           inferrer.helper.wrapInProblem(
               read,
-              templateNullableOperatorCallError.withArguments(indexGetName.name,
+              templateNullableOperatorCallError.withArguments(indexGetName.text,
                   receiverType, inferrer.isNonNullableByDefault),
               read.fileOffset,
               noLength));
@@ -3973,7 +3973,7 @@
       return inferrer.helper.wrapInProblem(
           write,
           templateNullableOperatorCallError.withArguments(
-              indexSetName.name, receiverType, inferrer.isNonNullableByDefault),
+              indexSetName.text, receiverType, inferrer.isNonNullableByDefault),
           write.fileOffset,
           noLength);
     }
@@ -4107,9 +4107,9 @@
       readResult = inferrer.wrapExpressionInferenceResultInProblem(
           readResult,
           templateNullablePropertyAccessError.withArguments(
-              propertyName.name, receiverType, inferrer.isNonNullableByDefault),
+              propertyName.text, receiverType, inferrer.isNonNullableByDefault),
           read.fileOffset,
-          propertyName.name.length);
+          propertyName.text.length);
     }
     return readResult;
   }
@@ -4191,9 +4191,9 @@
       return inferrer.helper.wrapInProblem(
           write,
           templateNullablePropertyAccessError.withArguments(
-              propertyName.name, receiverType, inferrer.isNonNullableByDefault),
+              propertyName.text, receiverType, inferrer.isNonNullableByDefault),
           write.fileOffset,
-          propertyName.name.length);
+          propertyName.text.length);
     }
 
     return write;
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index 68d00f9..a47d7a5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -698,9 +698,9 @@
     }
     printer.writeClassName(target.enclosingClass.reference);
     printer.writeTypeArguments(arguments.types);
-    if (target.name.name.isNotEmpty) {
+    if (target.name.text.isNotEmpty) {
       printer.write('.');
-      printer.write(target.name.name);
+      printer.write(target.name.text);
     }
     printer.writeArguments(arguments, includeTypeArguments: false);
   }
@@ -3557,12 +3557,12 @@
   }
 
   @override
-  int get precedence => Precedence.binaryPrecedence[binaryName.name];
+  int get precedence => Precedence.binaryPrecedence[binaryName.text];
 
   @override
   void toTextInternal(AstPrinter printer) {
     printer.writeExpression(left, minimumPrecedence: precedence);
-    printer.write(' ${binaryName.name} ');
+    printer.write(' ${binaryName.text} ');
     printer.writeExpression(right, minimumPrecedence: precedence);
   }
 }
@@ -3611,7 +3611,7 @@
     if (unaryName == unaryMinusName) {
       printer.write('-');
     } else {
-      printer.write('${unaryName.name}');
+      printer.write('${unaryName.text}');
     }
     printer.writeExpression(expression, minimumPrecedence: precedence);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
index cc23b9c..c8165a2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
@@ -47,6 +47,6 @@
       sink.write(cls.name ?? syntheticNames.nameClass(cls));
       sink.write("::");
     }
-    sink.write(member.name?.name ?? syntheticNames.nameMember(member));
+    sink.write(member.name?.text ?? syntheticNames.nameMember(member));
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 4472d88..ab208ce 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -609,7 +609,7 @@
             builder.getSubstitutionMap(supertype.cls);
         for (Constructor constructor in supertype.cls.constructors) {
           Constructor referenceFrom =
-              indexedClass?.lookupConstructor(constructor.name.name);
+              indexedClass?.lookupConstructor(constructor.name.text);
 
           builder.addSyntheticConstructor(makeMixinApplicationConstructor(
               builder.cls,
@@ -849,7 +849,7 @@
         }
       });
       Set<String> kernelConstructorNames =
-          cls.constructors.map((c) => c.name.name).toSet().difference({""});
+          cls.constructors.map((c) => c.name.text).toSet().difference({""});
       return kernelConstructorNames.containsAll(patchConstructorNames);
     }(),
         "Constructors of class '${builder.fullNameForErrors}' "
@@ -860,7 +860,7 @@
         if (initializer is RedirectingInitializer) {
           if (constructor.isConst && !initializer.target.isConst) {
             builder.addProblem(messageConstConstructorRedirectionToNonConst,
-                initializer.fileOffset, initializer.target.name.name.length);
+                initializer.fileOffset, initializer.target.name.text.length);
           }
           isRedirecting = true;
           break;
@@ -1072,7 +1072,7 @@
           patchFieldNames.remove(name);
         }
       });
-      Set<String> kernelFieldNames = cls.fields.map((f) => f.name.name).toSet();
+      Set<String> kernelFieldNames = cls.fields.map((f) => f.name.text).toSet();
       return kernelFieldNames.containsAll(patchFieldNames);
     }(),
         "Fields of class '${builder.fullNameForErrors}' "
@@ -1239,7 +1239,7 @@
   Class superclass = cls.superclass;
   if (superclass != null) {
     for (Constructor constructor in superclass.constructors) {
-      if (constructor.name.name.isEmpty) {
+      if (constructor.name.text.isEmpty) {
         return constructor.function.requiredParameterCount == 0
             ? constructor
             : null;
diff --git a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
index 4196292..9c26327 100644
--- a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
@@ -51,7 +51,7 @@
     String prefix = expression.import.name;
     Name name = new Name('_#loadLibrary_$prefix', parent.library);
     Procedure referencesFrom =
-        parent.lookupLibraryReferenceProcedure(name.name, false);
+        parent.lookupLibraryReferenceProcedure(name.text, false);
     tearoff = new Procedure(
         name,
         ProcedureKind.Method,
diff --git a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
index 35757bd..3a12ab4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
@@ -35,7 +35,7 @@
 bool isRedirectingFactoryField(Member member) {
   return member is Field &&
       member.isStatic &&
-      member.name.name == redirectingName;
+      member.name.text == redirectingName;
 }
 
 /// Name used for a synthesized let variable used to encode redirecting factory
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
index e7f565a..06556d5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -369,7 +369,7 @@
           classNode.enclosingLibrary.fileUri));
       result.add(".");
     }
-    result.add(procedure.name.name);
+    result.add(procedure.name.text);
   }
 
   void visitPartialInstantiationConstant(PartialInstantiationConstant node) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index f17aaef..3f0877b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -240,7 +240,7 @@
   @override
   void visitField(Field node) {
     enterTreeNode(node);
-    fileUri = checkLocation(node, node.name.name, node.fileUri);
+    fileUri = checkLocation(node, node.name.text, node.fileUri);
     super.visitField(node);
     exitTreeNode(node);
   }
@@ -248,7 +248,7 @@
   @override
   void visitProcedure(Procedure node) {
     enterTreeNode(node);
-    fileUri = checkLocation(node, node.name.name, node.fileUri);
+    fileUri = checkLocation(node, node.name.text, node.fileUri);
     super.visitProcedure(node);
     exitTreeNode(node);
   }
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 3708c2d..85f9056 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -620,7 +620,7 @@
   }
 
   void addSyntheticConstructor(Constructor constructor) {
-    String name = constructor.name.name;
+    String name = constructor.name.text;
     cls.constructors.add(constructor);
     constructor.parent = cls;
     DillMemberBuilder memberBuilder = new DillMemberBuilder(constructor, this);
@@ -718,10 +718,10 @@
     if (referencesFromIndexed != null) {
       if (procedure.isSetter) {
         referenceFrom =
-            referencesFromIndexed.lookupProcedureSetter(procedure.name.name);
+            referencesFromIndexed.lookupProcedureSetter(procedure.name.text);
       } else {
         referenceFrom =
-            referencesFromIndexed.lookupProcedureNotSetter(procedure.name.name);
+            referencesFromIndexed.lookupProcedureNotSetter(procedure.name.text);
       }
     }
 
@@ -748,7 +748,7 @@
     Procedure referenceFrom;
     if (referencesFromIndexed != null) {
       referenceFrom =
-          referencesFromIndexed.lookupProcedureNotSetter(field.name.name);
+          referencesFromIndexed.lookupProcedureNotSetter(field.name.text);
     }
     Procedure getter = new Procedure(
         field.name,
@@ -777,7 +777,7 @@
     Procedure referenceFrom;
     if (referencesFromIndexed != null) {
       referenceFrom =
-          referencesFromIndexed.lookupProcedureSetter(field.name.name);
+          referencesFromIndexed.lookupProcedureSetter(field.name.text);
     }
 
     Procedure setter = new Procedure(
@@ -1236,14 +1236,14 @@
           declaredMember,
           templateOverrideTypeVariablesMismatch.withArguments(
               "${declaredMember.enclosingClass.name}."
-                  "${declaredMember.name.name}",
+                  "${declaredMember.name.text}",
               "${interfaceMemberOrigin.enclosingClass.name}."
-                  "${interfaceMemberOrigin.name.name}"),
+                  "${interfaceMemberOrigin.name.text}"),
           declaredMember.fileOffset,
           noLength,
           context: [
             templateOverriddenMethodCause
-                .withArguments(interfaceMemberOrigin.name.name)
+                .withArguments(interfaceMemberOrigin.name.text)
                 .withLocation(_getMemberUri(interfaceMemberOrigin),
                     interfaceMemberOrigin.fileOffset, noLength)
           ]);
@@ -1284,16 +1284,16 @@
                     declaredBound,
                     declaredParameter.name,
                     "${declaredMember.enclosingClass.name}."
-                        "${declaredMember.name.name}",
+                        "${declaredMember.name.text}",
                     computedBound,
                     "${interfaceMemberOrigin.enclosingClass.name}."
-                        "${interfaceMemberOrigin.name.name}",
+                        "${interfaceMemberOrigin.name.text}",
                     library.isNonNullableByDefault),
                 declaredMember.fileOffset,
                 noLength,
                 context: [
                   templateOverriddenMethodCause
-                      .withArguments(interfaceMemberOrigin.name.name)
+                      .withArguments(interfaceMemberOrigin.name.text)
                       .withLocation(_getMemberUri(interfaceMemberOrigin),
                           interfaceMemberOrigin.fileOffset, noLength)
                 ]);
@@ -1368,10 +1368,10 @@
                   supertype, subtype, SubtypeCheckMode.ignoringNullabilities));
       if (isErrorInNnbdOptedOutMode || library.isNonNullableByDefault) {
         String declaredMemberName = '${declaredMember.enclosingClass.name}'
-            '.${declaredMember.name.name}';
+            '.${declaredMember.name.text}';
         String interfaceMemberName =
             '${interfaceMemberOrigin.enclosingClass.name}'
-            '.${interfaceMemberOrigin.name.name}';
+            '.${interfaceMemberOrigin.name.text}';
         Message message;
         int fileOffset;
         if (declaredParameter == null) {
@@ -1406,7 +1406,7 @@
             isInterfaceCheck, declaredMember, message, fileOffset, noLength,
             context: [
               templateOverriddenMethodCause
-                  .withArguments(interfaceMemberOrigin.name.name)
+                  .withArguments(interfaceMemberOrigin.name.text)
                   .withLocation(_getMemberUri(interfaceMemberOrigin),
                       interfaceMemberOrigin.fileOffset, noLength)
             ]);
@@ -1466,14 +1466,14 @@
           declaredMember,
           templateOverrideFewerPositionalArguments.withArguments(
               "${declaredMember.enclosingClass.name}."
-                  "${declaredMember.name.name}",
+                  "${declaredMember.name.text}",
               "${interfaceMember.enclosingClass.name}."
-                  "${interfaceMember.name.name}"),
+                  "${interfaceMember.name.text}"),
           declaredMember.fileOffset,
           noLength,
           context: [
             templateOverriddenMethodCause
-                .withArguments(interfaceMember.name.name)
+                .withArguments(interfaceMember.name.text)
                 .withLocation(interfaceMember.fileUri,
                     interfaceMember.fileOffset, noLength)
           ]);
@@ -1485,14 +1485,14 @@
           declaredMember,
           templateOverrideMoreRequiredArguments.withArguments(
               "${declaredMember.enclosingClass.name}."
-                  "${declaredMember.name.name}",
+                  "${declaredMember.name.text}",
               "${interfaceMember.enclosingClass.name}."
-                  "${interfaceMember.name.name}"),
+                  "${interfaceMember.name.text}"),
           declaredMember.fileOffset,
           noLength,
           context: [
             templateOverriddenMethodCause
-                .withArguments(interfaceMember.name.name)
+                .withArguments(interfaceMember.name.text)
                 .withLocation(interfaceMember.fileUri,
                     interfaceMember.fileOffset, noLength)
           ]);
@@ -1541,14 +1541,14 @@
           declaredMember,
           templateOverrideFewerNamedArguments.withArguments(
               "${declaredMember.enclosingClass.name}."
-                  "${declaredMember.name.name}",
+                  "${declaredMember.name.text}",
               "${interfaceMemberOrigin.enclosingClass.name}."
-                  "${interfaceMemberOrigin.name.name}"),
+                  "${interfaceMemberOrigin.name.text}"),
           declaredMember.fileOffset,
           noLength,
           context: [
             templateOverriddenMethodCause
-                .withArguments(interfaceMemberOrigin.name.name)
+                .withArguments(interfaceMemberOrigin.name.text)
                 .withLocation(interfaceMemberOrigin.fileUri,
                     interfaceMemberOrigin.fileOffset, noLength)
           ]);
@@ -1578,15 +1578,15 @@
               declaredMember,
               templateOverrideMismatchNamedParameter.withArguments(
                   "${declaredMember.enclosingClass.name}."
-                      "${declaredMember.name.name}",
+                      "${declaredMember.name.text}",
                   interfaceNamedParameters.current.name,
                   "${interfaceMember.enclosingClass.name}."
-                      "${interfaceMember.name.name}"),
+                      "${interfaceMember.name.text}"),
               declaredMember.fileOffset,
               noLength,
               context: [
                 templateOverriddenMethodCause
-                    .withArguments(interfaceMember.name.name)
+                    .withArguments(interfaceMember.name.text)
                     .withLocation(interfaceMember.fileUri,
                         interfaceMember.fileOffset, noLength)
               ]);
@@ -1616,14 +1616,14 @@
             templateOverrideMismatchRequiredNamedParameter.withArguments(
                 declaredParameter.name,
                 "${declaredMember.enclosingClass.name}."
-                    "${declaredMember.name.name}",
+                    "${declaredMember.name.text}",
                 "${interfaceMember.enclosingClass.name}."
-                    "${interfaceMember.name.name}"),
+                    "${interfaceMember.name.text}"),
             declaredParameter.fileOffset,
             noLength,
             context: [
               templateOverriddenMethodCause
-                  .withArguments(interfaceMemberOrigin.name.name)
+                  .withArguments(interfaceMemberOrigin.name.text)
                   .withLocation(_getMemberUri(interfaceMemberOrigin),
                       interfaceMemberOrigin.fileOffset, noLength)
             ]);
@@ -1743,7 +1743,7 @@
         // Interface check
         library.addProblem(
             templateInterfaceCheck.withArguments(
-                declaredMember.name.name, cls.name),
+                declaredMember.name.text, cls.name),
             cls.fileOffset,
             cls.name.length,
             cls.fileUri,
@@ -1756,7 +1756,7 @@
           int classNameLength = cls.nameAsMixinApplicationSubclass.length;
           library.addProblem(
               templateImplicitMixinOverride.withArguments(
-                  mixinName, baseName, declaredMember.name.name),
+                  mixinName, baseName, declaredMember.name.text),
               cls.fileOffset,
               classNameLength,
               cls.fileUri,
@@ -1765,7 +1765,7 @@
           // Named mixin application class
           library.addProblem(
               templateNamedMixinOverride.withArguments(
-                  cls.name, declaredMember.name.name),
+                  cls.name, declaredMember.name.text),
               cls.fileOffset,
               cls.name.length,
               cls.fileUri,
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index be090da..c0d4818 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -2174,7 +2174,7 @@
     MetadataCollector metadataCollector = loader.target.metadataCollector;
     if (returnType == null) {
       if (kind == ProcedureKind.Operator &&
-          identical(name, indexSetName.name)) {
+          identical(name, indexSetName.text)) {
         returnType = addVoidType(charOffset);
       } else if (kind == ProcedureKind.Setter) {
         returnType = addVoidType(charOffset);
@@ -2738,7 +2738,7 @@
         VariableDeclaration originNamed = originNamedMap[forwarderNamed.name];
         if (originNamed == null) {
           return unhandled(
-              "null", forwarder.name.name, origin.fileOffset, origin.fileUri);
+              "null", forwarder.name.text, origin.fileOffset, origin.fileUri);
         }
         if (originNamed.initializer == null) continue;
         forwarderNamed.initializer = cloner.clone(originNamed.initializer);
@@ -3405,7 +3405,7 @@
         targetReceiver =
             new InterfaceType(klass, klass.enclosingLibrary.nonNullable);
       }
-      String targetName = node.target.name.name;
+      String targetName = node.target.name.text;
       reportTypeArgumentIssues(issues, fileUri, node.fileOffset,
           typeArgumentsInfo: typeArgumentsInfo,
           targetReceiver: targetReceiver,
@@ -3489,7 +3489,7 @@
     reportTypeArgumentIssues(issues, fileUri, offset,
         typeArgumentsInfo: getTypeArgumentsInfo(arguments),
         targetReceiver: receiverType,
-        targetName: name.name);
+        targetName: name.text);
   }
 
   void checkTypesInOutline(TypeEnvironment typeEnvironment) {
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 2d855ee8..e6cee2a 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -292,10 +292,10 @@
       // corresponding field type which required us to know the type of the
       // constructor.
       String name = target.enclosingClass.name;
-      if (target.name.name.isNotEmpty) {
+      if (target.name.text.isNotEmpty) {
         // TODO(ahe): Use `inferrer.helper.constructorNameForDiagnostics`
         // instead. However, `inferrer.helper` may be null.
-        name += ".${target.name.name}";
+        name += ".${target.name.text}";
       }
       constructor.library.addProblem(
           templateCantInferTypeDueToCircularity.withArguments(name),
@@ -498,7 +498,7 @@
     if (contextType is! InvalidType) {
       errorNode = helper.wrapInProblem(
           errorNode,
-          template.withArguments(callName.name),
+          template.withArguments(callName.text),
           errorNode.fileOffset,
           noLength);
     }
@@ -942,13 +942,13 @@
       Template<Message Function(String, DartType, bool)> errorTemplate) {
     assert(receiverType != null && isKnown(receiverType));
     if (!isTopLevel && target.isMissing && errorTemplate != null) {
-      int length = name.name.length;
-      if (identical(name.name, callName.name) ||
-          identical(name.name, unaryMinusName.name)) {
+      int length = name.text.length;
+      if (identical(name.text, callName.text) ||
+          identical(name.text, unaryMinusName.text)) {
         length = 1;
       }
       return helper.buildProblem(
-          errorTemplate.withArguments(name.name,
+          errorTemplate.withArguments(name.text,
               resolveTypeParameter(receiverType), isNonNullableByDefault),
           fileOffset,
           length);
@@ -2411,9 +2411,9 @@
           replacement = helper.wrapInProblem(
               replacement,
               templateNullableMethodCallError.withArguments(
-                  name.name, receiverType, isNonNullableByDefault),
+                  name.text, receiverType, isNonNullableByDefault),
               fileOffset,
-              name.name.length);
+              name.text.length);
         }
       }
       return createNullAwareExpressionInferenceResult(
@@ -2454,9 +2454,9 @@
         replacement = helper.wrapInProblem(
             replacement,
             templateNullableMethodCallError.withArguments(
-                callName.name, receiverType, isNonNullableByDefault),
+                callName.text, receiverType, isNonNullableByDefault),
             fileOffset,
-            callName.name.length);
+            callName.text.length);
       }
     }
     // TODO(johnniwinther): Check that type arguments against the bounds.
@@ -2562,9 +2562,9 @@
         replacement = helper.wrapInProblem(
             replacement,
             templateNullableMethodCallError.withArguments(
-                methodName.name, receiverType, isNonNullableByDefault),
+                methodName.text, receiverType, isNonNullableByDefault),
             fileOffset,
-            methodName.name.length);
+            methodName.text.length);
       }
     }
 
@@ -3021,7 +3021,7 @@
         receiverType: receiverType,
         isImplicitExtensionMember: target.isExtensionMember);
     DartType inferredType = result.inferredType;
-    if (methodName.name == '==') {
+    if (methodName.text == '==') {
       inferredType = coreTypes.boolRawType(library.nonNullable);
     }
     _checkBoundsInMethodInvocation(
@@ -3320,7 +3320,7 @@
           null, engine.forest.createArguments(fileOffset, <Expression>[index]));
     } else {
       return helper.buildProblem(
-          templateSuperclassHasNoMethod.withArguments(indexGetName.name),
+          templateSuperclassHasNoMethod.withArguments(indexGetName.text),
           fileOffset,
           noLength);
     }
@@ -3337,7 +3337,7 @@
               .createArguments(fileOffset, <Expression>[index, value]));
     } else {
       return helper.buildProblem(
-          templateSuperclassHasNoMethod.withArguments(indexSetName.name),
+          templateSuperclassHasNoMethod.withArguments(indexSetName.text),
           fileOffset,
           noLength);
     }
@@ -3365,7 +3365,7 @@
       template = ambiguousTemplate;
     }
     return helper.buildProblem(
-        template.withArguments(name.name, resolveTypeParameter(receiverType),
+        template.withArguments(name.text, resolveTypeParameter(receiverType),
             isNonNullableByDefault),
         fileOffset,
         length,
@@ -3385,13 +3385,13 @@
       assert(extensionAccessCandidates == null);
       return helper.buildProblem(
           templateInvokeNonFunction
-              .withArguments(implicitInvocationPropertyName.name),
+              .withArguments(implicitInvocationPropertyName.text),
           fileOffset,
-          implicitInvocationPropertyName.name.length);
+          implicitInvocationPropertyName.text.length);
     } else {
       return _reportMissingOrAmbiguousMember(
           fileOffset,
-          isExpressionInvocation ? noLength : name.name.length,
+          isExpressionInvocation ? noLength : name.text.length,
           receiverType,
           name,
           extensionAccessCandidates,
@@ -3409,7 +3409,7 @@
     } else {
       return _reportMissingOrAmbiguousMember(
           fileOffset,
-          propertyName.name.length,
+          propertyName.text.length,
           receiverType,
           propertyName,
           extensionAccessCandidates,
@@ -3430,7 +3430,7 @@
     } else {
       return _reportMissingOrAmbiguousMember(
           fileOffset,
-          propertyName.name.length,
+          propertyName.text.length,
           receiverType,
           propertyName,
           extensionAccessCandidates,
@@ -3488,7 +3488,7 @@
     } else {
       return _reportMissingOrAmbiguousMember(
           fileOffset,
-          binaryName.name.length,
+          binaryName.text.length,
           leftType,
           binaryName,
           extensionAccessCandidates,
@@ -3506,7 +3506,7 @@
     } else {
       return _reportMissingOrAmbiguousMember(
           fileOffset,
-          unaryName == unaryMinusName ? 1 : unaryName.name.length,
+          unaryName == unaryMinusName ? 1 : unaryName.text.length,
           expressionType,
           unaryName,
           extensionAccessCandidates,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index 1b89f55..d467fb7 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -399,7 +399,7 @@
       // TODO(paulberry): this matches what is defined in the spec.  It would be
       // nice if we could change kernel to match the spec and not have to
       // override.
-      if (member.name.name == 'remainder') return false;
+      if (member.name.text == 'remainder') return false;
       if (!(receiverType is InterfaceType &&
           identical(receiverType.classNode, coreTypes.intClass))) {
         return false;
diff --git a/pkg/front_end/lib/src/testing/id_extractor.dart b/pkg/front_end/lib/src/testing/id_extractor.dart
index d3e174c..d63f675 100644
--- a/pkg/front_end/lib/src/testing/id_extractor.dart
+++ b/pkg/front_end/lib/src/testing/id_extractor.dart
@@ -11,7 +11,7 @@
   if (node.enclosingClass != null) {
     className = node.enclosingClass.name;
   }
-  String memberName = node.name.name;
+  String memberName = node.name.text;
   if (node is Procedure && node.kind == ProcedureKind.Setter) {
     memberName += '=';
   }
@@ -203,14 +203,14 @@
       // This is an invocation of a named local function.
       computeForNode(node, createInvokeId(node.receiver));
       node.arguments.accept(this);
-    } else if (node.name.name == '==' &&
+    } else if (node.name.text == '==' &&
         receiver is VariableGet &&
         receiver.variable.name == null) {
       // This is a desugared `?.`.
-    } else if (node.name.name == '[]') {
+    } else if (node.name.text == '[]') {
       computeForNode(node, computeDefaultNodeId(node));
       super.visitMethodInvocation(node);
-    } else if (node.name.name == '[]=') {
+    } else if (node.name.text == '[]=') {
       computeForNode(node, createUpdateId(node));
       super.visitMethodInvocation(node);
     } else {
diff --git a/pkg/front_end/lib/src/testing/id_testing_utils.dart b/pkg/front_end/lib/src/testing/id_testing_utils.dart
index 97eed20..2d8e634 100644
--- a/pkg/front_end/lib/src/testing/id_testing_utils.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart
@@ -20,8 +20,8 @@
 
 /// Returns a canonical simple name for [member].
 String getMemberName(Member member) {
-  if (member is Procedure && member.isSetter) return '${member.name.name}=';
-  return member.name.name;
+  if (member is Procedure && member.isSetter) return '${member.name.text}=';
+  return member.name.text;
 }
 
 /// Returns the enclosing [Member] for [node].
@@ -174,7 +174,7 @@
     {bool required: true}) {
   MemberBuilder memberBuilder;
   if (member.isExtensionMember) {
-    String memberName = member.name.name;
+    String memberName = member.name.text;
     String extensionName = memberName.substring(0, memberName.indexOf('|'));
     memberName = memberName.substring(extensionName.length + 1);
     bool isSetter = member is Procedure && member.isSetter;
@@ -191,16 +191,16 @@
         isSetter: isSetter, required: required);
   } else if (member.enclosingClass != null) {
     memberBuilder = lookupClassMemberBuilder(
-        compilerResult, member.enclosingClass, member, member.name.name,
+        compilerResult, member.enclosingClass, member, member.name.text,
         required: required);
   } else {
     TypeParameterScopeBuilder libraryBuilder = lookupLibraryDeclarationBuilder(
         compilerResult, member.enclosingLibrary,
         required: required);
     if (member is Procedure && member.isSetter) {
-      memberBuilder = libraryBuilder.setters[member.name.name];
+      memberBuilder = libraryBuilder.setters[member.name.text];
     } else {
-      memberBuilder = libraryBuilder.members[member.name.name];
+      memberBuilder = libraryBuilder.members[member.name.text];
     }
   }
   if (memberBuilder == null && required) {
@@ -659,10 +659,10 @@
       sb.write('tearoff ');
       break;
   }
-  sb.write(descriptor.name.name);
+  sb.write(descriptor.name.text);
   sb.write('=');
   Member member = descriptor.member.asMember;
-  String name = member.name.name;
+  String name = member.name.text;
   if (member is Procedure && member.isSetter) {
     sb.write('$name=');
   } else {
diff --git a/pkg/front_end/test/ast_nodes_has_to_string_test.dart b/pkg/front_end/test/ast_nodes_has_to_string_test.dart
index 28a3810..13d7120 100644
--- a/pkg/front_end/test/ast_nodes_has_to_string_test.dart
+++ b/pkg/front_end/test/ast_nodes_has_to_string_test.dart
@@ -51,7 +51,7 @@
               .getInterfaceMembers(c)
               .where((Member m) =>
                   !m.isAbstract &&
-                  m.name.name == "toString" &&
+                  m.name.text == "toString" &&
                   m.enclosingLibrary.importUri.scheme != "dart")
               .toList();
           if (toStringList.length > 1) throw "What?";
@@ -153,7 +153,7 @@
             .getInterfaceMembers(c)
             .where((Member m) =>
                 !m.isAbstract &&
-                m.name.name == "toString" &&
+                m.name.text == "toString" &&
                 m.enclosingLibrary.importUri.scheme != "dart")
             .toList();
         Member toString = toStringList.single;
diff --git a/pkg/front_end/test/binary_md_vm_tags_and_version_test.dart b/pkg/front_end/test/binary_md_vm_tags_and_version_test.dart
index 706d0a6..d9f412e 100644
--- a/pkg/front_end/test/binary_md_vm_tags_and_version_test.dart
+++ b/pkg/front_end/test/binary_md_vm_tags_and_version_test.dart
@@ -111,29 +111,29 @@
     Map<int, String> tagToName = {};
     for (Field f in compareMe.tagClass.fields) {
       // Class doesn't only contain tag stuff.
-      if (f.name.name.endsWith("Mask")) continue;
-      if (f.name.name.endsWith("HighBit")) continue;
-      if (f.name.name.endsWith("Bias")) continue;
-      if (f.name.name == "ComponentFile") continue;
+      if (f.name.text.endsWith("Mask")) continue;
+      if (f.name.text.endsWith("HighBit")) continue;
+      if (f.name.text.endsWith("Bias")) continue;
+      if (f.name.text == "ComponentFile") continue;
       ConstantExpression value = f.initializer;
       IntConstant intConstant = value.constant;
       int intValue = intConstant.value;
-      if (f.name.name == "BinaryFormatVersion") {
+      if (f.name.text == "BinaryFormatVersion") {
         tagVersion = intValue;
         continue;
       }
 
       int end = intValue + 1;
       // There are a few special cases that takes up a total of 8 tags.
-      if (uses8Tags(f.name.name)) {
+      if (uses8Tags(f.name.text)) {
         end = intValue + 8;
       }
       for (; intValue < end; intValue++) {
         if (tagToName[intValue] != null) {
           throw "Double entry for ${intValue}: "
-              "${f.name.name} and ${tagToName[intValue]}";
+              "${f.name.text} and ${tagToName[intValue]}";
         }
-        tagToName[intValue] = f.name.name;
+        tagToName[intValue] = f.name.text;
       }
     }
 
diff --git a/pkg/front_end/test/desugar_test.dart b/pkg/front_end/test/desugar_test.dart
index 9ec4d38..b61a6a7 100644
--- a/pkg/front_end/test/desugar_test.dart
+++ b/pkg/front_end/test/desugar_test.dart
@@ -63,7 +63,7 @@
       component.libraries.firstWhere((l) => l.importUri.path.endsWith(uriPath));
   var cls = lib.classes.firstWhere((c) => c.name == className);
   ir.Procedure member =
-      cls.members.firstWhere((m) => m.name.name == constructorName);
+      cls.members.firstWhere((m) => m.name.text == constructorName);
   Expect.isTrue(
       member.kind == ir.ProcedureKind.Factory, "$member is not a factory");
   Expect.isTrue(api.isRedirectingFactory(member));
diff --git a/pkg/front_end/test/fasta/assert_locations_test.dart b/pkg/front_end/test/fasta/assert_locations_test.dart
index eaff73c..532b311 100644
--- a/pkg/front_end/test/fasta/assert_locations_test.dart
+++ b/pkg/front_end/test/fasta/assert_locations_test.dart
@@ -114,10 +114,10 @@
 
   @override
   visitProcedure(Procedure node) {
-    expectedSpan = test.spans[node.name.name];
+    expectedSpan = test.spans[node.name.text];
     if (expectedSpan != null) {
       super.visitProcedure(node);
-      verified.add(node.name.name);
+      verified.add(node.name.text);
       expectedSpan = null;
     }
   }
diff --git a/pkg/front_end/test/id_tests/inheritance_test.dart b/pkg/front_end/test/id_tests/inheritance_test.dart
index a042a8a..39f382a 100644
--- a/pkg/front_end/test/id_tests/inheritance_test.dart
+++ b/pkg/front_end/test/id_tests/inheritance_test.dart
@@ -151,7 +151,7 @@
         return;
       }
 
-      String memberName = name.name;
+      String memberName = name.text;
       if (isSetter) {
         memberName += '=';
       }
diff --git a/pkg/front_end/test/incremental_load_from_dill_suite.dart b/pkg/front_end/test/incremental_load_from_dill_suite.dart
index 51255c1..768e1ba 100644
--- a/pkg/front_end/test/incremental_load_from_dill_suite.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_suite.dart
@@ -1013,7 +1013,7 @@
       if (info.lazyDeclaredGettersAndCalls != null) {
         sb.writeln("    - lazyDeclaredGettersAndCalls:");
         for (Member member in info.lazyDeclaredGettersAndCalls) {
-          sb.writeln("      - ${member.name.name}");
+          sb.writeln("      - ${member.name.text}");
         }
 
         // Expect these to be the same as in the class.
@@ -1022,7 +1022,7 @@
           if (f.isStatic) continue;
           if (!f.hasImplicitGetter) continue;
           if (!members.remove(f)) {
-            throw "Didn't find ${f.name.name} in lazyDeclaredGettersAndCalls "
+            throw "Didn't find ${f.name.text} in lazyDeclaredGettersAndCalls "
                 "for ${c.name} in ${library.importUri}";
           }
         }
@@ -1030,19 +1030,19 @@
           if (p.isStatic) continue;
           if (p.isSetter) continue;
           if (!members.remove(p)) {
-            throw "Didn't find ${p.name.name} in lazyDeclaredGettersAndCalls "
+            throw "Didn't find ${p.name.text} in lazyDeclaredGettersAndCalls "
                 "for ${c.name} in ${library.importUri}";
           }
         }
         if (members.isNotEmpty) {
-          throw "Still have ${members.map((m) => m.name.name)} left "
+          throw "Still have ${members.map((m) => m.name.text)} left "
               "for ${c.name} in ${library.importUri}";
         }
       }
       if (info.lazyDeclaredSetters != null) {
         sb.writeln("    - lazyDeclaredSetters:");
         for (Member member in info.lazyDeclaredSetters) {
-          sb.writeln("      - ${member.name.name}");
+          sb.writeln("      - ${member.name.text}");
         }
 
         // Expect these to be the same as in the class.
@@ -1062,32 +1062,32 @@
           }
         }
         if (members.isNotEmpty) {
-          throw "Still have ${members.map((m) => m.name.name)} left "
+          throw "Still have ${members.map((m) => m.name.text)} left "
               "for ${c.name} in ${library.importUri}";
         }
       }
       if (info.lazyImplementedGettersAndCalls != null) {
         sb.writeln("    - lazyImplementedGettersAndCalls:");
         for (Member member in info.lazyImplementedGettersAndCalls) {
-          sb.writeln("      - ${member.name.name}");
+          sb.writeln("      - ${member.name.text}");
         }
       }
       if (info.lazyImplementedSetters != null) {
         sb.writeln("    - lazyImplementedSetters:");
         for (Member member in info.lazyImplementedSetters) {
-          sb.writeln("      - ${member.name.name}");
+          sb.writeln("      - ${member.name.text}");
         }
       }
       if (info.lazyInterfaceGettersAndCalls != null) {
         sb.writeln("    - lazyInterfaceGettersAndCalls:");
         for (Member member in info.lazyInterfaceGettersAndCalls) {
-          sb.writeln("      - ${member.name.name}");
+          sb.writeln("      - ${member.name.text}");
         }
       }
       if (info.lazyInterfaceSetters != null) {
         sb.writeln("    - lazyInterfaceSetters:");
         for (Member member in info.lazyInterfaceSetters) {
-          sb.writeln("      - ${member.name.name}");
+          sb.writeln("      - ${member.name.text}");
         }
       }
     }
@@ -1292,10 +1292,10 @@
       libContent.add("Class ${c.name}");
     }
     for (Procedure p in lib.procedures) {
-      libContent.add("Procedure ${p.name.name}");
+      libContent.add("Procedure ${p.name.text}");
     }
     for (Field f in lib.fields) {
-      libContent.add("Field ${f.name.name}");
+      libContent.add("Field ${f.name.text}");
     }
   }
   return actualContent;
@@ -1657,7 +1657,7 @@
 void doSimulateTransformer(Component c) {
   for (Library lib in c.libraries) {
     if (lib.fields
-        .where((f) => f.name.name == "unique_SimulateTransformer")
+        .where((f) => f.name.text == "unique_SimulateTransformer")
         .toList()
         .isNotEmpty) continue;
     Name fieldName = new Name("unique_SimulateTransformer");
@@ -1669,7 +1669,7 @@
     lib.addMember(field);
     for (Class c in lib.classes) {
       if (c.fields
-          .where((f) => f.name.name == "unique_SimulateTransformer")
+          .where((f) => f.name.text == "unique_SimulateTransformer")
           .toList()
           .isNotEmpty) continue;
       fieldName = new Name("unique_SimulateTransformer");
diff --git a/pkg/front_end/test/kernel_generator_test.dart b/pkg/front_end/test/kernel_generator_test.dart
index 27fe114..20e3b57 100644
--- a/pkg/front_end/test/kernel_generator_test.dart
+++ b/pkg/front_end/test/kernel_generator_test.dart
@@ -74,7 +74,7 @@
           (await compileScript('main() => print("hi");', options: options))
               ?.component;
       var core = component.libraries.firstWhere(isDartCoreLibrary);
-      var printMember = core.members.firstWhere((m) => m.name.name == 'print');
+      var printMember = core.members.firstWhere((m) => m.name.text == 'print');
 
       // Note: summaries created by the SDK today contain empty statements as
       // method bodies.
diff --git a/pkg/front_end/test/patching/patching_test.dart b/pkg/front_end/test/patching/patching_test.dart
index 4cce8c0..81210eb 100644
--- a/pkg/front_end/test/patching/patching_test.dart
+++ b/pkg/front_end/test/patching/patching_test.dart
@@ -149,7 +149,7 @@
         // Don't include member signatures.
         continue;
       }
-      String name = m.name.name;
+      String name = m.name.text;
       if (m is Constructor) {
         name = '${m.enclosingClass.name}.${name}';
       }
diff --git a/pkg/front_end/test/summary_generator_test.dart b/pkg/front_end/test/summary_generator_test.dart
index 486295d..d641234 100644
--- a/pkg/front_end/test/summary_generator_test.dart
+++ b/pkg/front_end/test/summary_generator_test.dart
@@ -30,7 +30,7 @@
     var classA = aLib.classes.first;
     expect(classA.name, 'A');
     var fooMethod = classA.procedures.first;
-    expect(fooMethod.name.name, 'foo');
+    expect(fooMethod.name.text, 'foo');
     expect(fooMethod.function.body is EmptyStatement, isTrue);
   });
 
diff --git a/pkg/front_end/test/text_representation/text_representation_test.dart b/pkg/front_end/test/text_representation/text_representation_test.dart
index ef127c6..daff068 100644
--- a/pkg/front_end/test/text_representation/text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/text_representation_test.dart
@@ -134,8 +134,8 @@
 
   @override
   visitProcedure(Procedure node) {
-    if (!node.name.name.startsWith(expressionMarker) &&
-        !node.name.name.startsWith(statementMarker)) {
+    if (!node.name.text.startsWith(expressionMarker) &&
+        !node.name.text.startsWith(statementMarker)) {
       node.function.accept(this);
     }
     computeForMember(node);
@@ -143,8 +143,8 @@
 
   @override
   visitField(Field node) {
-    if (!node.name.name.startsWith(expressionMarker) &&
-        !node.name.name.startsWith(statementMarker)) {
+    if (!node.name.text.startsWith(expressionMarker) &&
+        !node.name.text.startsWith(statementMarker)) {
       node.initializer?.accept(this);
     }
     computeForMember(node);
@@ -152,10 +152,10 @@
 
   @override
   String computeMemberValue(Id id, Member node) {
-    if (node.name.name == 'stmtVariableDeclarationMulti') {
+    if (node.name.text == 'stmtVariableDeclarationMulti') {
       print(node);
     }
-    if (node.name.name.startsWith(expressionMarker)) {
+    if (node.name.text.startsWith(expressionMarker)) {
       if (node is Procedure) {
         Statement body = node.function.body;
         if (body is ReturnStatement) {
@@ -164,7 +164,7 @@
       } else if (node is Field && node.initializer != null) {
         return node.initializer.toText(strategy);
       }
-    } else if (node.name.name.startsWith(statementMarker)) {
+    } else if (node.name.text.startsWith(statementMarker)) {
       if (node is Procedure) {
         Statement body = node.function.body;
         if (body is Block && body.statements.length == 1) {
diff --git a/pkg/front_end/tool/_fasta/bench_maker.dart b/pkg/front_end/tool/_fasta/bench_maker.dart
index 5ab2e3e..581b5a9 100644
--- a/pkg/front_end/tool/_fasta/bench_maker.dart
+++ b/pkg/front_end/tool/_fasta/bench_maker.dart
@@ -164,7 +164,7 @@
     }
     Procedure callOperator;
     for (Procedure procedure in cls.procedures) {
-      if (procedure.name.name == "call") {
+      if (procedure.name.text == "call") {
         callOperator = procedure;
       }
     }
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 74ef5a2..3adc495 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -3252,7 +3252,7 @@
           .substituteType(interfaceTarget.getterType);
     }
     // Treat the properties of Object specially.
-    String nameString = name.name;
+    String nameString = name.text;
     if (nameString == 'hashCode') {
       return context.typeEnvironment.coreTypes.intRawType(context.nonNullable);
     } else if (nameString == 'runtimeType') {
@@ -3982,7 +3982,7 @@
       }
       return const DynamicType();
     }
-    if (name.name == 'call') {
+    if (name.text == 'call') {
       var receiverType = receiver.getStaticType(context);
       if (receiverType is FunctionType) {
         if (receiverType.typeParameters.length != arguments.types.length) {
@@ -3993,7 +3993,7 @@
             .substituteType(receiverType.returnType);
       }
     }
-    if (name.name == '==') {
+    if (name.text == '==') {
       // We use this special case to simplify generation of '==' checks.
       return context.typeEnvironment.coreTypes.boolRawType(context.nonNullable);
     }
@@ -4246,9 +4246,9 @@
     }
     printer.writeClassName(target.enclosingClass.reference);
     printer.writeTypeArguments(arguments.types);
-    if (target.name.name.isNotEmpty) {
+    if (target.name.text.isNotEmpty) {
       printer.write('.');
-      printer.write(target.name.name);
+      printer.write(target.name.text);
     }
     printer.writeArguments(arguments, includeTypeArguments: false);
   }
@@ -7088,29 +7088,34 @@
 /// library name for private names; uniqueness is not guaranteed.
 abstract class Name extends Node {
   final int hashCode;
-  final String name;
+  final String text;
   Reference get libraryName;
   Library get library;
   bool get isPrivate;
 
-  Name._internal(this.hashCode, this.name);
+  Name._internal(this.hashCode, this.text);
 
-  factory Name(String name, [Library library]) =>
-      new Name.byReference(name, library?.reference);
+  factory Name(String text, [Library library]) =>
+      new Name.byReference(text, library?.reference);
 
-  factory Name.byReference(String name, Reference libraryName) {
+  factory Name.byReference(String text, Reference libraryName) {
     /// Use separate subclasses for the public and private case to save memory
     /// for public names.
-    if (name.startsWith('_')) {
+    if (text.startsWith('_')) {
       assert(libraryName != null);
-      return new _PrivateName(name, libraryName);
+      return new _PrivateName(text, libraryName);
     } else {
-      return new _PublicName(name);
+      return new _PublicName(text);
     }
   }
 
+  // TODO(johnniwinther): Remove this when dependent code has been updated to
+  // use [text].
+  @deprecated
+  String get name => text;
+
   bool operator ==(other) {
-    return other is Name && name == other.name && library == other.library;
+    return other is Name && text == other.text && library == other.library;
   }
 
   R accept<R>(Visitor<R> v) => v.visitName(this);
@@ -7135,13 +7140,13 @@
   final Reference libraryName;
   bool get isPrivate => true;
 
-  _PrivateName(String name, Reference libraryName)
+  _PrivateName(String text, Reference libraryName)
       : this.libraryName = libraryName,
-        super._internal(_computeHashCode(name, libraryName), name);
+        super._internal(_computeHashCode(text, libraryName), text);
 
   String toString() => toStringInternal();
 
-  String toStringInternal() => library != null ? '$library::$name' : name;
+  String toStringInternal() => library != null ? '$library::$text' : text;
 
   Library get library => libraryName.asLibrary;
 
@@ -7158,7 +7163,7 @@
   Library get library => null;
   bool get isPrivate => false;
 
-  _PublicName(String name) : super._internal(name.hashCode, name);
+  _PublicName(String text) : super._internal(text.hashCode, text);
 
   String toString() => toStringInternal();
 }
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index d718a30..63cbbf3 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1324,7 +1324,7 @@
     var name = readName();
     var annotations = readAnnotationList(node);
     assert(() {
-      debugPath.add(node.name?.name ?? 'field');
+      debugPath.add(node.name?.text ?? 'field');
       return true;
     }());
     var type = readDartType();
@@ -1364,7 +1364,7 @@
     var name = readName();
     var annotations = readAnnotationList(node);
     assert(() {
-      debugPath.add(node.name?.name ?? 'constructor');
+      debugPath.add(node.name?.text ?? 'constructor');
       return true;
     }());
     var function = readFunctionNode();
@@ -1408,7 +1408,7 @@
     var name = readName();
     var annotations = readAnnotationList(node);
     assert(() {
-      debugPath.add(node.name?.name ?? 'procedure');
+      debugPath.add(node.name?.text ?? 'procedure');
       return true;
     }());
     int functionNodeSize = endOffset - _byteOffset;
@@ -1469,7 +1469,7 @@
     var name = readName();
     var annotations = readAnnotationList(node);
     assert(() {
-      debugPath.add(node.name?.name ?? 'redirecting-factory-constructor');
+      debugPath.add(node.name?.text ?? 'redirecting-factory-constructor');
       return true;
     }());
     var targetReference = readMemberReference();
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 98fb84a..f85987b 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -937,7 +937,7 @@
     if (_metadataSubsections != null) {
       _writeNodeMetadata(node);
     }
-    writeStringReference(node.name);
+    writeStringReference(node.text);
     // TODO: Consider a more compressed format for private names within the
     // enclosing library.
     if (node.isPrivate) {
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index c7e7067..95acedd 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -118,8 +118,8 @@
 
   CanonicalName getChildFromQualifiedName(Name name) {
     return name.isPrivate
-        ? getChildFromUri(name.library.importUri).getChild(name.name)
-        : getChild(name.name);
+        ? getChildFromUri(name.library.importUri).getChild(name.text)
+        : getChild(name.text);
   }
 
   CanonicalName getChildFromMember(Member member) {
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 446a07f..9f8500c 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -281,8 +281,8 @@
     int firstHash = firstName.hashCode;
     int secondHash = secondName.hashCode;
     if (firstHash != secondHash) return firstHash - secondHash;
-    String firstString = firstName.name;
-    String secondString = secondName.name;
+    String firstString = firstName.text;
+    String secondString = secondName.text;
     int firstLength = firstString.length;
     int secondLength = secondString.length;
     if (firstLength != secondLength) {
diff --git a/pkg/kernel/lib/error_formatter.dart b/pkg/kernel/lib/error_formatter.dart
index 56f4a9f..7bb8974 100644
--- a/pkg/kernel/lib/error_formatter.dart
+++ b/pkg/kernel/lib/error_formatter.dart
@@ -65,7 +65,7 @@
       final parent = context.parent;
       final parentName =
           parent is Class ? parent.name : (parent as Library).name;
-      name = "${parentName}::${context.name.name}";
+      name = "${parentName}::${context.name.text}";
     } else {
       final field = context as Field;
       if (where is Field) {
diff --git a/pkg/kernel/lib/library_index.dart b/pkg/kernel/lib/library_index.dart
index 94db880..8dbb8ee 100644
--- a/pkg/kernel/lib/library_index.dart
+++ b/pkg/kernel/lib/library_index.dart
@@ -220,10 +220,10 @@
 
   String getDisambiguatedName(Member member) {
     if (member is Procedure) {
-      if (member.isGetter) return LibraryIndex.getterPrefix + member.name.name;
-      if (member.isSetter) return LibraryIndex.setterPrefix + member.name.name;
+      if (member.isGetter) return LibraryIndex.getterPrefix + member.name.text;
+      if (member.isSetter) return LibraryIndex.setterPrefix + member.name.text;
     }
-    return member.name.name;
+    return member.name.text;
   }
 
   void addMember(Member member) {
@@ -238,12 +238,12 @@
   String getDisambiguatedExtensionName(
       ExtensionMemberDescriptor extensionMember) {
     if (extensionMember.kind == ExtensionMemberKind.TearOff)
-      return LibraryIndex.tearoffPrefix + extensionMember.name.name;
+      return LibraryIndex.tearoffPrefix + extensionMember.name.text;
     if (extensionMember.kind == ExtensionMemberKind.Getter)
-      return LibraryIndex.getterPrefix + extensionMember.name.name;
+      return LibraryIndex.getterPrefix + extensionMember.name.text;
     if (extensionMember.kind == ExtensionMemberKind.Setter)
-      return LibraryIndex.setterPrefix + extensionMember.name.name;
-    return extensionMember.name.name;
+      return LibraryIndex.setterPrefix + extensionMember.name.text;
+    return extensionMember.name.text;
   }
 
   void addExtensionMember(ExtensionMemberDescriptor extensionMember) {
diff --git a/pkg/kernel/lib/naive_type_checker.dart b/pkg/kernel/lib/naive_type_checker.dart
index ef93768..1178a0c 100644
--- a/pkg/kernel/lib/naive_type_checker.dart
+++ b/pkg/kernel/lib/naive_type_checker.dart
@@ -272,7 +272,7 @@
     // Permit any invocation on Function type.
     if (receiver == environment.coreTypes.functionLegacyRawType &&
         where is MethodInvocation &&
-        where.name.name == 'call') {
+        where.name.text == 'call') {
       return;
     }
 
diff --git a/pkg/kernel/lib/reference_from_index.dart b/pkg/kernel/lib/reference_from_index.dart
index a2a5f77..709fbb5 100644
--- a/pkg/kernel/lib/reference_from_index.dart
+++ b/pkg/kernel/lib/reference_from_index.dart
@@ -48,14 +48,14 @@
     for (int i = 0; i < library.procedures.length; i++) {
       Procedure procedure = library.procedures[i];
       if (procedure.isSetter) {
-        _proceduresSetters[procedure.name.name] = procedure;
+        _proceduresSetters[procedure.name.text] = procedure;
       } else {
-        _proceduresNotSetters[procedure.name.name] = procedure;
+        _proceduresNotSetters[procedure.name.text] = procedure;
       }
     }
     for (int i = 0; i < library.fields.length; i++) {
       Field field = library.fields[i];
-      _fields[field.name.name] = field;
+      _fields[field.name.text] = field;
     }
   }
 
@@ -80,19 +80,19 @@
   IndexedClass._(Class c) {
     for (int i = 0; i < c.constructors.length; i++) {
       Constructor constructor = c.constructors[i];
-      _constructors[constructor.name.name] = constructor;
+      _constructors[constructor.name.text] = constructor;
     }
     for (int i = 0; i < c.procedures.length; i++) {
       Procedure procedure = c.procedures[i];
       if (procedure.isSetter) {
-        _proceduresSetters[procedure.name.name] = procedure;
+        _proceduresSetters[procedure.name.text] = procedure;
       } else {
-        _proceduresNotSetters[procedure.name.name] = procedure;
+        _proceduresNotSetters[procedure.name.text] = procedure;
       }
     }
     for (int i = 0; i < c.fields.length; i++) {
       Field field = c.fields[i];
-      _fields[field.name.name] = field;
+      _fields[field.name.text] = field;
     }
   }
 
diff --git a/pkg/kernel/lib/src/text_util.dart b/pkg/kernel/lib/src/text_util.dart
index c04deb8..9fe573f 100644
--- a/pkg/kernel/lib/src/text_util.dart
+++ b/pkg/kernel/lib/src/text_util.dart
@@ -22,9 +22,9 @@
   if (node == null) {
     return 'null';
   } else if (node.library != null && includeLibraryName) {
-    return '${libraryNameToString(node.library)}::${node.name}';
+    return '${libraryNameToString(node.library)}::${node.text}';
   } else {
-    return node.name;
+    return node.text;
   }
 }
 
@@ -205,7 +205,7 @@
 }
 
 String memberNameToString(Member node) {
-  return node.name?.name ??
+  return node.name?.text ??
       "null-named member ${node.runtimeType} ${node.hashCode}";
 }
 
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 71f9fef..209122a 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -119,7 +119,7 @@
 }
 
 String debugMemberName(Member node) {
-  return node.name?.name ?? globalDebuggingNames.nameMember(node);
+  return node.name?.text ?? globalDebuggingNames.nameMember(node);
 }
 
 String debugQualifiedMemberName(Member node) {
@@ -341,14 +341,14 @@
   static final Name emptyName = new Name(emptyNameString);
 
   Name getMemberName(Member node) {
-    if (node.name?.name == '') return emptyName;
+    if (node.name?.text == '') return emptyName;
     if (node.name != null) return node.name;
     return new Name(syntheticNames.nameMember(node));
   }
 
   String getMemberReference(Member node) {
     if (node == null) return '<No Member>';
-    String name = getMemberName(node).name;
+    String name = getMemberName(node).text;
     if (node.parent is Class) {
       String className = getClassReference(node.parent);
       return '$className::$name';
@@ -481,11 +481,11 @@
       } else if (node is Field) {
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
-        write(prefix + '::' + node.name.name);
+        write(prefix + '::' + node.name.text);
       } else if (node is Procedure) {
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
-        write(prefix + '::' + node.name.name);
+        write(prefix + '::' + node.name.text);
       } else if (node is Typedef) {
         Library nodeLibrary = node.enclosingLibrary;
         String prefix = syntheticNames.nameLibraryPrefix(nodeLibrary);
@@ -701,10 +701,10 @@
   }
 
   void writeName(Name name) {
-    if (name?.name == '') {
+    if (name?.text == '') {
       writeWord(emptyNameString);
     } else {
-      writeWord(name?.name ?? '<anonymous>'); // TODO: write library name
+      writeWord(name?.text ?? '<anonymous>'); // TODO: write library name
     }
   }
 
@@ -1458,7 +1458,7 @@
       if (!first) {
         writeComma();
       }
-      writeWord('${fieldRef.asField.name.name}');
+      writeWord('${fieldRef.asField.name.text}');
       writeSymbol(':');
       writeExpression(value);
       first = false;
@@ -2366,7 +2366,7 @@
     writeList(node.fieldValues.entries,
         (core.MapEntry<Reference, Constant> entry) {
       if (entry.key.node != null) {
-        writeWord('${entry.key.asField.name.name}');
+        writeWord('${entry.key.asField.name.text}');
       } else {
         writeWord('${entry.key.canonicalName.name}');
       }
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 59d13a0..ef7c689 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -21,10 +21,10 @@
 }
 
 TextSerializer<Name> publicName =
-    Wrapped((w) => w.name, (u) => Name(u), const DartString());
+    Wrapped((w) => w.text, (u) => Name(u), const DartString());
 
 TextSerializer<Name> privateName = Wrapped(
-    (w) => Tuple2(w.name, w.library.canonicalName),
+    (w) => Tuple2(w.text, w.library.canonicalName),
     (u) => Name.byReference(u.first, u.second.getReference()),
     Tuple2Serializer(DartString(), CanonicalNameSerializer()));
 
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index f075b34..374651e 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -153,7 +153,7 @@
 
     for (var field in class_.mixin.fields) {
       Field clone =
-          cloner.cloneField(field, indexedClass?.lookupField(field.name.name));
+          cloner.cloneField(field, indexedClass?.lookupField(field.name.text));
       Procedure setter = setters[field.name];
       if (setter != null) {
         setters.remove(field.name);
@@ -187,10 +187,10 @@
       Procedure referenceFrom;
       if (procedure.isSetter) {
         referenceFrom =
-            indexedClass?.lookupProcedureSetter(procedure.name.name);
+            indexedClass?.lookupProcedureSetter(procedure.name.text);
       } else {
         referenceFrom =
-            indexedClass?.lookupProcedureNotSetter(procedure.name.name);
+            indexedClass?.lookupProcedureNotSetter(procedure.name.text);
       }
 
       // Linear search for a forwarding stub with the same name.
@@ -270,7 +270,7 @@
       return new DirectPropertyGet(new ThisExpression(), target)
         ..fileOffset = node.fileOffset;
     } else {
-      return _callNoSuchMethod(node.name.name, new Arguments.empty(), node,
+      return _callNoSuchMethod(node.name.text, new Arguments.empty(), node,
           isGetter: true, isSuper: true);
     }
   }
@@ -287,7 +287,7 @@
       VariableDeclaration rightHandSide =
           new VariableDeclaration.forValue(visit(node.value));
       Expression result = _callNoSuchMethod(
-          node.name.name, new Arguments([new VariableGet(rightHandSide)]), node,
+          node.name.text, new Arguments([new VariableGet(rightHandSide)]), node,
           isSetter: true, isSuper: true);
       VariableDeclaration call = new VariableDeclaration.forValue(result);
       return new Let(
@@ -306,7 +306,7 @@
         ..fileOffset = node.fileOffset;
     } else if (target == null || (target is Procedure && !target.isAccessor)) {
       // Target not found at all, or call was illegal.
-      return _callNoSuchMethod(node.name.name, visitedArguments, node,
+      return _callNoSuchMethod(node.name.text, visitedArguments, node,
           isSuper: true);
     } else {
       return new MethodInvocation(
diff --git a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
index 5cc3962..d4212e5 100644
--- a/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
+++ b/pkg/kernel/lib/transformations/track_widget_constructor_locations.dart
@@ -360,7 +360,7 @@
   void _transformClassImplementingWidget(
       Class clazz, ChangedStructureNotifier changedStructureNotifier) {
     if (clazz.fields
-        .any((Field field) => field.name.name == _locationFieldName)) {
+        .any((Field field) => field.name.text == _locationFieldName)) {
       // This class has already been transformed. Skip
       return;
     }
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index dfea2de..c760a89 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -39,7 +39,7 @@
   HashCombineMethodsScanner() : super(null);
 
   bool predicate(Procedure node) {
-    return node.name.name == "combine" || node.name.name == "finish";
+    return node.name.text == "combine" || node.name.text == "finish";
   }
 }
 
@@ -73,7 +73,7 @@
     Class cls, CoreTypes coreTypes, Constructor syntheticConstructor) {
   Constructor superConstructor = null;
   for (Constructor constructor in cls.superclass.constructors) {
-    if (constructor.name.name == "") {
+    if (constructor.name.text == "") {
       superConstructor = constructor;
     }
   }
@@ -83,14 +83,14 @@
         ..parent = syntheticConstructor.function)
       .toList();
   Map<String, VariableDeclaration> ownFields = Map.fromIterable(cls.fields,
-      key: (f) => f.name.name,
+      key: (f) => f.name.text,
       value: (f) =>
-          VariableDeclaration(f.name.name, type: f.type, isRequired: true)
+          VariableDeclaration(f.name.text, type: f.type, isRequired: true)
             ..parent = syntheticConstructor.function);
 
   List<Initializer> initializersConstructor = cls.fields
       .map<Initializer>((f) =>
-          FieldInitializer(f, VariableGet(ownFields[f.name.name]))
+          FieldInitializer(f, VariableGet(ownFields[f.name.text]))
             ..parent = syntheticConstructor)
       .toList();
 
@@ -124,7 +124,7 @@
     List<VariableDeclaration> allVariables) {
   for (Procedure procedure in cls.procedures) {
     if (procedure.kind == ProcedureKind.Operator &&
-        procedure.name.name == "==") {
+        procedure.name.text == "==") {
       // ==operator is already implemented, spec is to do nothing
       return;
     }
@@ -180,7 +180,7 @@
     List<VariableDeclaration> allVariables) {
   for (Procedure procedure in cls.procedures) {
     if (procedure.kind == ProcedureKind.Getter &&
-        procedure.name.name == "hashCode") {
+        procedure.name.text == "hashCode") {
       // hashCode getter is already implemented, spec is to do nothing
       return;
     }
@@ -198,8 +198,8 @@
       jenkinsScanner.scan(cls.enclosingLibrary.enclosingComponent);
   for (Class clazz in hashMethodsResult.targets.keys) {
     for (Procedure procedure in hashMethodsResult.targets[clazz].targets.keys) {
-      if (procedure.name.name == "combine") hashCombine = procedure;
-      if (procedure.name.name == "finish") hashFinish = procedure;
+      if (procedure.name.text == "combine") hashCombine = procedure;
+      if (procedure.name.text == "finish") hashFinish = procedure;
     }
   }
 
@@ -280,7 +280,7 @@
 List<VariableDeclaration> queryAllInstanceVariables(Class cls) {
   Constructor superConstructor = null;
   for (Constructor constructor in cls.superclass.constructors) {
-    if (constructor.name.name == "") {
+    if (constructor.name.text == "") {
       superConstructor = constructor;
     }
   }
@@ -289,5 +289,5 @@
           (f) => VariableDeclaration(f.name, type: f.type))
       .toList()
         ..addAll(cls.fields.map<VariableDeclaration>(
-            (f) => VariableDeclaration(f.name.name, type: f.type)));
+            (f) => VariableDeclaration(f.name.text, type: f.type)));
 }
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index 5db606b..d3869e2 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -622,11 +622,11 @@
     var target = node.interfaceTarget;
     if (target == null) {
       var receiver = visitExpression(node.receiver);
-      if (node.name.name == '==') {
+      if (node.name.text == '==') {
         visitExpression(node.arguments.positional.single);
         return environment.coreTypes.boolLegacyRawType;
       }
-      if (node.name.name == 'call' && receiver is FunctionType) {
+      if (node.name.text == 'call' && receiver is FunctionType) {
         return handleFunctionCall(node, receiver, node.arguments);
       }
       checkUnresolvedInvocation(receiver, node);
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index a6f70ca..4ccf611 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -156,7 +156,7 @@
       if (class_ == coreTypes.intClass ||
           class_ == coreTypes.numClass ||
           class_ == coreTypes.doubleClass) {
-        String name = member.name.name;
+        String name = member.name.text;
         return name == '+' ||
             name == '-' ||
             name == '*' ||
@@ -166,7 +166,7 @@
     } else {
       Class class_ = member.enclosingClass;
       if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
-        String name = member.name.name;
+        String name = member.name.text;
         return name == '+' ||
             name == '-' ||
             name == '*' ||
@@ -184,7 +184,7 @@
     if (isNonNullableByDefault) {
       Class class_ = member.enclosingClass;
       if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
-        String name = member.name.name;
+        String name = member.name.text;
         return name == 'clamp';
       }
     }
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 5ad6c85..1e02a78 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -273,11 +273,11 @@
     var oldParent = enterParent(node);
     bool isTopLevel = node.parent == currentLibrary;
     if (isTopLevel && !node.isStatic) {
-      problem(node, "The top-level field '${node.name.name}' should be static",
+      problem(node, "The top-level field '${node.name.text}' should be static",
           context: node);
     }
     if (node.isConst && !node.isStatic) {
-      problem(node, "The const field '${node.name.name}' should be static",
+      problem(node, "The const field '${node.name.text}' should be static",
           context: node);
     }
     classTypeParametersAreInScope = !node.isStatic;
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index b44d6ad..2a54a62 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -1610,7 +1610,7 @@
       return;
     }
     if (condition is MethodInvocation &&
-        condition.name.name == '==' &&
+        condition.name.text == '==' &&
         (condition.receiver is NullLiteral ||
             condition.arguments.positional.single is NullLiteral)) {
       if (condition.receiver is NullLiteral) {
@@ -1855,7 +1855,7 @@
 
   // Generate additional code for 'operator ==' to handle nulls.
   void _genEqualsOperatorNullHandling(Member member) {
-    if (member.name.name != '==' ||
+    if (member.name.text != '==' ||
         locals.numParameters != 2 ||
         member.enclosingClass == coreTypes.objectClass) {
       return;
@@ -3525,7 +3525,7 @@
     if (target == null) {
       final int temp = locals.tempIndexInFrame(node);
       _genNoSuchMethodForSuperCall(
-          node.name.name,
+          node.name.text,
           temp,
           cp.addArgDescByArguments(args, hasReceiver: true),
           args.types,
@@ -3549,7 +3549,7 @@
         hierarchy.getDispatchTarget(enclosingClass.superclass, node.name);
     if (target == null) {
       final int temp = locals.tempIndexInFrame(node);
-      _genNoSuchMethodForSuperCall(node.name.name, temp, cp.addArgDesc(1), [],
+      _genNoSuchMethodForSuperCall(node.name.text, temp, cp.addArgDesc(1), [],
           <Expression>[new ThisExpression()]);
       return;
     }
@@ -3566,7 +3566,7 @@
     final Member target = hierarchy
         .getDispatchTarget(enclosingClass.superclass, node.name, setter: true);
     if (target == null) {
-      _genNoSuchMethodForSuperCall(node.name.name, temp, cp.addArgDesc(2), [],
+      _genNoSuchMethodForSuperCall(node.name.text, temp, cp.addArgDesc(2), [],
           <Expression>[new ThisExpression(), node.value],
           storeLastArgumentToTemp: hasResult);
     } else {
@@ -3838,7 +3838,7 @@
         // closure call needs one temporary, so withTemp lets us use this
         // VariableGet's temporary when visiting the initializer.
         assert(init is MethodInvocation &&
-            init.name.name == "call" &&
+            init.name.text == "call" &&
             init.arguments.positional.length == 0);
         locals.withTemp(
             init, locals.tempIndexInFrame(node), () => _generateNode(init));
diff --git a/pkg/vm/lib/bytecode/generics.dart b/pkg/vm/lib/bytecode/generics.dart
index 6399d99..6fc5829 100644
--- a/pkg/vm/lib/bytecode/generics.dart
+++ b/pkg/vm/lib/bytecode/generics.dart
@@ -306,6 +306,6 @@
 /// function type. Such invocations can omit argument type checks.
 bool isUncheckedClosureCall(MethodInvocation node,
         StaticTypeContext staticTypeContext, BytecodeOptions options) =>
-    node.name.name == 'call' &&
+    node.name.text == 'call' &&
     getStaticType(node.receiver, staticTypeContext) is FunctionType &&
     !options.avoidClosureCallInstructions;
diff --git a/pkg/vm/lib/bytecode/object_table.dart b/pkg/vm/lib/bytecode/object_table.dart
index 734c26e..8db0792 100644
--- a/pkg/vm/lib/bytecode/object_table.dart
+++ b/pkg/vm/lib/bytecode/object_table.dart
@@ -1805,7 +1805,7 @@
   }
 
   String mangleMemberName(Member member, bool isGetter, bool isSetter) {
-    final name = member.name.name;
+    final name = member.name.text;
     if (isGetter || (member is Procedure && member.isGetter)) {
       return mangleGetterName(name);
     }
@@ -1862,7 +1862,7 @@
   ObjectHandle getSelectorNameHandle(Name name,
       {bool isGetter: false, bool isSetter: false}) {
     return getNameHandle(
-        name.library, mangleSelectorName(name.name, isGetter, isSetter));
+        name.library, mangleSelectorName(name.text, isGetter, isSetter));
   }
 
   ObjectHandle getTopLevelClassHandle(Library library) {
diff --git a/pkg/vm/lib/bytecode/recognized_methods.dart b/pkg/vm/lib/bytecode/recognized_methods.dart
index a237c1f..f73ce50 100644
--- a/pkg/vm/lib/bytecode/recognized_methods.dart
+++ b/pkg/vm/lib/bytecode/recognized_methods.dart
@@ -61,7 +61,7 @@
     }
 
     final Expression receiver = node.receiver;
-    final String selector = node.name.name;
+    final String selector = node.name.text;
 
     switch (args.positional.length) {
       case 0:
diff --git a/pkg/vm/lib/transformations/call_site_annotator.dart b/pkg/vm/lib/transformations/call_site_annotator.dart
index b93b258..324401f 100644
--- a/pkg/vm/lib/transformations/call_site_annotator.dart
+++ b/pkg/vm/lib/transformations/call_site_annotator.dart
@@ -67,7 +67,7 @@
 
     // TODO(34162): We don't need to save the type here for calls, just whether
     // or not it's a statically-checked call.
-    if (node.name.name == 'call' ||
+    if (node.name.text == 'call' ||
         hasGenericCovariantParameters(node.interfaceTarget)) {
       annotateWithType(node, node.receiver);
     }
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 8ec1805..0027255 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -203,9 +203,9 @@
       if (f is Field) {
         if (f.initializer is! NullLiteral) {
           diagnosticReporter.report(
-              templateFfiFieldInitializer.withArguments(f.name.name),
+              templateFfiFieldInitializer.withArguments(f.name.text),
               f.fileOffset,
-              f.name.name.length,
+              f.name.text.length,
               f.fileUri);
         }
       }
@@ -214,16 +214,16 @@
       if (_isPointerType(type)) {
         if (nativeTypeAnnos.length != 0) {
           diagnosticReporter.report(
-              templateFfiFieldNoAnnotation.withArguments(f.name.name),
+              templateFfiFieldNoAnnotation.withArguments(f.name.text),
               f.fileOffset,
-              f.name.name.length,
+              f.name.text.length,
               f.fileUri);
         }
       } else if (nativeTypeAnnos.length != 1) {
         diagnosticReporter.report(
-            templateFfiFieldAnnotation.withArguments(f.name.name),
+            templateFfiFieldAnnotation.withArguments(f.name.text),
             f.fileOffset,
-            f.name.name.length,
+            f.name.text.length,
             f.fileUri);
       } else {
         final DartType nativeType = InterfaceType(
@@ -258,7 +258,7 @@
         if (i is FieldInitializer) {
           toRemove.add(i);
           diagnosticReporter.report(
-              templateFfiFieldInitializer.withArguments(i.field.name.name),
+              templateFfiFieldInitializer.withArguments(i.field.name.text),
               i.fileOffset,
               1,
               i.location.file);
@@ -274,7 +274,7 @@
     // C.#fromPointer(Pointer<Void> address) : super.fromPointer(address);
     final VariableDeclaration pointer = new VariableDeclaration("#pointer");
     final name = Name("#fromPointer");
-    final referenceFrom = indexedClass?.lookupConstructor(name.name);
+    final referenceFrom = indexedClass?.lookupConstructor(name.text);
     final Constructor ctor = Constructor(
         FunctionNode(EmptyStatement(), positionalParameters: [pointer]),
         name: name,
@@ -463,7 +463,7 @@
         FunctionNode(getterStatement, returnType: field.type),
         fileUri: field.fileUri,
         reference:
-            indexedClass?.lookupProcedureNotSetter(field.name.name)?.reference)
+            indexedClass?.lookupProcedureNotSetter(field.name.text)?.reference)
       ..fileOffset = field.fileOffset
       ..isNonNullableByDefault = field.isNonNullableByDefault;
 
@@ -481,7 +481,7 @@
               returnType: VoidType(), positionalParameters: [argument]),
           fileUri: field.fileUri,
           reference:
-              indexedClass?.lookupProcedureSetter(field.name.name)?.reference)
+              indexedClass?.lookupProcedureSetter(field.name.text)?.reference)
         ..fileOffset = field.fileOffset
         ..isNonNullableByDefault = field.isNonNullableByDefault;
     }
@@ -503,7 +503,7 @@
         initializer: _runtimeBranchOnLayout(sizes),
         type: InterfaceType(intClass, Nullability.legacy),
         fileUri: struct.fileUri,
-        reference: indexedClass?.lookupField(name.name)?.reference)
+        reference: indexedClass?.lookupField(name.text)?.reference)
       ..fileOffset = struct.fileOffset;
     _makeEntryPoint(sizeOf);
     struct.addMember(sizeOf);
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index f23c669..e198b10 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -342,7 +342,7 @@
         isStatic: true,
         isFinal: true,
         fileUri: currentLibrary.fileUri,
-        reference: currentLibraryIndex?.lookupField(name.name)?.reference)
+        reference: currentLibraryIndex?.lookupField(name.text)?.reference)
       ..fileOffset = node.fileOffset;
     currentLibrary.addMember(field);
     return StaticGet(field);
@@ -434,7 +434,7 @@
       return;
     }
     diagnosticReporter.report(
-        templateFfiNotStatic.withArguments(fromFunctionMethod.name.name),
+        templateFfiNotStatic.withArguments(fromFunctionMethod.name.text),
         node.fileOffset,
         1,
         node.location.file);
diff --git a/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart b/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart
index fd6484ca..d2b01c3 100644
--- a/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart
+++ b/pkg/vm/lib/transformations/no_dynamic_invocations_annotator.dart
@@ -81,7 +81,7 @@
   }
 
   visitField(Field node) {
-    if (node.isStatic || node.name.name == 'call') {
+    if (node.isStatic || node.name.text == 'call') {
       return;
     }
 
@@ -104,7 +104,7 @@
   }
 
   visitProcedure(Procedure node) {
-    if (node.isStatic || node.name.name == 'call') {
+    if (node.isStatic || node.name.text == 'call') {
       return;
     }
 
diff --git a/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart b/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
index b059fd3..98592ef 100644
--- a/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
+++ b/pkg/vm/lib/transformations/obfuscation_prohibitions_annotator.dart
@@ -51,16 +51,16 @@
 
   @override
   visitConstructor(Constructor ctor) {
-    _addIfEntryPoint(ctor.annotations, ctor.name.name, ctor);
+    _addIfEntryPoint(ctor.annotations, ctor.name.text, ctor);
   }
 
   @override
   visitProcedure(Procedure proc) {
-    _addIfEntryPoint(proc.annotations, proc.name.name, proc);
+    _addIfEntryPoint(proc.annotations, proc.name.text, proc);
   }
 
   @override
   visitField(Field field) {
-    _addIfEntryPoint(field.annotations, field.name.name, field);
+    _addIfEntryPoint(field.annotations, field.name.text, field);
   }
 }
diff --git a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
index 2704c99..7aad1d8 100644
--- a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
+++ b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
@@ -71,7 +71,7 @@
   final biClass =
       protobufLib.classes.where((klass) => klass.name == 'BuilderInfo').single;
   final addMethod =
-      biClass.members.singleWhere((Member member) => member.name.name == 'add');
+      biClass.members.singleWhere((Member member) => member.name.text == 'add');
 
   component.accept(collector);
 
@@ -125,9 +125,9 @@
   _UnusedFieldMetadataPruner(this.tagNumberClass, this.builderInfoClass,
       this.addMethod, Set<Selector> dynamicSelectors, this.coreTypes, this.info)
       : tagNumberField = tagNumberClass.fields
-            .firstWhere((f) => f.name.name == 'tagNumber')
+            .firstWhere((f) => f.name.text == 'tagNumber')
             .reference {
-    dynamicNames.addAll(dynamicSelectors.map((sel) => sel.target.name));
+    dynamicNames.addAll(dynamicSelectors.map((sel) => sel.target.text));
   }
 
   /// If a proto message field is never accessed (neither read nor written to),
@@ -140,7 +140,7 @@
       TransformationInfo info) {
     for (final klass in gmSubclasses) {
       final selectors = invokedMethods[klass] ?? Set<Selector>();
-      final builderInfoFields = klass.fields.where((f) => f.name.name == '_i');
+      final builderInfoFields = klass.fields.where((f) => f.name.text == '_i');
       if (builderInfoFields.isEmpty) {
         continue;
       }
@@ -152,7 +152,7 @@
   void _pruneBuilderInfoField(
       Field field, Set<Selector> selectors, Class gmSubclass) {
     names.clear();
-    names.addAll(selectors.map((sel) => sel.target.name));
+    names.addAll(selectors.map((sel) => sel.target.text));
     visitedClass = gmSubclass;
     _computeUsedTagNumbers(gmSubclass);
     field.initializer.accept(this);
@@ -166,7 +166,7 @@
           final constant = annotation.constant;
           if (constant is InstanceConstant &&
               constant.classReference == tagNumberClass.reference) {
-            final name = procedure.name.name;
+            final name = procedure.name.text;
             if (dynamicNames.contains(name) || names.contains(name)) {
               usedTagNumbers.add(
                   (constant.fieldValues[tagNumberField] as IntConstant).value);
@@ -216,7 +216,7 @@
   void _changeCascadeEntry(Expression initializer) {
     if (initializer is MethodInvocation &&
         initializer.interfaceTarget?.enclosingClass == builderInfoClass &&
-        fieldAddingMethods.contains(initializer.name.name)) {
+        fieldAddingMethods.contains(initializer.name.text)) {
       final tagNumber =
           (initializer.arguments.positional[0] as IntLiteral).value;
       if (!usedTagNumbers.contains(tagNumber)) {
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index d35e0a0..8cd2e73 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -467,7 +467,7 @@
     }
 
     // TODO(alexmarkov): handle closures more precisely
-    if ((selector is DynamicSelector) && (selector.name.name == "call")) {
+    if ((selector is DynamicSelector) && (selector.name.text == "call")) {
       tracePrint("Possible closure call, result is dynamic");
       result = new Type.nullableAny();
     }
diff --git a/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart b/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
index 1e98f46..22729ee 100644
--- a/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
+++ b/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
@@ -81,7 +81,7 @@
       return;
     }
     final messageClass = (_messageClasses[cls] ??= _MessageClass());
-    if (member is Field && member.name.name == metadataFieldName) {
+    if (member is Field && member.name.text == metadataFieldName) {
       // Update contents of static field initializer of metadata field (_i).
       // according to the used tag numbers.
       assertx(member.isStatic);
@@ -146,7 +146,7 @@
   bool _isUnusedMetadata(_MessageClass cls, MethodInvocation node) {
     if (node.interfaceTarget != null &&
         node.interfaceTarget.enclosingClass == _builderInfoClass &&
-        fieldAddingMethods.contains(node.name.name)) {
+        fieldAddingMethods.contains(node.name.text)) {
       final tagNumber = (node.arguments.positional[0] as IntLiteral).value;
       return !cls._usedTags.contains(tagNumber);
     }
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index d76503d..fb59b0c 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -762,7 +762,7 @@
         }
       }
 
-      if (member.name.name == '==') {
+      if (member.name.text == '==') {
         // In addition to what is returned from the function body,
         // operator == performs implicit comparison with null
         // and returns bool.
@@ -1350,7 +1350,7 @@
       return;
     } else if (node is MethodInvocation &&
         node.receiver is VariableGet &&
-        node.name.name == '==') {
+        node.name.text == '==') {
       assertx(node.arguments.positional.length == 1 &&
           node.arguments.types.isEmpty &&
           node.arguments.named.isEmpty);
@@ -1639,7 +1639,7 @@
     final receiver = _visit(receiverNode);
     final args = _visitArguments(receiver, node.arguments);
     final target = node.interfaceTarget;
-    if (receiverNode is ConstantExpression && node.name.name == '[]') {
+    if (receiverNode is ConstantExpression && node.name.text == '[]') {
       Constant constant = receiverNode.constant;
       if (constant is ListConstant) {
         return _handleIndexingIntoListConstant(constant);
@@ -1647,11 +1647,11 @@
     }
     TypeExpr result;
     if (target == null) {
-      if (node.name.name == '==') {
+      if (node.name.text == '==') {
         _makeCall(node, new DynamicSelector(CallKind.Method, node.name), args);
         return new Type.nullable(_boolType);
       }
-      if (node.name.name == 'call') {
+      if (node.name.text == 'call') {
         final recvType = _staticDartType(node.receiver);
         if ((recvType is FunctionType) ||
             (recvType == _environment.functionLegacyRawType)) {
diff --git a/pkg/vm/lib/transformations/type_flow/utils.dart b/pkg/vm/lib/transformations/type_flow/utils.dart
index 79e7d7d..409194b 100644
--- a/pkg/vm/lib/transformations/type_flow/utils.dart
+++ b/pkg/vm/lib/transformations/type_flow/utils.dart
@@ -322,7 +322,7 @@
     (expr is ConstantExpression && expr.constant is NullConstant);
 
 Expression getArgumentOfComparisonWithNull(MethodInvocation node) {
-  if (node.name.name == '==') {
+  if (node.name.text == '==') {
     final lhs = node.receiver;
     final rhs = node.arguments.positional.single;
     if (isNullLiteral(lhs)) {
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index d901ed9..8805154 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -69,6 +69,7 @@
 Dart_FileWriteCallback Dart::file_write_callback_ = NULL;
 Dart_FileCloseCallback Dart::file_close_callback_ = NULL;
 Dart_EntropySource Dart::entropy_source_callback_ = NULL;
+Dart_GCEventCallback Dart::gc_event_callback_ = nullptr;
 
 // Structure for managing read-only global handles allocation used for
 // creating global read-only handles that are pre created and initialized
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index 78f7547..27ad70d 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -6,6 +6,7 @@
 #define RUNTIME_VM_DART_H_
 
 #include "include/dart_api.h"
+#include "include/dart_tools_api.h"
 #include "vm/allocation.h"
 #include "vm/snapshot.h"
 
@@ -140,6 +141,11 @@
     return entropy_source_callback_;
   }
 
+  static void set_gc_event_callback(Dart_GCEventCallback gc_event) {
+    gc_event_callback_ = gc_event;
+  }
+  static Dart_GCEventCallback gc_event_callback() { return gc_event_callback_; }
+
  private:
   static constexpr const char* kVmIsolateName = "vm-isolate";
 
@@ -158,6 +164,7 @@
   static Dart_FileWriteCallback file_write_callback_;
   static Dart_FileCloseCallback file_close_callback_;
   static Dart_EntropySource entropy_source_callback_;
+  static Dart_GCEventCallback gc_event_callback_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 1440eaa..63ba037 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -6380,7 +6380,7 @@
 }
 
 DART_EXPORT void Dart_SetGCEventCallback(Dart_GCEventCallback callback) {
-  Isolate::Current()->heap()->SetGCEventCallback(callback);
+  Dart::set_gc_event_callback(callback);
 }
 
 DART_EXPORT char* Dart_SetFileModifiedCallback(
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index dad7079..b2dd597 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -10,6 +10,7 @@
 #include "platform/assert.h"
 #include "platform/utils.h"
 #include "vm/compiler/jit/compiler.h"
+#include "vm/dart.h"
 #include "vm/flags.h"
 #include "vm/heap/pages.h"
 #include "vm/heap/safepoint.h"
@@ -67,8 +68,7 @@
       read_only_(false),
       last_gc_was_old_space_(false),
       assume_scavenge_will_fail_(false),
-      gc_on_nth_allocation_(kNoForcedGarbageCollection),
-      gc_event_callback_(nullptr) {
+      gc_on_nth_allocation_(kNoForcedGarbageCollection) {
   UpdateGlobalMaxUsed();
   for (int sel = 0; sel < kNumWeakSelectors; sel++) {
     new_weak_tables_[sel] = new WeakTable();
@@ -1026,7 +1026,7 @@
     });
   }
 #endif  // !PRODUCT
-  if (gc_event_callback_ != nullptr) {
+  if (Dart::gc_event_callback() != nullptr) {
     isolate_group_->ForEachIsolate([&](Isolate* isolate) {
       if (!Isolate::IsSystemIsolate(isolate)) {
         Dart_GCEvent event;
@@ -1072,7 +1072,7 @@
               AvgCollectionPeriod(isolate_uptime_micros, old_space_collections);
         }
 
-        (*gc_event_callback_)(&event);
+        (*Dart::gc_event_callback())(&event);
       }
     });
   }
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index 0ea8e09..7e42b75 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -322,10 +322,6 @@
 
   void MergeFrom(Heap* donor);
 
-  void SetGCEventCallback(Dart_GCEventCallback callback) {
-    gc_event_callback_ = callback;
-  }
-
  private:
   class GCStats : public ValueObject {
    public:
@@ -422,8 +418,6 @@
   // sensitive codepaths.
   intptr_t gc_on_nth_allocation_;
 
-  Dart_GCEventCallback gc_event_callback_;
-
   friend class Become;       // VisitObjectPointers
   friend class GCCompactor;  // VisitObjectPointers
   friend class Precompiler;  // VisitObjects
diff --git a/tools/VERSION b/tools/VERSION
index 287371e..c35c4a8 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 138
+PRERELEASE 139
 PRERELEASE_PATCH 0
\ No newline at end of file
