Skip to content

Commit 469a859

Browse files
Enable code generation features in tool (flutter#29399)
1 parent e8e60a8 commit 469a859

File tree

17 files changed

+55
-75
lines changed

17 files changed

+55
-75
lines changed

dev/devicelab/manifest.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,23 +82,20 @@ tasks:
8282
correctly.
8383
stage: devicelab_win
8484
required_agent_capabilities: ["windows/android"]
85-
flaky: true
8685

8786
codegen_integration_mac:
8887
description: >
8988
Runs codegeneration and verifies that it can execute
9089
correctly.
9190
stage: devicelab_ios
9291
required_agent_capabilities: ["mac/ios"]
93-
flaky: true
9492

9593
codegen_integration_linux:
9694
description: >
9795
Runs codegeneration and verifies that it can execute
9896
correctly.
9997
stage: devicelab
10098
required_agent_capabilities: ["linux/android"]
101-
flaky: true
10299

103100
flutter_gallery_android__compile:
104101
description: >

packages/flutter_tools/lib/executable.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,6 @@ Future<void> main(List<String> args) async {
9595
overrides: <Type, Generator>{
9696
// The build runner instance is not supported in google3 because
9797
// the build runner packages are not synced internally.
98-
CodeGenerator: () => experimentalBuildEnabled ? const BuildRunner() : const UnsupportedCodeGenerator(),
98+
CodeGenerator: () => const BuildRunner(),
9999
});
100100
}

packages/flutter_tools/lib/src/base/build.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ class AOTSnapshotter {
188188
'sharedLib': buildSharedLibrary.toString(),
189189
'extraGenSnapshotOptions': extraGenSnapshotOptions.join(' '),
190190
'engineHash': engine.version,
191-
'buildersUsed': '${flutterProject != null ? await flutterProject.hasBuilders : false}',
191+
'buildersUsed': '${flutterProject != null ? flutterProject.hasBuilders : false}',
192192
},
193193
depfilePaths: <String>[],
194194
);
@@ -299,6 +299,7 @@ class AOTSnapshotter {
299299
@required bool trackWidgetCreation,
300300
List<String> extraFrontEndOptions = const <String>[],
301301
}) async {
302+
final FlutterProject flutterProject = await FlutterProject.current();
302303
final Directory outputDir = fs.directory(outputPath);
303304
outputDir.createSync(recursive: true);
304305

@@ -308,6 +309,7 @@ class AOTSnapshotter {
308309
printTrace('Extra front-end options: $extraFrontEndOptions');
309310

310311
final String depfilePath = fs.path.join(outputPath, 'kernel_compile.d');
312+
final KernelCompiler kernelCompiler = await kernelCompilerFactory.create(flutterProject);
311313
final CompilerOutput compilerOutput = await kernelCompiler.compile(
312314
sdkRoot: artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath),
313315
mainPath: mainPath,

packages/flutter_tools/lib/src/build_runner/build_runner.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class BuildRunner extends CodeGenerator {
4848

4949
// Check if contents of builders changed. If so, invalidate build script
5050
// and regnerate.
51-
final YamlMap builders = await flutterProject.builders;
51+
final YamlMap builders = flutterProject.builders;
5252
final List<int> appliedBuilderDigest = _produceScriptId(builders);
5353
if (scriptIdFile.existsSync() && buildSnapshot.existsSync()) {
5454
final List<int> previousAppliedBuilderDigest = scriptIdFile.readAsBytesSync();
@@ -79,7 +79,7 @@ class BuildRunner extends CodeGenerator {
7979

8080
stringBuffer.writeln('name: flutter_tool');
8181
stringBuffer.writeln('dependencies:');
82-
final YamlMap builders = await flutterProject.builders;
82+
final YamlMap builders = flutterProject.builders;
8383
if (builders != null) {
8484
for (String name in builders.keys) {
8585
final Object node = builders[name];
@@ -147,6 +147,7 @@ class BuildRunner extends CodeGenerator {
147147
buildSnapshot.path,
148148
'daemon',
149149
'--skip-build-script-check',
150+
'--delete-conflicting-outputs'
150151
];
151152
buildDaemonClient = await BuildDaemonClient.connect(flutterProject.directory.path, command, logHandler: (ServerLog log) => printTrace(log.toString()));
152153
} finally {

packages/flutter_tools/lib/src/build_runner/build_script_generator.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,11 @@ class BuildScriptGenerator {
138138
if (definition.isOptional) {
139139
namedArgs['isOptional'] = literalTrue;
140140
}
141-
namedArgs['hideOutput'] = literalTrue;
141+
if (definition.buildTo == BuildTo.cache) {
142+
namedArgs['hideOutput'] = literalTrue;
143+
} else {
144+
namedArgs['hideOutput'] = literalFalse;
145+
}
142146
if (!identical(definition.defaults?.generateFor, InputSet.anything)) {
143147
final Map<String, Expression> inputSetArgs = <String, Expression>{};
144148
if (definition.defaults.generateFor.include != null) {

packages/flutter_tools/lib/src/bundle.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'compile.dart';
1616
import 'dart/package_map.dart';
1717
import 'devfs.dart';
1818
import 'globals.dart';
19+
import 'project.dart';
1920

2021
const String defaultMainPath = 'lib/main.dart';
2122
const String defaultAssetBasePath = '.';
@@ -72,6 +73,7 @@ Future<void> build({
7273
assetDirPath ??= getAssetBuildDirectory();
7374
packagesPath ??= fs.path.absolute(PackageMap.globalPackagesPath);
7475
applicationKernelFilePath ??= getDefaultApplicationKernelPath(trackWidgetCreation: trackWidgetCreation);
76+
final FlutterProject flutterProject = await FlutterProject.current();
7577

7678
if (compilationTraceFilePath != null) {
7779
if (buildMode != BuildMode.dynamicProfile && buildMode != BuildMode.dynamicRelease) {
@@ -99,6 +101,7 @@ Future<void> build({
99101
if ((extraFrontEndOptions != null) && extraFrontEndOptions.isNotEmpty)
100102
printTrace('Extra front-end options: $extraFrontEndOptions');
101103
ensureDirectoryExists(applicationKernelFilePath);
104+
final KernelCompiler kernelCompiler = await kernelCompilerFactory.create(flutterProject);
102105
final CompilerOutput compilerOutput = await kernelCompiler.compile(
103106
sdkRoot: artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath),
104107
incrementalCompilerByteStorePath: compilationTraceFilePath != null ? null :

packages/flutter_tools/lib/src/codegen.dart

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,6 @@ const String kMultiRootScheme = 'org-dartlang-app';
2525
/// implementation.
2626
CodeGenerator get codeGenerator => context[CodeGenerator];
2727

28-
/// Whether to attempt to build a flutter project using build* libraries.
29-
///
30-
/// This requires both an experimental opt in via the environment variable
31-
/// 'FLUTTER_EXPERIMENTAL_BUILD' and that the project itself has a
32-
/// dependency on the package 'flutter_build' and 'build_runner.'
33-
bool get experimentalBuildEnabled {
34-
return _experimentalBuildEnabled ??= platform.environment['FLUTTER_EXPERIMENTAL_BUILD']?.toLowerCase() == 'true';
35-
}
36-
bool _experimentalBuildEnabled;
37-
38-
@visibleForTesting
39-
set experimentalBuildEnabled(bool value) {
40-
_experimentalBuildEnabled = value;
41-
}
42-
4328
/// A wrapper for a build_runner process which delegates to a generated
4429
/// build script.
4530
///

packages/flutter_tools/lib/src/commands/generate.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ class GenerateCommand extends FlutterCommand {
2424
@override
2525
Future<FlutterCommandResult> runCommand() async {
2626
Cache.releaseLockEarly();
27-
if (!experimentalBuildEnabled) {
28-
throwToolExit('FLUTTER_EXPERIMENTAL_BUILD is not enabled, codegen is unsupported.');
29-
}
3027
final FlutterProject flutterProject = await FlutterProject.current();
3128
final CodegenDaemon codegenDaemon = await codeGenerator.daemon(flutterProject);
3229
codegenDaemon.startBuild();

packages/flutter_tools/lib/src/commands/test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ class TestCommand extends FastFlutterCommand {
160160
Cache.releaseLockEarly();
161161

162162
// Run builders once before all tests.
163-
if (experimentalBuildEnabled && await flutterProject.hasBuilders) {
163+
if (flutterProject.hasBuilders) {
164164
final CodegenDaemon codegenDaemon = await codeGenerator.daemon(flutterProject);
165165
codegenDaemon.startBuild();
166166
await for (CodegenStatus status in codegenDaemon.buildResults) {

packages/flutter_tools/lib/src/compile.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,24 @@ import 'base/platform.dart';
1717
import 'base/process_manager.dart';
1818
import 'base/terminal.dart';
1919
import 'cache.dart';
20+
import 'codegen.dart';
2021
import 'convert.dart';
2122
import 'dart/package_map.dart';
2223
import 'globals.dart';
2324
import 'project.dart';
2425

25-
KernelCompiler get kernelCompiler => context[KernelCompiler];
26+
KernelCompilerFactory get kernelCompilerFactory => context[KernelCompilerFactory];
27+
28+
class KernelCompilerFactory {
29+
const KernelCompilerFactory();
30+
31+
Future<KernelCompiler> create(FlutterProject flutterProject) async {
32+
if (flutterProject == null || !flutterProject.hasBuilders) {
33+
return const KernelCompiler();
34+
}
35+
return const CodeGeneratingKernelCompiler();
36+
}
37+
}
2638

2739
typedef CompilerMessageConsumer = void Function(String message, { bool emphasis, TerminalColor color });
2840

@@ -235,7 +247,7 @@ class KernelCompiler {
235247
'trackWidgetCreation': trackWidgetCreation.toString(),
236248
'linkPlatformKernelIn': linkPlatformKernelIn.toString(),
237249
'engineHash': engine.version,
238-
'buildersUsed': '${flutterProject != null ? await flutterProject.hasBuilders : false}',
250+
'buildersUsed': '${flutterProject != null ? flutterProject.hasBuilders : false}',
239251
},
240252
depfilePaths: <String>[depFilePath],
241253
pathFilter: (String path) => !path.startsWith('/b/build/slave/'),

packages/flutter_tools/lib/src/context_runner.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import 'base/time.dart';
2222
import 'base/user_messages.dart';
2323
import 'base/utils.dart';
2424
import 'cache.dart';
25-
import 'codegen.dart';
2625
import 'compile.dart';
2726
import 'devfs.dart';
2827
import 'device.dart';
@@ -83,7 +82,7 @@ Future<T> runInContext<T>(
8382
IOSSimulatorUtils: () => IOSSimulatorUtils(),
8483
IOSWorkflow: () => const IOSWorkflow(),
8584
IOSValidator: () => const IOSValidator(),
86-
KernelCompiler: () => experimentalBuildEnabled ? const CodeGeneratingKernelCompiler() : const KernelCompiler(),
85+
KernelCompilerFactory: () => const KernelCompilerFactory(),
8786
LinuxWorkflow: () => const LinuxWorkflow(),
8887
Logger: () => platform.isWindows ? WindowsStdoutLogger() : StdoutLogger(),
8988
MacOSWorkflow: () => const MacOSWorkflow(),

packages/flutter_tools/lib/src/project.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,17 @@ class FlutterProject {
162162
}
163163

164164
/// Return the set of builders used by this package.
165-
Future<YamlMap> get builders async {
166-
final YamlMap pubspec = loadYaml(await pubspecFile.readAsString());
165+
YamlMap get builders {
166+
if (!pubspecFile.existsSync()) {
167+
return null;
168+
}
169+
final YamlMap pubspec = loadYaml(pubspecFile.readAsStringSync());
167170
return pubspec['builders'];
168171
}
169172

170173
/// Whether there are any builders used by this package.
171-
Future<bool> get hasBuilders async {
172-
final YamlMap result = await builders;
174+
bool get hasBuilders {
175+
final YamlMap result = builders;
173176
return result != null && result.isNotEmpty;
174177
}
175178
}

packages/flutter_tools/lib/src/resident_runner.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class FlutterDevice {
6161
}) async {
6262
ResidentCompiler generator;
6363
final FlutterProject flutterProject = await FlutterProject.current();
64-
if (experimentalBuildEnabled && await flutterProject.hasBuilders) {
64+
if (flutterProject.hasBuilders) {
6565
generator = await CodeGeneratingResidentCompiler.create(
6666
flutterProject: flutterProject,
6767
);

packages/flutter_tools/lib/src/test/flutter_platform.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ class _Compiler {
270270
);
271271

272272
Future<ResidentCompiler> createCompiler() async {
273-
if (experimentalBuildEnabled && await flutterProject.hasBuilders) {
273+
if (flutterProject.hasBuilders) {
274274
return CodeGeneratingResidentCompiler.create(
275275
flutterProject: flutterProject,
276276
trackWidgetCreation: trackWidgetCreation,

packages/flutter_tools/test/build_runner/build_runner_test.dart

Lines changed: 0 additions & 36 deletions
This file was deleted.

packages/flutter_tools/test/compile_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ example:org-dartlang-app:/
121121
'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0'
122122
))
123123
));
124+
final KernelCompiler kernelCompiler = await kernelCompilerFactory.create(null);
124125
final CompilerOutput output = await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
125126
mainPath: '/path/to/main.dart',
126127
trackWidgetCreation: false,
@@ -144,6 +145,7 @@ example:org-dartlang-app:/
144145
'result abc\nline1\nline2\nabc\nabc'
145146
))
146147
));
148+
final KernelCompiler kernelCompiler = await kernelCompilerFactory.create(null);
147149
final CompilerOutput output = await kernelCompiler.compile(sdkRoot: '/path/to/sdkroot',
148150
mainPath: '/path/to/main.dart',
149151
trackWidgetCreation: false,
@@ -169,6 +171,7 @@ example:org-dartlang-app:/
169171
'result abc\nline1\nline2\nabc\nabc'
170172
))
171173
));
174+
final KernelCompiler kernelCompiler = await kernelCompilerFactory.create(null);
172175
final CompilerOutput output = await kernelCompiler.compile(
173176
sdkRoot: '/path/to/sdkroot',
174177
mainPath: '/path/to/main.dart',

packages/flutter_tools/test/tester/flutter_tester_test.dart

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import 'package:flutter_tools/src/build_info.dart';
1212
import 'package:flutter_tools/src/cache.dart';
1313
import 'package:flutter_tools/src/compile.dart';
1414
import 'package:flutter_tools/src/device.dart';
15+
import 'package:flutter_tools/src/project.dart';
1516
import 'package:flutter_tools/src/tester/flutter_tester.dart';
1617
import 'package:mockito/mockito.dart';
1718
import 'package:process/process.dart';
@@ -109,7 +110,7 @@ void main() {
109110
FileSystem: () => fs,
110111
Cache: () => Cache(rootOverride: fs.directory(flutterRoot)),
111112
ProcessManager: () => mockProcessManager,
112-
KernelCompiler: () => mockKernelCompiler,
113+
KernelCompilerFactory: () => FakeKernelCompilerFactory(mockKernelCompiler),
113114
Artifacts: () => mockArtifacts,
114115
};
115116

@@ -185,7 +186,6 @@ Hello!
185186
debuggingOptions: DebuggingOptions.enabled(const BuildInfo(BuildMode.debug, null)));
186187
expect(result.started, isTrue);
187188
expect(result.observatoryUri, observatoryUri);
188-
189189
expect(logLines.last, 'Hello!');
190190
}, overrides: startOverrides);
191191
});
@@ -194,3 +194,13 @@ Hello!
194194

195195
class MockArtifacts extends Mock implements Artifacts {}
196196
class MockKernelCompiler extends Mock implements KernelCompiler {}
197+
class FakeKernelCompilerFactory implements KernelCompilerFactory {
198+
FakeKernelCompilerFactory(this.kernelCompiler);
199+
200+
final KernelCompiler kernelCompiler;
201+
202+
@override
203+
Future<KernelCompiler> create(FlutterProject flutterProject) async {
204+
return kernelCompiler;
205+
}
206+
}

0 commit comments

Comments
 (0)