Version 2.10.0-84.0.dev
Merge commit 'd511a851261028cbbc2794895b150bad77cc635b' into 'dev'
diff --git a/DEPS b/DEPS
index 94c47ce..f84b666 100644
--- a/DEPS
+++ b/DEPS
@@ -79,7 +79,7 @@
"collection_rev": "583693680fc067e34ca5b72503df25e8b80579f9",
"convert_rev": "c1b01f832835d3d8a06b0b246a361c0eaab35d3c",
"crypto_rev": "f7c48b334b1386bc5ab0f706fbcd6df8496a87fc",
- "csslib_rev": "166d3e07eabc8283c6137cfde17fb25b8bb40080",
+ "csslib_rev": "681a6603f86bbbe64e8af42d722aef63b028d241",
"dart2js_info_rev" : "0632a623b08e1f601c7eba99e0186a581ae799e9",
# Note: Updates to dart_style have to be coordinated with the infrastructure
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index f83015d..c695b73 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -18,6 +18,7 @@
import 'package:analysis_server/src/services/correction/dart/convert_to_contains.dart';
import 'package:analysis_server/src/services/correction/dart/convert_to_generic_function_syntax.dart';
import 'package:analysis_server/src/services/correction/dart/convert_to_if_null.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_int_literal.dart';
import 'package:analysis_server/src/services/correction/dart/convert_to_where_type.dart';
import 'package:analysis_server/src/services/correction/dart/create_method.dart';
import 'package:analysis_server/src/services/correction/dart/make_final.dart';
@@ -94,6 +95,7 @@
LintNames.prefer_if_elements_to_conditional_expressions:
ConvertConditionalExpressionToIfElement.newInstance,
LintNames.prefer_if_null_operators: ConvertToIfNull.newInstance,
+ LintNames.prefer_int_literals: ConvertToIntLiteral.newInstance,
LintNames.prefer_is_empty: ReplaceWithIsEmpty.newInstance,
LintNames.prefer_is_not_empty: UesIsNotEmpty.newInstance,
LintNames.prefer_iterable_whereType: ConvertToWhereType.newInstance,
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart
index a4a3f55..52cecbb 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart
@@ -14,7 +14,7 @@
static final TransformSetManager instance = TransformSetManager._();
/// The name of the data file.
- static const String _dataFileName = 'fix_data.yaml';
+ static const String dataFileName = 'fix_data.yaml';
/// Initialize a newly created transform set manager.
TransformSetManager._();
@@ -28,7 +28,7 @@
var packageMap = package.packagesAvailableTo(libraryPath);
for (var entry in packageMap.entries) {
var directory = entry.value[0];
- var file = directory.getChildAssumingFile(_dataFileName);
+ var file = directory.getChildAssumingFile(dataFileName);
var transformSet = _loadTransformSet(file);
if (transformSet != null) {
transformSets.add(transformSet);
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 2a65443..cbd971b 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -212,6 +212,14 @@
kind == ElementKind.FIELD ||
kind == ElementKind.METHOD) {
return '${element.enclosingElement.displayName}.${element.displayName}';
+ } else if (kind == ElementKind.LIBRARY) {
+ // Libraries may not have names, so use a path relative to the context root.
+ final session = element.session;
+ final pathContext = session.resourceProvider.pathContext;
+ final rootPath = session.analysisContext.contextRoot.root.path;
+ final library = element as LibraryElement;
+
+ return pathContext.relative(library.source.fullName, from: rootPath);
} else {
return element.displayName;
}
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index b6dacb9..dec50cc 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -151,7 +151,7 @@
}
Future<void>
- test_checkFinalConditions_publicToPrivate_usedInOtherLibrary() async {
+ test_checkFinalConditions_publicToPrivate_usedInNamedLibrary() async {
await indexTestUnit('''
class A {
test() {}
@@ -170,7 +170,31 @@
refactoring.newName = '_newName';
var status = await refactoring.checkFinalConditions();
assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
- expectedMessage: "Renamed method will be invisible in 'my.lib'.");
+ expectedMessage:
+ "Renamed method will be invisible in '${convertPath("lib/lib.dart")}'.");
+ }
+
+ Future<void>
+ test_checkFinalConditions_publicToPrivate_usedInUnnamedLibrary() async {
+ await indexTestUnit('''
+class A {
+ var foo = 1;
+}
+''');
+ await indexUnit('/home/test/lib/lib.dart', '''
+import 'test.dart';
+
+main(A a) {
+ print(a.foo);
+}
+''');
+ createRenameRefactoringAtString('foo');
+ // check status
+ refactoring.newName = '_newName';
+ var status = await refactoring.checkFinalConditions();
+ assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
+ expectedMessage:
+ "Renamed field will be invisible in '${convertPath("lib/lib.dart")}'.");
}
Future<void>
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index 5ddd748..0e64120 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -84,7 +84,8 @@
refactoring.newName = '_NewName';
var status = await refactoring.checkFinalConditions();
assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
- expectedMessage: "Renamed class will be invisible in 'my.lib'.");
+ expectedMessage:
+ "Renamed class will be invisible in '${convertPath("lib/lib.dart")}'.");
}
Future<void> test_checkFinalConditions_shadowedBy_MethodElement() async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_int_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_int_literal_test.dart
new file mode 100644
index 0000000..a86f1f6
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_int_literal_test.dart
@@ -0,0 +1,31 @@
+// 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:analysis_server/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ConvertToIntLiteralTest);
+ });
+}
+
+@reflectiveTest
+class ConvertToIntLiteralTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.prefer_int_literals;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+const double d1 = 42.0;
+double d2 = 7.0e2;
+''');
+ await assertHasFix('''
+const double d1 = 42;
+double d2 = 700;
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
index 077f112..8b3aa1e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
@@ -15,6 +15,7 @@
as convert_to_generic_function_syntax;
import 'convert_to_if_element_test.dart' as convert_to_if_element;
import 'convert_to_if_null_test.dart' as convert_to_if_null;
+import 'convert_to_int_literal_test.dart' as convert_to_int_literal;
import 'convert_to_single_quoted_strings_test.dart'
as convert_to_single_quoted_strings;
import 'convert_to_spread_test.dart' as convert_to_spread;
@@ -58,6 +59,7 @@
convert_to_generic_function_syntax.main();
convert_to_if_element.main();
convert_to_if_null.main();
+ convert_to_int_literal.main();
convert_to_single_quoted_strings.main();
convert_to_spread.main();
convert_to_where_type.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
index 6aaca00..4e48e50 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
@@ -6,6 +6,9 @@
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_manager.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import '../fix_processor.dart';
@@ -19,6 +22,17 @@
@override
FixKind get kind => DartFixKind.DATA_DRIVEN;
+ /// Add the file containing the data used by the data-driven fix with the
+ /// given [content].
+ void addPackageDataFile(String content) {
+ addPackageFile('p', TransformSetManager.dataFileName, content);
+ }
+
+ /// A method that can be used as an error filter to ignore any unused_import
+ /// diagnostics.
+ bool ignoreUnusedImport(AnalysisError error) =>
+ error.errorCode != HintCode.UNUSED_IMPORT;
+
/// Set the content of the library that defines the element referenced by the
/// data on which this test is based.
void setPackageContent(String content) {
@@ -31,4 +45,10 @@
TransformSet()..addTransform(transform)
];
}
+
+ @override
+ void tearDown() {
+ DataDriven.transformSetsForTests = null;
+ super.tearDown();
+ }
}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/end_to_end_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/end_to_end_test.dart
new file mode 100644
index 0000000..e483534
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/end_to_end_test.dart
@@ -0,0 +1,45 @@
+// 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:test_reflective_loader/test_reflective_loader.dart';
+
+import 'data_driven_test_support.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(EndToEndTest);
+ });
+}
+
+@reflectiveTest
+class EndToEndTest extends DataDrivenFixProcessorTest {
+ Future<void> test_rename() async {
+ setPackageContent('''
+class New {}
+''');
+ addPackageDataFile('''
+version: 1
+transforms:
+- title: 'Rename to New'
+ element:
+ uris:
+ - '$importUri'
+ components:
+ - 'Old'
+ changes:
+ - kind: 'rename'
+ newName: 'New'
+''');
+ await resolveTestUnit('''
+import '$importUri';
+
+void f(Old o) {}
+''');
+ await assertHasFix('''
+import '$importUri';
+
+void f(New o) {}
+''', errorFilter: ignoreUnusedImport);
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
index cd29b71..466f678 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_test.dart
@@ -5,8 +5,6 @@
import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/rename.dart';
import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/dart/error/hint_codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'data_driven_test_support.dart';
@@ -532,7 +530,7 @@
import '$importUri';
class C extends New {}
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
}
@@ -552,7 +550,7 @@
import '$importUri';
class C implements New {}
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
}
@@ -572,7 +570,7 @@
import '$importUri';
class C with New {}
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
Future<void> test_mixin_reference_inWith() async {
@@ -589,7 +587,7 @@
import '$importUri';
class C with New {}
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
}
@@ -637,7 +635,7 @@
import '$importUri';
extension E on New {}
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
Future<void> test_class_reference_inTypeAnnotation() async {
@@ -654,7 +652,7 @@
import '$importUri';
void f(New o) {}
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
Future<void> test_typedef_reference() async {
@@ -671,7 +669,7 @@
import '$importUri';
void f(New o) {}
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
}
@@ -697,7 +695,7 @@
void f() {
New();
}
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
Future<void> test_extension_reference_override() async {
@@ -716,7 +714,7 @@
import '$importUri';
var l = New('a').double;
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
Future<void> test_field_instance_reference() async {
@@ -760,7 +758,7 @@
void f() {
new();
}
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
}
@@ -793,7 +791,6 @@
@reflectiveTest
class Rename_UndefinedIdentifierTest extends _AbstractRenameTest {
Future<void> test_class_reference_staticField() async {
- // CompileTimeErrorCode.UNDEFINED_IDENTIFIER
setPackageContent('''
class New {
static String empty = '';
@@ -809,7 +806,7 @@
import '$importUri';
var s = New.empty;
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
Future<void> test_extension_reference_staticField() async {
@@ -828,7 +825,7 @@
import '$importUri';
var s = New.empty;
-''', errorFilter: _ignoreUnusedImport);
+''', errorFilter: ignoreUnusedImport);
}
}
@@ -931,9 +928,6 @@
}
class _AbstractRenameTest extends DataDrivenFixProcessorTest {
- bool _ignoreUnusedImport(AnalysisError error) =>
- error.errorCode != HintCode.UNUSED_IMPORT;
-
Transform _rename(List<String> components, String newName) => Transform(
title: 'title',
element: ElementDescriptor(
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
index aeb109f..6b9b51a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
@@ -6,6 +6,7 @@
import 'add_type_parameter_test.dart' as add_type_parameter_change;
import 'diagnostics/test_all.dart' as diagnostics;
+import 'end_to_end_test.dart' as end_to_end;
import 'modify_parameters_test.dart' as modify_parameters;
import 'rename_test.dart' as rename_change;
import 'transform_set_manager_test.dart' as transform_set_manager;
@@ -15,6 +16,7 @@
defineReflectiveSuite(() {
add_type_parameter_change.main();
diagnostics.main();
+ end_to_end.main();
modify_parameters.main();
rename_change.main();
transform_set_manager.main();
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index 669d189..fe41371 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -136,13 +136,18 @@
left = node.leftOperand;
var flow = _flowAnalysis?.flow;
- flow?.equalityOp_rightBegin(left, left.staticType);
+ var leftExtensionOverride = left is ExtensionOverride;
+ if (!leftExtensionOverride) {
+ flow?.equalityOp_rightBegin(left, left.staticType);
+ }
var right = node.rightOperand;
right.accept(_resolver);
right = node.rightOperand;
- flow?.equalityOp_end(node, right, right.staticType, notEqual: notEqual);
+ if (!leftExtensionOverride) {
+ flow?.equalityOp_end(node, right, right.staticType, notEqual: notEqual);
+ }
_resolveUserDefinableElement(
node,
diff --git a/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart
index 10c2bac..38ca656 100644
--- a/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/binary_expression_test.dart
@@ -39,6 +39,24 @@
);
}
+ test_bangEq_extensionOverride_left() async {
+ await assertErrorsInCode(r'''
+extension E on int {}
+
+void f(int a) {
+ E(a) != 0;
+}
+''', [
+ error(CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR, 46, 2),
+ ]);
+
+ assertBinaryExpression(
+ findNode.binary('!= 0'),
+ element: null,
+ type: 'dynamic',
+ );
+ }
+
test_eqEq() async {
await assertNoErrorsInCode(r'''
f(int a, int b) {
@@ -56,6 +74,24 @@
);
}
+ test_eqEq_extensionOverride_left() async {
+ await assertErrorsInCode(r'''
+extension E on int {}
+
+void f(int a) {
+ E(a) == 0;
+}
+''', [
+ error(CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR, 46, 2),
+ ]);
+
+ assertBinaryExpression(
+ findNode.binary('== 0'),
+ element: null,
+ type: 'dynamic',
+ );
+ }
+
test_eqEqEq() async {
await assertErrorsInCode(r'''
f(int a, int b) {
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index cb2ef41..7c8ba6a 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -334,6 +334,7 @@
cls ^= owner.raw();
name = cls.ScrubbedName();
lib = cls.library();
+ url = lib.url();
js.PrintPropertyStr("l", url);
js.PrintPropertyStr("c", name);
}
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index dcd7f99..39e0254 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -2143,15 +2143,16 @@
VISIT_FROM(ObjectPtr, name_)
StringPtr name_; // Library prefix name.
- LibraryPtr importer_; // Library which declares this prefix.
ArrayPtr imports_; // Libraries imported with this prefix.
- VISIT_TO(ObjectPtr, imports_)
+ LibraryPtr importer_; // Library which declares this prefix.
+ VISIT_TO(ObjectPtr, importer_)
ObjectPtr* to_snapshot(Snapshot::Kind kind) {
switch (kind) {
- case Snapshot::kFull:
- case Snapshot::kFullJIT:
case Snapshot::kFullAOT:
return reinterpret_cast<ObjectPtr*>(&imports_);
+ case Snapshot::kFull:
+ case Snapshot::kFullJIT:
+ return reinterpret_cast<ObjectPtr*>(&importer_);
case Snapshot::kMessage:
case Snapshot::kNone:
case Snapshot::kInvalid:
diff --git a/tests/language/deferred/prefix_importer_tree_shaken_deferred.dart b/tests/language/deferred/prefix_importer_tree_shaken_deferred.dart
new file mode 100644
index 0000000..4bf00ef
--- /dev/null
+++ b/tests/language/deferred/prefix_importer_tree_shaken_deferred.dart
@@ -0,0 +1,8 @@
+// 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.
+
+@pragma("vm:never-inline")
+bar() {
+ return "bar";
+}
diff --git a/tests/language/deferred/prefix_importer_tree_shaken_immediate.dart b/tests/language/deferred/prefix_importer_tree_shaken_immediate.dart
new file mode 100644
index 0000000..c85a5b7
--- /dev/null
+++ b/tests/language/deferred/prefix_importer_tree_shaken_immediate.dart
@@ -0,0 +1,11 @@
+// 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 "prefix_importer_tree_shaken_deferred.dart" deferred as d;
+
+@pragma("vm:prefer-inline")
+load() => d.loadLibrary();
+
+@pragma("vm:prefer-inline")
+foo() => d.bar();
diff --git a/tests/language/deferred/prefix_importer_tree_shaken_test.dart b/tests/language/deferred/prefix_importer_tree_shaken_test.dart
new file mode 100644
index 0000000..ccb0246
--- /dev/null
+++ b/tests/language/deferred/prefix_importer_tree_shaken_test.dart
@@ -0,0 +1,13 @@
+// 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.
+
+/// VMOptions=--dwarf_stack_traces=true
+/// VMOptions=--dwarf_stack_traces=false
+
+import "prefix_importer_tree_shaken_immediate.dart" as i;
+
+main() async {
+ await i.load();
+ print(await i.foo());
+}
diff --git a/tests/language_2/deferred/prefix_importer_tree_shaken_deferred.dart b/tests/language_2/deferred/prefix_importer_tree_shaken_deferred.dart
new file mode 100644
index 0000000..4bf00ef
--- /dev/null
+++ b/tests/language_2/deferred/prefix_importer_tree_shaken_deferred.dart
@@ -0,0 +1,8 @@
+// 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.
+
+@pragma("vm:never-inline")
+bar() {
+ return "bar";
+}
diff --git a/tests/language_2/deferred/prefix_importer_tree_shaken_immediate.dart b/tests/language_2/deferred/prefix_importer_tree_shaken_immediate.dart
new file mode 100644
index 0000000..c85a5b7
--- /dev/null
+++ b/tests/language_2/deferred/prefix_importer_tree_shaken_immediate.dart
@@ -0,0 +1,11 @@
+// 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 "prefix_importer_tree_shaken_deferred.dart" deferred as d;
+
+@pragma("vm:prefer-inline")
+load() => d.loadLibrary();
+
+@pragma("vm:prefer-inline")
+foo() => d.bar();
diff --git a/tests/language_2/deferred/prefix_importer_tree_shaken_test.dart b/tests/language_2/deferred/prefix_importer_tree_shaken_test.dart
new file mode 100644
index 0000000..ccb0246
--- /dev/null
+++ b/tests/language_2/deferred/prefix_importer_tree_shaken_test.dart
@@ -0,0 +1,13 @@
+// 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.
+
+/// VMOptions=--dwarf_stack_traces=true
+/// VMOptions=--dwarf_stack_traces=false
+
+import "prefix_importer_tree_shaken_immediate.dart" as i;
+
+main() async {
+ await i.load();
+ print(await i.foo());
+}
diff --git a/tools/VERSION b/tools/VERSION
index 72296d4..ef50155 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 10
PATCH 0
-PRERELEASE 83
+PRERELEASE 84
PRERELEASE_PATCH 0
\ No newline at end of file