Version 2.15.0-165.0.dev

Merge commit 'e24865a79ea8f1c8f5d1521935a249ab59f34e91' into 'dev'
diff --git a/pkg/analysis_server/benchmark/benchmarks.dart b/pkg/analysis_server/benchmark/benchmarks.dart
index c319053..28c658d 100644
--- a/pkg/analysis_server/benchmark/benchmarks.dart
+++ b/pkg/analysis_server/benchmark/benchmarks.dart
@@ -8,6 +8,7 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer_utilities/package_root.dart';
 import 'package:args/command_runner.dart';
 import 'package:intl/intl.dart';
 import 'package:path/path.dart' as path;
@@ -24,17 +25,17 @@
     FlutterAnalyzeBenchmark(),
   ];
 
-  var runner =
-      CommandRunner('benchmark', 'A benchmark runner for the analysis server.');
+  var runner = CommandRunner(
+    'benchmark',
+    'A benchmark runner for the analysis server.',
+  );
   runner.addCommand(ListCommand(benchmarks));
   runner.addCommand(RunCommand(benchmarks));
   runner.run(args);
 }
 
 String get analysisServerSrcPath {
-  var script = Platform.script.toFilePath(windows: Platform.isWindows);
-  var pkgPath = path.normalize(path.join(path.dirname(script), '..', '..'));
-  return path.join(pkgPath, 'analysis_server');
+  return path.join(packageRoot, 'analysis_server');
 }
 
 void deleteServerCache() {
@@ -42,18 +43,14 @@
   ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
   var stateLocation = resourceProvider.getStateLocation('.analysis-driver');
   try {
-    if (stateLocation != null && stateLocation.exists) {
-      stateLocation.delete();
-    }
+    stateLocation?.delete();
   } catch (e) {
     // ignore any exception
   }
 }
 
 List<String> getProjectRoots({bool quick = false}) {
-  var script = Platform.script.toFilePath(windows: Platform.isWindows);
-  var pkgPath = path.normalize(path.join(path.dirname(script), '..', '..'));
-  return <String>[path.join(pkgPath, quick ? 'meta' : 'analysis_server')];
+  return [path.join(packageRoot, quick ? 'meta' : 'analysis_server')];
 }
 
 abstract class Benchmark {
@@ -65,7 +62,7 @@
   final String kind;
 
   Benchmark(this.id, this.description,
-      {this.enabled = true, this.kind = 'cpu'});
+      {this.enabled = true, required this.kind});
 
   int get maxIterations => 0;
 
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index 40a0feb..6adbb19 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -73,8 +73,6 @@
               _currentLibrary.featureSet.isEnabled(Feature.non_nullable),
         );
 
-  bool get _isNonNullableByDefault => _currentLibrary.isNonNullableByDefault;
-
   @override
   void visitAnnotation(Annotation node) {
     super.visitAnnotation(node);
@@ -259,7 +257,7 @@
 
   @override
   void visitSwitchStatement(SwitchStatement node) {
-    if (_isNonNullableByDefault) {
+    if (_currentLibrary.isNonNullableByDefault) {
       _validateSwitchStatement_nullSafety(node);
     } else {
       _validateSwitchStatement_legacy(node);
@@ -424,7 +422,7 @@
   void _reportNotPotentialConstants(AstNode node) {
     var notPotentiallyConstants = getNotPotentiallyConstants(
       node,
-      isNonNullableByDefault: _isNonNullableByDefault,
+      featureSet: _currentLibrary.featureSet,
     );
     if (notPotentiallyConstants.isEmpty) return;
 
@@ -773,7 +771,7 @@
   bool _reportNotPotentialConstants(AstNode node) {
     var notPotentiallyConstants = getNotPotentiallyConstants(
       node,
-      isNonNullableByDefault: verifier._isNonNullableByDefault,
+      featureSet: verifier._currentLibrary.featureSet,
     );
     if (notPotentiallyConstants.isEmpty) return true;
 
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 26fdf2b..e26da9a 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -1760,7 +1760,7 @@
   void _reportNotPotentialConstants(AstNode node) {
     var notPotentiallyConstants = getNotPotentiallyConstants(
       node,
-      isNonNullableByDefault: _isNonNullableByDefault,
+      featureSet: _library.featureSet,
     );
     if (notPotentiallyConstants.isEmpty) return;
 
diff --git a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
index 3b37d629..c2abc80 100644
--- a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
+++ b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -17,10 +18,10 @@
 /// Return the list of nodes that are not potentially constant.
 List<AstNode> getNotPotentiallyConstants(
   AstNode node, {
-  required bool isNonNullableByDefault,
+  required FeatureSet featureSet,
 }) {
   var collector = _Collector(
-    isNonNullableByDefault: isNonNullableByDefault,
+    featureSet: featureSet,
   );
   collector.collect(node);
   return collector.nodes;
@@ -50,10 +51,10 @@
 }
 
 class _Collector {
-  final bool isNonNullableByDefault;
+  final FeatureSet featureSet;
   final List<AstNode> nodes = [];
 
-  _Collector({required this.isNonNullableByDefault});
+  _Collector({required this.featureSet});
 
   void collect(AstNode node) {
     if (node is BooleanLiteral ||
@@ -139,7 +140,7 @@
     }
 
     if (node is AsExpression) {
-      if (isNonNullableByDefault) {
+      if (featureSet.isEnabled(Feature.non_nullable)) {
         if (!isPotentiallyConstantTypeExpression(node.type)) {
           nodes.add(node.type);
         }
@@ -153,7 +154,7 @@
     }
 
     if (node is IsExpression) {
-      if (isNonNullableByDefault) {
+      if (featureSet.isEnabled(Feature.non_nullable)) {
         if (!isPotentiallyConstantTypeExpression(node.type)) {
           nodes.add(node.type);
         }
diff --git a/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart b/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
index 6184eb4..e9e0a9a 100644
--- a/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/potentially_constant_test.dart
@@ -1140,7 +1140,7 @@
     var node = getNode();
     var notConstList = getNotPotentiallyConstants(
       node,
-      isNonNullableByDefault: typeSystem.isNonNullableByDefault,
+      featureSet: featureSet,
     );
     expect(notConstList, isEmpty);
   }
@@ -1151,7 +1151,7 @@
     var node = getNode();
     var notConstList = getNotPotentiallyConstants(
       node,
-      isNonNullableByDefault: typeSystem.isNonNullableByDefault,
+      featureSet: featureSet,
     );
 
     var expectedNotConst = getNotConstList();
@@ -1194,7 +1194,7 @@
     var node = getNode();
     var notConstList = getNotPotentiallyConstants(
       node,
-      isNonNullableByDefault: typeSystem.isNonNullableByDefault,
+      featureSet: featureSet,
     );
 
     var expectedNotConst = getNotConstList();
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 9daf620..b4e1b0b 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -47,6 +48,8 @@
 
   bool get enableUnusedLocalVariable => false;
 
+  FeatureSet get featureSet => result.libraryElement.featureSet;
+
   ClassElement get futureElement => typeProvider.futureElement;
 
   /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/43608
diff --git a/tools/VERSION b/tools/VERSION
index cc57400..01f2639 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 164
+PRERELEASE 165
 PRERELEASE_PATCH 0
\ No newline at end of file