Version 2.18.0-203.0.dev
Merge commit '65e8411498812312c7685eff283161bf4d620cf7' into 'dev'
diff --git a/DEPS b/DEPS
index d3febf3..e2d546a 100644
--- a/DEPS
+++ b/DEPS
@@ -107,7 +107,7 @@
"dartdoc_rev": "58348a98b992ce99b95d23131b67227bdb2b4875",
"devtools_rev": "51ac983d2db7eb19b3ce5956cb70b769d74fe784",
- "ffi_rev": "0c8364a728cfe4e4ba859c53b99d56b3dbe3add4",
+ "ffi_rev": "0c8364a728cfe4e4ba859c53b99d56b3dbe3add4", # dart-lang/ffi/issues/148
"file_rev": "0132eeedea2933513bf230513a766a8baeab0c4f",
"fixnum_rev": "164712f6547cdfb2709b752188186baf31fd1730",
"glob_rev": "e10eb2407c58427144004458ef85c9bbf7286e56",
@@ -122,7 +122,7 @@
"linter_rev": "1ddc70948d94f2449fec69a95e3ceb7b6b6c8348", # 1.25.0
"lints_rev": "8294e5648ab49474541527e2911e72e4c5aefe55",
"logging_rev": "f6979e3bc3b6e1847a08335b7eb6304e18986195",
- "markdown_rev": "73ad99eeddc1ecebd27faa3221e68c81dc8217eb", # 5.0.0
+ "markdown_rev": "e3f4bd28c9e61b522f75f291d4d6cfcfeccd83ee", # b/236358256
"markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
"matcher_rev": "12cdc5fbafd666ed908359ae215d5d0306087969",
"mime_rev": "0a75a41445eb642674a0a271eecde78cb025ee60",
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/rename_method_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/rename_method_parameter.dart
new file mode 100644
index 0000000..8a84fe8
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/dart/rename_method_parameter.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2022, 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/correction/dart/abstract_producer.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+class RenameMethodParameter extends CorrectionProducer {
+ String _oldName = '';
+ String _newName = '';
+
+ @override
+ List<Object> get fixArguments => [_oldName, _newName];
+
+ @override
+ FixKind get fixKind => DartFixKind.RENAME_METHOD_PARAMETER;
+
+ @override
+ Future<void> compute(ChangeBuilder builder) async {
+ final parameter = node.parent;
+ if (parameter is! FormalParameter) return;
+ var paramIdentifier = parameter.identifier;
+ if (paramIdentifier == null) return;
+
+ var method = parameter.thisOrAncestorOfType<MethodDeclaration>();
+ if (method == null) return;
+ var methodParameters = method.parameters;
+ if (methodParameters == null) return;
+
+ var classDeclaration = method.parent as Declaration;
+ var classElement = classDeclaration.declaredElement;
+ if (classElement is! ClassElement) return;
+
+ var parentMethod = classElement.lookUpInheritedMethod(
+ method.name.name, classElement.library);
+ if (parentMethod == null) return;
+
+ var parameters = methodParameters.parameters;
+ var parentParameters = parentMethod.parameters;
+ var oldName = paramIdentifier.name;
+
+ var i = parameters.indexOf(parameter);
+ if (0 <= i && i < parentParameters.length) {
+ var newName = parentParameters[i].name;
+
+ var collector = _Collector(newName, parameter.declaredElement!);
+ method.accept(collector);
+
+ if (!collector.error) {
+ _oldName = oldName;
+ _newName = newName;
+
+ await builder.addDartFileEdit(file, (builder) {
+ for (var i in collector.oldIdentifiers) {
+ builder.addSimpleReplacement(range.node(i), newName);
+ }
+ });
+ }
+ }
+ }
+}
+
+class _Collector extends RecursiveAstVisitor<void> {
+ var error = false;
+ final String newName;
+ final ParameterElement target;
+
+ final oldIdentifiers = <SimpleIdentifier>[];
+
+ _Collector(this.newName, this.target);
+
+ @override
+ void visitSimpleIdentifier(SimpleIdentifier node) {
+ if (error) return;
+
+ var nodeElement = node.staticElement;
+ if (nodeElement == target) {
+ oldIdentifiers.add(node);
+ } else if (node.name == newName) {
+ error = true;
+ }
+ }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
index 3461471..3f8f4d7 100644
--- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
+++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml
@@ -1584,7 +1584,7 @@
LintCode.avoid_relative_lib_imports:
status: hasFix
LintCode.avoid_renaming_method_parameters:
- status: needsEvaluation
+ status: hasFix
LintCode.avoid_return_types_on_setters:
status: hasFix
LintCode.avoid_returning_null:
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 9dd1286..ed8f791 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -1273,6 +1273,11 @@
DartFixKindPriority.DEFAULT,
"Remove 'var'",
);
+ static const RENAME_METHOD_PARAMETER = FixKind(
+ 'dart.fix.rename.methodParameter',
+ DartFixKindPriority.DEFAULT,
+ "Rename '{0}' to '{1}'",
+ );
static const RENAME_TO_CAMEL_CASE = FixKind(
'dart.fix.rename.toCamelCase',
DartFixKindPriority.DEFAULT,
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 8446643..c79ab5f 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -153,6 +153,7 @@
import 'package:analysis_server/src/services/correction/dart/remove_unused_local_variable.dart';
import 'package:analysis_server/src/services/correction/dart/remove_unused_parameter.dart';
import 'package:analysis_server/src/services/correction/dart/remove_var.dart';
+import 'package:analysis_server/src/services/correction/dart/rename_method_parameter.dart';
import 'package:analysis_server/src/services/correction/dart/rename_to_camel_case.dart';
import 'package:analysis_server/src/services/correction/dart/replace_Null_with_void.dart';
import 'package:analysis_server/src/services/correction/dart/replace_boolean_with_bool.dart';
@@ -401,6 +402,9 @@
LintNames.avoid_relative_lib_imports: [
ConvertToPackageImport.new,
],
+ LintNames.avoid_renaming_method_parameters: [
+ RenameMethodParameter.new,
+ ],
LintNames.avoid_return_types_on_setters: [
RemoveTypeAnnotation.new,
],
diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
index e37937f..eebcda7 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -29,6 +29,8 @@
static const String avoid_redundant_argument_values =
'avoid_redundant_argument_values';
static const String avoid_relative_lib_imports = 'avoid_relative_lib_imports';
+ static const String avoid_renaming_method_parameters =
+ 'avoid_renaming_method_parameters';
static const String avoid_return_types_on_setters =
'avoid_return_types_on_setters';
static const String avoid_returning_null_for_future =
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index 1d8a795..26b9a08 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -166,9 +166,7 @@
if (element is LocalElement) {
var targetRange = _getVisibleRange(target);
var elementRange = _getVisibleRange(element);
- return targetRange != null &&
- elementRange != null &&
- elementRange.intersects(targetRange);
+ return elementRange != null && elementRange.intersects(targetRange);
}
return false;
}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/rename_method_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/rename_method_parameter_test.dart
new file mode 100644
index 0000000..70faf54
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/rename_method_parameter_test.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2022, 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/correction/fix.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(RenameMethodParameterTest);
+ });
+}
+
+@reflectiveTest
+class RenameMethodParameterTest extends FixProcessorLintTest {
+ @override
+ FixKind get kind => DartFixKind.RENAME_METHOD_PARAMETER;
+
+ @override
+ String get lintCode => LintNames.avoid_renaming_method_parameters;
+
+ Future<void> test_conflict_parameters() async {
+ await resolveTestCode('''
+class A {
+ void m(a, b) {}
+}
+class B extends A {
+ void m(b, a) {
+ }
+}
+''');
+ await assertNoFix(
+ errorFilter: (error) => error.message.contains("parameter 'a'"));
+ }
+
+ Future<void> test_local_variable() async {
+ await resolveTestCode('''
+class A {
+ void m(a) {}
+}
+class B extends A {
+ void m(b) {
+ var a = '';
+ print(a);
+ }
+}
+''');
+ await assertNoFix();
+ }
+
+ Future<void> test_member() async {
+ await resolveTestCode('''
+class A {
+ void m(a) {}
+}
+class B extends A {
+ int? a;
+
+ void m(b) {
+ a = 1;
+ }
+}
+''');
+ await assertNoFix();
+ }
+
+ Future<void> test_rename() async {
+ await resolveTestCode('''
+class A {
+ void m(a, b, c) {}
+}
+class B extends A {
+ void m(a, d, c) {}
+}
+''');
+ await assertHasFix('''
+class A {
+ void m(a, b, c) {}
+}
+class B extends A {
+ void m(a, b, c) {}
+}
+''');
+ }
+
+ Future<void> test_shadowed() async {
+ await resolveTestCode('''
+class A {
+ void m(a) {}
+}
+class B extends A {
+ void m(b) {
+ print(b);
+ if (b > 0) {
+ var b = 0;
+ print(b);
+ }
+ }
+}
+''');
+ await assertHasFix('''
+class A {
+ void m(a) {}
+}
+class B extends A {
+ void m(a) {
+ print(a);
+ if (a > 0) {
+ var b = 0;
+ print(b);
+ }
+ }
+}
+''');
+ }
+
+ Future<void> test_topLevel() async {
+ await resolveTestCode('''
+int? a;
+class A {
+ void m(a) {}
+}
+class B extends A {
+ void m(b) {
+ a = 1;
+ }
+}
+''');
+ await assertNoFix();
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 58af344..768c4c6 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -188,6 +188,7 @@
import 'remove_unused_local_variable_test.dart' as remove_unused_local_variable;
import 'remove_unused_parameter_test.dart' as remove_unused_parameter;
import 'remove_var_test.dart' as remove_var;
+import 'rename_method_parameter_test.dart' as rename_method_parameter;
import 'rename_to_camel_case_test.dart' as rename_to_camel_case;
import 'replace_Null_with_void_test.dart' as replace_null_with_void;
import 'replace_boolean_with_bool_test.dart' as replace_boolean_with_bool;
@@ -398,6 +399,7 @@
remove_unused_parameter.main();
remove_var.main();
rename_to_camel_case.main();
+ rename_method_parameter.main();
replace_boolean_with_bool.main();
replace_cascade_with_dot.main();
replace_colon_with_equals.main();
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index feca390..0bc4b59 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -95,7 +95,8 @@
List<String> errorsPlain,
List<String> errorsColorized,
String invocationModes,
- String verbosityLevel) {
+ String verbosityLevel,
+ bool enableMirrors) {
final expFlags = <String>[];
if (experimentalFlags != null) {
for (String flag in experimentalFlags) {
@@ -107,7 +108,8 @@
return new CompilerOptions()
..fileSystem = fileSystem
..target = new VmTarget(new TargetFlags(
- enableNullSafety: nullSafety == kNullSafetyOptionStrong))
+ enableNullSafety: nullSafety == kNullSafetyOptionStrong,
+ supportMirrors: enableMirrors))
..packagesFileUri = packagesUri
..sdkSummary = platformKernelPath
..verbose = verbose
@@ -165,6 +167,7 @@
final String? packageConfig;
final String invocationModes;
final String verbosityLevel;
+ final bool enableMirrors;
// Code coverage and hot reload are only supported by incremental compiler,
// which is used if vm-service is enabled.
@@ -184,7 +187,8 @@
this.supportHotReload: false,
this.packageConfig: null,
this.invocationModes: '',
- this.verbosityLevel: Verbosity.defaultValue}) {
+ this.verbosityLevel: Verbosity.defaultValue,
+ required this.enableMirrors}) {
Uri? packagesUri = null;
final packageConfig = this.packageConfig ?? Platform.packageConfig;
if (packageConfig != null) {
@@ -208,7 +212,8 @@
errorsPlain,
errorsColorized,
invocationModes,
- verbosityLevel);
+ verbosityLevel,
+ enableMirrors);
}
Future<CompilerResult> compile(Uri script) {
@@ -295,7 +300,8 @@
List<String>? experimentalFlags,
String? packageConfig,
String invocationModes: '',
- String verbosityLevel: Verbosity.defaultValue})
+ String verbosityLevel: Verbosity.defaultValue,
+ required bool enableMirrors})
: super(isolateGroupId, fileSystem, platformKernelPath,
enableAsserts: enableAsserts,
nullSafety: nullSafety,
@@ -304,7 +310,8 @@
supportCodeCoverage: true,
packageConfig: packageConfig,
invocationModes: invocationModes,
- verbosityLevel: verbosityLevel);
+ verbosityLevel: verbosityLevel,
+ enableMirrors: enableMirrors);
factory IncrementalCompilerWrapper.forExpressionCompilationOnly(
Component component,
@@ -314,13 +321,15 @@
{bool enableAsserts: false,
List<String>? experimentalFlags,
String? packageConfig,
- String invocationModes: ''}) {
+ String invocationModes: '',
+ required bool enableMirrors}) {
IncrementalCompilerWrapper result = IncrementalCompilerWrapper(
isolateGroupId, fileSystem, platformKernelPath,
enableAsserts: enableAsserts,
experimentalFlags: experimentalFlags,
packageConfig: packageConfig,
- invocationModes: invocationModes);
+ invocationModes: invocationModes,
+ enableMirrors: enableMirrors);
result.generator = new IncrementalCompiler.forExpressionCompilationOnly(
component,
result.options,
@@ -349,7 +358,8 @@
nullSafety: nullSafety,
experimentalFlags: experimentalFlags,
packageConfig: packageConfig,
- invocationModes: invocationModes);
+ invocationModes: invocationModes,
+ enableMirrors: enableMirrors);
final generator = this.generator!;
// TODO(VM TEAM): This does not seem safe. What if cloning while having
// pending deltas for instance?
@@ -384,14 +394,16 @@
List<String>? experimentalFlags,
String? packageConfig,
String invocationModes: '',
- String verbosityLevel: Verbosity.defaultValue})
+ String verbosityLevel: Verbosity.defaultValue,
+ required bool enableMirrors})
: super(isolateGroupId, fileSystem, platformKernelPath,
enableAsserts: enableAsserts,
nullSafety: nullSafety,
experimentalFlags: experimentalFlags,
packageConfig: packageConfig,
invocationModes: invocationModes,
- verbosityLevel: verbosityLevel);
+ verbosityLevel: verbosityLevel,
+ enableMirrors: enableMirrors);
@override
Future<CompilerResult> compileInternal(Uri script) async {
@@ -428,7 +440,8 @@
String? multirootFilepaths,
String? multirootScheme,
String invocationModes: '',
- String verbosityLevel: Verbosity.defaultValue}) async {
+ String verbosityLevel: Verbosity.defaultValue,
+ required bool enableMirrors}) async {
IncrementalCompilerWrapper? compiler =
lookupIncrementalCompiler(isolateGroupId);
if (compiler != null) {
@@ -457,7 +470,8 @@
experimentalFlags: experimentalFlags,
packageConfig: packageConfig,
invocationModes: invocationModes,
- verbosityLevel: verbosityLevel);
+ verbosityLevel: verbosityLevel,
+ enableMirrors: enableMirrors);
}
isolateCompilers[isolateGroupId] = compiler;
}
@@ -513,6 +527,7 @@
final bool enableAsserts = request[16];
final List<String>? experimentalFlags =
request[17] != null ? request[17].cast<String>() : null;
+ final bool enableMirrors = request[18];
IncrementalCompilerWrapper? compiler = isolateCompilers[isolateGroupId];
@@ -595,7 +610,8 @@
component, isolateGroupId, fileSystem, null,
enableAsserts: enableAsserts,
experimentalFlags: experimentalFlags,
- packageConfig: dotPackagesFile);
+ packageConfig: dotPackagesFile,
+ enableMirrors: enableMirrors);
isolateCompilers[isolateGroupId] = compiler;
await compiler.compile(
component.mainMethod?.enclosingLibrary.importUri ??
@@ -776,6 +792,7 @@
final String? multirootScheme = request[13];
final String? workingDirectory = request[14];
final String verbosityLevel = request[15];
+ final bool enableMirrors = request[16];
Uri platformKernelPath;
List<int>? platformKernel = null;
if (request[3] is String) {
@@ -844,7 +861,8 @@
errorsPlain,
errorsColorized,
invocationModes,
- verbosityLevel);
+ verbosityLevel,
+ false);
// script should only be null for kUpdateSourcesTag.
await autoDetectNullSafetyMode(script!, options);
@@ -870,7 +888,8 @@
multirootFilepaths: multirootFilepaths,
multirootScheme: multirootScheme,
invocationModes: invocationModes,
- verbosityLevel: verbosityLevel);
+ verbosityLevel: verbosityLevel,
+ enableMirrors: enableMirrors);
} else {
FileSystem fileSystem = _buildFileSystem(
sourceFiles, platformKernel, multirootFilepaths, multirootScheme);
@@ -882,7 +901,8 @@
experimentalFlags: experimentalFlags,
packageConfig: packageConfig,
invocationModes: invocationModes,
- verbosityLevel: verbosityLevel);
+ verbosityLevel: verbosityLevel,
+ enableMirrors: enableMirrors);
}
CompilationResult result;
@@ -1044,6 +1064,7 @@
null /* multirootScheme */,
null /* original working directory */,
'all' /* CFE logging mode */,
+ true /* enableMirrors */,
];
await _processLoadRequest(request);
}
diff --git a/runtime/tests/vm/dart/enable_mirrors_lib_false.dart b/runtime/tests/vm/dart/enable_mirrors_lib_false.dart
new file mode 100644
index 0000000..040b701
--- /dev/null
+++ b/runtime/tests/vm/dart/enable_mirrors_lib_false.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, 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.
+
+// Auxiliary library for enable_mirrors_test.dart.
+
+bool dartLibraryMirrorsConditionalImport = false;
diff --git a/runtime/tests/vm/dart/enable_mirrors_lib_true.dart b/runtime/tests/vm/dart/enable_mirrors_lib_true.dart
new file mode 100644
index 0000000..5aa936c
--- /dev/null
+++ b/runtime/tests/vm/dart/enable_mirrors_lib_true.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, 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.
+
+// Auxiliary library for enable_mirrors_test.dart.
+
+bool dartLibraryMirrorsConditionalImport = true;
diff --git a/runtime/tests/vm/dart/enable_mirrors_test.dart b/runtime/tests/vm/dart/enable_mirrors_test.dart
new file mode 100644
index 0000000..e9f8e19
--- /dev/null
+++ b/runtime/tests/vm/dart/enable_mirrors_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable-mirrors=false
+
+// Verfies that '--enable-mirrors=false' affects conditional imports and
+// constant bool.fromEnvironment.
+
+import "package:expect/expect.dart";
+
+import 'enable_mirrors_lib_false.dart'
+ if (dart.library.mirrors) 'enable_mirrors_lib_true.dart';
+
+main() {
+ Expect.isFalse(const bool.fromEnvironment('dart.library.mirrors'));
+ Expect.isFalse(dartLibraryMirrorsConditionalImport);
+}
diff --git a/runtime/tests/vm/dart_2/enable_mirrors_lib_false.dart b/runtime/tests/vm/dart_2/enable_mirrors_lib_false.dart
new file mode 100644
index 0000000..d3d682a
--- /dev/null
+++ b/runtime/tests/vm/dart_2/enable_mirrors_lib_false.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2022, 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.
+
+// Auxiliary library for enable_mirrors_test.dart.
+
+// @dart = 2.9
+
+bool dartLibraryMirrorsConditionalImport = false;
diff --git a/runtime/tests/vm/dart_2/enable_mirrors_lib_true.dart b/runtime/tests/vm/dart_2/enable_mirrors_lib_true.dart
new file mode 100644
index 0000000..f824c2c
--- /dev/null
+++ b/runtime/tests/vm/dart_2/enable_mirrors_lib_true.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2022, 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.
+
+// Auxiliary library for enable_mirrors_test.dart.
+
+// @dart = 2.9
+
+bool dartLibraryMirrorsConditionalImport = true;
diff --git a/runtime/tests/vm/dart_2/enable_mirrors_test.dart b/runtime/tests/vm/dart_2/enable_mirrors_test.dart
new file mode 100644
index 0000000..072c740
--- /dev/null
+++ b/runtime/tests/vm/dart_2/enable_mirrors_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable-mirrors=false
+
+// Verfies that '--enable-mirrors=false' affects conditional imports and
+// constant bool.fromEnvironment.
+
+// @dart = 2.9
+
+import "package:expect/expect.dart";
+
+import 'enable_mirrors_lib_false.dart'
+ if (dart.library.mirrors) 'enable_mirrors_lib_true.dart';
+
+main() {
+ Expect.isFalse(const bool.fromEnvironment('dart.library.mirrors'));
+ Expect.isFalse(dartLibraryMirrorsConditionalImport);
+}
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index c6f3222..0ffba9b 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -699,6 +699,10 @@
experimental_flags_object.value.as_array.values = experimental_flags_array;
experimental_flags_object.value.as_array.length = num_experimental_flags;
+ Dart_CObject enable_mirrors;
+ enable_mirrors.type = Dart_CObject_kBool;
+ enable_mirrors.value.as_bool = FLAG_enable_mirrors;
+
Dart_CObject message;
message.type = Dart_CObject_kArray;
Dart_CObject* message_arr[] = {&tag,
@@ -718,7 +722,8 @@
&dills_object,
&num_blob_loads,
&enable_asserts,
- &experimental_flags_object};
+ &experimental_flags_object,
+ &enable_mirrors};
message.value.as_array.values = message_arr;
message.value.as_array.length = ARRAY_SIZE(message_arr);
@@ -942,6 +947,10 @@
verbosity_str.value.as_string =
const_cast<char*>(KernelCompilationVerbosityLevelToString(verbosity));
+ Dart_CObject enable_mirrors;
+ enable_mirrors.type = Dart_CObject_kBool;
+ enable_mirrors.value.as_bool = FLAG_enable_mirrors;
+
Dart_CObject* message_arr[] = {&tag,
&send_port,
&uri,
@@ -957,7 +966,8 @@
&multiroot_filepaths_object,
&multiroot_scheme_object,
&original_working_directory_object,
- &verbosity_str};
+ &verbosity_str,
+ &enable_mirrors};
message.value.as_array.values = message_arr;
message.value.as_array.length = ARRAY_SIZE(message_arr);
// Send the message.
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
index 45773c0..005f182 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridLayout.dart
@@ -2,9 +2,6 @@
// 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.
-// @dart = 2.9
-
-
part of layout;
/**
@@ -47,9 +44,9 @@
// - Optimize for the "incremental update" cases
class GridLayout extends ViewLayout {
/** Configuration parameters defined in CSS. */
- final GridTrackList rows;
- final GridTrackList columns;
- final GridTemplate template;
+ final GridTrackList? rows;
+ final GridTrackList? columns;
+ final GridTemplate? template;
/** The default sizing for new rows. */
final TrackSizing rowSizing;
@@ -61,33 +58,33 @@
* This stores the grid's size during a layout.
* Used for rows/columns with % or fr units.
*/
- int _gridWidth, _gridHeight;
+ int? _gridWidth, _gridHeight;
/**
* During a layout, this stores all row/column size information.
* Because grid-items can implicitly specify their own rows/columns, we can't
* compute this until we know the set of items.
*/
- List<GridTrack> _rowTracks, _columnTracks;
+ late List<GridTrack> _rowTracks, _columnTracks;
/** During a layout, tracks which dimension we're processing. */
- Dimension _dimension;
+ Dimension? _dimension;
GridLayout(Positionable view)
: rows = _GridTrackParser.parse(view.customStyle['grid-rows']),
columns = _GridTrackParser.parse(view.customStyle['grid-columns']),
template = _GridTemplateParser.parse(view.customStyle['grid-template']),
- rowSizing = _GridTrackParser
- .parseTrackSizing(view.customStyle['grid-row-sizing']),
- columnSizing = _GridTrackParser
- .parseTrackSizing(view.customStyle['grid-column-sizing']),
+ rowSizing = _GridTrackParser.parseTrackSizing(
+ view.customStyle['grid-row-sizing']),
+ columnSizing = _GridTrackParser.parseTrackSizing(
+ view.customStyle['grid-column-sizing']),
super(view) {
- _rowTracks = rows != null ? rows.tracks : new List<GridTrack>();
- _columnTracks = columns != null ? columns.tracks : new List<GridTrack>();
+ _rowTracks = rows?.tracks ?? [];
+ _columnTracks = columns?.tracks ?? [];
}
- int get currentWidth => _gridWidth;
- int get currentHeight => _gridHeight;
+ int? get currentWidth => _gridWidth;
+ int? get currentHeight => _gridHeight;
void cacheExistingBrowserLayout() {
// We don't need to do anything as we don't rely on the _cachedViewRect
@@ -97,11 +94,11 @@
// TODO(jacobr): cleanup this method so that it returns a Future
// rather than taking a Completer as an argument.
/** The main entry point for layout computation. */
- void measureLayout(Future<Size> size, Completer<bool> changed) {
+ void measureLayout(Future<Size> size, Completer<bool>? changed) {
_ensureAllTracks();
size.then((value) {
- _gridWidth = value.width;
- _gridHeight = value.height;
+ _gridWidth = value.width as int?;
+ _gridHeight = value.height as int?;
if (_rowTracks.length > 0 && _columnTracks.length > 0) {
_measureTracks();
@@ -135,7 +132,7 @@
}
num _getRemainingSpace(List<GridTrack> tracks) {
- num remaining = _getGridContentSize();
+ num remaining = _getGridContentSize()!;
remaining -= CollectionUtils.sum(tracks, (t) => t.usedBreadth);
return Math.max(0, remaining);
}
@@ -152,7 +149,7 @@
void _computeUsedBreadthOfTracks(List<GridTrack> tracks) {
// TODO(jmesserly): as a performance optimization we could cache this
final items = view.childViews.map((view_) => view_.layout).toList();
- CollectionUtils.sortBy(items, (item) => _getSpanCount(item));
+ CollectionUtils.sortBy(items, (item) => _getSpanCount(item)!);
// 1. Initialize per Grid Track variables
for (final t in tracks) {
@@ -224,7 +221,7 @@
num finalPosition = position;
for (int i = 0; i < tracks.length; i++) {
- int startEdge = tracks[i].start;
+ int startEdge = tracks[i].start as int;
int endEdge;
if (i < tracks.length - 1) {
endEdge = tracks[i + 1].start.round();
@@ -266,7 +263,7 @@
CollectionUtils.sortBy(fractionTracks, (t) => t.tempBreadth);
num spaceNeededFromFractionTracks = _getRemainingSpace(tracks);
- num currentBandFractionBreadth = 0;
+ num? currentBandFractionBreadth = 0;
num accumulatedFractions = 0;
for (final t in fractionTracks) {
if (t.tempBreadth != currentBandFractionBreadth) {
@@ -287,7 +284,7 @@
* computed, updatedBreadth, that represents the Grid Track's share of
* freeSpace.
*/
- void _distributeSpaceToTracks(List<GridTrack> tracks, num freeSpace,
+ void _distributeSpaceToTracks(List<GridTrack?> tracks, num? freeSpace,
_BreadthAccumulator breadth, bool ignoreMaxBreadth) {
// TODO(jmesserly): in some cases it would be safe to sort the passed in
// list in place. Not always though.
@@ -298,9 +295,9 @@
// their maxBreadth values. Because there are different MaxBreadths
// assigned to the different Grid Tracks, this can result in uneven growth.
for (int i = 0; i < tracks.length; i++) {
- num share = freeSpace / (tracks.length - i);
- share = Math.min(share, tracks[i].maxBreadth);
- tracks[i].tempBreadth = share;
+ num share = freeSpace! / (tracks.length - i);
+ share = Math.min(share, tracks[i]!.maxBreadth);
+ tracks[i]!.tempBreadth = share;
freeSpace -= share;
}
@@ -309,10 +306,10 @@
// evenly and assign it to each Grid Track without regard for its
// maxBreadth. This phase of growth will always be even, but only occurs
// when the ignoreMaxBreadth flag is true.
- if (freeSpace > 0 && ignoreMaxBreadth) {
+ if (freeSpace! > 0 && ignoreMaxBreadth) {
for (int i = 0; i < tracks.length; i++) {
- final share = freeSpace / (tracks.length - i);
- tracks[i].tempBreadth += share;
+ final share = freeSpace! / (tracks.length - i);
+ tracks[i]!.tempBreadth = tracks[i]!.tempBreadth + share;
freeSpace -= share;
}
}
@@ -320,7 +317,7 @@
// Note: the spec has us updating all grid tracks, not just the passed in
// tracks, but I think that's a spec bug.
for (final t in tracks) {
- t.updatedBreadth = Math.max(t.updatedBreadth, t.tempBreadth);
+ t!.updatedBreadth = Math.max(t.updatedBreadth, t.tempBreadth);
}
}
@@ -352,7 +349,7 @@
// Remember that we need to update the sizes on these tracks
tracks.addAll(spannedTracks);
- // Each time we transition to a new spanCount, update any modified tracks
+ // Each time we transition to a spanCount, update any modified tracks
bool spanCountFinished = false;
if (i + 1 == items.length) {
spanCountFinished = true;
@@ -362,7 +359,7 @@
if (spanCountFinished) {
for (final t in tracks) {
- breadth.setSize(t, Math.max(breadth.getSize(t), t.updatedBreadth));
+ breadth.setSize(t, Math.max(breadth.getSize(t)!, t.updatedBreadth));
}
tracks = [];
}
@@ -373,14 +370,14 @@
* Returns true if we have an appropriate content sized dimension, and don't
* cross a fractional track.
*/
- static bool _hasContentSizedTracks(Iterable<GridTrack> tracks,
+ static bool _hasContentSizedTracks(Iterable<GridTrack?> tracks,
ContentSizeMode sizeMode, _BreadthAccumulator breadth) {
for (final t in tracks) {
final fn = breadth.getSizingFunction(t);
if (sizeMode == ContentSizeMode.MAX && fn.isMaxContentSized ||
sizeMode == ContentSizeMode.MIN && fn.isContentSized) {
// Make sure we don't cross a fractional track
- return tracks.length == 1 || !tracks.any((t_) => t_.isFractional);
+ return tracks.length == 1 || !tracks.any((t_) => t_!.isFractional);
}
}
return false;
@@ -400,7 +397,7 @@
// Fill in tracks
for (int i = first; i < length; i++) {
if (tracks[i] == null) {
- tracks[i] = new GridTrack(sizing);
+ tracks[i] = GridTrack(sizing);
}
}
}
@@ -409,7 +406,7 @@
* Scans children creating GridLayoutParams as needed, and creates all of the
* rows and columns that we will need.
*
- * Note: this can potentially create new rows/columns, so this needs to be
+ * Note: this can potentially create new qrows/columns, so this needs to be
* run before the track sizing algorithm.
*/
void _ensureAllTracks() {
@@ -417,9 +414,9 @@
for (final child in items) {
if (child.layoutParams == null) {
- final p = new GridLayoutParams(child.view, this);
- _ensureTrack(_rowTracks, rowSizing, p.row, p.rowSpan);
- _ensureTrack(_columnTracks, columnSizing, p.column, p.columnSpan);
+ final p = GridLayoutParams(child.view, this);
+ _ensureTrack(_rowTracks, rowSizing, p.row!, p.rowSpan!);
+ _ensureTrack(_columnTracks, columnSizing, p.column!, p.columnSpan!);
child.layoutParams = p;
}
child.cacheExistingBrowserLayout();
@@ -433,12 +430,12 @@
final items = view.childViews.map((view_) => view_.layout);
for (final item in items) {
- GridLayoutParams childLayout = item.layoutParams;
+ GridLayoutParams childLayout = item.layoutParams as GridLayoutParams;
var xPos = _getTrackLocationX(childLayout);
var yPos = _getTrackLocationY(childLayout);
- int left = xPos.start, width = xPos.length;
- int top = yPos.start, height = yPos.length;
+ int? left = xPos.start, width = xPos.length;
+ int? top = yPos.start, height = yPos.length;
// Somewhat counterintuitively (at least to me):
// grid-col-align is the horizontal alignment
@@ -446,11 +443,11 @@
xPos = childLayout.columnAlign.align(xPos, item.currentWidth);
yPos = childLayout.rowAlign.align(yPos, item.currentHeight);
- item.setBounds(xPos.start, yPos.start, xPos.length, yPos.length);
+ item.setBounds(xPos.start, yPos.start, xPos.length!, yPos.length!);
}
}
- num _getGridContentSize() {
+ num? _getGridContentSize() {
if (_dimension == Dimension.WIDTH) {
return _gridWidth;
} else if (_dimension == Dimension.HEIGHT) {
@@ -459,55 +456,52 @@
}
_GridLocation _getTrackLocationX(GridLayoutParams childLayout) {
- int start = childLayout.column - 1;
- int end = start + childLayout.columnSpan - 1;
+ int start = childLayout.column! - 1;
+ int end = start + childLayout.columnSpan! - 1;
- start = _columnTracks[start].start;
- end = _columnTracks[end].end;
+ start = _columnTracks[start].start as int;
+ end = _columnTracks[end].end as int;
- return new _GridLocation(start, end - start);
+ return _GridLocation(start, end - start);
}
_GridLocation _getTrackLocationY(GridLayoutParams childLayout) {
- int start = childLayout.row - 1;
- int end = start + childLayout.rowSpan - 1;
+ int start = childLayout.row! - 1;
+ int end = start + childLayout.rowSpan! - 1;
- start = _rowTracks[start].start;
- end = _rowTracks[end].end;
+ start = _rowTracks[start].start as int;
+ end = _rowTracks[end].end as int;
- return new _GridLocation(start, end - start);
+ return _GridLocation(start, end - start);
}
/** Gets the tracks that this item crosses. */
// TODO(jmesserly): might be better to return an iterable
- List<GridTrack> _getTracks(ViewLayout item) {
- GridLayoutParams childLayout = item.layoutParams;
+ List<GridTrack?> _getTracks(ViewLayout item) {
+ GridLayoutParams? childLayout = item.layoutParams as GridLayoutParams?;
- int start, span;
- List<GridTrack> tracks;
+ int? start, span;
+ List<GridTrack>? tracks;
if (_dimension == Dimension.WIDTH) {
- start = childLayout.column - 1;
+ start = childLayout!.column! - 1;
span = childLayout.columnSpan;
tracks = _columnTracks;
} else if (_dimension == Dimension.HEIGHT) {
- start = childLayout.row - 1;
+ start = childLayout!.row! - 1;
span = childLayout.rowSpan;
tracks = _rowTracks;
}
- assert(start >= 0 && span >= 1);
+ assert(start! >= 0 && span! >= 1);
- final result = new List<GridTrack>(span);
- for (int i = 0; i < span; i++) {
- result[i] = tracks[start + i];
- }
+ final result = List<GridTrack>.generate(span!, (i) => tracks![start! + i]);
return result;
}
- int _getSpanCount(ViewLayout item) {
- GridLayoutParams childLayout = item.layoutParams;
+ int? _getSpanCount(ViewLayout item) {
+ GridLayoutParams? childLayout = item.layoutParams as GridLayoutParams?;
return (_dimension == Dimension.WIDTH
- ? childLayout.columnSpan
- : childLayout.rowSpan);
+ ? childLayout!.columnSpan
+ : childLayout!.rowSpan);
}
}
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.dart
index f2de0f1..c47f2ca 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParams.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
part of layout;
/**
@@ -16,25 +14,24 @@
// field ends up being mentioned 4 times instead of just twice.
class GridLayoutParams extends LayoutParams {
/** The coordinates of this item in the grid. */
- int row;
- int column;
- int rowSpan;
- int columnSpan;
- int layer;
+ int? row;
+ int? column;
+ int? rowSpan;
+ int? columnSpan;
+ int? layer;
/** Alignment within its box */
GridItemAlignment rowAlign;
GridItemAlignment columnAlign;
- GridLayoutParams(Positionable view, GridLayout layout) : super(view.node) {
+ GridLayoutParams(Positionable view, GridLayout layout)
+ : rowAlign =
+ GridItemAlignment.fromString(view.customStyle['grid-row-align']),
+ columnAlign =
+ GridItemAlignment.fromString(view.customStyle['grid-column-align']),
+ super(view.node) {
// TODO(jmesserly): this can be cleaned up a lot by just passing "view"
// into the parsers.
-
- rowAlign =
- new GridItemAlignment.fromString(view.customStyle['grid-row-align']);
- columnAlign =
- new GridItemAlignment.fromString(view.customStyle['grid-column-align']);
-
layer = StringUtils.parseInt(view.customStyle['grid-layer'], 0);
rowSpan = StringUtils.parseInt(view.customStyle['grid-row-span']);
@@ -45,7 +42,7 @@
row = line.start;
if (line.length != null) {
if (rowSpan != null) {
- throw new UnsupportedError(
+ throw UnsupportedError(
'grid-row-span cannot be with grid-row that defines an end');
}
rowSpan = line.length;
@@ -59,14 +56,14 @@
column = line.start;
if (line.length != null) {
if (columnSpan != null) {
- throw new UnsupportedError(
+ throw UnsupportedError(
'grid-column-span cannot be with grid-column that defines an end');
}
columnSpan = line.length;
}
}
- String cell = _GridTemplateParser.parseCell(view.customStyle['grid-cell']);
+ String? cell = _GridTemplateParser.parseCell(view.customStyle['grid-cell']);
if (cell != null && cell != 'none') {
// TODO(jmesserly): I didn't see anything spec'd about conflicts and
// error handling. For now, throw an error on a misconfigured view.
@@ -76,16 +73,16 @@
column != null ||
rowSpan != null ||
columnSpan != null) {
- throw new UnsupportedError(
+ throw UnsupportedError(
'grid-cell cannot be used with grid-row and grid-column');
}
if (layout.template == null) {
- throw new UnsupportedError(
+ throw UnsupportedError(
'grid-cell requires that grid-template is set on the parent');
}
- final rect = layout.template.lookupCell(cell);
+ final rect = layout.template!.lookupCell(cell);
row = rect.row;
column = rect.column;
rowSpan = rect.rowSpan;
@@ -96,7 +93,7 @@
if (columnSpan == null) columnSpan = 1;
if (row == null && column == null) {
- throw new UnsupportedError('grid-flow is not implemented' +
+ throw UnsupportedError('grid-flow is not implemented' +
' so at least one row or one column must be defined');
}
@@ -104,6 +101,6 @@
if (column == null) column = 1;
}
- assert(row > 0 && rowSpan > 0 && column > 0 && columnSpan > 0);
+ assert(row! > 0 && rowSpan! > 0 && column! > 0 && columnSpan! > 0);
}
}
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart
index 7cc87e8..009392a 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridLayoutParser.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
part of layout;
/**
@@ -56,7 +54,7 @@
}
void _error(String msg) {
- throw new SyntaxErrorException(msg, _src, _offset);
+ throw SyntaxErrorException(msg, _src, _offset);
}
int get length => _src.length;
@@ -132,7 +130,7 @@
}
}
- String _maybeEatString() {
+ String? _maybeEatString() {
// TODO(jmesserly): make this match CSS string parsing
String quote = "'";
if (!_maybeEat(quote)) {
@@ -171,7 +169,7 @@
}
/** Eats an integer. */
- int _maybeEatInt() {
+ int? _maybeEatInt() {
int start = _offset;
bool dot = false;
while (_offset < length && _isDigit(_peekChar())) {
@@ -186,8 +184,8 @@
}
/** Eats an integer. */
- int _eatInt() {
- int result = _maybeEatInt();
+ int? _eatInt() {
+ int? result = _maybeEatInt();
if (result == null) {
_error('expected positive integer');
}
@@ -224,37 +222,37 @@
_GridTemplateParser._internal(String src) : super(src);
/** Parses the grid-rows and grid-columns CSS properties into object form. */
- static GridTemplate parse(String str) {
+ static GridTemplate? parse(String? str) {
if (str == null) return null;
- final p = new _GridTemplateParser._internal(str);
+ final p = _GridTemplateParser._internal(str);
final result = p._parseTemplate();
p._eatEnd();
return result;
}
/** Parses a grid-cell value. */
- static String parseCell(String str) {
+ static String? parseCell(String? str) {
if (str == null) return null;
- final p = new _GridTemplateParser._internal(str);
+ final p = _GridTemplateParser._internal(str);
final result = p._maybeEatString();
p._eatEnd();
return result;
}
// => <string>+ | 'none'
- GridTemplate _parseTemplate() {
+ GridTemplate? _parseTemplate() {
if (_maybeEat('none')) {
return null;
}
- final rows = new List<String>();
- String row;
+ final rows = <String?>[];
+ String? row;
while ((row = _maybeEatString()) != null) {
rows.add(row);
}
if (rows.length == 0) {
_error('expected at least one cell, or "none"');
}
- return new GridTemplate(rows);
+ return GridTemplate(rows);
}
}
@@ -263,9 +261,9 @@
_GridItemParser._internal(String src) : super(src);
/** Parses the grid-rows and grid-columns CSS properties into object form. */
- static _GridLocation parse(String cell, GridTrackList list) {
+ static _GridLocation? parse(String? cell, GridTrackList? list) {
if (cell == null) return null;
- final p = new _GridItemParser._internal(cell);
+ final p = _GridItemParser._internal(cell);
final result = p._parseTrack(list);
p._eatEnd();
return result;
@@ -274,27 +272,27 @@
// [ [ <integer> | <string> | 'start' | 'end' ]
// [ <integer> | <string> | 'start' | 'end' ]? ]
// | 'auto'
- _GridLocation _parseTrack(GridTrackList list) {
+ _GridLocation? _parseTrack(GridTrackList? list) {
if (_maybeEat('auto')) {
return null;
}
- int start = _maybeParseLine(list);
+ int? start = _maybeParseLine(list);
if (start == null) {
_error('expected row/column number or name');
}
- int end = _maybeParseLine(list);
- int span = null;
+ int? end = _maybeParseLine(list);
+ int? span = null;
if (end != null) {
- span = end - start;
+ span = end - start!;
if (span <= 0) {
_error('expected row/column span to be a positive integer');
}
}
- return new _GridLocation(start, span);
+ return _GridLocation(start, span);
}
// [ <integer> | <string> | 'start' | 'end' ]
- int _maybeParseLine(GridTrackList list) {
+ int? _maybeParseLine(GridTrackList? list) {
if (_maybeEat('start')) {
return 1;
} else if (_maybeEat('end')) {
@@ -303,14 +301,14 @@
// TODO(jmesserly): this won't interact properly with implicit
// rows/columns. Instead it will snap to the number of tracks at the point
// where it is evaluated.
- return list.tracks.length + 1;
+ return list!.tracks.length + 1;
}
- String name = _maybeEatString();
+ String? name = _maybeEatString();
if (name == null) {
return _maybeEatInt();
} else {
- int edge = list.lineNames[name];
+ int? edge = list!.lineNames[name];
if (edge == null) {
_error('row/column name "$name" not found in the parent\'s '
' grid-row/grid-columns properties');
@@ -329,17 +327,17 @@
// CSS units, support for all escape sequences, etc.
class _GridTrackParser extends _Parser {
final List<GridTrack> _tracks;
- final Map<String, int> _lineNames;
+ final Map<String?, int> _lineNames;
_GridTrackParser._internal(String src)
- : _tracks = new List<GridTrack>(),
- _lineNames = new Map<String, int>(),
+ : _tracks = <GridTrack>[],
+ _lineNames = Map<String?, int>(),
super(src);
/** Parses the grid-rows and grid-columns CSS properties into object form. */
- static GridTrackList parse(String str) {
+ static GridTrackList? parse(String? str) {
if (str == null) return null;
- final p = new _GridTrackParser._internal(str);
+ final p = _GridTrackParser._internal(str);
final result = p._parseTrackList();
p._eatEnd();
return result;
@@ -349,28 +347,28 @@
* Parses the grid-row-sizing and grid-column-sizing CSS properties into
* object form.
*/
- static TrackSizing parseTrackSizing(String str) {
+ static TrackSizing parseTrackSizing(String? str) {
if (str == null) str = 'auto';
- final p = new _GridTrackParser._internal(str);
+ final p = _GridTrackParser._internal(str);
final result = p._parseTrackMinmax();
p._eatEnd();
return result;
}
// <track-list> => [ [ <string> ]* <track-group> [ <string> ]* ]+ | 'none'
- GridTrackList _parseTrackList() {
+ GridTrackList? _parseTrackList() {
if (_maybeEat('none')) {
return null;
}
_parseTrackListHelper();
- return new GridTrackList(_tracks, _lineNames);
+ return GridTrackList(_tracks, _lineNames);
}
/** Code shared by _parseTrackList and _parseTrackGroup */
- void _parseTrackListHelper([List<GridTrack> resultTracks = null]) {
+ void _parseTrackListHelper([List<GridTrack>? resultTracks = null]) {
_maybeEatWhitespace();
while (!endOfInput) {
- String name;
+ String? name;
while ((name = _maybeEatString()) != null) {
_lineNames[name] = _tracks.length + 1; // should be 1-based
}
@@ -384,7 +382,7 @@
if (_peekChar() == _Parser.R_PAREN) {
return;
}
- resultTracks.add(new GridTrack(_parseTrackMinmax()));
+ resultTracks.add(GridTrack(_parseTrackMinmax()));
} else {
_parseTrackGroup();
}
@@ -398,11 +396,11 @@
// | <track-minmax>
void _parseTrackGroup() {
if (_maybeEat('(')) {
- final tracks = new List<GridTrack>();
+ final tracks = <GridTrack>[];
_parseTrackListHelper(tracks);
_eat(')');
if (_maybeEat('[')) {
- num expand = _eatInt();
+ num expand = _eatInt()!;
_eat(']');
if (expand <= 0) {
@@ -419,7 +417,7 @@
}
}
} else {
- _tracks.add(new GridTrack(_parseTrackMinmax()));
+ _tracks.add(GridTrack(_parseTrackMinmax()));
}
}
@@ -434,10 +432,10 @@
_eat(',');
final max = _parseTrackBreadth();
_eat(')');
- return new TrackSizing(min, max);
+ return TrackSizing(min, max);
} else {
final breadth = _parseTrackBreadth();
- return new TrackSizing(breadth, breadth);
+ return TrackSizing(breadth, breadth);
}
}
@@ -460,9 +458,9 @@
}
if (units == 'fr') {
- return new FractionSizing(value);
+ return FractionSizing(value);
} else {
- return new FixedSizing(value, units);
+ return FixedSizing(value, units);
}
}
}
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.dart b/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.dart
index 2fa6eb9..8baa1fb 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/GridTracks.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
part of layout;
// This file has classes representing the grid tracks and grid template
@@ -21,7 +19,7 @@
* is used as a start or end, it might be interpreted exclusively or
* inclusively.
*/
- final Map<String, int> lineNames;
+ final Map<String?, int> lineNames;
GridTrackList(this.tracks, this.lineNames) {}
}
@@ -32,15 +30,15 @@
* The start position of this track. Equal to the sum of previous track's
* usedBreadth.
*/
- num start;
+ late num start;
/** The final computed breadth of this track. */
- num usedBreadth;
+ late num usedBreadth;
// Fields used internally by the sizing algorithm
- num maxBreadth;
- num updatedBreadth;
- num tempBreadth;
+ late num maxBreadth;
+ late num updatedBreadth;
+ late num tempBreadth;
final TrackSizing sizing;
@@ -50,7 +48,7 @@
* Support for the feature that repeats rows and columns, e.g.
* [:grid-columns: 10px ("content" 250px 10px)[4]:]
*/
- GridTrack clone() => new GridTrack(sizing.clone());
+ GridTrack clone() => GridTrack(sizing.clone());
/** The min sizing function for the track. */
SizingFunction get minSizing => sizing.min;
@@ -69,7 +67,7 @@
final String value;
// 'start' | 'end' | 'center' | 'stretch'
- GridItemAlignment.fromString(String value)
+ GridItemAlignment.fromString(String? value)
: this.value = (value == null) ? 'stretch' : value {
switch (this.value) {
case 'start':
@@ -78,24 +76,25 @@
case 'stretch':
break;
default:
- throw new UnsupportedError('invalid row/column alignment "$value"');
+ throw UnsupportedError('invalid row/column alignment "$value"');
}
}
- _GridLocation align(_GridLocation span, int size) {
+ _GridLocation align(_GridLocation span, int? size) {
switch (value) {
case 'start':
- return new _GridLocation(span.start, size);
+ return _GridLocation(span.start, size);
case 'end':
- return new _GridLocation(span.end - size, size);
+ return _GridLocation(span.end - size!, size);
case 'center':
- size = Math.min(size, span.length);
- num center = span.start + span.length / 2;
+ size = Math.min(size!, span.length!);
+ num center = span.start! + span.length! / 2;
num left = center - size / 2;
- return new _GridLocation(left.round(), size);
+ return _GridLocation(left.round(), size);
case 'stretch':
return span;
}
+ throw UnsupportedError('invalid row/column alignment "$value"');
}
}
@@ -107,23 +106,23 @@
final Map<int, _GridTemplateRect> _rects;
final int _numRows;
- GridTemplate(List<String> rows)
- : _rects = new Map<int, _GridTemplateRect>(),
+ GridTemplate(List<String?> rows)
+ : _rects = <int, _GridTemplateRect>{},
_numRows = rows.length {
_buildRects(rows);
}
/** Scans the template strings and computes bounds for each one. */
- void _buildRects(List<String> templateRows) {
+ void _buildRects(List<String?> templateRows) {
for (int r = 0; r < templateRows.length; r++) {
- String row = templateRows[r];
+ String row = templateRows[r]!;
for (int c = 0; c < row.length; c++) {
int cell = row.codeUnitAt(c);
final rect = _rects[cell];
if (rect != null) {
rect.add(r + 1, c + 1);
} else {
- _rects[cell] = new _GridTemplateRect(cell, r + 1, c + 1);
+ _rects[cell] = _GridTemplateRect(cell, r + 1, c + 1);
}
}
}
@@ -139,12 +138,12 @@
*/
_GridTemplateRect lookupCell(String cell) {
if (cell.length != 1) {
- throw new UnsupportedError(
+ throw UnsupportedError(
'grid-cell "$cell" must be a one character string');
}
final rect = _rects[cell.codeUnitAt(0)];
if (rect == null) {
- throw new UnsupportedError(
+ throw UnsupportedError(
'grid-cell "$cell" not found in parent\'s grid-template');
}
return rect;
@@ -171,8 +170,8 @@
if (expected != _count) {
// TODO(jmesserly): not sure if we should throw here, due to CSS's
// permissiveness. At the moment we're noisy about errors.
- String cell = new String.fromCharCodes([_char]);
- throw new UnsupportedError('grid-template "$cell"'
+ String cell = String.fromCharCodes([_char]);
+ throw UnsupportedError('grid-template "$cell"'
' is not square, expected $expected cells but got $_count');
}
}
@@ -183,8 +182,8 @@
* grid-column during parsing.
*/
class _GridLocation {
- final int start, length;
+ final int? start, length;
_GridLocation(this.start, this.length) {}
- int get end => start + length;
+ int get end => start! + length!;
}
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart b/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
index 56e25b3..bc4258a 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/SizingFunctions.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
part of layout;
// This file has classes representing the grid sizing functions
@@ -20,7 +18,7 @@
bool get isMaxContentSized => false;
bool get isFraction => false;
- num resolveLength(num gridSize) => 0;
+ num resolveLength(num? gridSize) => 0;
num get fractionValue => 0;
@@ -46,16 +44,16 @@
FixedSizing(this.length, [this.units = 'px']) : _contentSized = false {
if (units != 'px' && units != '%') {
// TODO(jmesserly): support other unit types
- throw new UnsupportedError('Units other than px and %');
+ throw UnsupportedError('Units other than px and %');
}
}
// TODO(jmesserly): this is only needed because of our mutable property
- FixedSizing clone() => new FixedSizing(length, units);
+ FixedSizing clone() => FixedSizing(length, units);
bool get isMinContentSized => _contentSized;
- num resolveLength(num gridSize) {
+ num resolveLength(num? gridSize) {
if (units == '%') {
if (gridSize == null) {
// Use content size when the grid doesn't have an absolute size in this
@@ -120,38 +118,38 @@
TrackSizing(this.min, this.max) {}
// TODO(jmesserly): this is only needed because FixedSizing is mutable
- TrackSizing clone() => new TrackSizing(min.clone(), max.clone());
+ TrackSizing clone() => TrackSizing(min.clone(), max.clone());
}
/** Represents a GridTrack breadth property. */
// TODO(jmesserly): these classes could be replaced with reflection/mirrors
abstract class _BreadthAccumulator {
- void setSize(GridTrack t, num value);
- num getSize(GridTrack t);
+ void setSize(GridTrack? t, num value);
+ num? getSize(GridTrack? t);
- SizingFunction getSizingFunction(GridTrack t);
+ SizingFunction getSizingFunction(GridTrack? t);
}
class _UsedBreadthAccumulator implements _BreadthAccumulator {
const _UsedBreadthAccumulator();
- void setSize(GridTrack t, num value) {
- t.usedBreadth = value;
+ void setSize(GridTrack? t, num value) {
+ t!.usedBreadth = value;
}
- num getSize(GridTrack t) => t.usedBreadth;
+ num? getSize(GridTrack? t) => t!.usedBreadth;
- SizingFunction getSizingFunction(GridTrack t) => t.minSizing;
+ SizingFunction getSizingFunction(GridTrack? t) => t!.minSizing;
}
class _MaxBreadthAccumulator implements _BreadthAccumulator {
const _MaxBreadthAccumulator();
- void setSize(GridTrack t, num value) {
- t.maxBreadth = value;
+ void setSize(GridTrack? t, num value) {
+ t!.maxBreadth = value;
}
- num getSize(GridTrack t) => t.maxBreadth;
+ num? getSize(GridTrack? t) => t!.maxBreadth;
- SizingFunction getSizingFunction(GridTrack t) => t.maxSizing;
+ SizingFunction getSizingFunction(GridTrack? t) => t!.maxSizing;
}
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.dart b/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.dart
index aa0c3e9..5c284e1 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/ViewLayout.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
part of layout;
/** The interface that the layout algorithms use to talk to the view. */
@@ -30,9 +28,9 @@
class LayoutParams {
// TODO(jmesserly): should be const, but there's a bug in DartC preventing us
// from calling "window." in an initializer. See b/5332777
- CssStyleDeclaration style;
+ CssStyleDeclaration? style;
- int get layer => 0;
+ int? get layer => 0;
LayoutParams(Element node) {
style = node.getComputedStyle();
@@ -73,9 +71,9 @@
* The layout parameters associated with this view and used by the parent
* to determine how this view should be laid out.
*/
- LayoutParams layoutParams;
- int _offsetWidth;
- int _offsetHeight;
+ LayoutParams? layoutParams;
+ int? _offsetWidth;
+ int? _offsetHeight;
/** The view that this layout belongs to. */
final Positionable view;
@@ -85,7 +83,7 @@
* properties in the first pass while computing positions. Then we have a
* second pass that actually moves everything.
*/
- int _measuredLeft, _measuredTop, _measuredWidth, _measuredHeight;
+ int? _measuredLeft, _measuredTop, _measuredWidth, _measuredHeight;
ViewLayout(this.view);
@@ -96,9 +94,9 @@
// registered with a LayoutProvider.
factory ViewLayout.fromView(Positionable view) {
if (hasCustomLayout(view)) {
- return new GridLayout(view);
+ return GridLayout(view);
} else {
- return new ViewLayout(view);
+ return ViewLayout(view);
}
}
@@ -106,36 +104,36 @@
return view.customStyle['display'] == "-dart-grid";
}
- CssStyleDeclaration get _style => layoutParams.style;
+ CssStyleDeclaration? get _style => layoutParams!.style;
void cacheExistingBrowserLayout() {
- _offsetWidth = view.node.offset.width;
- _offsetHeight = view.node.offset.height;
+ _offsetWidth = view.node.offset.width as int?;
+ _offsetHeight = view.node.offset.height as int?;
}
- int get currentWidth {
+ int? get currentWidth {
return _offsetWidth;
}
- int get currentHeight {
+ int? get currentHeight {
return _offsetHeight;
}
- int get borderLeftWidth => _toPixels(_style.borderLeftWidth);
- int get borderTopWidth => _toPixels(_style.borderTopWidth);
- int get borderRightWidth => _toPixels(_style.borderRightWidth);
- int get borderBottomWidth => _toPixels(_style.borderBottomWidth);
+ int get borderLeftWidth => _toPixels(_style!.borderLeftWidth);
+ int get borderTopWidth => _toPixels(_style!.borderTopWidth);
+ int get borderRightWidth => _toPixels(_style!.borderRightWidth);
+ int get borderBottomWidth => _toPixels(_style!.borderBottomWidth);
int get borderWidth => borderLeftWidth + borderRightWidth;
int get borderHeight => borderTopWidth + borderBottomWidth;
/** Implements the custom layout computation. */
- void measureLayout(Future<Size> size, Completer<bool> changed) {}
+ void measureLayout(Future<Size> size, Completer<bool>? changed) {}
/**
* Positions the view within its parent container.
* Also performs a layout of its children.
*/
- void setBounds(int left, int top, int width, int height) {
+ void setBounds(int? left, int? top, int width, int height) {
assert(width >= 0 && height >= 0);
_measuredLeft = left;
@@ -144,8 +142,8 @@
// Note: we need to save the client height
_measuredWidth = width - borderWidth;
_measuredHeight = height - borderHeight;
- final completer = new Completer<Size>();
- completer.complete(new Size(_measuredWidth, _measuredHeight));
+ final completer = Completer<Size>();
+ completer.complete(Size(_measuredWidth!, _measuredHeight!));
measureLayout(completer.future, null);
}
@@ -159,7 +157,7 @@
style.top = '${_measuredTop}px';
style.width = '${_measuredWidth}px';
style.height = '${_measuredHeight}px';
- style.zIndex = '${layoutParams.layer}';
+ style.zIndex = '${layoutParams!.layer}';
_measuredLeft = null;
_measuredTop = null;
@@ -181,8 +179,8 @@
}
}
- int measureContent(ViewLayout parent, Dimension dimension,
- [ContentSizeMode mode = null]) {
+ int? measureContent(ViewLayout parent, Dimension? dimension,
+ [ContentSizeMode? mode = null]) {
if (dimension == Dimension.WIDTH) {
return measureWidth(parent, mode);
} else if (dimension == Dimension.HEIGHT) {
@@ -190,23 +188,23 @@
}
}
- int measureWidth(ViewLayout parent, ContentSizeMode mode) {
- final style = layoutParams.style;
+ int? measureWidth(ViewLayout parent, ContentSizeMode? mode) {
+ final style = layoutParams!.style;
if (mode == ContentSizeMode.MIN) {
- return _styleToPixels(style.minWidth, currentWidth, parent.currentWidth);
+ return _styleToPixels(style!.minWidth, currentWidth, parent.currentWidth);
} else if (mode == ContentSizeMode.MAX) {
- return _styleToPixels(style.maxWidth, currentWidth, parent.currentWidth);
+ return _styleToPixels(style!.maxWidth, currentWidth, parent.currentWidth);
}
}
- int measureHeight(ViewLayout parent, ContentSizeMode mode) {
- final style = layoutParams.style;
+ int? measureHeight(ViewLayout parent, ContentSizeMode? mode) {
+ final style = layoutParams!.style;
if (mode == ContentSizeMode.MIN) {
return _styleToPixels(
- style.minHeight, currentHeight, parent.currentHeight);
+ style!.minHeight, currentHeight, parent.currentHeight);
} else if (mode == ContentSizeMode.MAX) {
return _styleToPixels(
- style.maxHeight, currentHeight, parent.currentHeight);
+ style!.maxHeight, currentHeight, parent.currentHeight);
}
}
@@ -215,19 +213,18 @@
return int.parse(style.substring(0, style.length - 2));
} else {
// TODO(jmesserly): other size units
- throw new UnsupportedError(
- 'Unknown min/max content size format: "$style"');
+ throw UnsupportedError('Unknown min/max content size format: "$style"');
}
}
- static int _styleToPixels(String style, num size, num parentSize) {
+ static int? _styleToPixels(String style, num? size, num? parentSize) {
if (style == 'none') {
// For an unset max-content size, use the actual size
- return size;
+ return size as int?;
}
if (style.endsWith('%')) {
num percent = double.parse(style.substring(0, style.length - 1));
- return ((percent / 100) * parentSize).toInt();
+ return ((percent / 100) * parentSize!).toInt();
}
return _toPixels(style);
}
diff --git a/samples-dev/swarm/swarm_ui_lib/layout/layout.dart b/samples-dev/swarm/swarm_ui_lib/layout/layout.dart
index ddc5bb1..b060c6e 100644
--- a/samples-dev/swarm/swarm_ui_lib/layout/layout.dart
+++ b/samples-dev/swarm/swarm_ui_lib/layout/layout.dart
@@ -2,8 +2,6 @@
// 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.
-// @dart = 2.9
-
library layout;
import 'dart:async';
diff --git a/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart b/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart
index 546d126..bba7cf2 100644
--- a/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart
+++ b/samples-dev/swarm/swarm_ui_lib/util/CollectionUtils.dart
@@ -80,9 +80,9 @@
}
/** Orders an iterable by its values, or by a key selector. */
- static List orderBy(Iterable source,
+ static List<T> orderBy<T>(Iterable<T> source,
[NumericValueSelector? selector = null]) {
- final result = List.from(source);
+ final result = List<T>.from(source);
sortBy(result, selector);
return result;
}
diff --git a/tools/VERSION b/tools/VERSION
index 9f203d5..4a55559 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 18
PATCH 0
-PRERELEASE 202
+PRERELEASE 203
PRERELEASE_PATCH 0
\ No newline at end of file