Version 2.15.0-266.0.dev

Merge commit '3c5e2a0d7b11139408d1827d371836464417e622' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7ae5db7..03de374 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -495,7 +495,7 @@
 #### Linter
 
 Updated the Linter to `1.14.0`, which includes changes that
-- fix `omit_local_variable_types` to not flag a local type that is 
+- fix `omit_local_variable_types` to not flag a local type that is
   required for inference.
 - allow `while (true) { ... }` in `literal_only_boolean_expressions`.
 - fix `file_names` to report at the start of the file (not the entire
@@ -538,7 +538,11 @@
 
 ### Pub
 
-- Adds support for token-based authorization to third party package-repositories
+- If you have analytics enabled `dart pub get` will send
+  [usage metrics](https://github.com/dart-lang/pub/blob/0035a40f25d027130c0314571da53ffafc6d973b/lib/src/solver/result.dart#L131-L175)
+  for packages from pub.dev, intended for popularity analysis.
+
+- Adds support for token-based authorization to third-party package-repositories
   with the new command `dart pub token`.
 - Credentials are no longer stored in the pub-cache, but in a platform dependent
   config directory:
@@ -546,6 +550,35 @@
     is defined, otherwise `$HOME/.config/dart/pub-credentials.json`
   * On Mac OS: `$HOME/Library/Application Support/dart/pub-credentials.json`
   * On Windows: `%APPDATA%/dart/pub-credentials.json`
+- The syntax for dependencies hosted at a third-party package repository has
+  been simplified. Before you would need to write:
+
+```
+dependencies:
+  colorizer:
+    hosted:
+      name: colorizer
+      url: 'https://custom-pub-server.com'
+    version: ^1.2.3
+environment:
+  sdk: '>=2.14.0 < 3.0.0'
+```
+
+Now you can write:
+
+```
+dependencies:
+  colorizer:
+    hosted: 'https://custom-pub-server.com'
+    version: ^1.2.3
+environment:
+  sdk: '>=2.15.0 < 3.0.0'
+```
+
+This feature requires
+[language-version](https://dart.dev/guides/language/evolution#language-versioning)
+2.15 or later, e.g. the `pubspec.yaml` should have an SDK constraint of
+`>=2.15 <3.0.0`.
 
 - Detect potential leaks in `dart pub publish`.
   When publishing, pub will examine your files for potential secret keys, and
diff --git a/DEPS b/DEPS
index 1acadc2..18e0f7a 100644
--- a/DEPS
+++ b/DEPS
@@ -139,7 +139,7 @@
   "pool_rev": "7abe634002a1ba8a0928eded086062f1307ccfae",
   "process_rev": "56ece43b53b64c63ae51ec184b76bd5360c28d0b",
   "protobuf_rev": "c1eb6cb51af39ccbaa1a8e19349546586a5c8e31",
-  "pub_rev": "78bc50c7833451c24e531713362e46fd50621ff0",
+  "pub_rev": "0035a40f25d027130c0314571da53ffafc6d973b",
   "pub_semver_rev": "a43ad72fb6b7869607581b5fedcb186d1e74276a",
   "root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
   "rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index ace7285..69db956 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -228,31 +228,18 @@
       }
     }
 
-    String path;
-    String packagesConfigOverride;
-
     try {
-      final filename = maybeUriToFilename(mainCommand);
-      if (File(filename).existsSync()) {
-        // TODO(sigurdm): getExecutableForCommand is able to figure this out,
-        // but does not return a package config override.
-        path = filename;
-        packagesConfigOverride = null;
-      } else {
-        path = await getExecutableForCommand(mainCommand);
-        packagesConfigOverride =
-            join(current, '.dart_tool', 'package_config.json');
-      }
+      final executable = await getExecutableForCommand(mainCommand);
+      VmInteropHandler.run(
+        executable.executable,
+        runArgs,
+        packageConfigOverride: executable.packageConfig,
+      );
+      return 0;
     } on CommandResolutionFailedException catch (e) {
       log.stderr(e.message);
       return errorExitCode;
     }
-    VmInteropHandler.run(
-      path,
-      runArgs,
-      packageConfigOverride: packagesConfigOverride,
-    );
-    return 0;
   }
 }
 
diff --git a/pkg/dartdev/lib/src/commands/test.dart b/pkg/dartdev/lib/src/commands/test.dart
index c6711c7..36683af 100644
--- a/pkg/dartdev/lib/src/commands/test.dart
+++ b/pkg/dartdev/lib/src/commands/test.dart
@@ -5,7 +5,6 @@
 import 'dart:async';
 
 import 'package:args/args.dart';
-import 'package:path/path.dart';
 import 'package:pub/pub.dart';
 
 import '../core.dart';
@@ -32,15 +31,16 @@
     try {
       final testExecutable = await getExecutableForCommand('test:test');
       log.trace('dart $testExecutable ${argResults.rest.join(' ')}');
-      VmInteropHandler.run(testExecutable, argResults.rest,
-          packageConfigOverride:
-              join(current, '.dart_tool', 'package_config.json'));
+      VmInteropHandler.run(testExecutable.executable, argResults.rest,
+          packageConfigOverride: testExecutable.packageConfig);
       return 0;
     } on CommandResolutionFailedException catch (e) {
       if (project.hasPubspecFile) {
         print(e.message);
-        print('You need to add a dev_dependency on package:test.');
-        print('Try running `dart pub add --dev test`.');
+        if (e.issue == CommandResolutionIssue.packageNotFound) {
+          print('You need to add a dev_dependency on package:test.');
+          print('Try running `dart pub add --dev test`.');
+        }
       } else {
         print(
             'No pubspec.yaml file found - run this command in your project folder.');
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index df6722b..412cfbc 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -3,7 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 complex_reload_test: Skip # http://dartbug.com/47130
-coverage_closure_call_test: Skip # https://github.com/dart-lang/sdk/issues/47568
 valid_source_locations_test: Pass, Slow
 
 [ $compiler == app_jitk ]
@@ -76,6 +75,7 @@
 code_test: SkipByDesign # Debugger is disabled in AOT mode.
 column_breakpoint_test: SkipByDesign # Debugger is disabled in AOT mode.
 complex_reload_test: SkipByDesign # Debugger is disabled in AOT mode.
+coverage_closure_call_test: SkipByDesign # Debugger and coverage are disabled in AOT mode.
 coverage_const_field_async_closure_test: SkipByDesign # Debugger is disabled in AOT mode.
 coverage_leaf_function_test: SkipByDesign # Debugger is disabled in AOT mode.
 coverage_optimized_function_test: SkipByDesign # Debugger is disabled in AOT mode.
diff --git a/runtime/observatory_2/tests/service_2/coverage_closure_call_test.dart b/runtime/observatory_2/tests/service_2/coverage_closure_call_test.dart
new file mode 100644
index 0000000..967f8fa
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/coverage_closure_call_test.dart
@@ -0,0 +1,115 @@
+// 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.
+
+import 'package:observatory_2/service_io.dart';
+import 'package:test/test.dart';
+import 'test_helper.dart';
+import 'service_test_common.dart';
+import 'dart:developer';
+
+String leafFunction(void Function() f) {
+  f();
+  return "some constant";
+}
+
+void testFunction() {
+  debugger();
+  leafFunction(() {});
+  debugger();
+}
+
+bool allRangesCompiled(coverage) {
+  for (int i = 0; i < coverage['ranges'].length; i++) {
+    if (!coverage['ranges'][i]['compiled']) {
+      return false;
+    }
+  }
+  return true;
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+  (Isolate isolate) async {
+    var stack = await isolate.getStack();
+
+    // Make sure we are in the right place.
+    expect(stack.type, equals('Stack'));
+    expect(stack['frames'].length, greaterThanOrEqualTo(1));
+    expect(stack['frames'][0].function.name, equals('testFunction'));
+
+    var root = isolate.rootLibrary;
+    await root.load();
+    var func = root.functions.singleWhere((f) => f.name == 'leafFunction');
+    await func.load();
+
+    var expectedRange = {
+      'scriptIndex': 0,
+      'startPos': 386,
+      'endPos': 460,
+      'compiled': true,
+      'coverage': {
+        'hits': [],
+        'misses': [386, 430]
+      }
+    };
+
+    var params = {
+      'reports': ['Coverage'],
+      'scriptId': func.location.script.id,
+      'tokenPos': func.location.tokenPos,
+      'endTokenPos': func.location.endTokenPos,
+      'forceCompile': true
+    };
+    var report = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
+    expect(report['type'], equals('SourceReport'));
+    expect(report['ranges'].length, 1);
+    expect(report['ranges'][0], equals(expectedRange));
+    expect(report['scripts'].length, 1);
+    expect(report['scripts'][0]['uri'],
+        endsWith('coverage_closure_call_test.dart'));
+  },
+  resumeIsolate,
+  hasStoppedAtBreakpoint,
+  (Isolate isolate) async {
+    var stack = await isolate.getStack();
+
+    // Make sure we are in the right place.
+    expect(stack.type, equals('Stack'));
+    expect(stack['frames'].length, greaterThanOrEqualTo(1));
+    expect(stack['frames'][0].function.name, equals('testFunction'));
+
+    var root = isolate.rootLibrary;
+    await root.load();
+    var func = root.functions.singleWhere((f) => f.name == 'leafFunction');
+    await func.load();
+
+    var expectedRange = {
+      'scriptIndex': 0,
+      'startPos': 386,
+      'endPos': 460,
+      'compiled': true,
+      'coverage': {
+        'hits': [386, 430],
+        'misses': []
+      }
+    };
+
+    var params = {
+      'reports': ['Coverage'],
+      'scriptId': func.location.script.id,
+      'tokenPos': func.location.tokenPos,
+      'endTokenPos': func.location.endTokenPos,
+      'forceCompile': true
+    };
+    var report = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
+    expect(report['type'], equals('SourceReport'));
+    expect(report['ranges'].length, 1);
+    expect(report['ranges'][0], equals(expectedRange));
+    expect(report['scripts'].length, 1);
+    expect(report['scripts'][0]['uri'],
+        endsWith('coverage_closure_call_test.dart'));
+  },
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testFunction);
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 5627906..ac51da2 100644
--- a/runtime/observatory_2/tests/service_2/service_2_kernel.status
+++ b/runtime/observatory_2/tests/service_2/service_2_kernel.status
@@ -3,7 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 complex_reload_test: Skip # http://dartbug.com/47130
-coverage_closure_call_test: Skip # https://github.com/dart-lang/sdk/issues/47568
 valid_source_locations_test: Pass, Slow
 
 [ $compiler == app_jitk ]
@@ -76,6 +75,7 @@
 code_test: SkipByDesign # Debugger is disabled in AOT mode.
 column_breakpoint_test: SkipByDesign # Debugger is disabled in AOT mode.
 complex_reload_test: SkipByDesign # Debugger is disabled in AOT mode.
+coverage_closure_call_test: SkipByDesign # Debugger and coverage are disabled in AOT mode.
 coverage_const_field_async_closure_test: SkipByDesign # Debugger is disabled in AOT mode.
 coverage_leaf_function_test: SkipByDesign # Debugger is disabled in AOT mode.
 coverage_optimized_function_test: SkipByDesign # Debugger is disabled in AOT mode.
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph_test.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph_test.cc
index 85ba707..ca7fcc2 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph_test.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph_test.cc
@@ -333,7 +333,9 @@
     kMatchAndMoveCheckNull,
     kMatchAndMoveLoadField,
     kMoveDebugStepChecks,
+#if !defined(PRODUCT)
     kMatchAndMoveRecordCoverage,
+#endif
     kMatchAndMoveClosureCall,
     kMoveDebugStepChecks,
     kMatchReturn,
diff --git a/tools/VERSION b/tools/VERSION
index 0f45ddc..8e42ace 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 265
+PRERELEASE 266
 PRERELEASE_PATCH 0
\ No newline at end of file