Version 2.12.0-171.0.dev

Merge commit '6acb187d4a433b1a3c117ecbf85d281defdf8a82' into 'dev'
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index d097a92..67f5bed 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -109,6 +109,8 @@
 /// An enumeration of quick fix kinds for the errors found in an analysis
 /// options file.
 class AnalysisOptionsFixKind {
+  static const REMOVE_LINT =
+      FixKind('analysisOptions.fix.removeLint', 50, "Remove '{0}'");
   static const REMOVE_SETTING =
       FixKind('analysisOptions.fix.removeSetting', 50, "Remove '{0}'");
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
index b176935..f60d19e 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/analysis_options/fix_generator.dart
@@ -14,6 +14,7 @@
 import 'package:analyzer/src/analysis_options/error/option_codes.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/lint/options_rule_validator.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:yaml/yaml.dart';
@@ -64,7 +65,11 @@
 //    } else if (errorCode ==
 //        AnalysisOptionsHintCode.STRONG_MODE_SETTING_DEPRECATED) {
 //    } else
-    if (errorCode == AnalysisOptionsHintCode.SUPER_MIXINS_SETTING_DEPRECATED) {
+
+    if (errorCode == DEPRECATED_LINT_HINT) {
+      await _addFix_removeLint();
+    } else if (errorCode ==
+        AnalysisOptionsHintCode.SUPER_MIXINS_SETTING_DEPRECATED) {
       await _addFix_removeSetting();
 //    } else if (errorCode ==
 //        AnalysisOptionsWarningCode.ANALYSIS_OPTION_DEPRECATED) {
@@ -87,57 +92,17 @@
     return fixes;
   }
 
+  Future<void> _addFix_removeLint() async {
+    var builder = await _createScalarDeletionBuilder();
+    if (builder != null) {
+      _addFixFromBuilder(builder, AnalysisOptionsFixKind.REMOVE_LINT,
+          args: [coveringNodePath[0].toString()]);
+    }
+  }
+
   Future<void> _addFix_removeSetting() async {
-    if (coveringNodePath[0] is YamlScalar) {
-      SourceRange deletionRange;
-      var index = 1;
-      while (index < coveringNodePath.length) {
-        var parent = coveringNodePath[index];
-        if (parent is YamlList) {
-          if (parent.nodes.length > 1) {
-            var nodeToDelete = coveringNodePath[index - 1];
-            deletionRange = _lines(
-                nodeToDelete.span.start.offset, nodeToDelete.span.end.offset);
-            break;
-          }
-        } else if (parent is YamlMap) {
-          var nodes = parent.nodes;
-          if (nodes.length > 1) {
-            YamlNode key;
-            YamlNode value;
-            var child = coveringNodePath[index - 1];
-            if (nodes.containsKey(child)) {
-              key = child;
-              value = nodes[child];
-            } else if (nodes.containsValue(child)) {
-              for (var entry in nodes.entries) {
-                if (child == entry.value) {
-                  key = entry.key;
-                  value = child;
-                  break;
-                }
-              }
-            }
-            if (key == null || value == null) {
-              throw StateError(
-                  'Child is neither a key nor a value in the parent');
-            }
-            deletionRange = _lines(key.span.start.offset,
-                _firstNonWhitespaceBefore(value.span.end.offset));
-            break;
-          }
-        } else if (parent is YamlDocument) {
-          break;
-        }
-        index++;
-      }
-      var nodeToDelete = coveringNodePath[index - 1];
-      deletionRange ??=
-          _lines(nodeToDelete.span.start.offset, nodeToDelete.span.end.offset);
-      var builder = ChangeBuilder();
-      await builder.addGenericFileEdit(file, (builder) {
-        builder.addDeletion(deletionRange);
-      });
+    var builder = await _createScalarDeletionBuilder();
+    if (builder != null) {
       _addFixFromBuilder(builder, AnalysisOptionsFixKind.REMOVE_SETTING,
           args: [coveringNodePath[0].toString()]);
     }
@@ -155,6 +120,63 @@
     fixes.add(Fix(kind, change));
   }
 
+  Future<ChangeBuilder> _createScalarDeletionBuilder() async {
+    if (coveringNodePath[0] is! YamlScalar) {
+      return null;
+    }
+
+    SourceRange deletionRange;
+    var index = 1;
+    while (index < coveringNodePath.length) {
+      var parent = coveringNodePath[index];
+      if (parent is YamlList) {
+        if (parent.nodes.length > 1) {
+          var nodeToDelete = coveringNodePath[index - 1];
+          deletionRange = _lines(
+              nodeToDelete.span.start.offset, nodeToDelete.span.end.offset);
+          break;
+        }
+      } else if (parent is YamlMap) {
+        var nodes = parent.nodes;
+        if (nodes.length > 1) {
+          YamlNode key;
+          YamlNode value;
+          var child = coveringNodePath[index - 1];
+          if (nodes.containsKey(child)) {
+            key = child;
+            value = nodes[child];
+          } else if (nodes.containsValue(child)) {
+            for (var entry in nodes.entries) {
+              if (child == entry.value) {
+                key = entry.key;
+                value = child;
+                break;
+              }
+            }
+          }
+          if (key == null || value == null) {
+            throw StateError(
+                'Child is neither a key nor a value in the parent');
+          }
+          deletionRange = _lines(key.span.start.offset,
+              _firstNonWhitespaceBefore(value.span.end.offset));
+          break;
+        }
+      } else if (parent is YamlDocument) {
+        break;
+      }
+      index++;
+    }
+    var nodeToDelete = coveringNodePath[index - 1];
+    deletionRange ??=
+        _lines(nodeToDelete.span.start.offset, nodeToDelete.span.end.offset);
+    var builder = ChangeBuilder();
+    await builder.addGenericFileEdit(file, (builder) {
+      builder.addDeletion(deletionRange);
+    });
+    return builder;
+  }
+
   int _firstNonWhitespaceBefore(int offset) {
     while (offset > 0 && isWhitespace(content.codeUnitAt(offset - 1))) {
       offset--;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/remove_lint_test.dart b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/remove_lint_test.dart
new file mode 100644
index 0000000..deb6eb4
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/remove_lint_test.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2020, 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:linter/src/rules.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveLintTest);
+  });
+}
+
+@reflectiveTest
+class RemoveLintTest extends AnalysisOptionsFixTest {
+  void setUp() {
+    registerLintRules();
+  }
+
+  Future<void> test_deprecated() async {
+    await assertHasFix('''
+linter:
+  rules:
+    - camel_case_types
+    - super_goes_last
+''', '''
+linter:
+  rules:
+    - camel_case_types
+''');
+  }
+
+  Future<void> test_deprecated_only() async {
+    await assertHasFix('''
+linter:
+  rules:
+    - super_goes_last
+''', '''
+''');
+  }
+
+  Future<void> test_deprecated_withSectionAfter() async {
+    await assertHasFix('''
+linter:
+  rules:
+    - camel_case_types
+    - super_goes_last
+section:
+  - foo
+''', '''
+linter:
+  rules:
+    - camel_case_types
+section:
+  - foo
+''');
+  }
+
+  Future<void> test_deprecated_withSectionBefore() async {
+    await assertHasFix('''
+analyzer:
+  exclude:
+    - test/data/**
+
+linter:
+  rules:
+    - camel_case_types
+    - super_goes_last
+''', '''
+analyzer:
+  exclude:
+    - test/data/**
+
+linter:
+  rules:
+    - camel_case_types
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_all.dart
index e17f40e..6d61c19 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/analysis_options/test_all.dart
@@ -4,10 +4,12 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'remove_lint_test.dart' as remove_lint;
 import 'remove_setting_test.dart' as remove_setting;
 
 void main() {
   defineReflectiveSuite(() {
+    remove_lint.main();
     remove_setting.main();
   });
 }
diff --git a/pkg/analyzer/lib/src/lint/options_rule_validator.dart b/pkg/analyzer/lib/src/lint/options_rule_validator.dart
index 31f27c0..bf67245 100644
--- a/pkg/analyzer/lib/src/lint/options_rule_validator.dart
+++ b/pkg/analyzer/lib/src/lint/options_rule_validator.dart
@@ -11,6 +11,8 @@
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:yaml/yaml.dart';
 
+/// TODO(pq): migrate these codes to `option_codes.dart`?
+
 /// A hint code indicating reference to a deprecated lint.
 ///
 /// Parameters:
diff --git a/pkg/compiler/lib/compiler_new.dart b/pkg/compiler/lib/compiler_new.dart
index 918c627..77e4a0c 100644
--- a/pkg/compiler/lib/compiler_new.dart
+++ b/pkg/compiler/lib/compiler_new.dart
@@ -40,6 +40,10 @@
 
   /// The raw data read from [uri].
   T get data;
+
+  /// Release any resources held by the input. After releasing, a call to `get
+  /// data` will fail, and previously returned data may be invalid.
+  void release();
 }
 
 /// Interface for providing the compiler with input. That is, Dart source files,
diff --git a/pkg/compiler/lib/src/io/source_file.dart b/pkg/compiler/lib/src/io/source_file.dart
index 1b358bc..f091dee 100644
--- a/pkg/compiler/lib/src/io/source_file.dart
+++ b/pkg/compiler/lib/src/io/source_file.dart
@@ -225,6 +225,9 @@
   @override
   set length(int v) => lengthCache = v;
   int lengthCache = -1;
+
+  @override
+  void release() {}
 }
 
 class CachingUtf8BytesSourceFile extends Utf8BytesSourceFile {
@@ -242,6 +245,12 @@
     }
     return cachedText;
   }
+
+  @override
+  void release() {
+    cachedText = null;
+    super.release();
+  }
 }
 
 class StringSourceFile extends SourceFile<List<int>> {
@@ -277,17 +286,30 @@
 
   @override
   String slowSubstring(int start, int end) => text.substring(start, end);
+
+  @override
+  void release() {}
 }
 
 /// Binary input data.
 class Binary implements Input<List<int>> {
   @override
   final Uri uri;
-  @override
-  final List<int> data;
+  List<int> /*?*/ _data;
 
-  Binary(this.uri, this.data);
+  Binary(this.uri, List<int> data) : _data = data;
+
+  @override
+  List<int> get data {
+    if (_data != null) return _data;
+    throw StateError("'get data' after 'release()'");
+  }
 
   @override
   InputKind get inputKind => InputKind.binary;
+
+  @override
+  void release() {
+    _data = null;
+  }
 }
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index 28d3224..707def0 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -259,25 +259,38 @@
         _reporter.log('Reading data from ${uri}');
         api.Input<List<int>> dataInput =
             await _provider.readFromUri(uri, inputKind: api.InputKind.binary);
-        DataSource source = new BinarySourceImpl(dataInput.data);
-        backendStrategy.prepareCodegenReader(source);
-        Map<MemberEntity, CodegenResult> codegenResults =
-            source.readMemberMap((MemberEntity member) {
-          List<ModularName> modularNames = [];
-          List<ModularExpression> modularExpressions = [];
-          CodegenReader reader = new CodegenReaderImpl(
-              closedWorld, modularNames, modularExpressions);
-          source.registerCodegenReader(reader);
-          CodegenResult result = CodegenResult.readFromDataSource(
-              source, modularNames, modularExpressions);
-          source.deregisterCodegenReader(reader);
-          return result;
-        });
-        _reporter.log('Read ${codegenResults.length} members from ${uri}');
-        results.addAll(codegenResults);
+        // TODO(36983): This code is extracted because there appeared to be a
+        // memory leak for large buffer held by `source`.
+        _deserializeCodegenInput(
+            backendStrategy, closedWorld, uri, dataInput, results);
+        dataInput.release();
       });
     }
     return new DeserializedCodegenResults(
         globalTypeInferenceResults, codegenInputs, results);
   }
+
+  void _deserializeCodegenInput(
+      BackendStrategy backendStrategy,
+      JClosedWorld closedWorld,
+      Uri uri,
+      api.Input<List<int>> dataInput,
+      Map<MemberEntity, CodegenResult> results) {
+    DataSource source = new BinarySourceImpl(dataInput.data);
+    backendStrategy.prepareCodegenReader(source);
+    Map<MemberEntity, CodegenResult> codegenResults =
+        source.readMemberMap((MemberEntity member) {
+      List<ModularName> modularNames = [];
+      List<ModularExpression> modularExpressions = [];
+      CodegenReader reader =
+          new CodegenReaderImpl(closedWorld, modularNames, modularExpressions);
+      source.registerCodegenReader(reader);
+      CodegenResult result = CodegenResult.readFromDataSource(
+          source, modularNames, modularExpressions);
+      source.deregisterCodegenReader(reader);
+      return result;
+    });
+    _reporter.log('Read ${codegenResults.length} members from ${uri}');
+    results.addAll(codegenResults);
+  }
 }
diff --git a/tools/VERSION b/tools/VERSION
index a38a740..ae91d6f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 170
+PRERELEASE 171
 PRERELEASE_PATCH 0
\ No newline at end of file