Version 2.17.0-271.0.dev

Merge commit '434aac2fb5ec6e2fa569adc50d42701c77f5db3f' into 'dev'
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index ffe0eb4..d2e352f 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -341,6 +341,7 @@
     _checkForDivisionOptimizationHint(node);
     _deprecatedVerifier.binaryExpression(node);
     _checkForInvariantNullComparison(node);
+    _invalidAccessVerifier.verifyBinary(node);
     super.visitBinaryExpression(node);
   }
 
@@ -1849,6 +1850,25 @@
     _checkForOtherInvalidAccess(identifier, element);
   }
 
+  void verifyBinary(BinaryExpression node) {
+    var element = node.staticElement;
+    if (element != null && _hasVisibleForOverriding(element)) {
+      var operator = node.operator;
+
+      if (node.leftOperand is SuperExpression) {
+        var methodDeclaration = node.thisOrAncestorOfType<MethodDeclaration>();
+        if (methodDeclaration?.name.name == operator.lexeme) {
+          return;
+        }
+      }
+
+      _errorReporter.reportErrorForToken(
+          HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER,
+          operator,
+          [operator.type.lexeme]);
+    }
+  }
+
   void verifyImport(ImportDirective node) {
     var element = node.uriElement;
     if (_hasInternal(element) &&
@@ -1968,7 +1988,7 @@
           parent is PropertyAccess && parent.target is SuperExpression) {
         var methodDeclaration =
             grandparent?.thisOrAncestorOfType<MethodDeclaration>();
-        if (methodDeclaration?.name.token.value() == identifier.token.value()) {
+        if (methodDeclaration?.name.name == identifier.name) {
           validOverride = true;
         }
       }
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_overriding_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_overriding_member_test.dart
index d4e5892..04c59dd 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_overriding_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_overriding_member_test.dart
@@ -111,6 +111,27 @@
     ]);
   }
 
+  test_operator() async {
+    newFile2('$testPackageLibPath/a.dart', '''
+import 'package:meta/meta.dart';
+
+class A {
+  @visibleForOverriding
+  operator >(A other) => true;
+}
+''');
+
+    await assertErrorsInCode('''
+import 'a.dart';
+
+class B {
+  void m(A a) => a > A();
+}
+''', [
+      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER, 47, 1),
+    ]);
+  }
+
   test_overriding_getter() async {
     newFile2('$testPackageLibPath/a.dart', '''
 import 'package:meta/meta.dart';
@@ -169,14 +190,18 @@
 }
 ''');
 
-    await assertNoErrorsInCode('''
+    await assertErrorsInCode('''
 import 'a.dart';
 
 class B extends A {
   @override
   operator >(A other) => super > other;
+
+  void m() => super > A();
 }
-''');
+''', [
+      error(HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER, 111, 1),
+    ]);
   }
 
   test_overriding_setter() async {
diff --git a/pkg/analyzer/test/src/workspace/bazel_test.dart b/pkg/analyzer/test/src/workspace/bazel_test.dart
index 474d1e5..2aabbdc 100644
--- a/pkg/analyzer/test/src/workspace/bazel_test.dart
+++ b/pkg/analyzer/test/src/workspace/bazel_test.dart
@@ -133,7 +133,7 @@
       '/workspace/my/lib/a.dart',
     ]);
     _assertResolve(
-      'file:///workspace/my/lib/a.dart',
+      toUriStr('/workspace/my/lib/a.dart'),
       getFile('/workspace/my/lib/a.dart'),
     );
   }
@@ -143,7 +143,7 @@
       '/workspace/WORKSPACE',
     ]);
     _assertResolve(
-      'file:///workspace/my/lib/a.dart',
+      toUriStr('/workspace/my/lib/a.dart'),
       getFile('/workspace/my/lib/a.dart'),
       exists: false,
     );
@@ -231,7 +231,7 @@
       '/workspace/WORKSPACE',
       '/workspace/my/foo/test',
     ]);
-    _assertResolve('file:///workspace/bazel-bin/my/test/a .dart',
+    _assertResolve(toUriStr('/workspace/bazel-bin/my/test/a .dart'),
         '/workspace/my/test/a .dart',
         exists: false, restore: false);
   }
@@ -242,7 +242,7 @@
       '/workspace/bazel-genfiles/my/foo/test/foo1.dart',
       '/workspace/bazel-bin/'
     ]);
-    _assertResolve('file:///workspace/bazel-bin/my/foo/test/foo1.dart',
+    _assertResolve(toUriStr('/workspace/bazel-bin/my/foo/test/foo1.dart'),
         '/workspace/bazel-genfiles/my/foo/test/foo1.dart',
         restore: false);
   }
@@ -253,7 +253,7 @@
       '/workspace/bazel-genfiles/',
       '/workspace/my/foo/test/foo1.dart'
     ]);
-    _assertResolve('file:///workspace/bazel-genfiles/my/foo/test/foo1.dart',
+    _assertResolve(toUriStr('/workspace/bazel-genfiles/my/foo/test/foo1.dart'),
         '/workspace/my/foo/test/foo1.dart',
         restore: false);
   }
@@ -264,7 +264,7 @@
       '/workspace/bazel-genfiles/',
       '/other/my/foo/test/foo1.dart'
     ]);
-    _assertNoResolve('file:///other/my/foo/test/foo1.dart');
+    _assertNoResolve(toUriStr('/other/my/foo/test/foo1.dart'));
   }
 
   void test_resolveAbsolute_file_readonly_to_workspace() {
@@ -273,7 +273,7 @@
       '/READONLY/workspace/',
       '/workspace/my/foo/test/foo1.dart'
     ]);
-    _assertResolve('file:///READONLY/workspace/my/foo/test/foo1.dart',
+    _assertResolve(toUriStr('/READONLY/workspace/my/foo/test/foo1.dart'),
         '/workspace/my/foo/test/foo1.dart',
         restore: false);
   }
@@ -283,7 +283,7 @@
       '/workspace/WORKSPACE',
       '/workspace/bazel-genfiles/my/foo/test/foo1.dart'
     ]);
-    _assertResolve('file:///workspace/my/foo/test/foo1.dart',
+    _assertResolve(toUriStr('/workspace/my/foo/test/foo1.dart'),
         '/workspace/bazel-genfiles/my/foo/test/foo1.dart',
         restore: false);
   }
diff --git a/sdk/lib/_internal/vm/bin/vmservice_server.dart b/sdk/lib/_internal/vm/bin/vmservice_server.dart
index 03ea982..2fdff43 100644
--- a/sdk/lib/_internal/vm/bin/vmservice_server.dart
+++ b/sdk/lib/_internal/vm/bin/vmservice_server.dart
@@ -373,7 +373,7 @@
       request.response.close();
       return;
     }
-    final asset = assets[path];
+    final asset = assets![path];
     if (asset != null) {
       // Serving up a static asset (e.g. .css, .html, .png).
       request.response.headers.contentType = ContentType.parse(asset.mimeType);
diff --git a/sdk/lib/vmservice/asset.dart b/sdk/lib/vmservice/asset.dart
index 985c905..7e086ff 100644
--- a/sdk/lib/vmservice/asset.dart
+++ b/sdk/lib/vmservice/asset.dart
@@ -58,7 +58,7 @@
 external List<Object> _decodeAssets(Uint8List data);
 
 Map<String, Asset>? _assets;
-Map<String, Asset> get assets {
+Map<String, Asset>? get assets {
   if (_assets == null) {
     try {
       _assets = Asset.request();
@@ -66,5 +66,5 @@
       print('Could not load Observatory assets: $e');
     }
   }
-  return _assets!;
+  return _assets;
 }
diff --git a/tools/VERSION b/tools/VERSION
index 812e398..858518f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 270
+PRERELEASE 271
 PRERELEASE_PATCH 0
\ No newline at end of file