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