diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart index a9a2f638384..30b44a3372a 100644 --- a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart +++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart @@ -83,6 +83,7 @@ class ExpressionCompilerWorker { final ProcessedOptions _processedOptions; final CompilerOptions _compilerOptions; final ModuleFormat _moduleFormat; + final bool _canaryFeatures; final Component _sdkComponent; void Function()? onDone; @@ -91,6 +92,7 @@ class ExpressionCompilerWorker { this._processedOptions, this._compilerOptions, this._moduleFormat, + this._canaryFeatures, this._sdkComponent, this.requestStream, this.sendResponse, @@ -194,6 +196,7 @@ class ExpressionCompilerWorker { trackWidgetCreation: parsedArgs['track-widget-creation'] as bool, soundNullSafety: parsedArgs['sound-null-safety'] as bool, moduleFormat: moduleFormat, + canaryFeatures: parsedArgs['canary'] as bool, verbose: parsedArgs['verbose'] as bool, requestStream: requestStream, sendResponse: sendResponse, @@ -219,6 +222,7 @@ class ExpressionCompilerWorker { bool trackWidgetCreation = false, bool soundNullSafety = false, ModuleFormat moduleFormat = ModuleFormat.amd, + bool canaryFeatures = false, bool verbose = false, Stream>? requestStream, // Defaults to read from stdin void Function(Map)? @@ -258,8 +262,15 @@ class ExpressionCompilerWorker { if (sdkComponent == null) { throw Exception('Could not load SDK component: $sdkSummary'); } - return ExpressionCompilerWorker._(processedOptions, compilerOptions, - moduleFormat, sdkComponent, requestStream, sendResponse, onDone) + return ExpressionCompilerWorker._( + processedOptions, + compilerOptions, + moduleFormat, + canaryFeatures, + sdkComponent, + requestStream, + sendResponse, + onDone) .._updateCache(sdkComponent, dartSdkModule, true); } @@ -436,11 +447,13 @@ class ExpressionCompilerWorker { finalComponent, hierarchy, SharedCompilerOptions( - sourceMap: true, - summarizeApi: false, - moduleName: moduleName, - soundNullSafety: _compilerOptions.nnbdMode == NnbdMode.Strong, - enableAsserts: _enableAsserts), + sourceMap: true, + summarizeApi: false, + moduleName: moduleName, + soundNullSafety: _compilerOptions.nnbdMode == NnbdMode.Strong, + enableAsserts: _enableAsserts, + canaryFeatures: _canaryFeatures, + ), _moduleCache.componentForLibrary, _moduleCache.moduleNameForComponent, coreTypes: coreTypes, @@ -776,6 +789,7 @@ final argParser = ArgParser() ..addOption('module-format', defaultsTo: 'amd') ..addFlag('track-widget-creation', defaultsTo: false) ..addFlag('sound-null-safety', negatable: true, defaultsTo: true) + ..addFlag('canary', negatable: true, defaultsTo: false) ..addFlag('verbose', defaultsTo: false); Uri? _argToUri(String? uriArg) => diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart index d2e72bb256a..4860bcff94c 100644 --- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart +++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart @@ -149,11 +149,13 @@ class TestCompiler { var classHierarchy = compilerResult.classHierarchy!; var compilerOptions = SharedCompilerOptions( - replCompile: true, - moduleName: moduleName, - experiments: experiments, - soundNullSafety: setup.soundNullSafety, - emitDebugMetadata: true); + replCompile: true, + moduleName: moduleName, + experiments: experiments, + soundNullSafety: setup.soundNullSafety, + emitDebugMetadata: true, + canaryFeatures: false, + ); var coreTypes = compilerResult.coreTypes; final importToSummary = Map.identity(); diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart index efe3b0a03cf..484291a8147 100644 --- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart +++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart @@ -114,10 +114,12 @@ class TestCompiler { var moduleName = 'foo.dart'; var classHierarchy = compilerResult.classHierarchy; var compilerOptions = SharedCompilerOptions( - replCompile: true, - moduleName: moduleName, - soundNullSafety: setup.soundNullSafety, - moduleFormats: [setup.moduleFormat]); + replCompile: true, + moduleName: moduleName, + soundNullSafety: setup.soundNullSafety, + moduleFormats: [setup.moduleFormat], + canaryFeatures: false, + ); var coreTypes = compilerResult.coreTypes; final importToSummary = Map.identity(); @@ -277,11 +279,28 @@ void main() { for (var moduleFormat in [ModuleFormat.amd, ModuleFormat.ddc]) { group('Module format: $moduleFormat |', () { group('Unsound null safety |', () { - var options = SetupCompilerOptions( - soundNullSafety: false, moduleFormat: moduleFormat); + runUnsoundTests(moduleFormat); + }); + }); + } - group('Expression compilations on the same expression compiler |', () { - var source = ''' + for (var moduleFormat in [ModuleFormat.amd, ModuleFormat.ddc]) { + group('Module format: $moduleFormat |', () { + group('Sound null safety |', () { + runSoundTests(moduleFormat); + }); + }); + } +} + +void runUnsoundTests(ModuleFormat moduleFormat) { + var options = SetupCompilerOptions( + soundNullSafety: false, + moduleFormat: moduleFormat, + ); + + group('Expression compilations on the same expression compiler |', () { + var source = ''' ${options.dartLangComment} main() { } @@ -291,93 +310,93 @@ void main() { } '''; - late TestDriver driver; + late TestDriver driver; - setUp(() { - driver = TestDriver(options, source); - }); + setUp(() { + driver = TestDriver(options, source); + }); - tearDown(() { - driver.delete(); - }); + tearDown(() { + driver.delete(); + }); - test('successful expression compilations', () async { - var compiler = await driver.createCompiler(); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'true', - expectedResult: ''' + test('successful expression compilations', () async { + var compiler = await driver.createCompiler(); + await driver.check( + compiler: compiler, + scope: {}, + expression: 'true', + expectedResult: ''' (function() { return true; }( )) '''); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'false', - expectedResult: ''' + await driver.check( + compiler: compiler, + scope: {}, + expression: 'false', + expectedResult: ''' (function() { return false; }( )) '''); - }); + }); - test('some successful expression compilations', () async { - var compiler = await driver.createCompiler(); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'true', - expectedResult: ''' + test('some successful expression compilations', () async { + var compiler = await driver.createCompiler(); + await driver.check( + compiler: compiler, + scope: {}, + expression: 'true', + expectedResult: ''' (function() { return true; }( )) '''); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'blah', - expectedError: "Undefined name 'blah'", - ); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'false', - expectedResult: ''' + await driver.check( + compiler: compiler, + scope: {}, + expression: 'blah', + expectedError: "Undefined name 'blah'", + ); + await driver.check( + compiler: compiler, + scope: {}, + expression: 'false', + expectedResult: ''' (function() { return false; }( )) '''); - }); + }); - test('failing expression compilations', () async { - var compiler = await driver.createCompiler(); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'blah1', - expectedError: "Undefined name 'blah1'", - ); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'blah2', - expectedError: "Undefined name 'blah2'", - ); - }); - }); + test('failing expression compilations', () async { + var compiler = await driver.createCompiler(); + await driver.check( + compiler: compiler, + scope: {}, + expression: 'blah1', + expectedError: "Undefined name 'blah1'", + ); + await driver.check( + compiler: compiler, + scope: {}, + expression: 'blah2', + expectedError: "Undefined name 'blah2'", + ); + }); + }); - group('Expression compiler import tests', () { - var source = ''' + group('Expression compiler import tests', () { + var source = ''' ${options.dartLangComment} import 'dart:io' show Directory; import 'dart:io' as p; @@ -394,21 +413,21 @@ void main() { } '''; - late TestDriver driver; + late TestDriver driver; - setUp(() { - driver = TestDriver(options, source); - }); + setUp(() { + driver = TestDriver(options, source); + }); - tearDown(() { - driver.delete(); - }); + tearDown(() { + driver.delete(); + }); - test('expression referencing unnamed import', () async { - await driver.check( - scope: {}, - expression: 'Directory.systemTemp', - expectedResult: ''' + test('expression referencing unnamed import', () async { + await driver.check( + scope: {}, + expression: 'Directory.systemTemp', + expectedResult: ''' (function() { const dart_sdk = ${options.loadModule}('dart_sdk'); const io = dart_sdk.io; @@ -417,13 +436,13 @@ void main() { )) '''); - }); + }); - test('expression referencing named import', () async { - await driver.check( - scope: {}, - expression: 'p.Directory.systemTemp', - expectedResult: ''' + test('expression referencing named import', () async { + await driver.check( + scope: {}, + expression: 'p.Directory.systemTemp', + expectedResult: ''' (function() { const dart_sdk = ${options.loadModule}('dart_sdk'); const io = dart_sdk.io; @@ -432,15 +451,14 @@ void main() { )) '''); - }); + }); - test( - 'expression referencing another library with the same named import', - () async { - await driver.check( - scope: {}, - expression: 'p.utf8.decoder', - expectedResult: ''' + test('expression referencing another library with the same named import', + () async { + await driver.check( + scope: {}, + expression: 'p.utf8.decoder', + expectedResult: ''' (function() { const dart_sdk = ${options.loadModule}('dart_sdk'); const convert = dart_sdk.convert; @@ -449,13 +467,12 @@ void main() { )) '''); - }); - }); + }); + }); - group( - 'Expression compiler tests for interactions with module containers:', - () { - var source = ''' + group('Expression compiler tests for interactions with module containers:', + () { + var source = ''' ${options.dartLangComment} class A { const A(); @@ -473,22 +490,21 @@ void main() { void main() => foo(); '''; - late TestDriver driver; - setUp(() { - driver = TestDriver(options, source); - }); + late TestDriver driver; + setUp(() { + driver = TestDriver(options, source); + }); - tearDown(() { - driver.delete(); - }); + tearDown(() { + driver.delete(); + }); - test( - 'evaluation that non-destructively appends to the type container', - () async { - await driver.check( - scope: {'a': 'null', 'check': 'null'}, - expression: 'a is String', - expectedResult: ''' + test('evaluation that non-destructively appends to the type container', + () async { + await driver.check( + scope: {'a': 'null', 'check': 'null'}, + expression: 'a is String', + expectedResult: ''' (function(a, check) { const dart_sdk = ${options.loadModule}('dart_sdk'); const core = dart_sdk.core; @@ -502,13 +518,13 @@ void main() { null )) '''); - }); + }); - test('evaluation that reuses the type container', () async { - await driver.check( - scope: {'a': 'null', 'check': 'null'}, - expression: 'a is int', - expectedResult: ''' + test('evaluation that reuses the type container', () async { + await driver.check( + scope: {'a': 'null', 'check': 'null'}, + expression: 'a is int', + expectedResult: ''' (function(a, check) { const dart_sdk = ${options.loadModule}('dart_sdk'); const core = dart_sdk.core; @@ -522,15 +538,14 @@ void main() { null )) '''); - }); + }); - test( - 'evaluation that non-destructively appends to the constant container', - () async { - await driver.check( - scope: {'a': 'null', 'check': 'null'}, - expression: 'const B()', - expectedResult: ''' + test('evaluation that non-destructively appends to the constant container', + () async { + await driver.check( + scope: {'a': 'null', 'check': 'null'}, + expression: 'const B()', + expectedResult: ''' (function(a, check) { const dart_sdk = ${options.loadModule}('dart_sdk'); const dart = dart_sdk.dart; @@ -550,15 +565,15 @@ void main() { null )) '''); - }); + }); - test( - 'evaluation that reuses the constant container and canonicalizes properly', - () async { - await driver.check( - scope: {'a': 'null', 'check': 'null'}, - expression: 'a == const A()', - expectedResult: ''' + test( + 'evaluation that reuses the constant container and canonicalizes properly', + () async { + await driver.check( + scope: {'a': 'null', 'check': 'null'}, + expression: 'a == const A()', + expectedResult: ''' (function(a, check) { const dart_sdk = ${options.loadModule}('dart_sdk'); const dart = dart_sdk.dart; @@ -578,11 +593,11 @@ void main() { null )) '''); - }); - }); + }); + }); - group('Expression compiler tests using extension symbols', () { - var source = ''' + group('Expression compiler tests using extension symbols', () { + var source = ''' ${options.dartLangComment} void bar() { /* evaluation placeholder */ @@ -591,21 +606,21 @@ void main() { void main() => bar(); '''; - late TestDriver driver; - setUp(() { - driver = TestDriver(options, source); - }); + late TestDriver driver; + setUp(() { + driver = TestDriver(options, source); + }); - tearDown(() { - driver.delete(); - }); + tearDown(() { + driver.delete(); + }); - test('map access', () async { - await driver.check( - scope: {'inScope': '1', 'innerInScope': '0'}, - expression: - '(Map params) { return params["index"]; }({})', - expectedResult: ''' + test('map access', () async { + await driver.check( + scope: {'inScope': '1', 'innerInScope': '0'}, + expression: + '(Map params) { return params["index"]; }({})', + expectedResult: ''' (function() { const dart_sdk = ${options.loadModule}('dart_sdk'); const core = dart_sdk.core; @@ -625,19 +640,18 @@ void main() { )) '''); - }); - }); - }); }); - } + }); +} - for (var moduleFormat in [ModuleFormat.amd, ModuleFormat.ddc]) { - group('Module format: $moduleFormat |', () { - group('Sound null safety |', () { - var options = SetupCompilerOptions(soundNullSafety: true); +void runSoundTests(ModuleFormat moduleFormat) { + var options = SetupCompilerOptions( + soundNullSafety: true, + moduleFormat: moduleFormat, + ); - group('Expression compilations on the same expression compiler |', () { - var source = ''' + group('Expression compilations on the same expression compiler |', () { + var source = ''' ${options.dartLangComment} main() { } @@ -647,93 +661,93 @@ void main() { } '''; - late TestDriver driver; + late TestDriver driver; - setUp(() { - driver = TestDriver(options, source); - }); + setUp(() { + driver = TestDriver(options, source); + }); - tearDown(() { - driver.delete(); - }); + tearDown(() { + driver.delete(); + }); - test('successful expression compilations', () async { - var compiler = await driver.createCompiler(); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'true', - expectedResult: ''' + test('successful expression compilations', () async { + var compiler = await driver.createCompiler(); + await driver.check( + compiler: compiler, + scope: {}, + expression: 'true', + expectedResult: ''' (function() { return true; }( )) '''); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'false', - expectedResult: ''' + await driver.check( + compiler: compiler, + scope: {}, + expression: 'false', + expectedResult: ''' (function() { return false; }( )) '''); - }); + }); - test('some successful expression compilations', () async { - var compiler = await driver.createCompiler(); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'true', - expectedResult: ''' + test('some successful expression compilations', () async { + var compiler = await driver.createCompiler(); + await driver.check( + compiler: compiler, + scope: {}, + expression: 'true', + expectedResult: ''' (function() { return true; }( )) '''); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'blah', - expectedError: "Undefined name 'blah'", - ); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'false', - expectedResult: ''' + await driver.check( + compiler: compiler, + scope: {}, + expression: 'blah', + expectedError: "Undefined name 'blah'", + ); + await driver.check( + compiler: compiler, + scope: {}, + expression: 'false', + expectedResult: ''' (function() { return false; }( )) '''); - }); + }); - test('failing expression compilations', () async { - var compiler = await driver.createCompiler(); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'blah1', - expectedError: "Undefined name 'blah1'", - ); - await driver.check( - compiler: compiler, - scope: {}, - expression: 'blah2', - expectedError: "Undefined name 'blah2'", - ); - }); - }); + test('failing expression compilations', () async { + var compiler = await driver.createCompiler(); + await driver.check( + compiler: compiler, + scope: {}, + expression: 'blah1', + expectedError: "Undefined name 'blah1'", + ); + await driver.check( + compiler: compiler, + scope: {}, + expression: 'blah2', + expectedError: "Undefined name 'blah2'", + ); + }); + }); - group('Expression compiler import tests', () { - var source = ''' + group('Expression compiler import tests', () { + var source = ''' ${options.dartLangComment} import 'dart:io' show Directory; import 'dart:io' as p; @@ -750,21 +764,21 @@ void main() { } '''; - late TestDriver driver; + late TestDriver driver; - setUp(() { - driver = TestDriver(options, source); - }); + setUp(() { + driver = TestDriver(options, source); + }); - tearDown(() { - driver.delete(); - }); + tearDown(() { + driver.delete(); + }); - test('expression referencing unnamed import', () async { - await driver.check( - scope: {}, - expression: 'Directory.systemTemp', - expectedResult: ''' + test('expression referencing unnamed import', () async { + await driver.check( + scope: {}, + expression: 'Directory.systemTemp', + expectedResult: ''' (function() { const dart_sdk = ${options.loadModule}('dart_sdk'); const io = dart_sdk.io; @@ -773,13 +787,13 @@ void main() { )) '''); - }); + }); - test('expression referencing named import', () async { - await driver.check( - scope: {}, - expression: 'p.Directory.systemTemp', - expectedResult: ''' + test('expression referencing named import', () async { + await driver.check( + scope: {}, + expression: 'p.Directory.systemTemp', + expectedResult: ''' (function() { const dart_sdk = ${options.loadModule}('dart_sdk'); const io = dart_sdk.io; @@ -788,15 +802,14 @@ void main() { )) '''); - }); + }); - test( - 'expression referencing another library with the same named import', - () async { - await driver.check( - scope: {}, - expression: 'p.utf8.decoder', - expectedResult: ''' + test('expression referencing another library with the same named import', + () async { + await driver.check( + scope: {}, + expression: 'p.utf8.decoder', + expectedResult: ''' (function() { const dart_sdk = ${options.loadModule}('dart_sdk'); const convert = dart_sdk.convert; @@ -805,12 +818,11 @@ void main() { )) '''); - }); - }); + }); + }); - group('Expression compiler expressions that import extension symbols', - () { - var source = ''' + group('Expression compiler expressions that import extension symbols', () { + var source = ''' ${options.dartLangComment} void bar() { /* evaluation placeholder */ @@ -819,21 +831,21 @@ void main() { void main() => bar(); '''; - late TestDriver driver; - setUp(() { - driver = TestDriver(options, source); - }); + late TestDriver driver; + setUp(() { + driver = TestDriver(options, source); + }); - tearDown(() { - driver.delete(); - }); + tearDown(() { + driver.delete(); + }); - test('map access', () async { - await driver.check( - scope: {'inScope': '1', 'innerInScope': '0'}, - expression: - '(Map params) { return params["index"]; }({})', - expectedResult: ''' + test('map access', () async { + await driver.check( + scope: {'inScope': '1', 'innerInScope': '0'}, + expression: + '(Map params) { return params["index"]; }({})', + expectedResult: ''' (function() { const dart_sdk = ${options.loadModule}('dart_sdk'); const core = dart_sdk.core; @@ -852,9 +864,6 @@ void main() { )) '''); - }); - }); - }); }); - } + }); } diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_amd_canary_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_amd_canary_test.dart new file mode 100644 index 00000000000..fd3d284da11 --- /dev/null +++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_amd_canary_test.dart @@ -0,0 +1,28 @@ +// Copyright (c) 2023, 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:dev_compiler/dev_compiler.dart'; +import 'package:test/test.dart'; + +import 'expression_compiler_worker_shared.dart'; + +void main() async { + // Set to true to enable debug output + var debug = false; + + group('canary -', () { + group('amd module format -', () { + for (var soundNullSafety in [true, false]) { + group('${soundNullSafety ? "sound" : "unsound"} null safety -', () { + runTests( + moduleFormat: ModuleFormat.amd, + soundNullSafety: soundNullSafety, + canaryFeatures: true, + verbose: debug, + ); + }); + } + }); + }); +} diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_amd_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_amd_test.dart index b357fac12fc..50ff89397ff 100644 --- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_amd_test.dart +++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_amd_test.dart @@ -17,6 +17,7 @@ void main() async { runTests( moduleFormat: ModuleFormat.amd, soundNullSafety: soundNullSafety, + canaryFeatures: false, verbose: debug, ); }); diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_ddc_canary_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_ddc_canary_test.dart new file mode 100644 index 00000000000..ea712b6d545 --- /dev/null +++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_ddc_canary_test.dart @@ -0,0 +1,28 @@ +// Copyright (c) 2023, 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:dev_compiler/dev_compiler.dart'; +import 'package:test/test.dart'; + +import 'expression_compiler_worker_shared.dart'; + +void main() async { + // Set to true to enable debug output + var debug = false; + + group('canary -', () { + group('ddc module format -', () { + for (var soundNullSafety in [true, false]) { + group('${soundNullSafety ? "sound" : "unsound"} null safety -', () { + runTests( + moduleFormat: ModuleFormat.ddc, + soundNullSafety: soundNullSafety, + canaryFeatures: true, + verbose: debug, + ); + }); + } + }); + }); +} diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_ddc_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_ddc_test.dart index 4ccd6ab3320..b122958ca5e 100644 --- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_ddc_test.dart +++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_ddc_test.dart @@ -17,6 +17,7 @@ void main() async { runTests( moduleFormat: ModuleFormat.ddc, soundNullSafety: soundNullSafety, + canaryFeatures: false, verbose: debug, ); }); diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_shared.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_shared.dart index 629eee389ba..4c381652047 100644 --- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_shared.dart +++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_worker_shared.dart @@ -25,6 +25,7 @@ import 'package:test/test.dart'; void runTests({ required ModuleFormat moduleFormat, required bool soundNullSafety, + required bool canaryFeatures, bool verbose = false, }) { group('expression compiler worker on startup', () { @@ -64,6 +65,7 @@ void runTests({ '--module-format', moduleFormat.name, soundNullSafety ? '--sound-null-safety' : '--no-sound-null-safety', + if (canaryFeatures) '--canary', if (verbose) '--verbose', ], sendPort: receivePort.sendPort, @@ -75,18 +77,30 @@ void runTests({ }); group('reading assets using standard file system - ', () { - runExpressionCompilationTests( - StandardFileSystemTestDriver(soundNullSafety, moduleFormat, verbose)); + runExpressionCompilationTests(StandardFileSystemTestDriver( + soundNullSafety, + moduleFormat, + canaryFeatures, + verbose, + )); }); group('reading assets using multiroot file system - ', () { - runExpressionCompilationTests( - MultiRootFileSystemTestDriver(soundNullSafety, moduleFormat, verbose)); + runExpressionCompilationTests(MultiRootFileSystemTestDriver( + soundNullSafety, + moduleFormat, + canaryFeatures, + verbose, + )); }); group('reading assets using asset file system -', () { - runExpressionCompilationTests( - AssetFileSystemTestDriver(soundNullSafety, moduleFormat, verbose)); + runExpressionCompilationTests(AssetFileSystemTestDriver( + soundNullSafety, + moduleFormat, + canaryFeatures, + verbose, + )); }); } @@ -950,6 +964,7 @@ class E { abstract class TestDriver { final bool soundNullSafety; final ModuleFormat moduleFormat; + final bool canaryFeatures; final bool verbose; late FileSystem fileSystem; @@ -964,7 +979,8 @@ abstract class TestDriver { ExpressionCompilerWorker? worker; Future? workerDone; - TestDriver(this.soundNullSafety, this.moduleFormat, this.verbose); + TestDriver(this.soundNullSafety, this.moduleFormat, this.canaryFeatures, + this.verbose); /// Initialize file systems, inputs, and start servers if needed. Future start(); @@ -1005,6 +1021,7 @@ abstract class TestDriver { sendResponse: responseController.add, soundNullSafety: soundNullSafety, moduleFormat: moduleFormat, + canaryFeatures: canaryFeatures, verbose: verbose, ); workerDone = worker?.run(); @@ -1022,8 +1039,9 @@ class StandardFileSystemTestDriver extends TestDriver { StandardFileSystemTestDriver( bool soundNullSafety, ModuleFormat moduleFormat, + bool canaryFeatures, bool verbose, - ) : super(soundNullSafety, moduleFormat, verbose); + ) : super(soundNullSafety, moduleFormat, canaryFeatures, verbose); @override Future start() async { @@ -1038,8 +1056,9 @@ class MultiRootFileSystemTestDriver extends TestDriver { MultiRootFileSystemTestDriver( bool soundNullSafety, ModuleFormat moduleFormat, + bool canaryFeatures, bool verbose, - ) : super(soundNullSafety, moduleFormat, verbose); + ) : super(soundNullSafety, moduleFormat, canaryFeatures, verbose); @override Future start() async { @@ -1057,8 +1076,9 @@ class AssetFileSystemTestDriver extends TestDriver { AssetFileSystemTestDriver( bool soundNullSafety, ModuleFormat moduleFormat, + bool canaryFeatures, bool verbose, - ) : super(soundNullSafety, moduleFormat, verbose); + ) : super(soundNullSafety, moduleFormat, canaryFeatures, verbose); @override Future start() async { diff --git a/pkg/dev_compiler/test/shared_test_options.dart b/pkg/dev_compiler/test/shared_test_options.dart index 0ed32d81672..c60249ceeea 100644 --- a/pkg/dev_compiler/test/shared_test_options.dart +++ b/pkg/dev_compiler/test/shared_test_options.dart @@ -74,10 +74,13 @@ class SetupCompilerOptions { final String dartLangComment; final ModuleFormat moduleFormat; final bool soundNullSafety; + final bool canaryFeatures; - SetupCompilerOptions( - {this.soundNullSafety = true, this.moduleFormat = ModuleFormat.amd}) - : options = getOptions(soundNullSafety), + SetupCompilerOptions({ + this.soundNullSafety = true, + this.moduleFormat = ModuleFormat.amd, + this.canaryFeatures = false, + }) : options = getOptions(soundNullSafety), dartLangComment = soundNullSafety ? dartSoundComment : dartUnsoundComment { options.onDiagnostic = (DiagnosticMessage m) {