Version 2.10.0-20.0.dev
Merge commit '4049442385fc06af9742a763e1717e3348754898' into 'dev'
diff --git a/DEPS b/DEPS
index 2906f58..92fa1ff 100644
--- a/DEPS
+++ b/DEPS
@@ -48,7 +48,7 @@
"co19_2_rev": "e48b3090826cf40b8037648f19d211e8eab1b4b6",
# The internal benchmarks to use. See go/dart-benchmarks-internal
- "benchmarks_internal_rev": "991d4cb32af0e914763ebbdeced91395bed874d8",
+ "benchmarks_internal_rev": "760986cf29594acf424ee6e8af23a4322825935a",
"checkout_benchmarks_internal": False,
# As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
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 27138b1..72328fa 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
@@ -17,6 +17,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_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';
import 'package:analysis_server/src/services/correction/dart/remove_argument.dart';
@@ -42,6 +43,7 @@
import 'package:analysis_server/src/services/correction/dart/replace_with_var.dart';
import 'package:analysis_server/src/services/correction/dart/use_curly_braces.dart';
import 'package:analysis_server/src/services/correction/dart/use_is_not_empty.dart';
+import 'package:analysis_server/src/services/correction/dart/use_rethrow.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/fix_internal.dart';
import 'package:analysis_server/src/services/linter/lint_names.dart';
@@ -90,6 +92,7 @@
LintNames.prefer_if_null_operators: ConvertToIfNull.newInstance,
LintNames.prefer_is_empty: ReplaceWithIsEmpty.newInstance,
LintNames.prefer_is_not_empty: UesIsNotEmpty.newInstance,
+ LintNames.prefer_iterable_whereType: ConvertToWhereType.newInstance,
LintNames.prefer_single_quotes: ConvertToSingleQuotes.newInstance,
LintNames.prefer_spread_collections: ConvertAddAllToSpread.newInstance,
LintNames.slash_for_doc_comments: ConvertDocumentationIntoLine.newInstance,
@@ -100,6 +103,7 @@
LintNames.unnecessary_new: RemoveUnnecessaryNew.newInstance,
LintNames.unnecessary_overrides: RemoveMethodDeclaration.newInstance,
LintNames.unnecessary_this: RemoveThisExpression.newInstance,
+ LintNames.use_rethrow_when_possible: UseRethrow.newInstance,
};
/// A map from an error code to a generator used to create the correction
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_where_type_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_where_type_test.dart
new file mode 100644
index 0000000..12bc2eb
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_where_type_test.dart
@@ -0,0 +1,41 @@
+// 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(ConvertToWhereTypeTest);
+ });
+}
+
+@reflectiveTest
+class ConvertToWhereTypeTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.prefer_iterable_whereType;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+Iterable<C> f(List<Object> list) {
+ return list.where((e) => e is C);
+}
+Iterable<C> f2(List<Object> list) =>
+ list.where((e) => e is C);
+
+class C {}
+''');
+ await assertHasFix('''
+Iterable<C> f(List<Object> list) {
+ return list.whereType<C>();
+}
+Iterable<C> f2(List<Object> list) =>
+ list.whereType<C>();
+
+class C {}
+''');
+ }
+}
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 3524501..b7a2148 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
@@ -16,6 +16,7 @@
import 'convert_to_single_quoted_strings_test.dart'
as convert_to_single_quoted_strings;
import 'convert_to_spread_test.dart' as convert_to_spread;
+import 'convert_to_where_type_test.dart' as convert_to_where_type;
import 'create_method_test.dart' as create_method;
import 'make_final_test.dart' as make_final;
import 'remove_argument_test.dart' as remove_argument;
@@ -42,6 +43,7 @@
import 'replace_with_var_test.dart' as replace_with_var;
import 'use_curly_braces_test.dart' as use_curly_braces;
import 'use_is_not_empty_test.dart' as use_is_not_empty;
+import 'use_rethrow_test.dart' as use_rethrow;
void main() {
defineReflectiveSuite(() {
@@ -54,6 +56,7 @@
convert_to_if_null.main();
convert_to_single_quoted_strings.main();
convert_to_spread.main();
+ convert_to_where_type.main();
create_method.main();
make_final.main();
remove_argument.main();
@@ -78,5 +81,6 @@
replace_with_var.main();
use_curly_braces.main();
use_is_not_empty.main();
+ use_rethrow.main();
}, name: 'bulk');
}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/use_rethrow_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/use_rethrow_test.dart
new file mode 100644
index 0000000..967d352
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/use_rethrow_test.dart
@@ -0,0 +1,51 @@
+// 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(UseRethrowTest);
+ });
+}
+
+@reflectiveTest
+class UseRethrowTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.use_rethrow_when_possible;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+void f() {
+ try {} catch (e) {
+ throw e;
+ }
+}
+
+void f2() {
+ try {} catch (e, stackTrace) {
+ print(stackTrace);
+ throw e;
+ }
+}
+''');
+ await assertHasFix('''
+void f() {
+ try {} catch (e) {
+ rethrow;
+ }
+}
+
+void f2() {
+ try {} catch (e, stackTrace) {
+ print(stackTrace);
+ rethrow;
+ }
+}
+''');
+ }
+}
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index e891a3e..91f08b0 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -2584,8 +2584,12 @@
[variable.name.name]);
} else {
var variableElement = variable.declaredElement;
- if (variableElement is FieldElement && variableElement.isAbstract) {
- // Abstract fields can't be initialized, so no error.
+ if (variableElement is FieldElement &&
+ (variableElement.isAbstract || variableElement.isExternal)) {
+ // Abstract and external fields can't be initialized, so no error.
+ } else if (variableElement is TopLevelVariableElement &&
+ variableElement.isExternal) {
+ // External top level variables can't be initialized, so no error.
} else if (!_isNonNullableByDefault || !variable.isLate) {
_errorReporter.reportErrorForNode(
CompileTimeErrorCode.FINAL_NOT_INITIALIZED,
diff --git a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
index 46d0ab5..1f5e0cb 100644
--- a/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/element_locator_test.dart
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/src/dart/ast/element_locator.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -18,11 +17,6 @@
@reflectiveTest
class ElementLocatorTest extends PubPackageResolutionTest {
- @override
- AnalysisOptionsImpl get analysisOptions {
- return AnalysisOptionsImpl()..hint = false;
- }
-
test_locate_AssignmentExpression() async {
await resolveTestCode(r'''
int x = 0;
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index fceef52..e97c021 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -351,11 +351,17 @@
void writeTestPackageConfig(
PackageConfigFileBuilder config, {
+ String languageVersion,
bool js = false,
bool meta = false,
}) {
config = config._copy();
- config.add(name: 'test', rootPath: testPackageRootPath);
+
+ config.add(
+ name: 'test',
+ rootPath: testPackageRootPath,
+ languageVersion: languageVersion,
+ );
if (js) {
var jsPath = '/packages/js';
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
index 502b7bb..35822d2 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
@@ -148,6 +148,17 @@
''');
}
+ test_set_external_variable_final_invalid() async {
+ await assertErrorsInCode('''
+external final int x;
+void f(int value) {
+ x = value;
+}
+''', [
+ error(CompileTimeErrorCode.ASSIGNMENT_TO_FINAL_LOCAL, 44, 1),
+ ]);
+ }
+
test_topLevelVariable_late() async {
await assertNoErrorsInCode('''
late final int a;
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
index b93d824..ddf030f 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
@@ -98,4 +98,44 @@
}
''');
}
+
+ test_set_external_field_final_invalid() async {
+ await assertErrorsInCode('''
+class A {
+ external final int x;
+}
+void f(A a, int x) {
+ a.x = x;
+}
+''', [
+ error(CompileTimeErrorCode.ASSIGNMENT_TO_FINAL, 61, 1),
+ ]);
+ }
+
+ test_set_external_field_final_overridden_valid() async {
+ await assertNoErrorsInCode('''
+class A {
+ external final int x;
+}
+abstract class B extends A {
+ void set x(int value);
+}
+void f(B b, int x) {
+ b.x = x; // ok because setter provided in derived class
+}
+''');
+ }
+
+ test_set_external_static_field_final_invalid() async {
+ await assertErrorsInCode('''
+class A {
+ external static final int x;
+}
+void f(int x) {
+ A.x = x;
+}
+''', [
+ error(CompileTimeErrorCode.ASSIGNMENT_TO_FINAL, 63, 1),
+ ]);
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart b/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
index c85acdb..73c8ee9 100644
--- a/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
@@ -68,4 +68,20 @@
text: "'x' must have a method body because 'A' isn't abstract."),
]);
}
+
+ test_external_field() async {
+ await assertNoErrorsInCode('''
+class A {
+ external int? x;
+}
+''');
+ }
+
+ test_external_field_final() async {
+ await assertNoErrorsInCode('''
+class A {
+ external final int? x;
+}
+''');
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
index 54cccca..a2d7705 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -13,14 +10,94 @@
main() {
defineReflectiveSuite(() {
+ defineReflectiveTests(ConstEvalThrowsExceptionTest_language24);
defineReflectiveTests(ConstEvalThrowsExceptionTest);
defineReflectiveTests(ConstEvalThrowsExceptionWithNullSafetyTest);
- defineReflectiveTests(ConstEvalThrowsExceptionWithConstantUpdateTest);
});
}
@reflectiveTest
-class ConstEvalThrowsExceptionTest extends PubPackageResolutionTest {
+class ConstEvalThrowsExceptionTest extends PubPackageResolutionTest
+ with ConstEvalThrowsExceptionTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+
+ test_binaryMinus_null() async {
+ await assertErrorsInCode('''
+const dynamic D = null;
+const C = D - 5;
+''', [
+ error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
+ ]);
+
+ await assertErrorsInCode('''
+const dynamic D = null;
+const C = 5 - D;
+''', [
+ error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
+ ]);
+ }
+
+ test_binaryPlus_null() async {
+ await assertErrorsInCode('''
+const dynamic D = null;
+const C = D + 5;
+''', [
+ error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
+ ]);
+
+ await assertErrorsInCode('''
+const dynamic D = null;
+const C = 5 + D;
+''', [
+ error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
+ ]);
+ }
+
+ test_eqEq_nonPrimitiveRightOperand() async {
+ await assertNoErrorsInCode('''
+const c = const T.eq(1, const Object());
+class T {
+ final Object value;
+ const T.eq(Object o1, Object o2) : value = o1 == o2;
+}
+''');
+ }
+
+ test_fromEnvironment_ifElement() async {
+ await assertNoErrorsInCode('''
+const b = bool.fromEnvironment('foo');
+
+main() {
+ const l1 = [1, 2, 3];
+ const l2 = [if (b) ...l1];
+ print(l2);
+}
+''');
+ }
+}
+
+@reflectiveTest
+class ConstEvalThrowsExceptionTest_language24 extends PubPackageResolutionTest
+ with ConstEvalThrowsExceptionTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+@reflectiveTest
+mixin ConstEvalThrowsExceptionTestCases on PubPackageResolutionTest {
+ /// The expected state of this feature in the test.
+ bool get _constant_update_2018;
+
test_assertInitializerThrows() async {
await assertErrorsInCode(r'''
class A {
@@ -206,7 +283,7 @@
const dynamic nil = null;
const c = [if (1 < 0) nil + 1];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 37, 18),
@@ -219,7 +296,7 @@
const dynamic nonBool = 3;
const c = const [if (nonBool) 'a'];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 48, 7),
]
@@ -235,7 +312,7 @@
const dynamic nonBool = null;
const c = const {if (nonBool) 'a' : 1};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 51, 7),
]
@@ -251,7 +328,7 @@
const dynamic nonBool = 'a';
const c = const {if (nonBool) 3};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 50, 7),
]
@@ -267,7 +344,7 @@
const dynamic nil = null;
const c = [if (0 < 1) 3 else nil + 1];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 37, 25),
@@ -362,70 +439,6 @@
}
@reflectiveTest
-class ConstEvalThrowsExceptionWithConstantUpdateTest
- extends ConstEvalThrowsExceptionTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-
- test_binaryMinus_null() async {
- await assertErrorsInCode('''
-const dynamic D = null;
-const C = D - 5;
-''', [
- error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
- ]);
-
- await assertErrorsInCode('''
-const dynamic D = null;
-const C = 5 - D;
-''', [
- error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
- ]);
- }
-
- test_binaryPlus_null() async {
- await assertErrorsInCode('''
-const dynamic D = null;
-const C = D + 5;
-''', [
- error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
- ]);
-
- await assertErrorsInCode('''
-const dynamic D = null;
-const C = 5 + D;
-''', [
- error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 34, 5),
- ]);
- }
-
- test_eqEq_nonPrimitiveRightOperand() async {
- await assertNoErrorsInCode('''
-const c = const T.eq(1, const Object());
-class T {
- final Object value;
- const T.eq(Object o1, Object o2) : value = o1 == o2;
-}
-''');
- }
-
- test_fromEnvironment_ifElement() async {
- await assertNoErrorsInCode('''
-const b = bool.fromEnvironment('foo');
-
-main() {
- const l1 = [1, 2, 3];
- const l2 = [if (b) ...l1];
- print(l2);
-}
-''');
- }
-}
-
-@reflectiveTest
class ConstEvalThrowsExceptionWithNullSafetyTest
extends ConstEvalThrowsExceptionTest with WithNullSafetyMixin {
test_asExpression_typeParameter() async {
diff --git a/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart b/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
index 48c5f70..054355c 100644
--- a/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
@@ -2,24 +2,45 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
+ defineReflectiveTests(ConstSetElementTypeImplementsEqualsTest_language24);
defineReflectiveTests(ConstSetElementTypeImplementsEqualsTest);
- defineReflectiveTests(
- ConstSetElementTypeImplementsEqualsWithUIAsCodeAndConstantsTest);
});
}
@reflectiveTest
-class ConstSetElementTypeImplementsEqualsTest extends PubPackageResolutionTest {
+class ConstSetElementTypeImplementsEqualsTest extends PubPackageResolutionTest
+ with ConstSetElementTypeImplementsEqualsTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class ConstSetElementTypeImplementsEqualsTest_language24
+ extends PubPackageResolutionTest
+ with ConstSetElementTypeImplementsEqualsTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin ConstSetElementTypeImplementsEqualsTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_constField() async {
await assertErrorsInCode(r'''
class A {
@@ -125,7 +146,7 @@
const {...[A()]};
}
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode
@@ -150,7 +171,7 @@
const {...{A()}};
}
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode
@@ -186,13 +207,3 @@
]);
}
}
-
-@reflectiveTest
-class ConstSetElementTypeImplementsEqualsWithUIAsCodeAndConstantsTest
- extends ConstSetElementTypeImplementsEqualsTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart b/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
index 6cbca9c..d2470d0 100644
--- a/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,19 +10,44 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(ConstSpreadExpectedListOrSetTest);
- defineReflectiveTests(ConstSpreadExpectedListOrSetWithConstantsTest);
+ defineReflectiveTests(ConstSpreadExpectedListOrSetTest_language24);
});
}
@reflectiveTest
-class ConstSpreadExpectedListOrSetTest extends PubPackageResolutionTest {
+class ConstSpreadExpectedListOrSetTest extends PubPackageResolutionTest
+ with ConstSpreadExpectedListOrSetTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class ConstSpreadExpectedListOrSetTest_language24
+ extends PubPackageResolutionTest
+ with ConstSpreadExpectedListOrSetTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin ConstSpreadExpectedListOrSetTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_listInt() async {
await assertErrorsInCode(
'''
const dynamic a = 5;
var b = const <int>[...a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
44, 1),
@@ -41,7 +63,7 @@
const dynamic a = [5];
var b = const <int>[...a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 43, 4),
@@ -54,7 +76,7 @@
const dynamic a = <int, int>{0: 1};
var b = const <int>[...a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
59, 1),
@@ -70,7 +92,7 @@
const dynamic a = null;
var b = const <int>[...a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
47, 1),
@@ -86,7 +108,7 @@
const dynamic a = null;
var b = const <int>[...?a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 44, 5),
@@ -99,7 +121,7 @@
const dynamic a = <int>{5};
var b = const <int>[...a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 48, 4),
@@ -112,7 +134,7 @@
const dynamic a = 5;
var b = const <int>{...a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
44, 1),
@@ -128,7 +150,7 @@
const dynamic a = <int>[5];
var b = const <int>{...a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 48, 4),
@@ -141,7 +163,7 @@
const dynamic a = <int, int>{1: 2};
var b = const <int>{...a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
59, 1),
@@ -157,7 +179,7 @@
const dynamic a = null;
var b = const <int>{...a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
47, 1),
@@ -173,7 +195,7 @@
const dynamic a = null;
var b = const <int>{...?a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 44, 5),
@@ -186,7 +208,7 @@
const dynamic a = <int>{5};
var b = const <int>{...a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 48, 4),
@@ -207,13 +229,3 @@
''');
}
}
-
-@reflectiveTest
-class ConstSpreadExpectedListOrSetWithConstantsTest
- extends ConstSpreadExpectedListOrSetTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart b/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
index 0548e36..937a847 100644
--- a/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,19 +10,43 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(ConstSpreadExpectedMapTest);
- defineReflectiveTests(ConstSpreadExpectedMapWithConstantsTest);
+ defineReflectiveTests(ConstSpreadExpectedMapTest_language24);
});
}
@reflectiveTest
-class ConstSpreadExpectedMapTest extends PubPackageResolutionTest {
+class ConstSpreadExpectedMapTest extends PubPackageResolutionTest
+ with ConstSpreadExpectedMapTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class ConstSpreadExpectedMapTest_language24 extends PubPackageResolutionTest
+ with ConstSpreadExpectedMapTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin ConstSpreadExpectedMapTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_mapInt() async {
await assertErrorsInCode(
'''
const dynamic a = 5;
var b = const <int, int>{...a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 49, 1),
]
@@ -40,7 +61,7 @@
const dynamic a = <int>[5];
var b = const <int, int>{...a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 56, 1),
]
@@ -62,7 +83,7 @@
const dynamic a = null;
var b = const <int, int>{...a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 52, 1),
]
@@ -84,7 +105,7 @@
const dynamic a = <int>{5};
var b = const <int, int>{...a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 56, 1),
]
@@ -107,13 +128,3 @@
''');
}
}
-
-@reflectiveTest
-class ConstSpreadExpectedMapWithConstantsTest
- extends ConstSpreadExpectedMapTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
index 8b43155..726859c 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(EqualElementsInConstSetTest);
- defineReflectiveTests(EqualElementsInConstSetWithConstantsTest);
+ defineReflectiveTests(EqualElementsInConstSetTest_language24);
});
}
@reflectiveTest
-class EqualElementsInConstSetTest extends PubPackageResolutionTest {
+class EqualElementsInConstSetTest extends PubPackageResolutionTest
+ with EqualElementsInConstSetTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class EqualElementsInConstSetTest_language24 extends PubPackageResolutionTest
+ with EqualElementsInConstSetTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin EqualElementsInConstSetTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_entry() async {
await assertErrorsInCode('''
var c = const {1, 2, 1};
@@ -33,7 +54,7 @@
'''
var c = const {1, if (1 < 0) 2 else 1};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 36, 1,
contextMessages: [
@@ -50,7 +71,7 @@
'''
var c = const {if (0 < 1) 1 else 1};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 15, 19),
@@ -62,7 +83,7 @@
'''
var c = const {1, if (0 < 1) 2 else 1};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 19),
@@ -74,7 +95,7 @@
'''
var c = const {if (0 < 1) 1 else 1};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 15, 19),
@@ -86,7 +107,7 @@
'''
var c = const {2, if (1 < 0) 2};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 12),
@@ -98,7 +119,7 @@
'''
var c = const {1, if (0 < 1) 1};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 29, 1,
contextMessages: [
@@ -139,7 +160,7 @@
'''
var c = const {1, ...{2}};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 6),
@@ -151,7 +172,7 @@
'''
var c = const {1, ...{1}};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 21, 3,
contextMessages: [
@@ -172,13 +193,3 @@
]);
}
}
-
-@reflectiveTest
-class EqualElementsInConstSetWithConstantsTest
- extends EqualElementsInConstSetTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
index a9fde6b..2cc1a89 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(EqualKeysInConstMapTest);
- defineReflectiveTests(EqualKeysInConstMapWithConstantsTest);
+ defineReflectiveTests(EqualKeysInConstMapTest_language24);
});
}
@reflectiveTest
-class EqualKeysInConstMapTest extends PubPackageResolutionTest {
+class EqualKeysInConstMapTest extends PubPackageResolutionTest
+ with EqualKeysInConstMapTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class EqualKeysInConstMapTest_language24 extends PubPackageResolutionTest
+ with EqualKeysInConstMapTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin EqualKeysInConstMapTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_entry() async {
await assertErrorsInCode('''
var c = const {1: null, 2: null, 1: null};
@@ -33,7 +54,7 @@
'''
var c = const {1: null, if (1 < 0) 2: null else 1: null};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 48, 1,
contextMessages: [
@@ -50,7 +71,7 @@
'''
var c = const {if (0 < 1) 1: null else 1: null};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 15, 31),
@@ -62,7 +83,7 @@
'''
var c = const {1: null, if (0 < 1) 2: null else 1: null};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 31),
@@ -74,7 +95,7 @@
'''
var c = const {if (0 < 1) 1: null else 1: null};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 15, 31),
@@ -86,7 +107,7 @@
'''
var c = const {2: null, if (1 < 0) 2: 2};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 15),
@@ -98,7 +119,7 @@
'''
var c = const {1: null, if (0 < 1) 1: null};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 35, 1,
contextMessages: [
@@ -139,7 +160,7 @@
'''
var c = const {1: null, ...{2: null}};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 12),
@@ -151,7 +172,7 @@
'''
var c = const {1: null, ...{1: null}};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 27, 9,
contextMessages: [
@@ -172,12 +193,3 @@
]);
}
}
-
-@reflectiveTest
-class EqualKeysInConstMapWithConstantsTest extends EqualKeysInConstMapTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
index 8772ebf..699e6bf 100644
--- a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
@@ -102,6 +102,23 @@
''');
}
+ test_field_external() async {
+ await assertNoErrorsInCode('''
+class A {
+ external final int x;
+}
+''');
+ }
+
+ test_field_external_with_constructor() async {
+ await assertNoErrorsInCode('''
+class A {
+ external final int x;
+ A();
+}
+''');
+ }
+
test_field_noConstructor_initializer() async {
await assertNoErrorsInCode('''
class C {
@@ -173,4 +190,18 @@
error(HintCode.UNUSED_LOCAL_VARIABLE, 19, 1),
]);
}
+
+ test_static_field_external() async {
+ await assertNoErrorsInCode('''
+class A {
+ external static final int x;
+}
+''');
+ }
+
+ test_variable_external() async {
+ await assertNoErrorsInCode('''
+external final int x;
+''');
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart
index 710a5cf..3d332b9 100644
--- a/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,14 +10,38 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(IfElementConditionFromDeferredLibraryTest);
- defineReflectiveTests(
- IfElementConditionFromDeferredLibraryWithConstantsTest);
+ defineReflectiveTests(IfElementConditionFromDeferredLibraryTest_language24);
});
}
@reflectiveTest
-class IfElementConditionFromDeferredLibraryTest
- extends PubPackageResolutionTest {
+class IfElementConditionFromDeferredLibraryTest extends PubPackageResolutionTest
+ with IfElementConditionFromDeferredLibraryTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class IfElementConditionFromDeferredLibraryTest_language24
+ extends PubPackageResolutionTest
+ with IfElementConditionFromDeferredLibraryTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin IfElementConditionFromDeferredLibraryTestCases
+ on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_inList_deferred() async {
newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
const bool c = true;''');
@@ -30,7 +51,7 @@
f() {
return const [if(a.c) 0];
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode
@@ -62,7 +83,7 @@
f() {
return const [if(a.c) 0];
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 9),
@@ -78,7 +99,7 @@
f() {
return const {if(a.c) 0 : 0};
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode
@@ -110,7 +131,7 @@
f() {
return const {if(a.c) 0 : 0};
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 13),
@@ -126,7 +147,7 @@
f() {
return const {if(a.c) 0};
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode
@@ -158,20 +179,10 @@
f() {
return const {if(a.c) 0};
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 47, 9),
]);
}
}
-
-@reflectiveTest
-class IfElementConditionFromDeferredLibraryWithConstantsTest
- extends IfElementConditionFromDeferredLibraryTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart
index 7f20112..17c1ae2 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart
@@ -692,6 +692,31 @@
''');
}
+ test_getter_overrides_external_field_final_invalid() async {
+ await assertErrorsInCode('''
+class A {
+ external final int x;
+}
+abstract class B implements A {
+ num get x;
+ void set x(num value);
+}
+''', [
+ error(CompileTimeErrorCode.INVALID_OVERRIDE, 78, 1),
+ ]);
+ }
+
+ test_getter_overrides_external_field_final_valid() async {
+ await assertNoErrorsInCode('''
+class A {
+ external final num x;
+}
+abstract class B implements A {
+ int get x;
+}
+''');
+ }
+
test_getter_overrides_external_field_invalid() async {
await assertErrorsInCode('''
class A {
@@ -875,6 +900,18 @@
''');
}
+ test_setter_overrides_external_field_final_valid() async {
+ await assertNoErrorsInCode('''
+class A {
+ external final num x;
+}
+abstract class B implements A {
+ int get x;
+ void set x(int value);
+}
+''');
+ }
+
test_setter_overrides_external_field_invalid() async {
await assertErrorsInCode('''
class A {
diff --git a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
index 9f57784..f2526bd 100644
--- a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,37 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(ListElementTypeNotAssignableTest);
- defineReflectiveTests(ListElementTypeNotAssignableWithConstantsTest);
+ defineReflectiveTests(ListElementTypeNotAssignableTest_language24);
});
}
@reflectiveTest
-class ListElementTypeNotAssignableTest extends PubPackageResolutionTest {
+class ListElementTypeNotAssignableTest extends PubPackageResolutionTest
+ with ListElementTypeNotAssignableTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class ListElementTypeNotAssignableTest_language24
+ extends PubPackageResolutionTest
+ with ListElementTypeNotAssignableTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin ListElementTypeNotAssignableTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_ifElement_thenElseFalse_intInt() async {
await assertErrorsInCode(
'''
@@ -26,7 +48,7 @@
const dynamic b = 0;
var v = const <int>[if (1 < 0) a else b];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 62, 19),
@@ -40,7 +62,7 @@
const dynamic b = 'b';
var v = const <int>[if (1 < 0) a else b];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 82,
1),
@@ -55,7 +77,7 @@
'''
var v = const <int>[if (1 < 0) 'a'];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 31,
3),
@@ -73,7 +95,7 @@
const dynamic a = 'a';
var v = const <int>[if (1 < 0) a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 43, 12),
@@ -86,7 +108,7 @@
const dynamic a = 0;
var v = const <int>[if (true) a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 41, 11),
@@ -99,7 +121,7 @@
const dynamic a = 'a';
var v = const <int>[if (true) a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 53,
1),
@@ -114,7 +136,7 @@
'''
var v = const <int>[...[0, 1]];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 20, 9),
@@ -229,13 +251,3 @@
''');
}
}
-
-@reflectiveTest
-class ListElementTypeNotAssignableWithConstantsTest
- extends ListElementTypeNotAssignableTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
index 3281891..515fb56 100644
--- a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(MapKeyTypeNotAssignableTest);
- defineReflectiveTests(MapKeyTypeNotAssignableWithConstantsTest);
+ defineReflectiveTests(MapKeyTypeNotAssignableTest_language24);
});
}
@reflectiveTest
-class MapKeyTypeNotAssignableTest extends PubPackageResolutionTest {
+class MapKeyTypeNotAssignableTest extends PubPackageResolutionTest
+ with MapKeyTypeNotAssignableTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class MapKeyTypeNotAssignableTest_language24 extends PubPackageResolutionTest
+ with MapKeyTypeNotAssignableTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin MapKeyTypeNotAssignableTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_ifElement_thenElseFalse_intInt_dynamic() async {
await assertErrorsInCode(
'''
@@ -26,7 +47,7 @@
const dynamic b = 0;
var v = const <int, bool>{if (1 < 0) a: true else b: false};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 68, 32),
@@ -40,7 +61,7 @@
const dynamic b = 'b';
var v = const <int, bool>{if (1 < 0) a: true else b: false};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 94, 1),
]
@@ -55,7 +76,7 @@
const dynamic a = 'a';
var v = const <int, bool>{if (1 < 0) a: true};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 49, 18),
@@ -67,7 +88,7 @@
'''
var v = const <int, bool>{if (1 < 0) 'a': true};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 37, 3),
]
@@ -83,7 +104,7 @@
const dynamic a = 0;
var v = const <int, bool>{if (true) a: true};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 17),
@@ -96,7 +117,7 @@
const dynamic a = 'a';
var v = const <int, bool>{if (true) a: true};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 59, 1),
]
@@ -111,7 +132,7 @@
final a = 0;
var v = const <int, bool>{if (1 < 2) a: true};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 50, 1),
]
@@ -149,7 +170,7 @@
'''
var v = const <int, String>{...{1: 'a'}};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 28, 11),
@@ -162,7 +183,7 @@
const dynamic a = 'a';
var v = const <int, String>{...{a: 'a'}};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 55, 1),
]
@@ -265,13 +286,3 @@
''');
}
}
-
-@reflectiveTest
-class MapKeyTypeNotAssignableWithConstantsTest
- extends MapKeyTypeNotAssignableTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
index 794cc75..fb15c1f 100644
--- a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(MapValueTypeNotAssignableTest);
- defineReflectiveTests(MapValueTypeNotAssignableWithConstantsTest);
+ defineReflectiveTests(MapValueTypeNotAssignableTest_language24);
});
}
@reflectiveTest
-class MapValueTypeNotAssignableTest extends PubPackageResolutionTest {
+class MapValueTypeNotAssignableTest extends PubPackageResolutionTest
+ with MapValueTypeNotAssignableTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class MapValueTypeNotAssignableTest_language24 extends PubPackageResolutionTest
+ with MapValueTypeNotAssignableTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin MapValueTypeNotAssignableTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_ifElement_thenElseFalse_intInt_dynamic() async {
await assertErrorsInCode(
'''
@@ -26,7 +47,7 @@
const dynamic b = 0;
var v = const <bool, int>{if (1 < 0) true: a else false: b};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 68, 32),
@@ -40,7 +61,7 @@
const dynamic b = 'b';
var v = const <bool, int>{if (1 < 0) true: a else false: b};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 101, 1),
@@ -56,7 +77,7 @@
const dynamic a = 'a';
var v = const <bool, int>{if (1 < 0) true: a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 49, 18),
@@ -68,7 +89,7 @@
'''
var v = const <bool, int>{if (1 < 0) true: 'a'};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 43, 3),
@@ -86,7 +107,7 @@
const dynamic a = 0;
var v = const <bool, int>{if (true) true: a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 17),
@@ -99,7 +120,7 @@
const dynamic a = 'a';
var v = const <bool, int>{if (true) true: a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 65, 1),
@@ -115,7 +136,7 @@
final a = 0;
var v = const <bool, int>{if (1 < 2) true: a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 56, 1),
]
@@ -153,7 +174,7 @@
'''
var v = const <bool, int>{...{true: 1}};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 26, 12),
@@ -166,7 +187,7 @@
const dynamic a = 'a';
var v = const <bool, int>{...{true: a}};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 59, 1),
@@ -265,13 +286,3 @@
''');
}
}
-
-@reflectiveTest
-class MapValueTypeNotAssignableWithConstantsTest
- extends MapValueTypeNotAssignableTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart b/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart
index c2faa10..ef8e5e6 100644
--- a/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart
@@ -699,4 +699,87 @@
1),
]);
}
+
+ test_external_field_final_implement_getter() async {
+ await assertNoErrorsInCode('''
+class A {
+ external final int x;
+}
+class B implements A {
+ int get x => 0;
+}
+''');
+ }
+
+ test_external_field_final_implement_none() async {
+ await assertErrorsInCode('''
+class A {
+ external final int x;
+}
+class B implements A {}
+''', [
+ error(
+ CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+ 42,
+ 1),
+ ]);
+ }
+
+ test_external_field_implement_getter() async {
+ await assertErrorsInCode('''
+class A {
+ external int x;
+}
+class B implements A {
+ int get x => 0;
+}
+''', [
+ error(
+ CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+ 36,
+ 1),
+ ]);
+ }
+
+ test_external_field_implement_getter_and_setter() async {
+ await assertNoErrorsInCode('''
+class A {
+ external int x;
+}
+class B implements A {
+ int get x => 0;
+ void set x(int value) {}
+}
+''');
+ }
+
+ test_external_field_implement_none() async {
+ await assertErrorsInCode('''
+class A {
+ external int x;
+}
+class B implements A {}
+''', [
+ error(
+ CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
+ 36,
+ 1),
+ ]);
+ }
+
+ test_external_field_implement_setter() async {
+ await assertErrorsInCode('''
+class A {
+ external int x;
+}
+class B implements A {
+ void set x(int value) {}
+}
+''', [
+ error(
+ CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+ 36,
+ 1),
+ ]);
+ }
}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
index 6f0d2d7..28ae14c 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
@@ -2,25 +2,40 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
- defineReflectiveTests(NonConstantListElementFromDeferredLibraryTest);
+ defineReflectiveTests(NonConstantListValueFromDeferredLibraryTest);
defineReflectiveTests(
- NonConstantListValueFromDeferredLibraryWithConstantsTest);
+ NonConstantListElementFromDeferredLibraryTest_language24);
});
}
@reflectiveTest
-class NonConstantListElementFromDeferredLibraryTest
- extends PubPackageResolutionTest {
+class NonConstantListElementFromDeferredLibraryTest_language24
+ extends PubPackageResolutionTest
+ with NonConstantListElementFromDeferredLibraryTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin NonConstantListElementFromDeferredLibraryTestCases
+ on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
@failingTest
test_const_ifElement_thenTrue_deferredElse() async {
// reports wrong error code (which is not crucial to fix)
@@ -47,7 +62,7 @@
const cond = true;
var v = const [ if (cond) a.c ];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode
@@ -90,11 +105,9 @@
}
@reflectiveTest
-class NonConstantListValueFromDeferredLibraryWithConstantsTest
- extends NonConstantListElementFromDeferredLibraryTest {
+class NonConstantListValueFromDeferredLibraryTest
+ extends PubPackageResolutionTest
+ with NonConstantListElementFromDeferredLibraryTestCases {
@override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
+ bool get _constant_update_2018 => true;
}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
index fd0772b..f9038cd 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(NonConstantListElementTest);
- defineReflectiveTests(NonConstantListElementWithConstantsTest);
+ defineReflectiveTests(NonConstantListElementTest_language24);
});
}
@reflectiveTest
-class NonConstantListElementTest extends PubPackageResolutionTest {
+class NonConstantListElementTest extends PubPackageResolutionTest
+ with NonConstantListElementTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantListElementTest_language24 extends PubPackageResolutionTest
+ with NonConstantListElementTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin NonConstantListElementTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_forElement() async {
await assertErrorsInCode(r'''
const Set set = {};
@@ -34,7 +55,7 @@
final dynamic a = 0;
var v = const [if (1 < 0) 0 else a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 54, 1),
]
@@ -49,7 +70,7 @@
final dynamic a = 0;
var v = const [if (1 < 0) a else 0];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
]
@@ -64,7 +85,7 @@
final dynamic a = 0;
var v = const [if (1 > 0) 0 else a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 54, 1),
]
@@ -79,7 +100,7 @@
final dynamic a = 0;
var v = const [if (1 > 0) a else 0];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
]
@@ -94,7 +115,7 @@
const dynamic a = 0;
var v = const [if (1 < 0) a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 12),
@@ -107,7 +128,7 @@
final dynamic a = 0;
var v = const [if (1 < 0) a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
]
@@ -122,7 +143,7 @@
const dynamic a = 0;
var v = const [if (1 > 0) a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 12),
@@ -135,7 +156,7 @@
final dynamic a = 0;
var v = const [if (1 > 0) a];
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
]
@@ -169,13 +190,3 @@
''');
}
}
-
-@reflectiveTest
-class NonConstantListElementWithConstantsTest
- extends NonConstantListElementTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
index ec30b00..26828b8 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,14 +10,40 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(NonConstantMapElementTest);
- defineReflectiveTests(NonConstantMapElementWithConstantTest);
+ defineReflectiveTests(NonConstantMapElementTest_language24);
defineReflectiveTests(NonConstantMapKeyTest);
+ defineReflectiveTests(NonConstantMapKeyTest_language24);
defineReflectiveTests(NonConstantMapValueTest);
+ defineReflectiveTests(NonConstantMapValueTest_language24);
});
}
@reflectiveTest
-class NonConstantMapElementTest extends PubPackageResolutionTest {
+class NonConstantMapElementTest extends PubPackageResolutionTest
+ with NonConstantMapElementTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapElementTest_language24 extends PubPackageResolutionTest
+ with NonConstantMapElementTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin NonConstantMapElementTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_forElement_cannotBeConst() async {
await assertErrorsInCode('''
void main() {
@@ -39,7 +62,7 @@
const {1: null, if (true) for (final x in const []) null: null};
}
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 42, 36),
error(HintCode.UNUSED_LOCAL_VARIABLE, 53, 1),
@@ -66,7 +89,7 @@
const {1: null, if (true) null: null};
}
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 32, 20),
@@ -80,7 +103,7 @@
const {1: null, if (true) if (true) null: null};
}
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 32, 30),
@@ -95,7 +118,7 @@
const {1: null, if (notConst) null: null};
}
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 60, 8),
]
@@ -112,7 +135,7 @@
const {1: null, if (isTrue) null: null else null: null};
}
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 55, 38),
@@ -126,7 +149,7 @@
const {1: null, ...{null: null}};
}
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 32, 15),
@@ -141,7 +164,7 @@
const {1: null, ...notConst};
}
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 56, 8),
]
@@ -152,23 +175,39 @@
}
@reflectiveTest
-class NonConstantMapElementWithConstantTest extends NonConstantMapElementTest {
+class NonConstantMapKeyTest extends PubPackageResolutionTest
+ with NonConstantMapKeyTestCases {
@override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
+ bool get _constant_update_2018 => true;
}
@reflectiveTest
-class NonConstantMapKeyTest extends PubPackageResolutionTest {
+class NonConstantMapKeyTest_language24 extends PubPackageResolutionTest
+ with NonConstantMapKeyTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+@reflectiveTest
+mixin NonConstantMapKeyTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_ifElement_thenElseFalse_finalElse() async {
await assertErrorsInCode(
'''
final dynamic a = 0;
var v = const <int, int>{if (1 < 0) 0: 0 else a: 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 67, 1),
]
@@ -183,7 +222,7 @@
final dynamic a = 0;
var v = const <int, int>{if (1 < 0) a: 0 else 0: 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
]
@@ -198,7 +237,7 @@
final dynamic a = 0;
var v = const <int, int>{if (1 > 0) 0: 0 else a: 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 67, 1),
]
@@ -213,7 +252,7 @@
final dynamic a = 0;
var v = const <int, int>{if (1 > 0) a: 0 else 0: 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
]
@@ -228,7 +267,7 @@
const dynamic a = 0;
var v = const <int, int>{if (1 < 0) a: 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
@@ -241,7 +280,7 @@
final dynamic a = 0;
var v = const <int, int>{if (1 < 0) a: 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
]
@@ -256,7 +295,7 @@
const dynamic a = 0;
var v = const <int, int>{if (1 > 0) a: 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
@@ -269,7 +308,7 @@
final dynamic a = 0;
var v = const <int, int>{if (1 > 0) a: 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
]
@@ -296,14 +335,38 @@
}
@reflectiveTest
-class NonConstantMapValueTest extends PubPackageResolutionTest {
+class NonConstantMapValueTest extends PubPackageResolutionTest
+ with NonConstantMapValueTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapValueTest_language24 extends PubPackageResolutionTest
+ with NonConstantMapValueTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin NonConstantMapValueTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_ifElement_thenElseFalse_finalElse() async {
await assertErrorsInCode(
'''
final dynamic a = 0;
var v = const <int, int>{if (1 < 0) 0: 0 else 0: a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 70, 1),
]
@@ -318,7 +381,7 @@
final dynamic a = 0;
var v = const <int, int>{if (1 < 0) 0: a else 0: 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
]
@@ -333,7 +396,7 @@
final dynamic a = 0;
var v = const <int, int>{if (1 > 0) 0: 0 else 0: a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 70, 1),
]
@@ -348,7 +411,7 @@
final dynamic a = 0;
var v = const <int, int>{if (1 > 0) 0: a else 0: 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
]
@@ -363,7 +426,7 @@
const dynamic a = 0;
var v = const <int, int>{if (1 < 0) 0: a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
@@ -376,7 +439,7 @@
final dynamic a = 0;
var v = const <int, int>{if (1 < 0) 0: a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
]
@@ -391,7 +454,7 @@
const dynamic a = 0;
var v = const <int, int>{if (1 > 0) 0: a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
@@ -404,7 +467,7 @@
final dynamic a = 0;
var v = const <int, int>{if (1 > 0) 0: a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
]
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
index 25504a3..f6526ff 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,14 +10,38 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(NonConstantMapKeyFromDeferredLibraryTest);
- defineReflectiveTests(
- NonConstantMapKeyFromDeferredLibraryWithConstantsTest);
+ defineReflectiveTests(NonConstantMapKeyFromDeferredLibraryTest_language24);
});
}
@reflectiveTest
-class NonConstantMapKeyFromDeferredLibraryTest
- extends PubPackageResolutionTest {
+class NonConstantMapKeyFromDeferredLibraryTest extends PubPackageResolutionTest
+ with NonConstantMapKeyFromDeferredLibraryTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapKeyFromDeferredLibraryTest_language24
+ extends PubPackageResolutionTest
+ with NonConstantMapKeyFromDeferredLibraryTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin NonConstantMapKeyFromDeferredLibraryTestCases
+ on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
@failingTest
test_const_ifElement_thenTrue_deferredElse() async {
// reports wrong error code
@@ -45,7 +66,7 @@
const cond = true;
var v = const { if (cond) a.c : 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode
@@ -82,13 +103,3 @@
]);
}
}
-
-@reflectiveTest
-class NonConstantMapKeyFromDeferredLibraryWithConstantsTest
- extends NonConstantMapKeyFromDeferredLibraryTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
index d884a44..f8b166b 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(NonConstantMapKeyTest);
- defineReflectiveTests(NonConstantMapKeyWithConstantsTest);
+ defineReflectiveTests(NonConstantMapKeyTest_language24);
});
}
@reflectiveTest
-class NonConstantMapKeyTest extends PubPackageResolutionTest {
+class NonConstantMapKeyTest extends PubPackageResolutionTest
+ with NonConstantMapKeyTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapKeyTest_language24 extends PubPackageResolutionTest
+ with NonConstantMapKeyTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin NonConstantMapKeyTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_ifElement_thenTrue_elseFinal() async {
await assertErrorsInCode(
r'''
@@ -26,7 +47,7 @@
const cond = true;
var v = const {if (cond) 0: 1 else a : 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 75, 1),
]
@@ -42,7 +63,7 @@
const cond = true;
var v = const {if (cond) a : 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 65, 1),
]
@@ -60,12 +81,3 @@
]);
}
}
-
-@reflectiveTest
-class NonConstantMapKeyWithConstantsTest extends NonConstantMapKeyTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
index 6ce36a1..ad0ec5b 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -14,13 +11,39 @@
defineReflectiveSuite(() {
defineReflectiveTests(NonConstantMapValueFromDeferredLibraryTest);
defineReflectiveTests(
- NonConstantMapValueFromDeferredLibraryWithConstantsTest);
+ NonConstantMapValueFromDeferredLibraryTest_language24);
});
}
@reflectiveTest
class NonConstantMapValueFromDeferredLibraryTest
- extends PubPackageResolutionTest {
+ extends PubPackageResolutionTest
+ with NonConstantMapValueFromDeferredLibraryTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapValueFromDeferredLibraryTest_language24
+ extends PubPackageResolutionTest
+ with NonConstantMapValueFromDeferredLibraryTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin NonConstantMapValueFromDeferredLibraryTestCases
+ on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
@failingTest
test_const_ifElement_thenTrue_elseDeferred() async {
// reports wrong error code
@@ -45,7 +68,7 @@
const cond = true;
var v = const { if (cond) 'a' : a.c};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode
@@ -82,13 +105,3 @@
]);
}
}
-
-@reflectiveTest
-class NonConstantMapValueFromDeferredLibraryWithConstantsTest
- extends NonConstantMapValueFromDeferredLibraryTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
index edbe740..74c3160 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(NonConstantMapValueTest);
- defineReflectiveTests(NonConstantMapValueWithConstantsTest);
+ defineReflectiveTests(NonConstantMapValueTest_language24);
});
}
@reflectiveTest
-class NonConstantMapValueTest extends PubPackageResolutionTest {
+class NonConstantMapValueTest extends PubPackageResolutionTest
+ with NonConstantMapValueTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantMapValueTest_language24 extends PubPackageResolutionTest
+ with NonConstantMapValueTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin NonConstantMapValueTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_ifTrue_elseFinal() async {
await assertErrorsInCode(
r'''
@@ -26,7 +47,7 @@
const cond = true;
var v = const {if (cond) 'a': 'b', 'c' : a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 81, 1),
]
@@ -43,7 +64,7 @@
const cond = true;
var v = const {if (cond) 'a' : a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 71, 1),
]
@@ -61,12 +82,3 @@
]);
}
}
-
-@reflectiveTest
-class NonConstantMapValueWithConstantsTest extends NonConstantMapValueTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
index 1f92b3d..8adf61f 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(NonConstantSetElementTest);
- defineReflectiveTests(NonConstantSetElementWithConstantsTest);
+ defineReflectiveTests(NonConstantSetElementTest_language24);
});
}
@reflectiveTest
-class NonConstantSetElementTest extends PubPackageResolutionTest {
+class NonConstantSetElementTest extends PubPackageResolutionTest
+ with NonConstantSetElementTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class NonConstantSetElementTest_language24 extends PubPackageResolutionTest
+ with NonConstantSetElementTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin NonConstantSetElementTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_forElement() async {
await assertErrorsInCode(r'''
const Set set = {};
@@ -34,7 +55,7 @@
final dynamic a = 0;
var v = const <int>{if (1 < 0) 0 else a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 59, 1),
]
@@ -49,7 +70,7 @@
final dynamic a = 0;
var v = const <int>{if (1 < 0) a else 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
]
@@ -64,7 +85,7 @@
final dynamic a = 0;
var v = const <int>{if (1 > 0) 0 else a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 59, 1),
]
@@ -79,7 +100,7 @@
final dynamic a = 0;
var v = const <int>{if (1 > 0) a else 0};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
]
@@ -94,7 +115,7 @@
const dynamic a = 0;
var v = const <int>{if (1 < 0) a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 12),
@@ -107,7 +128,7 @@
final dynamic a = 0;
var v = const <int>{if (1 < 0) a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
]
@@ -122,7 +143,7 @@
const dynamic a = 0;
var v = const <int>{if (1 > 0) a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 12),
@@ -135,7 +156,7 @@
final dynamic a = 0;
var v = const <int>{if (1 > 0) a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
]
@@ -159,7 +180,7 @@
final Set x = null;
var v = const {...x};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 38, 1),
]
@@ -184,12 +205,3 @@
''');
}
}
-
-@reflectiveTest
-class NonConstantSetElementWithConstantsTest extends NonConstantSetElementTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart
index c5af2c7..1a89d0a 100644
--- a/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,37 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(SetElementFromDeferredLibraryTest);
- defineReflectiveTests(SetElementFromDeferredLibraryWithConstantsTest);
+ defineReflectiveTests(SetElementFromDeferredLibraryTest_language24);
});
}
@reflectiveTest
-class SetElementFromDeferredLibraryTest extends PubPackageResolutionTest {
+class SetElementFromDeferredLibraryTest extends PubPackageResolutionTest
+ with SetElementFromDeferredLibraryTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class SetElementFromDeferredLibraryTest_language24
+ extends PubPackageResolutionTest
+ with SetElementFromDeferredLibraryTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin SetElementFromDeferredLibraryTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
@failingTest
test_const_ifElement_thenTrue_elseDeferred() async {
// reports wrong error code
@@ -42,7 +64,7 @@
const cond = true;
var v = const {if (cond) a.c};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.SET_ELEMENT_FROM_DEFERRED_LIBRARY,
78, 3),
@@ -74,13 +96,3 @@
]);
}
}
-
-@reflectiveTest
-class SetElementFromDeferredLibraryWithConstantsTest
- extends SetElementFromDeferredLibraryTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
index 6fcc0ed..d7349b8 100644
--- a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,36 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(SetElementTypeNotAssignableTest);
- defineReflectiveTests(SetElementTypeNotAssignableWithConstantTest);
+ defineReflectiveTests(SetElementTypeNotAssignableTest_language24);
});
}
@reflectiveTest
-class SetElementTypeNotAssignableTest extends PubPackageResolutionTest {
+class SetElementTypeNotAssignableTest extends PubPackageResolutionTest
+ with SetElementTypeNotAssignableTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class SetElementTypeNotAssignableTest_language24
+ extends PubPackageResolutionTest with SetElementTypeNotAssignableTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin SetElementTypeNotAssignableTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_const_ifElement_thenElseFalse_intInt() async {
await assertErrorsInCode(
'''
@@ -26,7 +47,7 @@
const dynamic b = 0;
var v = const <int>{if (1 < 0) a else b};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 62, 19),
@@ -40,7 +61,7 @@
const dynamic b = 'b';
var v = const <int>{if (1 < 0) a else b};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 82,
1),
@@ -55,7 +76,7 @@
'''
var v = const <int>{if (1 < 0) 'a'};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 31,
3),
@@ -73,7 +94,7 @@
const dynamic a = 'a';
var v = const <int>{if (1 < 0) a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 43, 12),
@@ -86,7 +107,7 @@
const dynamic a = 0;
var v = const <int>{if (true) a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 11),
@@ -99,7 +120,7 @@
const dynamic a = 'a';
var v = const <int>{if (true) a};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 53,
1),
@@ -114,7 +135,7 @@
'''
var v = const <int>{...[0, 1]};
''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 20, 9),
@@ -197,13 +218,3 @@
''');
}
}
-
-@reflectiveTest
-class SetElementTypeNotAssignableWithConstantTest
- extends SetElementTypeNotAssignableTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart
index d62d6ba..3c9b2a3 100644
--- a/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart
@@ -2,10 +2,7 @@
// 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:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -13,12 +10,37 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(SpreadExpressionFromDeferredLibraryTest);
- defineReflectiveTests(SpreadExpressionFromDeferredLibraryWithConstantsTest);
+ defineReflectiveTests(SpreadExpressionFromDeferredLibraryTest_language24);
});
}
@reflectiveTest
-class SpreadExpressionFromDeferredLibraryTest extends PubPackageResolutionTest {
+class SpreadExpressionFromDeferredLibraryTest extends PubPackageResolutionTest
+ with SpreadExpressionFromDeferredLibraryTestCases {
+ @override
+ bool get _constant_update_2018 => true;
+}
+
+@reflectiveTest
+class SpreadExpressionFromDeferredLibraryTest_language24
+ extends PubPackageResolutionTest
+ with SpreadExpressionFromDeferredLibraryTestCases {
+ @override
+ bool get _constant_update_2018 => false;
+
+ @override
+ void setUp() {
+ super.setUp();
+ writeTestPackageConfig(
+ PackageConfigFileBuilder(),
+ languageVersion: '2.4',
+ );
+ }
+}
+
+mixin SpreadExpressionFromDeferredLibraryTestCases on PubPackageResolutionTest {
+ bool get _constant_update_2018;
+
test_inList_deferred() async {
newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
const List c = [];''');
@@ -28,7 +50,7 @@
f() {
return const [...a.c];
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode
@@ -60,7 +82,7 @@
f() {
return const [...a.c];
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 6),
@@ -76,7 +98,7 @@
f() {
return const {...a.c};
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode
@@ -108,7 +130,7 @@
f() {
return const {...a.c};
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 6),
@@ -124,7 +146,7 @@
f() {
return const {...a.c};
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? [
error(
CompileTimeErrorCode
@@ -156,20 +178,10 @@
f() {
return const {...a.c};
}''',
- analysisOptions.experimentStatus.constant_update_2018
+ _constant_update_2018
? []
: [
error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 47, 6),
]);
}
}
-
-@reflectiveTest
-class SpreadExpressionFromDeferredLibraryWithConstantsTest
- extends SpreadExpressionFromDeferredLibraryTest {
- @override
- AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
- ..contextFeatures = FeatureSet.fromEnableFlags(
- [EnableString.constant_update_2018],
- );
-}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
index eaa394f..0552343 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
@@ -374,6 +374,15 @@
''');
}
+ test_get_from_external_field_final_valid() async {
+ await assertNoErrorsInCode('''
+class A {
+ external final int x;
+}
+int f(A a) => a.x;
+''');
+ }
+
test_get_from_external_field_valid() async {
await assertNoErrorsInCode('''
class A {
@@ -383,6 +392,15 @@
''');
}
+ test_get_from_external_static_field_final_valid() async {
+ await assertNoErrorsInCode('''
+class A {
+ external static final int x;
+}
+int f() => A.x;
+''');
+ }
+
test_get_from_external_static_field_valid() async {
await assertNoErrorsInCode('''
class A {
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
index 4dfb712..33b8193 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
@@ -177,6 +177,13 @@
@reflectiveTest
class UndefinedIdentifierWithNullSafetyTest extends UndefinedIdentifierTest
with WithNullSafetyMixin {
+ test_get_from_external_variable_final_valid() async {
+ await assertNoErrorsInCode('''
+external final int x;
+int f() => x;
+''');
+ }
+
test_get_from_external_variable_valid() async {
await assertNoErrorsInCode('''
external int x;
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index 4888037..951cccc 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -11,6 +11,7 @@
show getSupportedLibraryNames;
import '../compiler_new.dart' as api;
+import 'common/metrics.dart' show Metrics, Metric;
import 'common/tasks.dart' show GenericTask, Measurer;
import 'common.dart';
import 'compiler.dart';
@@ -48,7 +49,11 @@
]);
}
- void log(message) {
+ void logInfo(String message) {
+ callUserHandler(null, null, null, null, message, api.Diagnostic.INFO);
+ }
+
+ void logVerbose(String message) {
callUserHandler(
null, null, null, null, message, api.Diagnostic.VERBOSE_INFO);
}
@@ -91,9 +96,14 @@
return super.run(uri);
}).then((bool success) {
if (options.verbose) {
- StringBuffer timings = new StringBuffer();
+ StringBuffer timings = StringBuffer();
computeTimings(setupDuration, timings);
- log("$timings");
+ logVerbose('$timings');
+ }
+ if (options.reportPrimaryMetrics || options.reportSecondaryMetrics) {
+ StringBuffer metrics = StringBuffer();
+ collectMetrics(metrics);
+ logInfo('$metrics');
}
return success;
});
@@ -149,6 +159,31 @@
' (${percent.toStringAsFixed(2)}%)');
}
+ void collectMetrics(StringBuffer buffer) {
+ buffer.writeln('Metrics:');
+ for (final task in tasks) {
+ Metrics metrics = task.metrics;
+ String namespace = metrics.namespace;
+ if (namespace == '') {
+ namespace =
+ task.name.toLowerCase().replaceAll(RegExp(r'[^a-z0-9]+'), '_');
+ }
+ void report(Metric metric) {
+ buffer
+ .writeln(' ${namespace}.${metric.name}: ${metric.formatValue()}');
+ }
+
+ for (final metric in metrics.primary) {
+ report(metric);
+ }
+ if (options.reportSecondaryMetrics) {
+ for (final metric in metrics.secondary) {
+ report(metric);
+ }
+ }
+ }
+ }
+
@override
void reportDiagnostic(DiagnosticMessage message,
List<DiagnosticMessage> infos, api.Diagnostic kind) {
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index aea3bac..129ecf0 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -89,6 +89,8 @@
static const String verbose = '--verbose';
static const String progress = '--show-internal-progress';
static const String version = '--version';
+ static const String reportMetrics = '--report-metrics';
+ static const String reportAllMetrics = '--report-all-metrics';
static const String dillDependencies = '--dill-dependencies';
static const String readData = '--read-data';
diff --git a/pkg/compiler/lib/src/common/metrics.dart b/pkg/compiler/lib/src/common/metrics.dart
new file mode 100644
index 0000000..2afd042
--- /dev/null
+++ b/pkg/compiler/lib/src/common/metrics.dart
@@ -0,0 +1,104 @@
+// 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.
+
+library dart2js.common.metrics;
+
+/// A collection of metrics that is normally associated with a task.
+abstract class Metrics {
+ /// The namespace prepended to all the metric names with a period (`.`).
+ /// An empty string means no namespace.
+ String get namespace;
+
+ /// Returns all the primary metrics. Only a few metrics that give an overall
+ /// picture of the compilation should be selected as primary metrics.
+ Iterable<Metric> get primary;
+
+ /// Returns all the secondary metrics. Typically these are displayed together
+ /// with the primary metrics to give three levels of detail: no metrics, just
+ /// the primary metrics, all metrics including primary and secondary metrics.
+ Iterable<Metric> get secondary;
+
+ factory Metrics.none() => _emptyMetrics;
+}
+
+final Metrics _emptyMetrics = MetricsBase();
+
+class MetricsBase implements Metrics {
+ @override
+ String get namespace => '';
+
+ // TODO(sra): Make these late final fields.
+ List<Metric> _primary = [];
+ List<Metric> _secondary = [];
+
+ /// Setter method that is usually called in a subclass constructor to define
+ /// the primary metrics.
+ void set primary(Iterable<Metric> metrics) {
+ assert(_primary.isEmpty);
+ _primary.addAll(metrics);
+ }
+
+ /// Setter method that is usually called in a subclass constructor to define
+ /// the secondary metrics.
+ void set secondary(Iterable<Metric> metrics) {
+ assert(_secondary.isEmpty);
+ _secondary.addAll(metrics);
+ }
+
+ @override
+ Iterable<Metric> get primary => _primary /*!*/;
+
+ @override
+ Iterable<Metric> get secondary => _secondary /*!*/;
+}
+
+abstract class Metric<T> {
+ String get name;
+ String formatValue();
+}
+
+class DurationMetric implements Metric<Duration> {
+ @override
+ final String name;
+ Duration _duration = Duration.zero;
+
+ DurationMetric(this.name);
+
+ void add(Duration value) {
+ _duration += value;
+ }
+
+ T measure<T>(T Function() action) {
+ final stopwatch = Stopwatch()..start();
+ T result = action();
+ add(stopwatch.elapsed);
+ return result;
+ }
+
+ @override
+ String formatValue() {
+ return (_duration.inMilliseconds / 1000).toStringAsFixed(3) + 's';
+ }
+
+ @override
+ String toString() => 'DurationMetric("$name", $_duration)';
+}
+
+class CountMetric implements Metric<int> {
+ @override
+ final String name;
+ int _count = 0;
+
+ CountMetric(this.name);
+
+ void add([int count = 1]) {
+ _count += count;
+ }
+
+ @override
+ String formatValue() => '$_count';
+
+ @override
+ String toString() => 'CountMetric("$name", $_count)';
+}
diff --git a/pkg/compiler/lib/src/common/tasks.dart b/pkg/compiler/lib/src/common/tasks.dart
index 077972c..6022b50 100644
--- a/pkg/compiler/lib/src/common/tasks.dart
+++ b/pkg/compiler/lib/src/common/tasks.dart
@@ -7,6 +7,8 @@
import 'dart:async'
show Future, Zone, ZoneDelegate, ZoneSpecification, runZoned;
+import 'metrics.dart';
+
/// Used to measure where time is spent in the compiler.
///
/// This exposes [measure] and [measureIo], which wrap an action and associate
@@ -16,7 +18,7 @@
abstract class CompilerTask {
final Measurer _measurer;
final Stopwatch _watch;
- final Map<String, GenericTask> _subtasks = <String, GenericTask>{};
+ final Map<String, GenericTask> _subtasks = {};
int _asyncCount = 0;
@@ -163,7 +165,7 @@
if (_measurer._currentAsyncTask == null) {
_measurer._currentAsyncTask = this;
} else if (_measurer._currentAsyncTask != this) {
- throw "Can't track async task '$name' because"
+ throw "Cannot track async task '$name' because"
" '${_measurer._currentAsyncTask.name}' is already being tracked.";
}
_asyncCount++;
@@ -207,6 +209,9 @@
int getSubtaskTime(String subtask) => _subtasks[subtask].timing;
bool getSubtaskIsRunning(String subtask) => _subtasks[subtask].isRunning;
+
+ /// Returns the metrics for this task.
+ Metrics get metrics => Metrics.none();
}
class GenericTask extends CompilerTask {
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 4022219..41b46d5 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -407,6 +407,8 @@
new OptionHandler(Flags.noFrequencyBasedMinification, passThrough),
new OptionHandler(Flags.verbose, setVerbose),
new OptionHandler(Flags.progress, passThrough),
+ new OptionHandler(Flags.reportMetrics, passThrough),
+ new OptionHandler(Flags.reportAllMetrics, passThrough),
new OptionHandler(Flags.version, (_) => wantVersion = true),
new OptionHandler('--library-root=.+', ignoreOption),
new OptionHandler('--libraries-spec=.+', setLibrarySpecificationUri),
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 1db440d..c09c0cc 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -8,6 +8,7 @@
import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
+import 'common/metrics.dart' show Metric, Metrics, CountMetric, DurationMetric;
import 'common/tasks.dart' show CompilerTask;
import 'common.dart';
import 'common_elements.dart'
@@ -84,6 +85,20 @@
String toString() => "OutputUnit($name, $_imports)";
}
+class _DeferredLoadTaskMetrics implements Metrics {
+ @override
+ String get namespace => 'deferred_load';
+
+ DurationMetric time = DurationMetric('time');
+ CountMetric hunkListElements = CountMetric('hunkListElements');
+
+ @override
+ Iterable<Metric> get primary => [time];
+
+ @override
+ Iterable<Metric> get secondary => [hunkListElements];
+}
+
/// For each deferred import, find elements and constants to be loaded when that
/// import is loaded. Elements that are used by several deferred imports are in
/// shared OutputUnits.
@@ -134,6 +149,9 @@
final Compiler compiler;
+ @override
+ final _DeferredLoadTaskMetrics metrics = _DeferredLoadTaskMetrics();
+
bool get disableProgramSplit => compiler.options.disableProgramSplit;
bool get newDeferredSplit => compiler.options.newDeferredSplit;
bool get reportInvalidInferredDeferredTypes =>
@@ -739,6 +757,7 @@
if (outputUnit == _mainOutputUnit) continue;
if (outputUnit._imports.contains(import)) {
hunksToLoad[_importDeferName[import]].add(outputUnit);
+ metrics.hunkListElements.add(1);
}
}
}
@@ -835,6 +854,10 @@
/// work item (e.g. we might converge faster if we pick first the update that
/// contains a bigger delta.)
OutputUnitData run(FunctionEntity main, KClosedWorld closedWorld) {
+ return metrics.time.measure(() => _run(main, closedWorld));
+ }
+
+ OutputUnitData _run(FunctionEntity main, KClosedWorld closedWorld) {
if (!isProgramSplit || main == null || disableProgramSplit) {
return _buildResult();
}
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 0820252..3042432 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -7,6 +7,7 @@
import '../../compiler_new.dart';
import '../closure.dart';
import '../common.dart';
+import '../common/metrics.dart';
import '../common/names.dart';
import '../compiler.dart';
import '../common_elements.dart';
@@ -67,12 +68,13 @@
final FunctionEntity mainElement;
- final Map<Local, TypeInformation> _defaultTypeOfParameter =
- new Map<Local, TypeInformation>();
+ final Map<Local, TypeInformation> _defaultTypeOfParameter = {};
- final WorkQueue _workQueue = new WorkQueue();
+ final WorkQueue _workQueue = WorkQueue();
- final Set<MemberEntity> _analyzedElements = new Set<MemberEntity>();
+ final _InferrerEngineMetrics metrics = _InferrerEngineMetrics();
+
+ final Set<MemberEntity> _analyzedElements = {};
/// The maximum number of times we allow a node in the graph to
/// change types. If a node reaches that limit, we give up
@@ -309,13 +311,17 @@
}
void runOverAllElements() {
- _analyzeAllElements();
+ metrics.time.measure(_runOverAllElements);
+ }
+
+ void _runOverAllElements() {
+ metrics.analyze.measure(_analyzeAllElements);
TypeGraphDump dump =
debug.PRINT_GRAPH ? new TypeGraphDump(_compilerOutput, this) : null;
dump?.beforeAnalysis();
_buildWorkQueue();
- _refine();
+ metrics.refine1.measure(_refine);
// Try to infer element types of lists and compute their escape information.
types.allocatedLists.values.forEach((TypeInformation info) {
@@ -424,7 +430,7 @@
}
_workQueue.addAll(seenTypes);
- _refine();
+ metrics.refine2.measure(_refine);
if (debug.PRINT_SUMMARY) {
types.allocatedLists.values.forEach((_info) {
@@ -483,6 +489,7 @@
}
dump?.afterAnalysis();
+ metrics.overallRefineCount.add(_overallRefineCount);
_reporter.log('Inferred $_overallRefineCount types.');
_processLoopInformation();
@@ -703,6 +710,7 @@
_overallRefineCount++;
info.refineCount++;
if (info.refineCount > _MAX_CHANGE_COUNT) {
+ metrics.exceededMaxChangeCount.add();
if (debug.ANOMALY_WARN) {
print("ANOMALY WARNING: max refinement reached for $info");
}
@@ -1188,6 +1196,26 @@
}
}
+class _InferrerEngineMetrics extends MetricsBase {
+ final time = DurationMetric('time');
+ final analyze = DurationMetric('time.analyze');
+ final refine1 = DurationMetric('time.refine1');
+ final refine2 = DurationMetric('time.refine2');
+ final exceededMaxChangeCount = CountMetric('count.exceededMaxChange');
+ final overallRefineCount = CountMetric('count.overallRefines');
+
+ _InferrerEngineMetrics() {
+ primary = [time];
+ secondary = [
+ analyze,
+ refine1,
+ refine2,
+ exceededMaxChangeCount,
+ overallRefineCount
+ ];
+ }
+}
+
class KernelTypeSystemStrategy implements TypeSystemStrategy {
final JsClosedWorld _closedWorld;
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index 2de18dc..62e0b11 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -8,6 +8,7 @@
import 'package:kernel/ast.dart' as ir;
import '../closure.dart';
+import '../common/metrics.dart' show Metrics;
import '../compiler.dart';
import '../elements/entities.dart';
import '../js_backend/inferred_data.dart';
@@ -53,12 +54,15 @@
final Compiler _compiler;
final InferredDataBuilder _inferredDataBuilder;
+ Metrics /*?*/ _metrics;
TypeGraphInferrer(
this._compiler, this.closedWorld, this._inferredDataBuilder);
String get name => 'Graph inferrer';
+ Metrics get metrics => _metrics;
+
AbstractValueDomain get abstractValueDomain =>
closedWorld.abstractValueDomain;
@@ -66,6 +70,7 @@
GlobalTypeInferenceResults analyzeMain(FunctionEntity main) {
inferrer = createInferrerEngineFor(main);
inferrer.runOverAllElements();
+ _metrics = inferrer.metrics;
return buildResults();
}
diff --git a/pkg/compiler/lib/src/inferrer/types.dart b/pkg/compiler/lib/src/inferrer/types.dart
index 5c5c4f1..25305e4 100644
--- a/pkg/compiler/lib/src/inferrer/types.dart
+++ b/pkg/compiler/lib/src/inferrer/types.dart
@@ -6,6 +6,7 @@
import 'package:kernel/ast.dart' as ir;
import '../common.dart' show failedAt, retainDataForTesting;
+import '../common/metrics.dart' show Metrics;
import '../common/names.dart';
import '../common/tasks.dart' show CompilerTask;
import '../compiler.dart' show Compiler;
@@ -159,10 +160,15 @@
GlobalTypeInferenceResults resultsForTesting;
+ Metrics _metrics;
+
GlobalTypeInferenceTask(Compiler compiler)
: compiler = compiler,
super(compiler.measurer);
+ @override
+ Metrics get metrics => _metrics;
+
/// Runs the global type-inference algorithm once.
GlobalTypeInferenceResults runGlobalTypeInference(FunctionEntity mainElement,
JClosedWorld closedWorld, InferredDataBuilder inferredDataBuilder) {
@@ -170,10 +176,12 @@
GlobalTypeInferenceResults results;
if (compiler.disableTypeInference) {
results = new TrivialGlobalTypeInferenceResults(closedWorld);
+ _metrics = Metrics.none();
} else {
typesInferrerInternal ??= compiler.backendStrategy
.createTypesInferrer(closedWorld, inferredDataBuilder);
results = typesInferrerInternal.analyzeMain(mainElement);
+ _metrics = typesInferrerInternal.metrics;
}
closedWorld.noSuchMethodData.categorizeComplexImplementations(results);
if (retainDataForTesting) {
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 3e9ab67..6cd91f3 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -340,6 +340,14 @@
/// during each phase of compilation.
bool showInternalProgress = false;
+ /// Enable printing of metrics at end of compilation.
+ // TODO(sra): Add command-line filtering of metrics.
+ bool reportPrimaryMetrics = false;
+
+ /// Enable printing of more metrics at end of compilation.
+ // TODO(sra): Add command-line filtering of metrics.
+ bool reportSecondaryMetrics = false;
+
/// Track allocations in the JS output.
///
/// This is an experimental feature.
@@ -496,6 +504,8 @@
..useMultiSourceInfo = _hasOption(options, Flags.useMultiSourceInfo)
..useNewSourceInfo = _hasOption(options, Flags.useNewSourceInfo)
..verbose = _hasOption(options, Flags.verbose)
+ ..reportPrimaryMetrics = _hasOption(options, Flags.reportMetrics)
+ ..reportSecondaryMetrics = _hasOption(options, Flags.reportAllMetrics)
..showInternalProgress = _hasOption(options, Flags.progress)
..dillDependencies =
_extractUriListOption(options, '${Flags.dillDependencies}')
diff --git a/pkg/test_runner/lib/src/command.dart b/pkg/test_runner/lib/src/command.dart
index ec9eda3..ae9fb11 100644
--- a/pkg/test_runner/lib/src/command.dart
+++ b/pkg/test_runner/lib/src/command.dart
@@ -180,6 +180,9 @@
if (displayName == 'precompiler' || displayName == 'app_jit') {
return VMCommandOutput(
this, exitCode, timedOut, stdout, stderr, time, pid);
+ } else if (displayName == 'dart2js') {
+ return Dart2jsCompilerCommandOutput(
+ this, exitCode, timedOut, stdout, stderr, time, compilationSkipped);
} else if (displayName == 'dartdevc') {
return DevCompilerCommandOutput(this, exitCode, timedOut, stdout, stderr,
time, compilationSkipped, pid);
diff --git a/pkg/test_runner/lib/src/command_output.dart b/pkg/test_runner/lib/src/command_output.dart
index eb54807..c55896c 100644
--- a/pkg/test_runner/lib/src/command_output.dart
+++ b/pkg/test_runner/lib/src/command_output.dart
@@ -967,7 +967,56 @@
}
}
-class DevCompilerCommandOutput extends CommandOutput {
+class Dart2jsCompilerCommandOutput extends CompilationCommandOutput
+ with _StaticErrorOutput {
+ /// Matches the location and message of a dart2js error message, which looks
+ /// like:
+ ///
+ /// tests/language_2/some_test.dart:9:3:
+ /// Error: Some message.
+ /// BadThing();
+ /// ^
+ ///
+ /// The test runner only validates the main error message, and not the
+ /// suggested fixes, so we only parse the first line.
+ static final _errorRegexp =
+ RegExp(r"^([^:]+):(\d+):(\d+):\nError: (.*)$", multiLine: true);
+
+ Dart2jsCompilerCommandOutput(
+ Command command,
+ int exitCode,
+ bool timedOut,
+ List<int> stdout,
+ List<int> stderr,
+ Duration time,
+ bool compilationSkipped)
+ : super(command, exitCode, timedOut, stdout, stderr, time,
+ compilationSkipped);
+
+ @override
+ void _parseErrors() {
+ var errors = <StaticError>[];
+ _StaticErrorOutput._parseCfeErrors(
+ ErrorSource.web, _errorRegexp, decodeUtf8(stdout), errors);
+ errors.forEach(addError);
+ }
+}
+
+class DevCompilerCommandOutput extends CommandOutput with _StaticErrorOutput {
+ /// Matches the first line of a DDC error message. DDC prints errors to
+ /// stdout that look like:
+ ///
+ /// org-dartlang-app:/tests/language_2/some_test.dart:7:21: Error: Some message.
+ /// Try fixing the code to be less bad.
+ /// var _ = <int>[if (1) 2];
+ /// ^
+ ///
+ /// The test runner only validates the main error message, and not the
+ /// suggested fixes, so we only parse the first line.
+ static final _errorRegexp = RegExp(
+ r"^org-dartlang-app:/([^:]+):(\d+):(\d+): Error: (.*)$",
+ multiLine: true);
+
DevCompilerCommandOutput(
Command command,
int exitCode,
@@ -985,6 +1034,11 @@
if (hasTimedOut) return Expectation.timeout;
if (hasNonUtf8) return Expectation.nonUtf8Error;
+ // If it's a static error test, validate the exact errors.
+ if (testCase.testFile.isStaticErrorTest) {
+ return _validateExpectedErrors(testCase);
+ }
+
// Handle errors / missing errors
if (testCase.hasCompileError) {
return exitCode == 0
@@ -1001,9 +1055,24 @@
if (hasCrashed) return Expectation.crash;
if (hasTimedOut) return Expectation.timeout;
if (hasNonUtf8) return Expectation.nonUtf8Error;
+
+ // If it's a static error test, validate the exact errors.
+ if (testCase.testFile.isStaticErrorTest) {
+ return _validateExpectedErrors(testCase);
+ }
+
if (exitCode != 0) return Expectation.compileTimeError;
+
return Expectation.pass;
}
+
+ @override
+ void _parseErrors() {
+ var errors = <StaticError>[];
+ _StaticErrorOutput._parseCfeErrors(
+ ErrorSource.web, _errorRegexp, decodeUtf8(stdout), errors);
+ errors.forEach(addError);
+ }
}
class VMKernelCompilationCommandOutput extends CompilationCommandOutput {
@@ -1178,13 +1247,8 @@
with _StaticErrorOutput {
static void parseErrors(String stdout, List<StaticError> errors,
[List<StaticError> warnings]) {
- for (var match in _errorRegexp.allMatches(stdout)) {
- var line = int.parse(match.group(2));
- var column = int.parse(match.group(3));
- var message = match.group(4);
- errors.add(
- StaticError({ErrorSource.cfe: message}, line: line, column: column));
- }
+ _StaticErrorOutput._parseCfeErrors(
+ ErrorSource.cfe, _errorRegexp, stdout, errors);
}
/// Matches the first line of a Fasta error message. Fasta prints errors to
@@ -1222,6 +1286,19 @@
/// Mixin for outputs from a command that implement a Dart front end which
/// reports static errors.
mixin _StaticErrorOutput on CommandOutput {
+ /// Parses compile errors reported by CFE using the given [regExp] and adds
+ /// them to [errors] as coming from [errorSource].
+ static void _parseCfeErrors(ErrorSource errorSource, RegExp regExp,
+ String stdout, List<StaticError> errors) {
+ for (var match in regExp.allMatches(stdout)) {
+ var line = int.parse(match.group(2));
+ var column = int.parse(match.group(3));
+ var message = match.group(4);
+ errors
+ .add(StaticError({errorSource: message}, line: line, column: column));
+ }
+ }
+
/// Reported static errors, parsed from [stderr].
List<StaticError> get errors {
if (!_parsedErrors) {
@@ -1310,9 +1387,14 @@
Expectation _validateExpectedErrors(TestCase testCase,
[OutputWriter writer]) {
// Filter out errors that aren't for this configuration.
- var errorSource = testCase.configuration.compiler == Compiler.dart2analyzer
- ? ErrorSource.analyzer
- : ErrorSource.cfe;
+ var errorSource = {
+ Compiler.dart2analyzer: ErrorSource.analyzer,
+ Compiler.dart2js: ErrorSource.web,
+ Compiler.dartdevc: ErrorSource.web,
+ Compiler.fasta: ErrorSource.cfe
+ }[testCase.configuration.compiler];
+ assert(errorSource != null);
+
var expected = testCase.testFile.expectedErrors
.where((error) => error.hasError(errorSource));
diff --git a/pkg/test_runner/lib/src/test_file.dart b/pkg/test_runner/lib/src/test_file.dart
index c5a0fd8..01afcd9 100644
--- a/pkg/test_runner/lib/src/test_file.dart
+++ b/pkg/test_runner/lib/src/test_file.dart
@@ -72,6 +72,14 @@
/// is skipped on configurations that are not purely front end.
bool get isStaticErrorTest => expectedErrors.isNotEmpty;
+ /// If the test contains any web-specific (`[web]`) static error expectations,
+ /// then it's a "web static error test".
+ ///
+ /// These tests exist to validate that a Dart web compiler reports the right
+ /// expected errors.
+ bool get isWebStaticErrorTest =>
+ expectedErrors.any((error) => error.hasError(ErrorSource.web));
+
/// If the tests has no static error expectations, or all of the expectations
/// are warnings, then the test tests runtime semantics.
///
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index d05d3c1..2a2bfb4 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -165,7 +165,19 @@
}
}
- return true;
+ // Normal runtime tests are always run.
+ if (testFile.isRuntimeTest) return true;
+
+ // Tests of web-specific static errors are run on web compilers.
+ if (testFile.isWebStaticErrorTest &&
+ (configuration.compiler == Compiler.dart2js ||
+ configuration.compiler == Compiler.dartdevc)) {
+ return true;
+ }
+
+ // Other static error tests are run on front-end-only configurations.
+ return configuration.compiler == Compiler.dart2analyzer ||
+ configuration.compiler == Compiler.fasta;
}
/// Whether a test with [expectations] should be skipped under the current
@@ -557,19 +569,6 @@
/// options.
void _testCasesFromTestFile(
TestFile testFile, ExpectationSet expectations, TestCaseEvent onTest) {
- // TODO(rnystrom): Skipping this here is a little unusual because most
- // skips are handled in _addTestCase(). However, if the configuration
- // is running on a browser, calling _addTestCase() will try to create
- // a set of commands which ultimately causes an exception in
- // DummyRuntimeConfiguration. This avoids that.
- // If the test only has static expectations, skip it on any configurations
- // that are not purely front ends.
- if (!testFile.isRuntimeTest &&
- configuration.compiler != Compiler.dart2analyzer &&
- configuration.compiler != Compiler.fasta) {
- return;
- }
-
// The configuration must support everything the test needs.
if (!configuration.supportedFeatures.containsAll(testFile.requirements)) {
return;
@@ -690,7 +689,7 @@
commands.addAll(compilationArtifact.commands);
}
- if (testFile.hasCompileError &&
+ if ((testFile.hasCompileError || testFile.isStaticErrorTest) &&
compilerConfiguration.hasCompiler &&
!compilerConfiguration.runRuntimeDespiteMissingCompileTimeError) {
// Do not attempt to run the compiled result. A compilation
@@ -744,9 +743,9 @@
return "/$prefixDartDir/$fileRelativeToDartDir";
}
- // Unreachable.
print("Cannot create URL for path $file. Not in build or dart directory.");
exit(1);
+ throw "unreachable";
}
String _uriForBrowserTest(String pathComponent) {
diff --git a/pkg/vm_snapshot_analysis/CHANGELOG.md b/pkg/vm_snapshot_analysis/CHANGELOG.md
index 36d229f..c637854 100644
--- a/pkg/vm_snapshot_analysis/CHANGELOG.md
+++ b/pkg/vm_snapshot_analysis/CHANGELOG.md
@@ -1,5 +1,8 @@
# Changelog
+## 0.5.4
+- Fix bug causing name clash for Type class.
+
## 0.5.3
- Add `compareProgramInfo` that takes in two program info objects and outputs
a `Map` object containing the diff data.
diff --git a/pkg/vm_snapshot_analysis/pubspec.yaml b/pkg/vm_snapshot_analysis/pubspec.yaml
index fce4b3d..1f7fb76 100644
--- a/pkg/vm_snapshot_analysis/pubspec.yaml
+++ b/pkg/vm_snapshot_analysis/pubspec.yaml
@@ -1,6 +1,6 @@
name: vm_snapshot_analysis
description: Utilities for analysing AOT snapshot size.
-version: 0.5.3
+version: 0.5.4
homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_snapshot_analysis
diff --git a/tests/lib/js/constructor_parameters_static_test.dart b/tests/lib/js/constructor_parameters_static_test.dart
index 3efa2a2..82b7b1e 100644
--- a/tests/lib/js/constructor_parameters_static_test.dart
+++ b/tests/lib/js/constructor_parameters_static_test.dart
@@ -17,10 +17,10 @@
class Foo {
external Foo({int? a});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
external factory Foo.fooFactory({int? a});
- // ^
- // [web] TODO(srujzs): Add error once supported.
+ // ^
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
}
@JS()
@@ -28,21 +28,21 @@
class Bar {
external Bar({int? a});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
// Factories of an anonymous class can only contain named parameters.
external factory Bar.barFactoryPositional(int? a);
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Factory constructors for @anonymous JS interop classes should not contain any positional parameters.
external factory Bar.barFactoryOptional([int? a]);
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Factory constructors for @anonymous JS interop classes should not contain any positional parameters.
external factory Bar.barFactoryMixedOptional(int? a, [int? b]);
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Factory constructors for @anonymous JS interop classes should not contain any positional parameters.
external factory Bar.barFactoryMixedNamed(int? a, {int? b});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Factory constructors for @anonymous JS interop classes should not contain any positional parameters.
// Named parameters are okay only for factories of an anonymous class.
external factory Bar.barFactoryNamed({int? a});
@@ -52,10 +52,10 @@
abstract class Baz {
external Baz({int? a});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
external factory Baz.bazFactory({int? a});
- // ^
- // [web] TODO(srujzs): Add error once supported.
+ // ^
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
}
main() {}
diff --git a/tests/lib/js/js_annotation_static_test.dart b/tests/lib/js/js_annotation_static_test.dart
index ef7dc40..a8d7cd7 100644
--- a/tests/lib/js/js_annotation_static_test.dart
+++ b/tests/lib/js/js_annotation_static_test.dart
@@ -17,27 +17,27 @@
@JS()
external Foo(int bar);
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Member has a JS interop annotation but the enclosing class does not.
@JS()
external factory Foo.fooFactory();
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Member has a JS interop annotation but the enclosing class does not.
@JS()
external int get bar;
// ^^^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Member has a JS interop annotation but the enclosing class does not.
@JS()
external set bar(int val);
// ^^^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Member has a JS interop annotation but the enclosing class does not.
@JS()
external int baz();
// ^^^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Member has a JS interop annotation but the enclosing class does not.
@JS()
external static int bazStatic();
// ^^^^^^^^^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Member has a JS interop annotation but the enclosing class does not.
}
@JS()
diff --git a/tests/lib/js/parameters_static_test.dart b/tests/lib/js/parameters_static_test.dart
index 0928ca5..11f875a 100644
--- a/tests/lib/js/parameters_static_test.dart
+++ b/tests/lib/js/parameters_static_test.dart
@@ -16,48 +16,48 @@
class Foo {
external int singleNamedArg({int? a});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
external int mixedNamedArgs(int a, {int? b});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
}
@JS()
class Bar {
external static int singleNamedArg({int? a});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
external static int mixedNamedArgs(int a, {int? b});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
}
external int singleNamedArg({int? a});
// ^
-// [web] TODO(srujzs): Add error once supported.
+// [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
external int mixedNamedArgs(int a, {int? b});
// ^
-// [web] TODO(srujzs): Add error once supported.
+// [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
@JS()
@anonymous
class Baz {
external int singleNamedArg({int? a});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
external int mixedNamedArgs(int a, {int? b});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
}
@JS()
abstract class Qux {
external int singleNamedArg({int? a});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
external int mixedNamedArgs(int a, {int? b});
// ^
- // [web] TODO(srujzs): Add error once supported.
+ // [web] Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.
}
main() {}
diff --git a/tools/VERSION b/tools/VERSION
index cd9f864..cf7150f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 10
PATCH 0
-PRERELEASE 19
+PRERELEASE 20
PRERELEASE_PATCH 0
\ No newline at end of file