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
