Index: pkg/front_end/lib/src/fasta/testing/kernel_chain.dart |
diff --git a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart |
index 04ae0cfa6fa7f3eca9eaa6305050a6e8586666ed..bdb0ff71bacb40946129d9ee6bad1e44288a72db 100644 |
--- a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart |
+++ b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart |
@@ -28,10 +28,14 @@ import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter; |
import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder; |
import 'package:testing/testing.dart' |
- show ChainContext, Result, StdioProcess, Step; |
+ show ChainContext, Result, StdioProcess, Step, TestDescription; |
import 'package:kernel/ast.dart' show Program; |
+import 'package:front_end/front_end.dart'; |
+ |
+import 'patched_sdk_location.dart' show computePatchedSdk; |
+ |
class Print extends Step<Program, Program, ChainContext> { |
const Print(); |
@@ -170,6 +174,40 @@ class Copy extends Step<Program, Program, ChainContext> { |
} |
} |
+/// A `package:testing` step that runs the `package:front_end` compiler to |
+/// generate a kernel program for an individual file. |
+/// |
+/// Most options are hard-coded, but if necessary they could be moved to the |
+/// [CompileContext] object in the future. |
+class Compile extends Step<TestDescription, Program, CompileContext> { |
+ const Compile(); |
+ |
+ String get name => "fasta compilation"; |
+ |
+ Future<Result<Program>> run( |
+ TestDescription description, CompileContext context) async { |
+ Result<Program> result; |
+ reportError(CompilationError error) { |
+ result ??= fail(null, error.message); |
+ } |
+ |
+ Uri sdk = await computePatchedSdk(); |
+ Program p = await kernelForProgram( |
+ description.uri, |
+ new CompilerOptions() |
+ ..sdkRoot = sdk |
+ ..packagesFileUri = Uri.base.resolve('.packages') |
+ ..strongMode = context.strongMode |
+ ..linkedDependencies = [sdk.resolve('platform.dill')] |
+ ..onError = reportError); |
+ return result ??= pass(p); |
+ } |
+} |
+ |
+abstract class CompileContext implements ChainContext { |
+ bool get strongMode; |
+} |
+ |
class BytesCollector implements Sink<List<int>> { |
final List<List<int>> lists = <List<int>>[]; |