Version 2.15.0-144.0.dev

Merge commit 'e559b80f52fb8dec89bfe82272fa466c4004496d' into 'dev'
diff --git a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
index cb04456..add033d 100644
--- a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
+++ b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:front_end/src/api_unstable/dart2js.dart' as api;
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
@@ -13,7 +12,6 @@
 /// Replaces js_util methods with inline calls to foreign_helper JS which
 /// emits the code as a JavaScript code fragment.
 class JsUtilOptimizer extends Transformer {
-  final Procedure _jsTarget;
   final Procedure _callMethodTarget;
   final List<Procedure> _callMethodUncheckedTargets;
   final Procedure _callConstructorTarget;
@@ -32,16 +30,16 @@
     'setProperty'
   ];
   final Iterable<Procedure> _allowedInteropJsUtilTargets;
+  final Procedure _jsTarget;
   final Procedure _allowInteropTarget;
   final Procedure _listEmptyFactory;
 
   final CoreTypes _coreTypes;
   final StatefulStaticTypeContext _staticTypeContext;
+  Map<Reference, ExtensionMemberDescriptor>? _extensionMemberIndex;
 
   JsUtilOptimizer(this._coreTypes, ClassHierarchy hierarchy)
-      : _jsTarget =
-            _coreTypes.index.getTopLevelProcedure('dart:_foreign_helper', 'JS'),
-        _callMethodTarget =
+      : _callMethodTarget =
             _coreTypes.index.getTopLevelProcedure('dart:js_util', 'callMethod'),
         _callMethodUncheckedTargets = List<Procedure>.generate(
             5,
@@ -59,6 +57,8 @@
             .getTopLevelProcedure('dart:js_util', 'setProperty'),
         _setPropertyUncheckedTarget = _coreTypes.index
             .getTopLevelProcedure('dart:js_util', '_setPropertyUnchecked'),
+        _jsTarget =
+            _coreTypes.index.getTopLevelProcedure('dart:_foreign_helper', 'JS'),
         _allowInteropTarget =
             _coreTypes.index.getTopLevelProcedure('dart:js', 'allowInterop'),
         _allowedInteropJsUtilTargets = _allowedInteropJsUtilMembers.map(
@@ -74,6 +74,7 @@
     _staticTypeContext.enterLibrary(lib);
     lib.transformChildren(this);
     _staticTypeContext.leaveLibrary(lib);
+    _extensionMemberIndex = null;
     return lib;
   }
 
@@ -88,21 +89,24 @@
   @override
   visitProcedure(Procedure node) {
     _staticTypeContext.enterMember(node);
-    if (node.isExternal && node.isExtensionMember && !_isDeclaredStatic(node)) {
-      var transformedBody;
-      if (api.getExtensionMemberKind(node) == ProcedureKind.Getter) {
-        transformedBody = _getExternalGetterBody(node);
-      } else if (api.getExtensionMemberKind(node) == ProcedureKind.Setter) {
-        transformedBody = _getExternalSetterBody(node);
-      } else if (api.getExtensionMemberKind(node) == ProcedureKind.Method) {
-        transformedBody = _getExternalMethodBody(node);
+    var transformedBody;
+    if (node.isExternal && node.isExtensionMember) {
+      var index = _extensionMemberIndex ??=
+          _createExtensionMembersIndex(node.enclosingLibrary);
+      var nodeDescriptor = index[node.reference]!;
+      if (!nodeDescriptor.isStatic) {
+        if (nodeDescriptor.kind == ExtensionMemberKind.Getter) {
+          transformedBody = _getExternalGetterBody(node);
+        } else if (nodeDescriptor.kind == ExtensionMemberKind.Setter) {
+          transformedBody = _getExternalSetterBody(node);
+        } else if (nodeDescriptor.kind == ExtensionMemberKind.Method) {
+          transformedBody = _getExternalMethodBody(node);
+        }
       }
-      // TODO(rileyporter): Add transformation for static members and any
-      // operators we decide to support.
-      if (transformedBody != null) {
-        node.function.body = transformedBody;
-        node.isExternal = false;
-      }
+    }
+    if (transformedBody != null) {
+      node.function.body = transformedBody;
+      node.isExternal = false;
     } else {
       node.transformChildren(this);
     }
@@ -110,6 +114,18 @@
     return node;
   }
 
+  /// Returns and initializes `_extensionMemberIndex` to an index of the member
+  /// reference to the member `ExtensionMemberDescriptor`, for all extension
+  /// members in the given [library].
+  Map<Reference, ExtensionMemberDescriptor> _createExtensionMembersIndex(
+      Library library) {
+    _extensionMemberIndex = {};
+    library.extensions.forEach((extension) => extension.members.forEach(
+        (descriptor) =>
+            _extensionMemberIndex![descriptor.member] = descriptor));
+    return _extensionMemberIndex!;
+  }
+
   /// Returns a new function body for the given [node] external getter.
   ///
   /// The new function body will call the optimized version of
@@ -121,11 +137,11 @@
         _getPropertyTarget,
         Arguments([
           VariableGet(function.positionalParameters.first),
-          StringLiteral(_getMemberName(node))
+          StringLiteral(_getExtensionMemberName(node))
         ]))
       ..fileOffset = node.fileOffset;
-    return ReturnStatement(AsExpression(
-        _lowerGetProperty(getPropertyInvocation), function.returnType));
+    return ReturnStatement(
+        AsExpression(getPropertyInvocation, function.returnType));
   }
 
   /// Returns a new function body for the given [node] external setter.
@@ -139,7 +155,7 @@
         _setPropertyTarget,
         Arguments([
           VariableGet(function.positionalParameters.first),
-          StringLiteral(_getMemberName(node)),
+          StringLiteral(_getExtensionMemberName(node)),
           VariableGet(function.positionalParameters.last)
         ]))
       ..fileOffset = node.fileOffset;
@@ -157,7 +173,7 @@
         _callMethodTarget,
         Arguments([
           VariableGet(function.positionalParameters.first),
-          StringLiteral(_getMemberName(node)),
+          StringLiteral(_getExtensionMemberName(node)),
           ListLiteral(function.positionalParameters
               .sublist(1)
               .map((argument) => VariableGet(argument))
@@ -168,43 +184,30 @@
         _lowerCallMethod(callMethodInvocation), function.returnType));
   }
 
-  /// Returns the member name, either from the `@JS` annotation if non-empty,
-  /// or parsed from CFE generated node name.
-  String _getMemberName(Procedure node) {
+  /// Returns the extension member name.
+  ///
+  /// Returns either the name from the `@JS` annotation if non-empty, or the
+  /// declared name of the extension member. Does not return the CFE generated
+  /// name for the top level member for this extension member.
+  String _getExtensionMemberName(Procedure node) {
     var jsAnnotationName = getJSName(node);
     if (jsAnnotationName.isNotEmpty) {
       return jsAnnotationName;
     }
-    // TODO(rileyporter): Switch to using the ExtensionMemberDescriptor data.
-    var nodeName = node.name.text;
-    if (nodeName.contains('#')) {
-      return nodeName.substring(nodeName.indexOf('#') + 1);
-    } else {
-      return nodeName.substring(nodeName.indexOf('|') + 1);
-    }
-  }
-
-  /// Returns whether the given extension [node] is declared as `static`.
-  ///
-  /// All extension members have `isStatic` true, but the members declared as
-  /// static will not have a synthesized `this` variable.
-  bool _isDeclaredStatic(Procedure node) {
-    return node.function.positionalParameters.isEmpty ||
-        node.function.positionalParameters.first.name != '#this';
+    return _extensionMemberIndex![node.reference]!.name.text;
   }
 
   /// Replaces js_util method calls with optimization when possible.
   ///
-  /// Lowers `getProperty` for any argument type straight to JS fragment call.
-  /// Lowers `setProperty` to `_setPropertyUnchecked` for values that are
+  /// Lowers `setProperty` to  `_setPropertyUnchecked` for values that are
   /// not Function type and guaranteed to be interop allowed.
   /// Lowers `callMethod` to `_callMethodUncheckedN` when the number of given
   /// arguments is 0-4 and all arguments are guaranteed to be interop allowed.
+  /// Lowers `callConstructor` to `_callConstructorUncheckedN` when there are
+  /// 0-4 arguments and all arguments are guaranteed to be interop allowed.
   @override
   visitStaticInvocation(StaticInvocation node) {
-    if (node.target == _getPropertyTarget) {
-      node = _lowerGetProperty(node);
-    } else if (node.target == _setPropertyTarget) {
+    if (node.target == _setPropertyTarget) {
       node = _lowerSetProperty(node);
     } else if (node.target == _callMethodTarget) {
       node = _lowerCallMethod(node);
@@ -215,28 +218,6 @@
     return node;
   }
 
-  /// Lowers the given js_util `getProperty` call to the foreign_helper JS call
-  /// for any argument type. Lowers `getProperty(o, name)` to
-  /// `JS('Object|Null', '#.#', o, name)`.
-  StaticInvocation _lowerGetProperty(StaticInvocation node) {
-    Arguments arguments = node.arguments;
-    assert(arguments.types.isEmpty);
-    assert(arguments.positional.length == 2);
-    assert(arguments.named.isEmpty);
-    return StaticInvocation(
-        _jsTarget,
-        Arguments(
-          [
-            StringLiteral("Object|Null"),
-            StringLiteral("#.#"),
-            ...arguments.positional
-          ],
-          // TODO(rileyporter): Copy type from getProperty when it's generic.
-          types: [DynamicType()],
-        )..fileOffset = arguments.fileOffset)
-      ..fileOffset = node.fileOffset;
-  }
-
   /// Lowers the given js_util `setProperty` call to `_setPropertyUnchecked`
   /// when the additional validation checks in `setProperty` can be elided.
   ///
diff --git a/pkg/_js_interop_checks/pubspec.yaml b/pkg/_js_interop_checks/pubspec.yaml
index 27f50f2..bae1992 100644
--- a/pkg/_js_interop_checks/pubspec.yaml
+++ b/pkg/_js_interop_checks/pubspec.yaml
@@ -8,7 +8,5 @@
 dependencies:
   _fe_analyzer_shared:
     path: ../_fe_analyzer_shared
-  front_end:
-    path: ../front_end
   kernel:
     path: ../kernel
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index 456dc38..6e97072 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -8,10 +8,8 @@
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -179,11 +177,8 @@
   }
 
   bool _isPackageReference(SourceReference reference) {
-    var unitSourceContent = reference.element.unitSourceContent;
-    if (unitSourceContent == null) {
-      return false;
-    }
-    var quotedImportUri = unitSourceContent.substring(reference.range.offset,
+    var source = reference.element.source!;
+    var quotedImportUri = source.contents.data.substring(reference.range.offset,
         reference.range.offset + reference.range.length);
     return packagePrefixedStringPattern.hasMatch(quotedImportUri);
   }
@@ -220,10 +215,3 @@
     }
   }
 }
-
-extension on Element {
-  String? get unitSourceContent {
-    var unitElement = thisOrAncestorOfType<CompilationUnitElementImpl>();
-    return unitElement?.sourceContent;
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 670e73a..fcf5d4e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -80,7 +80,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 179;
+  static const int DATA_VERSION = 180;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 9c3a24d..766ace4 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -974,10 +974,6 @@
   @override
   late Source source;
 
-  /// The content of the [source] for which this element model was built.
-  /// Might be `null` if we don't have it (for example in google3 summaries).
-  String? sourceContent;
-
   @override
   LineInfo? lineInfo;
 
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 570ef8f..650fde4 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -107,16 +107,6 @@
             (element.aliasedElement as GenericFunctionTypeElement).parameters,
         _typeParameters = element.typeParameters;
 
-  String? get _unitSourceContent {
-    Element? element = this.element;
-    while (element != null) {
-      if (element is CompilationUnitElementImpl) {
-        return element.sourceContent;
-      }
-      element = element.enclosingElement;
-    }
-  }
-
   void consumeLocalElements() {
     _functionIndex = _functions!.length;
   }
@@ -138,8 +128,7 @@
         '[accessors: $accessors]'
         '[element.source: ${element.source?.fullName}]'
         '[libraryFilePath: $libraryFilePath]'
-        '[unitFilePath: $unitFilePath]'
-        '[unitSourceContent: $_unitSourceContent]',
+        '[unitFilePath: $unitFilePath]',
       );
     }
     return _accessors![_accessorIndex++] as PropertyAccessorElementImpl;
@@ -158,8 +147,7 @@
         '[classes: $classes]'
         '[element.source: ${element.source?.fullName}]'
         '[libraryFilePath: $libraryFilePath]'
-        '[unitFilePath: $unitFilePath]'
-        '[unitSourceContent: $_unitSourceContent]',
+        '[unitFilePath: $unitFilePath]',
       );
     }
     return _classes![_classIndex++] as ClassElementImpl;
@@ -215,8 +203,7 @@
         '[variables: $variables]'
         '[element.source: ${element.source?.fullName}]'
         '[libraryFilePath: $libraryFilePath]'
-        '[unitFilePath: $unitFilePath]'
-        '[unitSourceContent: $_unitSourceContent]',
+        '[unitFilePath: $unitFilePath]',
       );
     }
     return _variables![_variableIndex++] as VariableElementImpl;
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 8767463..2b75f9e 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -1266,7 +1266,6 @@
 
     unitElement.uri = _reader.readOptionalStringReference();
     unitElement.isSynthetic = _reader.readBool();
-    unitElement.sourceContent = _reader.readOptionalStringUtf8();
 
     _readUnitMacroGenerationDataList(unitElement);
     _readClasses(unitElement, unitReference);
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 3103c35..33e913e 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -449,7 +449,6 @@
     _sink._writeStringReference('${unitElement.source.uri}');
     _sink._writeOptionalStringReference(unitElement.uri);
     _sink.writeBool(unitElement.isSynthetic);
-    _sink.writeOptionalStringUtf8(unitElement.sourceContent);
     _resolutionSink._writeAnnotationList(unitElement.metadata);
     _writeUnitElementMacroGenerationDataList(unitElement);
     _writeList(unitElement.classes, _writeClassElement);
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 10620eb..fc66eed 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -415,7 +415,6 @@
       unitElement.librarySource = inputLibrary.source;
       unitElement.lineInfo = unitNode.lineInfo;
       unitElement.source = inputUnit.source;
-      unitElement.sourceContent = inputUnit.sourceContent;
       unitElement.uri = inputUnit.partUriStr;
       unitElement.setCodeRange(0, unitNode.length);
 
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 6c3269d..140b083 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -261,6 +261,13 @@
         !Sdk.checkArtifactExists(genSnapshot)) {
       return 255;
     }
+    // AOT compilation isn't supported on ia32. Currently, generating an
+    // executable only supports AOT runtimes, so these commands are disabled.
+    if (Platform.version.contains('ia32')) {
+      stderr.write(
+          "'dart compile $format' is not supported on x86 architectures");
+      return 64;
+    }
     // We expect a single rest argument; the dart entry point.
     if (argResults.rest.length != 1) {
       // This throws.
diff --git a/pkg/dartdev/test/commands/compile_test.dart b/pkg/dartdev/test/commands/compile_test.dart
index 4bf62f0..be43ac7 100644
--- a/pkg/dartdev/test/commands/compile_test.dart
+++ b/pkg/dartdev/test/commands/compile_test.dart
@@ -20,6 +20,7 @@
     'Info: Compiling without sound null safety';
 
 void defineCompileTests() {
+  final isRunningOnIA32 = Platform.version.contains('ia32');
   // *** NOTE ***: These tests *must* be run with the `--use-sdk` option
   // as they depend on a fully built SDK to resolve various snapshot files
   // used by compilation.
@@ -51,6 +52,12 @@
         'Usage: dart compile <subcommand> [arguments]',
       ),
     );
+
+    expect(result.stdout, contains('jit-snapshot'));
+    expect(result.stdout, contains('kernel'));
+    expect(result.stdout, contains('js'));
+    expect(result.stdout, contains('aot-snapshot'));
+    expect(result.stdout, contains('exe'));
     expect(result.exitCode, 0);
   });
 
@@ -118,7 +125,41 @@
     expect(result.stdout, contains('I love executables'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
+
+  test('Compile to executable disabled on IA32', () {
+    final p = project(mainSrc: 'void main() { print("I love executables"); }');
+    final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
+
+    var result = p.runSync(
+      [
+        'compile',
+        'exe',
+        inFile,
+      ],
+    );
+
+    expect(result.stderr,
+        "'dart compile exe' is not supported on x86 architectures");
+    expect(result.exitCode, 64);
+  }, skip: !isRunningOnIA32);
+
+  test('Compile to AOT snapshot disabled on IA32', () {
+    final p = project(mainSrc: 'void main() { print("I love executables"); }');
+    final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
+
+    var result = p.runSync(
+      [
+        'compile',
+        'aot-snapshot',
+        inFile,
+      ],
+    );
+
+    expect(result.stderr,
+        "'dart compile aot-snapshot' is not supported on x86 architectures");
+    expect(result.exitCode, 64);
+  }, skip: !isRunningOnIA32);
 
   test('Compile and run executable with options', () {
     final p = project(
@@ -151,7 +192,7 @@
     expect(result.stdout, contains('42'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile and run aot snapshot', () {
     final p = project(mainSrc: 'void main() { print("I love AOT"); }');
@@ -182,7 +223,7 @@
     expect(result.stdout, contains('I love AOT'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile and run kernel snapshot', () {
     final p = project(mainSrc: 'void main() { print("I love kernel"); }');
@@ -266,7 +307,7 @@
     expect(result.exitCode, compileErrorExitCode);
     expect(File(outFile).existsSync(), false,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile exe with warnings', () {
     final p = project(mainSrc: '''
@@ -293,7 +334,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile exe with sound null safety', () {
     final p = project(mainSrc: '''void main() {}''');
@@ -315,7 +356,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile exe with unsound null safety', () {
     final p = project(mainSrc: '''
@@ -340,7 +381,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile and run exe with --sound-null-safety', () {
     final p = project(mainSrc: '''void main() {
@@ -374,7 +415,7 @@
     expect(result.stdout, contains('sound'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile and run exe with --no-sound-null-safety', () {
     final p = project(mainSrc: '''void main() {
@@ -408,7 +449,7 @@
     expect(result.stdout, contains('unsound'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile exe without info', () {
     final p = project(mainSrc: '''void main() {}''');
@@ -432,7 +473,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile exe without warnings', () {
     final p = project(mainSrc: '''
@@ -459,7 +500,7 @@
         predicate((o) => !'$o'.contains(soundNullSafetyMessage)));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile JS with sound null safety', () {
     final p = project(mainSrc: '''void main() {}''');
@@ -579,7 +620,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile AOT snapshot with unsound null safety', () {
     final p = project(mainSrc: '''
@@ -604,7 +645,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile AOT snapshot without info', () {
     final p = project(mainSrc: '''void main() {}''');
@@ -628,7 +669,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile AOT snapshot without warnings', () {
     final p = project(mainSrc: '''
@@ -655,7 +696,7 @@
         predicate((o) => !'$o'.contains(soundNullSafetyMessage)));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile AOT snapshot with warnings', () {
     final p = project(mainSrc: '''
@@ -683,7 +724,7 @@
     expect(result.stdout, contains('Warning: '));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile kernel with invalid trailing argument', () {
     final p = project(mainSrc: '''void main() {}''');
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index b8d1d74..e811ba1 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -241,23 +241,3 @@
 // TODO(sigmund): Delete this API once `member.isRedirectingFactory`
 // is implemented correctly for patch files (Issue #33495).
 bool isRedirectingFactory(ir.Procedure member) => member.isRedirectingFactory;
-
-/// Determines what `ProcedureKind` the given extension [member] is based on
-/// the member name.
-///
-/// Note: classifies operators as `ProcedureKind.Method`.
-ir.ProcedureKind getExtensionMemberKind(ir.Procedure member) {
-  assert(member.isExtensionMember);
-  String name = member.name.text;
-  int pipeIndex = name.indexOf('|');
-  int poundIndex = name.indexOf('#');
-  assert(pipeIndex >= 0);
-  if (poundIndex >= 0) {
-    String getOrSet = name.substring(pipeIndex + 1, poundIndex);
-    return getOrSet == 'get'
-        ? ir.ProcedureKind.Getter
-        : ir.ProcedureKind.Setter;
-  } else {
-    return member.kind;
-  }
-}
diff --git a/pkg/front_end/test/desugar_test.dart b/pkg/front_end/test/desugar_test.dart
index 31089ed..82fdd4a 100644
--- a/pkg/front_end/test/desugar_test.dart
+++ b/pkg/front_end/test/desugar_test.dart
@@ -28,7 +28,6 @@
     await testRedirectingFactoryDirect();
     await testRedirectingFactorySerialized();
     await testRedirectingFactoryPatchFile();
-    await testExtensionMemberKind();
   });
 }
 
@@ -80,97 +79,3 @@
   _B(int x);
 }
 ''';
-
-Future<void> testExtensionMemberKind() async {
-  var component = await compileUnit(['e.dart'], {'e.dart': extensionSource});
-  var library = component.libraries
-      .firstWhere((l) => l.importUri.path.endsWith('e.dart'));
-  var descriptors =
-      library.extensions.expand((extension) => extension.members).toList();
-
-  // Check generated getters and setters for fields.
-  var fieldGetter =
-      findExtensionField(descriptors, 'field', ir.ExtensionMemberKind.Getter);
-  Expect.equals(
-      api.getExtensionMemberKind(fieldGetter), ir.ProcedureKind.Getter);
-  var fieldSetter =
-      findExtensionField(descriptors, 'field', ir.ExtensionMemberKind.Setter);
-  Expect.equals(
-      api.getExtensionMemberKind(fieldSetter), ir.ProcedureKind.Setter);
-  var staticFieldGetter = findExtensionField(
-      descriptors, 'staticField', ir.ExtensionMemberKind.Getter);
-  Expect.equals(
-      api.getExtensionMemberKind(staticFieldGetter), ir.ProcedureKind.Getter);
-  var staticFieldSetter = findExtensionField(
-      descriptors, 'staticField', ir.ExtensionMemberKind.Setter);
-  Expect.equals(
-      api.getExtensionMemberKind(staticFieldSetter), ir.ProcedureKind.Setter);
-
-  // Check getters and setters.
-  var getter = findExtensionMember(descriptors, 'getter');
-  Expect.equals(api.getExtensionMemberKind(getter), ir.ProcedureKind.Getter);
-  var setter = findExtensionMember(descriptors, 'setter');
-  Expect.equals(api.getExtensionMemberKind(setter), ir.ProcedureKind.Setter);
-  var staticGetter = findExtensionMember(descriptors, 'staticGetter');
-  Expect.equals(
-      api.getExtensionMemberKind(staticGetter), ir.ProcedureKind.Getter);
-  var staticSetter = findExtensionMember(descriptors, 'staticSetter');
-  Expect.equals(
-      api.getExtensionMemberKind(staticSetter), ir.ProcedureKind.Setter);
-
-  // Check methods.
-  var method = findExtensionMember(descriptors, 'method');
-  Expect.equals(api.getExtensionMemberKind(method), ir.ProcedureKind.Method);
-  var methodTearoff = findExtensionTearoff(descriptors, 'get#method');
-  Expect.equals(
-      api.getExtensionMemberKind(methodTearoff), ir.ProcedureKind.Getter);
-  var staticMethod = findExtensionMember(descriptors, 'staticMethod');
-  Expect.equals(
-      api.getExtensionMemberKind(staticMethod), ir.ProcedureKind.Method);
-
-  // Check operators.
-  var operator = findExtensionMember(descriptors, '+');
-  Expect.equals(api.getExtensionMemberKind(operator), ir.ProcedureKind.Method);
-}
-
-ir.Member findExtensionMember(
-    List<ir.ExtensionMemberDescriptor> descriptors, String memberName) {
-  return descriptors
-      .firstWhere((d) => d.name.text == memberName)
-      .member
-      .asMember;
-}
-
-ir.Member findExtensionField(List<ir.ExtensionMemberDescriptor> descriptors,
-    String fieldName, ir.ExtensionMemberKind kind) {
-  return descriptors
-      .firstWhere((d) => d.name.text == fieldName && d.kind == kind)
-      .member
-      .asMember;
-}
-
-ir.Member findExtensionTearoff(
-    List<ir.ExtensionMemberDescriptor> descriptors, String memberName) {
-  return descriptors
-      .map((d) => d.member.asMember)
-      .firstWhere((m) => m.name.text.contains(memberName));
-}
-
-const extensionSource = '''
-class Foo {}
-
-extension Ext on Foo {
-  external int field;
-  external static int staticField;
-
-  external get getter;
-  external set setter(_);
-  external static get staticGetter;
-  external static set staticSetter(_);
-
-  external int method();
-  external static int staticMethod();
-
-  external operator +(_);
-}
-''';
diff --git a/runtime/observatory/tests/service/break_on_dart_colon_test.dart b/runtime/observatory/tests/service/break_on_dart_colon_test.dart
new file mode 100644
index 0000000..f9b4908
--- /dev/null
+++ b/runtime/observatory/tests/service/break_on_dart_colon_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--verbose_debug
+
+import 'dart:developer';
+
+import 'package:observatory/service_io.dart';
+
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+// Line in core/print.dart
+const int LINE_A = 10;
+
+testMain() {
+  debugger();
+  print('1');
+  print('2');
+  print('3');
+  print('Done');
+}
+
+IsolateTest expectHitBreakpoint(String uri, int line) {
+  return (Isolate isolate) async {
+    final bpt = await isolate.addBreakpointByScriptUri(uri, line);
+    await resumeIsolate(isolate);
+    await hasStoppedAtBreakpoint(isolate);
+    await stoppedAtLine(line)(isolate);
+    await isolate.removeBreakpoint(bpt);
+  };
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+
+  // Dart libraries are not debuggable by default
+  markDartColonLibrariesDebuggable,
+
+  expectHitBreakpoint('org-dartlang-sdk:///sdk/lib/core/print.dart', LINE_A),
+  expectHitBreakpoint('dart:core/print.dart', LINE_A),
+  expectHitBreakpoint('/core/print.dart', LINE_A),
+
+  resumeIsolate,
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index e5f8df6..af626d9 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -47,6 +47,7 @@
 bad_reload_test: SkipByDesign # Hot reload is disabled in AOT mode.
 break_on_activation_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_async_function_test: SkipByDesign # Debugger is disabled in AOT mode.
+break_on_dart_colon_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_default_constructor_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_function_child_isolate_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_function_many_child_isolates_test: SkipByDesign # Debugger is disabled in AOT mode.
diff --git a/runtime/observatory_2/tests/service_2/break_on_dart_colon_test.dart b/runtime/observatory_2/tests/service_2/break_on_dart_colon_test.dart
new file mode 100644
index 0000000..e0d400c3
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/break_on_dart_colon_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--verbose_debug
+
+import 'dart:developer';
+
+import 'package:observatory_2/service_io.dart';
+
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+// Line in core/print.dart
+const int LINE_A = 10;
+
+testMain() {
+  debugger();
+  print('1');
+  print('2');
+  print('3');
+  print('Done');
+}
+
+IsolateTest expectHitBreakpoint(String uri, int line) {
+  return (Isolate isolate) async {
+    final bpt = await isolate.addBreakpointByScriptUri(uri, line);
+    await resumeIsolate(isolate);
+    await hasStoppedAtBreakpoint(isolate);
+    await stoppedAtLine(line)(isolate);
+    await isolate.removeBreakpoint(bpt);
+  };
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+
+  // Dart libraries are not debuggable by default
+  markDartColonLibrariesDebuggable,
+
+  expectHitBreakpoint('org-dartlang-sdk:///sdk/lib/core/print.dart', LINE_A),
+  expectHitBreakpoint('dart:core/print.dart', LINE_A),
+  expectHitBreakpoint('/core/print.dart', LINE_A),
+
+  resumeIsolate,
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory_2/tests/service_2/service_2_kernel.status b/runtime/observatory_2/tests/service_2/service_2_kernel.status
index 5138ddd..322b922 100644
--- a/runtime/observatory_2/tests/service_2/service_2_kernel.status
+++ b/runtime/observatory_2/tests/service_2/service_2_kernel.status
@@ -47,6 +47,7 @@
 bad_reload_test: SkipByDesign # Hot reload is disabled in AOT mode.
 break_on_activation_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_async_function_test: SkipByDesign # Debugger is disabled in AOT mode.
+break_on_dart_colon_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_default_constructor_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_function_child_isolate_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_function_many_child_isolates_test: SkipByDesign # Debugger is disabled in AOT mode.
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 7763cc7..7bbf92b 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -3129,6 +3129,7 @@
   const GrowableObjectArray& libs = GrowableObjectArray::Handle(
       isolate_->group()->object_store()->libraries());
   bool is_package = script_url.StartsWith(Symbols::PackageScheme());
+  bool is_dart_colon = script_url.StartsWith(Symbols::DartScheme());
   Script& script_for_lib = Script::Handle(zone);
   for (intptr_t i = 0; i < libs.Length(); i++) {
     lib ^= libs.At(i);
@@ -3136,7 +3137,8 @@
     // are available for look up. When certain script only contains
     // top level functions, scripts could still be loaded correctly.
     lib.EnsureTopLevelClassIsFinalized();
-    script_for_lib = lib.LookupScript(script_url, !is_package);
+    bool useResolvedUri = !is_package && !is_dart_colon;
+    script_for_lib = lib.LookupScript(script_url, useResolvedUri);
     if (!script_for_lib.IsNull()) {
       scripts.Add(script_for_lib);
     }
diff --git a/tools/VERSION b/tools/VERSION
index cb88287..fe63169 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 143
+PRERELEASE 144
 PRERELEASE_PATCH 0
\ No newline at end of file