Only run codegen at start of flutter_test (#29171)
diff --git a/dev/bots/test.dart b/dev/bots/test.dart
index 5bf7048..8a2fde4 100644
--- a/dev/bots/test.dart
+++ b/dev/bots/test.dart
@@ -317,6 +317,10 @@
// with --track-widget-creation.
await _runFlutterTest(path.join(flutterRoot, 'examples', 'flutter_gallery'), options: <String>['--track-widget-creation'], tableData: bigqueryApi?.tabledata);
await _runFlutterTest(path.join(flutterRoot, 'examples', 'catalog'), tableData: bigqueryApi?.tabledata);
+ // Smoke test for code generation.
+ await _runFlutterTest(path.join(flutterRoot, 'dev', 'integration_tests', 'codegen'), tableData: bigqueryApi?.tabledata, environment: <String, String>{
+ 'FLUTTER_EXPERIMENTAL_BUILD': 'true',
+ });
print('${bold}DONE: All tests successful.$reset');
}
@@ -581,6 +585,7 @@
bool skip = false,
Duration timeout = _kLongTimeout,
bq.TabledataResourceApi tableData,
+ Map<String, String> environment,
}) async {
final List<String> args = <String>['test']..addAll(options);
if (flutterTestArgs != null && flutterTestArgs.isNotEmpty)
@@ -612,6 +617,7 @@
printOutput: printOutput,
skip: skip,
timeout: timeout,
+ environment: environment,
);
}
@@ -624,6 +630,7 @@
expectNonZeroExit: expectFailure,
timeout: timeout,
beforeExit: formatter.finish,
+ environment: environment,
);
await _processTestOutput(formatter, testOutput, tableData);
} else {
diff --git a/packages/flutter_tools/lib/src/codegen.dart b/packages/flutter_tools/lib/src/codegen.dart
index d53714a..128c816 100644
--- a/packages/flutter_tools/lib/src/codegen.dart
+++ b/packages/flutter_tools/lib/src/codegen.dart
@@ -161,22 +161,19 @@
/// Creates a new [ResidentCompiler] and configures a [BuildDaemonClient] to
/// run builds.
- static Future<CodeGeneratingResidentCompiler> create({
+ ///
+ /// If `runCold` is true, then no codegen daemon will be created. Instead the
+ /// compiler will only be initialized with the correct configuration for
+ /// codegen mode.
+ static Future<ResidentCompiler> create({
@required FlutterProject flutterProject,
bool trackWidgetCreation = false,
CompilerMessageConsumer compilerMessageConsumer = printError,
bool unsafePackageSerialization = false,
String outputPath,
String initializeFromDill,
+ bool runCold = false,
}) async {
- final CodegenDaemon codegenDaemon = await codeGenerator.daemon(flutterProject);
- codegenDaemon.startBuild();
- final CodegenStatus status = await codegenDaemon.buildResults.firstWhere((CodegenStatus status) {
- return status == CodegenStatus.Succeeded || status == CodegenStatus.Failed;
- });
- if (status == CodegenStatus.Failed) {
- printError('Code generation failed, build may have compile errors.');
- }
final ResidentCompiler residentCompiler = ResidentCompiler(
artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath),
trackWidgetCreation: trackWidgetCreation,
@@ -191,6 +188,17 @@
// Pass an invalid file name to prevent frontend_server from initializing from dill.
initializeFromDill: 'none_file',
);
+ if (runCold) {
+ return residentCompiler;
+ }
+ final CodegenDaemon codegenDaemon = await codeGenerator.daemon(flutterProject);
+ codegenDaemon.startBuild();
+ final CodegenStatus status = await codegenDaemon.buildResults.firstWhere((CodegenStatus status) {
+ return status == CodegenStatus.Succeeded || status == CodegenStatus.Failed;
+ });
+ if (status == CodegenStatus.Failed) {
+ printError('Code generation failed, build may have compile errors.');
+ }
return CodeGeneratingResidentCompiler._(residentCompiler, codegenDaemon);
}
diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart
index 4779e42..3fa235f 100644
--- a/packages/flutter_tools/lib/src/commands/test.dart
+++ b/packages/flutter_tools/lib/src/commands/test.dart
@@ -9,6 +9,7 @@
import '../base/file_system.dart';
import '../base/platform.dart';
import '../cache.dart';
+import '../codegen.dart';
import '../project.dart';
import '../runner/flutter_command.dart';
import '../test/coverage_collector.dart';
@@ -159,6 +160,20 @@
Cache.releaseLockEarly();
+ // Run builders once before all tests.
+ if (experimentalBuildEnabled && await flutterProject.hasBuilders) {
+ final CodegenDaemon codegenDaemon = await codeGenerator.daemon(flutterProject);
+ codegenDaemon.startBuild();
+ await for (CodegenStatus status in codegenDaemon.buildResults) {
+ if (status == CodegenStatus.Succeeded) {
+ break;
+ }
+ if (status == CodegenStatus.Failed) {
+ throwToolExit('Code generation failed.');
+ }
+ }
+ }
+
final int result = await runTests(
files,
workDir: workDir,
diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart
index 5f93671..12c0770 100644
--- a/packages/flutter_tools/lib/src/compile.dart
+++ b/packages/flutter_tools/lib/src/compile.dart
@@ -500,13 +500,12 @@
}
if (packagesFilePath != null) {
command.addAll(<String>['--packages', packagesFilePath]);
+ } else if (_packagesPath != null) {
+ command.addAll(<String>['--packages', _packagesPath]);
}
if (_trackWidgetCreation) {
command.add('--track-widget-creation');
}
- if (_packagesPath != null) {
- command.addAll(<String>['--packages', _packagesPath]);
- }
if (_fileSystemRoots != null) {
for (String root in _fileSystemRoots) {
command.addAll(<String>['--filesystem-root', root]);
@@ -662,6 +661,9 @@
}
}
}
+ if (platform.isWindows && _fileSystemRoots != null && _fileSystemRoots.length > 1) {
+ return Uri.file(filename, windows: platform.isWindows).toString();
+ }
return null;
}
diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart
index 0bbe735..22aa734 100644
--- a/packages/flutter_tools/lib/src/test/flutter_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart
@@ -274,9 +274,10 @@
return CodeGeneratingResidentCompiler.create(
flutterProject: flutterProject,
trackWidgetCreation: trackWidgetCreation,
- initializeFromDill: null, // TODO(jonahwilliams): investigate multi-root support in init from dill.
- unsafePackageSerialization: false,
compilerMessageConsumer: reportCompilerMessage,
+ // We already ran codegen once at the start, we only need to
+ // configure builders.
+ runCold: true,
);
}
return ResidentCompiler(