* Introduce frontend_server that allows for interactive and batch modes. Example of batch mode: ``` $ dart $HOME/p/f/t11/flutter/engine/src/flutter/frontend_server/bin/server.dart --sdk-root=$HOME/p/f/t11/flutter/engine/src/out/android_debug/flutter_patched_sdk --platform-kernel-dill=$HOME/p/f/t11/flutter/engine/src/out/android_debug/flutter_patched_sdk/platform.dill $HOME/p/f/t11/flutter/flutter/examples/flutter_gallery/lib/main.dart out: result 79256789-598c-4909-a9e4-0ef36d4c26ba out: 'State&TickerProviderStateMixin^#U0^' is exported from both 'package:flutter/src/widgets/animated_cross_fade.dart' and 'package:flutter/src/widgets/animated_list.dart'. ... out: Superclass has no method named 'hitTest'. out: 79256789-598c-4909-a9e4-0ef36d4c26ba $HOME/p/f/t11/flutter/flutter/examples/flutter_gallery/lib/main.dart.dill $ ``` Example of interactive mode - communication via stdin/stdout: ``` $ dart $HOME/p/f/t11/flutter/engine/src/flutter/frontend_server/bin/server.dart --sdk-root=$HOME/p/f/t11/flutter/engine/src/out/android_debug/flutter_patched_sdk --platform-kernel-dill=$HOME/p/f/t11/flutter/engine/src/out/android_debug/flutter_patched_sdk/platform.dill --incremental out: Frontend server is ready. in: compile abc.dart out: result fd99c0f9-12bb-4083-818e-2521d454fdc8 out: fd99c0f9-12bb-4083-818e-2521d454fdc8 abc.dart.dill in: accept in: recompile kuka in: 123.dart in: 456.dart in: kuka out: result d12f8d05-6c79-44f7-a775-1d3469e1be53 in: quit $ ``` * Add test. Cleanup dependencies. * One more test with mocks * Remove platform-kernel option. Refactored CompilerOptions. Clean up comments. * Update license * Use Uri.base.resolve consistently. Ensure folder path for sdk root. Fix test. * Fix main_dart for frontend_server build target * Reintroduce .packages file, add README.md, revert changes to licenses_flutter * Run analyzer on frontend-server. Update .packages deps so tests can be run too. * Add analyzer options file * Clean up dependencies * Add frontend_server files to license file back * Fix comment in analysis_options.yaml * Run frontend_server tests in travis * Update licenses * Change a+x permission on travis/test.sh * pub get before pub run test * Fix path to when * Clarify accept/reject instructions * Formatting, fixed docs, style * Update license script to skip .travis.yml, when/example. Update license file. * Update style nits * Fix license * Trim license extracted text. Fix licenses * Update licenses_third_party signature * Few more tests * Update dart license * Update dart license * Style changes. Fix return value for Future<Null>
2.5 KiB
Frontend Server
Frontend server is simple wrapper around Dart Frontend. It is a Dart application that compiles Dart source into Dart Kernel binary (.dill-file). Documentation on Dart Kernel (semantic, binary format, etc) can be found here: https://github.com/dart-lang/sdk/wiki/Kernel-Documentation.
Frontend server runs in two modes:
- immediate mode, where Dart source file name is provided as command line argument;
- interactive mode, where communication is happening over stdin/stdout.
Interactive mode instructions
Compile/Recompile
compile <input.dart>
Compiles <input.dart> Dart source file with Dart Frontend. Replies with result response.
recompile <boundary-key>
<path/to/updated/file1.dart>
<path/to/updated/file2.dart>
...
<boundary-key>
Incrementally recompiles Dart program previously compiled in current session, taking into account
changes in the listed files. Replies with result response.
Relative paths should be relative to current working directory for the shell that launched Frontend Server.
Accept/Reject
accept
Accepts results of incremental compilation, so that on next recompilation request Dart Frontend will not include these recompiled files.
reject
Rejects results of incremental compilation, so that on next recompilation request Dart Frontend will include compilation results from previously rejected recompilation in addition to what it will recompile based on newly changed files. Small technical detail is that Dart Frontend will not recompile files from previously rejected recompilation attempts (unless they were changed since then), it will just include appropriate kernel binaries it kept around from those previously rejected compilation requests.
One use of accept and reject instructions is in the context of Dart VM hot-reload. Dart VM can
reject user-provided incremental change to what is currently running. It could happen for variety
of Dart VM internal reasons. For example, if incremental update changes some class to enum,
such update can not be hot-reloaded by VM at this point, will be rejected.
Quit
quit
Stops the server.
Response from the server
result <boundary-key>
<compiler output>
<boundary-key> [<output.dill>]
Response from the Dart Frontend compiler is bracketed by <boundary-key> tags. If the compiler
was able to produce a Dart Kernel file, the name of this file <output.dill> is provided too.
If the compiler encountered unrecoverable errors, there will be no output file name provided.