| # The dart2js compiler | 
 |  | 
 | Welcome to the sources of the dart2js compiler! | 
 |  | 
 | ## Architecture | 
 |  | 
 | The compiler is currently undergoing a long refactoring process. As you navigate | 
 | this code you may find it helpful to understand how the compiler used to be, | 
 | where it is going, and where it is today. | 
 |  | 
 | ### The near future architecture | 
 |  | 
 | The compiler will operate in these general phases: | 
 |  | 
 |   1. **load kernel**: Load all the code as kernel | 
 |       * Collect dart sources transtively | 
 |       * Convert to kernel AST   | 
 |    | 
 |   (this will be handled by invoking the front-end package) | 
 |    | 
 |   Alternatively, the compiler can start compilation directly from kernel files. | 
 |  | 
 |   2. **model**: Create a Dart model of the program | 
 |      * The kernel ASTs could be used as a model, so this might be a no-op or just | 
 |        creating a thin wrapper on top of kernel. | 
 |  | 
 |   3. **tree-shake and create world**: Build world of reachable code | 
 |      * For each reachable piece of code: | 
 |          * Compute impact (i1) from kernel AST | 
 |      * Build a closed world (w1) | 
 |  | 
 |   4. **analyze**: Run a global analysis | 
 |      * Assume closed world semantics (from w1) | 
 |      * Produce a global result (g) | 
 |         * Like today (g) will contain type and nullability information | 
 |         * After we adopt strong-mode types, we want to explore simplifying this | 
 |         to only contain native + nullability information. | 
 |  | 
 |   5. **codegen model**: Create a JS model of the program | 
 |      * Model JavaScript specific concepts (like the split of constructor bodies | 
 |        as separate elements) and provide a mapping to the Dart model | 
 |  | 
 |   6. **codegen and tree-shake**: Generate code, as needed | 
 |      * For each reachable piece of code: | 
 |         * build ssa graph from kernel ASTs and global results (g) | 
 |         * optimize ssa | 
 |         * compute impact (i2) from optimized code | 
 |         * emit JS ASTs for the code | 
 |      * Build a codegen closed world (w2) from new impacts (i2) | 
 |  | 
 |   7. **emit**: Assemble and minify the program | 
 |      * Build program structure from the compiled pieces (w2) | 
 |      * Use frequency namer to minify names. | 
 |      * Emit js and source map files. | 
 |  | 
 | ### The old architecture | 
 |  | 
 | The compiler used to operate as follows: | 
 |  | 
 |   1. **load dart**: Load all source files | 
 |      * Collect dart sources transtively | 
 |      * Scan enough tokens to build import dependencies. | 
 |  | 
 |   2. **model**: Create a Dart model (aka. Element Model) of the program | 
 |      * Do a diet-parse of the program to create the high-level element model | 
 |  | 
 |   3. **resolve and tree-shake**: Resolve and build world of reachable code (the | 
 |      resolution enqueuer) | 
 |      * For each reachable piece of code: | 
 |         * Parse the full body of the function | 
 |         * Resolve it and enqueue other pieces that are reachable | 
 |         * Type check the body of the function | 
 |  | 
 |   4. **analyze**: Run a global analysis | 
 |      * Assume closed world semantics (from everything enqueued by the resolver) | 
 |      * Produce a global result about type and nullability information of method | 
 |        arguments, return values, and receivers of dynamic sends. | 
 |  | 
 |   5. **codegen and tree-shake**: Generate code, as needed (via the codegen | 
 |      enqueuer) | 
 |      * For each reachable piece of code: | 
 |         * build ssa graph from resolved source ASTs global results (g) | 
 |         * optimize ssa | 
 |         * enqueue visible dependencies | 
 |         * emit js asts for the code | 
 |  | 
 |   6. **emit**: Assemble and minify the program | 
 |      * Build program structure from the compiled pieces | 
 |      * Use frequency namer to minify names. | 
 |      * Emit js and source map files. | 
 |  | 
 | ### The architecture today (which might be changing while you read this!) | 
 |  | 
 | When using the `--use-kernel` flag, you can test the latest state of the | 
 | compiler as we are migrating to the new architecture. Currently it works as | 
 | follows: | 
 |  | 
 |   1. **load dart**: (same as old compiler) | 
 |  | 
 |   2. **model**: (same element model as old compiler) | 
 |  | 
 |   3. **resolve, tree-shake and build world**: Build world of reachable code | 
 |      * For each reachable piece of code: | 
 |         * Parse full body of the function | 
 |         * Resolve it from the parsed source ASTs | 
 |         * Type check it (same as old compiler) | 
 |         * Compute impact (i1) from resolved source ASTs (no kernel) | 
 |      * Build a closed world (w1) | 
 |  | 
 |   4. **kernelize**: Create kernel ASTs | 
 |      * For all resolved elements in w1, compute their kernel representation using | 
 |        the `rasta` visitor. | 
 |  | 
 |   5. **analyze**: (almost same as old compiler) | 
 |  | 
 |   6. **codegen and tree-shake**: Generate code, as needed | 
 |      * For each reachable piece of code: | 
 |         * build ssa graph from kernel ASTs (uses global results g) | 
 |         * optimize ssa | 
 |         * compute impact (i2) from optimized code | 
 |         * emit js asts for the code | 
 |      * Build a codegen closed world (w2) from new impacts (i2) | 
 |  | 
 |   7. **emit**: (same as old compiler) | 
 |  | 
 | Some additional details worth highlighting: | 
 |  | 
 |   * tree-shaking is close to working as we want: the notion of a world and world | 
 |     impacts are computed explicitly: | 
 |  | 
 |      * In the old compiler, the resolver and code generator directly | 
 |        enqueued items to be processed, there was no knowledge of what had | 
 |        to be done other than in the algorithm itself. | 
 |  | 
 |      * Now the information is computed explicitly in two ways: | 
 |  | 
 |        * The dependencies of a single element are computed as an "impact" | 
 |          object, these are derived from the structure of the | 
 |          code (either the resolved code or the generated code). | 
 |  | 
 |        * The closed world is now an explicit concept that can be replaced in the | 
 |          compiler. | 
 |  | 
 |      * This allows us to delete the resolver in the future and replace it | 
 |        with a kernel loader, an impact builder from kernel, and a kernel world. | 
 |  | 
 |      * There is an implementation of a kernel impact builder, but it is not yet | 
 |        in use in the compiler pipeline (gated on replacing the Dart model) | 
 |  | 
 |   * We still depend on the Dart model computed by resolution, but progress has | 
 |     been made introducing an abstraction common to the new and old models. The | 
 |     old model is the "Element model", the generic abstraction is called the | 
 |     "Entity model". Some portions of the compiler now refer to the entity model. | 
 |  | 
 |   * The ssa graph is built from the kernel ASTs, but it still depends on the old | 
 |     element model computed from resolution (accessed via a kernel2Ast adapter). | 
 |     The graph builder implementation covers a large chunk of the language | 
 |     features, but is not complete (89% of langage & corelib tests are passing). | 
 |  | 
 |   * Global analysis is still working on top of the dart2js ASTs. | 
 |  | 
 | ## Code organization and history | 
 |  | 
 | The compiler package was initially intended to be compiler for multiple targets: | 
 | Javascript, Dart (dart2dart), and dartino bytecodes. It has now evolved to be a | 
 | Javascript only compiler, but some of the abstractions to support multiple | 
 | targets still remain. | 
 |  | 
 | ### Possibly confusing terminology | 
 |  | 
 | Some of the terminology in the compiler is confusing without knowing its | 
 | history. We are cleaning this up as we are rearchitecting the system, but here | 
 | are some of the legacy terminology we have: | 
 |  | 
 |   * **target**: the output the compiler is producing. Nowdays it just | 
 |     JavaScript, but in the past there was also Dart and dartino bytecodes. | 
 |  | 
 |   * **backend**: pieces of the compiler that were target-specific. | 
 |     Note: in the past we've used the term *backend* also for code that is used | 
 |     in the frontend of the compiler that happens to be target-specific, as well | 
 |     as and code that is used in the emitter or what traditionally is known | 
 |     as the backend of the compiler. | 
 |  | 
 |   * **frontend**: the parser, resolver, and other early stages of the compiler. | 
 |     The front-end however makes target-specific choices. For example, to compile | 
 |     a program with async-await, the dart2js backend needs to include some helper | 
 |     functions that are used by the expanded async-await code, these helpers need | 
 |     to be parsed by the frontend and added to the compilation pipeline. | 
 |  | 
 |   * **world**: the compiler exploits closed-world assumptions to do | 
 |     optimizations. The *world* encapsulates some of our knowledge of the | 
 |     program, like what's reachable from `main`, which classes are instantiated, | 
 |     etc. | 
 |  | 
 |   * **universe**: rather than loading entire programs and removing unreachable | 
 |     code, the compiler uses a tree-growing approach: it enqueues work based on | 
 |     what it sees. While this is happening the *world* is considered to be | 
 |     growing, in the past the term *universe* was used to describe this growing | 
 |     world. While the term is not completely deleted from the codebase, a lot of | 
 |     progress has been made to rename *universe* into *world builders*. | 
 |  | 
 |   * **model**: there are many models in the compiler: | 
 |  | 
 |     * **element model**: this is an abstraction describing the elements seen in | 
 |       Dart programs, like "libraries", "classes", "methods", etc. | 
 |  | 
 |     * **entity model**: also describes elements seen in Dart programs, but it is | 
 |       meant to be minimalistic and a super-hierarchy above the *element models*. | 
 |       This is a newer addition, is an added abstraction to make it possible to | 
 |       refactor our code from our old frontend to the kernel frontend. | 
 |  | 
 |     * **Dart vs JS models**: the compiler in the past had a single model to | 
 |       describe elements in the source and elements that were being compiled. In | 
 |       the future we plan to have two. Both input model and output models will be | 
 |       implementations of the *entity model*. The JS model is intended to have | 
 |       concepts specific about generating code in JS (like constructor-bodies as | 
 |       a separate entity than the constructor, closure classes, etc). | 
 |  | 
 |     * **emitter model**: this is a model just used for dumping out the structure | 
 |       of the program in a .js text file. It doesn't have enough semantic meaning | 
 |       to be a JS model for compilation at this moment. | 
 |  | 
 |   * **enqueuer**: a work-queue used to achieve tree-shaking (or more precisely | 
 |     tree-growing): elements are added to the enqueuer as we recognize that they | 
 |     are needed in a given application. Note that we even track how elements are | 
 |     used, since some ways of using an element require more code than others. | 
 |  | 
 | ### Code layout | 
 |  | 
 | Here are some details of our current code layout and what's in each file. This | 
 | list also includes some action items (labeled AI below), which are mainly | 
 | cleanup tasks that we have been discussing for a while: | 
 |  | 
 | **bin folder**: some experimental command-line entrypoints, these need to be | 
 | revisited | 
 |  | 
 | * `bin/dart2js.dart`: is a dart2js entry point, not used today other than | 
 |   locally for development, most of our tools launch dart2js from | 
 |   `lib/src/dart2js.dart` instead. | 
 |  | 
 |   AI: change how we build the SDK to launch dart2js from here, most logic might | 
 |   remain inside `lib/src/dart2js.dart` for testing purposes. | 
 |  | 
 | **lib folder**: API to use dart2js as a library. This is used by our | 
 | command-line tool to launch dart2js, but also by pub to invoke dart2js as a | 
 | library during `pub-build` and `pub-serve`. | 
 |  | 
 | * `lib/compiler_new.dart`: the current API. This API is used by our command-line | 
 |   tool to spawn the dart2js compiler. This API (and everything that is | 
 |   transitively created from it) has no dependencies on `dart:io` so that the | 
 |   compiler can be used in contexts where `dart:io` is not available (e.g. | 
 |   running in a browser worker) or where `dart:io` is not used explicitly (e.g. | 
 |   running as a pub transformer). | 
 |  | 
 |   AI: rename to `compiler.dart`. | 
 |  | 
 | * `lib/compiler.dart`: a legacy API that now is implemented by adapting calls to | 
 |   the new API in `compiler_new.dart`. | 
 |  | 
 |   AI: migrate users to the new API (pub is one of those users, possibly dart-pad | 
 |   is another), and delete the legacy API. | 
 |  | 
 | **lib/src folder**: most of the compiler lives here, as very little of its | 
 | functionality is publicly exposed. | 
 |  | 
 |  | 
 | * `lib/src/dart2js.dart`: the command-line script that runs dart2js. When | 
 |   building the SDK, the dart2js snapshot is built using the main method on this | 
 |   script.  This file creates the parameters needed to invoke the API defined in | 
 |   `lib/compiler_new.dart`. All dependencies on `dart:io` come from here. This is | 
 |   also where we process options (although some of the logic is done in | 
 |   `options.dart`). | 
 |  | 
 | * `lib/src/compiler.dart`: defines the core `Compiler` object, which contains | 
 |   all the logic about what the compiler pipeline does and how data is organized | 
 |   and communicated between different phases. For a long time, `Compiler` was | 
 |   also used throughout the system as a global dependency-injection object. | 
 |   We've been slowly disentangling those dependencies, but there are still many | 
 |   references to `compiler` still in use. | 
 |  | 
 | * `lib/src/apiimpl.dart`: defines `CompilerImpl` a subclass of `Compiler` that | 
 |   adds support for loading scripts, resolving package URIs and patch files. The | 
 |   separation here is a bit historical and we should be able to remove it. It was | 
 |   added to make it easier to create a `MockCompiler` implementation for unit | 
 |   testing. The `MockCompiler` has been replaced in most unit tests by a regular | 
 |   `CompilerImpl` that uses a mock of the file-system (see | 
 |   `tests/compiler/dart2js/memory_compiler.dart`). | 
 |  | 
 |   AI: Once all tests are migrated to this memory compiler, we should merge | 
 |   `Compiler` and `CompilerImpl` and remove this file. | 
 |  | 
 | * `lib/src/old_to_new_api.dart`: helper library used to adapt the public API in | 
 |   `lib/compiler.dart` to `lib/compiler_new.dart`. | 
 |  | 
 | * `lib/src/closure.dart`: closures are compiled as classes, this file has the | 
 |   logic to do this kind of conversion in the Dart element model. This includes | 
 |   computing what needs to be boxed and creating fake element models to represent | 
 |   closures as classes. We use the fake model approach because the compiler | 
 |   currently uses the same element model for Dart and JS. Our goal with the | 
 |   compiler rearchitecture described earlier is to have two models. The | 
 |   Dart model will be able to encode closures directly, and we'll introduce their | 
 |   corresponding classes when we create the corresponding JS model, removing the | 
 |   need of the fake elements. | 
 |  | 
 | * `lib/src/colors.dart`: ANSI support for reporting error messages with colors. | 
 |  | 
 |   AI: this file should move under a utilities folder. | 
 |  | 
 |  | 
 | * Handling of options: as mentioned earlier `lib/src/dart2js.dart` has some | 
 |   handling of command-line options, the rest is divided into these files: | 
 |  | 
 |   * `lib/src/commandline_options.dart`: defines the flags that dart2js accepts. | 
 |  | 
 |   * `lib/src/options.dart`: defines first-class objects to represent options of | 
 |     dart2js. This includes a parse function that can translate flags into their | 
 |     corresponding objects. This was added recently to simplify how options were | 
 |     propagated throughout the compiler. | 
 |  | 
 |   AI: simplify further how we specify options. Ideally all changes can be done | 
 |   in a single file (`options.dart`?), and unit-tests can specify options via an | 
 |   options object rather than command-line flags. | 
 |  | 
 | * `lib/src/common.dart`: convenience file that reexports code used in many | 
 |   places in the compiler. | 
 |  | 
 |   AI: consider deleting this file. | 
 |  | 
 |  | 
 | * Constants: the compiler has a constant system that delays evaluation of | 
 |   constants and provides different semantics depending on the embedder, this | 
 |   abstraction was especially necessary when dart2js was used as a front-end for | 
 |   non-JS systems like dart2dart and dartino. | 
 |  | 
 |   * `lib/src/constants/expressions.dart`: this is how constants are represented | 
 |     after they are parsed but before they are evaluated. It is a target | 
 |     agnostic representation, all expressions are kept as they appear in the | 
 |     source, and it doesn't replace _environemnt_ values that are provided on the | 
 |     command line. In particular, the constant `1 == 1.0` is represented as an | 
 |     expression that includes the `==` binary expression, and `const | 
 |     String.fromEnvironment("FOO")` is not expanded. | 
 |  | 
 |   * `lib/src/constants/value.dart`: this is the represented value of a constant | 
 |     after it has been evaluated. The resulting value is specific to the target | 
 |     of the compiler and will no longer have environment placeholders. For | 
 |     example, when the target is Dart (dart2dart) `1 == 1.0` is evaluated to | 
 |     `false`, and when the target is JavaScript it is evaluated to `true`. This | 
 |     specific example is a result of the way dart2js compiles numbers as | 
 |     JavaScript Numbers. | 
 |  | 
 |   * `lib/src/constants/evaluation.dart`: defines the algorithm to turn an | 
 |     expression into a value. | 
 |  | 
 |   * `lib/src/constants/constant_system.dart`: an abstraction that defines how | 
 |     expressions may be folded. Different implementations of the constant system | 
 |     are used to target Dart or JavaScript. | 
 |  | 
 |   * `lib/src/compile_time_constants.dart`: defines how constant expressions are | 
 |     created from a parsed AST. | 
 |  | 
 |   * `lib/src/constant_system_dart.dart`: defines an implementation of a constant | 
 |     system with the Dart semantics (where `1 == 1.0` is true). | 
 |  | 
 |   * `lib/src/js_backend/constant_system_javascript.dart`: defines an | 
 |     implementation of a constant system with the JavaScript semantics (where | 
 |     `1 == 1.0` is false). | 
 |  | 
 |   * `lib/src/constants/constructors.dart` and | 
 |     `lib/src/constants/constant_constructors.dart`: used to define expressions | 
 |     containing constant constructors. They depend on the resolver to figure out | 
 |     what is the meaning of an initializer or a field on a constructed constant | 
 |     created this way. | 
 |  | 
 |   AI: consider deleting `constant_system_dart.dart` now that it is no longer | 
 |   used, or move under testing, if it might be used for unittests of the constant | 
 |   expressions. | 
 |  | 
 | * Common elements: the compiler often refers to certain elements during | 
 |   compilation either because they are first-class in the language or because | 
 |   they are implicitly used to implement some features. These include: | 
 |  | 
 |   * `lib/src/common_elements.dart`: provides an interface to lookup basic | 
 |     elements like the class of `Object`, `int`, `List`, and their corresponding | 
 |     interface types, constructors for symbols, annotations such as | 
 |     `@MirrorsUsed`, the `identical` function, etc. These are normally restricted | 
 |     to elements that are understood directly in Dart. | 
 |  | 
 |   * `lib/src/js_backend/backend_helpers.dart`: provides a way to lookup internal | 
 |     elements of the Javascript backend, like our internal | 
 |     representation of JSInt31, JSArray, and other implementation-specific | 
 |     elements. | 
 |  | 
 | * `lib/src/deferred_load.dart`: general analysis for deferred loading. This is | 
 |   where we compute how to split the code in different JS chunks or fragments. | 
 |   This is run after resolution, but at a time when no code is generated yet, so | 
 |   the decisions made here are used later on by the emitter to dump code into | 
 |   different files. | 
 |  | 
 | * `lib/src/dump_info.dart`: a special phase used to create a .info.json file. | 
 |   This file contains lots of information computed by dart2js including decisions | 
 |   about deferred loading, results of the global type-inference, and the actual | 
 |   code generated for each function. The output is used by tools provided in the | 
 |   `dart2js_info` package to analyze a program and better understand why | 
 |   something wasn't optimized as you'd expect. | 
 |  | 
 | * Tree-shaking: The compiler does two phases of reducing the program size by | 
 |   throwing away unreachable code. The first phase is done while resolving the | 
 |   program (reachablity is basically based on dependencies that appear in the | 
 |   code), the second phase is done as functions are optimized (which in turn can | 
 |   delete branches of the code and make more code unreachable). Externally | 
 |   we refer to it as tree-shaking, but it behaves more like a tree-growing | 
 |   algorithm: elements are added as they are discovered or as they are used. | 
 |   On some large apps we've seen 50% of code tree-shaken: 20% from the first | 
 |   phase, and an additional 30% from the second phase. | 
 |  | 
 |   * `lib/src/enqueue.dart`: this is the basic algorithm that adds things as they | 
 |     are discovered during resolution. | 
 |  | 
 |   * `lib/src/js_backend/enqueuer.dart`: this is the enqueuer used during code | 
 |     generation. | 
 |  | 
 | * `lib/src/environment.dart`: simple interface for collecting environment values | 
 |   (these are values passed via -D flags on the command line). | 
 |  | 
 | * `lib/src/filenames.dart`: basic support for converting between native and Uri | 
 |   paths. | 
 |  | 
 |   AI: move to utils | 
 |  | 
 | * `lib/src/id_generator.dart`: simple id generator | 
 |  | 
 |   AI: move to utils | 
 |  | 
 | * `lib/src/library_loader.dart`: the loader of the dart2js frontend. Asks the | 
 |   compiler to read and scan files, produce enough metadata to understand | 
 |   import, export, and part directives and keep crawling. It also triggers the | 
 |   patch parser to load patch files. | 
 |  | 
 | * `lib/src/mirrors_used.dart`: task that analyzes `@MirrorsUsed` annotations, | 
 |   which let the compiler continue to do tree-shaking even when code is used via | 
 |   `dart:mirrors`. | 
 |  | 
 | * Input/output: the compiler is designed to avoid all dependencies on dart:io. | 
 |   Most data is consumed and emitted via provider APIs. | 
 |  | 
 |   * `lib/src/compiler_new.dart`: defines the interface of these providers (see | 
 |     `CompilerInput` and `CompilerOutput`). | 
 |  | 
 |   * `lib/src/null_compiler_output.dart`: a `CompilerOutput` that discards all | 
 |     data written to it (name derives from /dev/null). | 
 |  | 
 |   * `lib/src/source_file_provider.dart`: _TODO: add details_. | 
 |  | 
 | * Parsing: most of the parsing logic is now in the `front_end` package, | 
 |   currently under `pkg/front_end/lib/src/fasta/scanner` and | 
 |   `pkg/front_end/lib/src/fasta/parser`. The `front_end` parser is AST agnostic | 
 |   and uses listeners to create on the side what they want as the result of | 
 |   parsing. The logic to create dart2js' ASTs is defined in listeners within the | 
 |   compiler package: | 
 |  | 
 |   * `lib/src/parser/element_listener.dart`: listener used to create the first | 
 |     skeleton of the element model (used by the diet parser) | 
 |  | 
 |   * `lib/src/parser/partial_elements.dart`: representation of elements in the | 
 |     element model whose body is not parsed yet (e.g. a diet-parsed member). | 
 |  | 
 |   * `lib/src/parser/node_listener.dart`: listener used to create the body of | 
 |     methods. | 
 |  | 
 |   * `lib/src/parser/member_listener.dart`: listener used to attach method bodies | 
 |     to class members. | 
 |  | 
 |   * `lib/src/parser/parser_task.dart`: Task to execute the full parser. | 
 |  | 
 |   * `lib/src/parser/diet_parser_task.dart`: Task to execute diet parsing. | 
 |  | 
 |   * `lib/src/patch_parser.dart`: additional support for parsing patch files. We | 
 |     expect this will also move under `front_end` in the future. | 
 |  | 
 |  | 
 | * URI resolution: the compiler needs special logic to resolve `dart:*` URIs and | 
 |   `package:*` URIs. These are specified in three parts: | 
 |  | 
 |   * sdk library files are specified in a .platform file. This file has a special | 
 |     .ini format which is parsed with `lib/src/platform_configuration.dart`. | 
 |  | 
 |   * sdk patch files are hardcoded in the codebase in | 
 |     `lib/src/js_backend/backend.dart` (see `_patchLocations`). | 
 |  | 
 |   * `lib/src/resolved_uri_translator.dart`: has the logic to translate all these | 
 |     URIs when they are encountered by the library loader. | 
 |  | 
 |   AI: consider changing the .platform file format to yaml. | 
 |  | 
 |  | 
 | * `lib/src/typechecker.dart`: the type checker (spec mode semantics, no support | 
 |   for strong mode here). | 
 |  | 
 | * World: _TODO: add details_ | 
 |  | 
 |   * `lib/src/world.dart` | 
 |   * `lib/src/universe/call_structure.dart` | 
 |   * `lib/src/universe/use.dart` | 
 |   * `lib/src/universe/feature.dart` | 
 |   * `lib/src/universe/world_impact.dart` | 
 |   * `lib/src/universe/selector.dart` | 
 |   * `lib/src/universe/side_effects.dart` | 
 |   * `lib/src/universe/class_set.dart` | 
 |   * `lib/src/universe/world_builder.dart` | 
 |   * `lib/src/universe/function_set.dart` | 
 |  | 
 |  | 
 | * Testing, debugging, and what not: _TODO: add details_ | 
 |   * `lib/src/tracer.dart` | 
 |   * `lib/src/use_unused_api.dart` | 
 |  | 
 |  | 
 | * SSA (`lib/src/ssa`): internal IR used to optimize functions before emitting | 
 |   JavaScript. _TODO: add details_. | 
 |   * `ssa.dart` | 
 |   * `kernel_string_builder.dart` | 
 |   * `codegen.dart` | 
 |   * `variable_allocator.dart` | 
 |   * `type_builder.dart` | 
 |   * `value_set.dart` | 
 |   * `types.dart` | 
 |   * `jump_handler.dart` | 
 |   * `codegen_helpers.dart` | 
 |   * `switch_continue_analysis.dart` | 
 |   * `types_propagation.dart` | 
 |   * `nodes.dart` | 
 |   * `kernel_ast_adapter.dart` | 
 |   * `graph_builder.dart` | 
 |   * `validate.dart` | 
 |   * `builder.dart.rej` | 
 |   * `interceptor_simplifier.dart` | 
 |   * `builder_kernel.dart` | 
 |   * `locals_handler.dart` | 
 |   * `optimize.dart` | 
 |   * `kernel_impact.dart` | 
 |   * `invoke_dynamic_specializers.dart` | 
 |   * `builder.dart` | 
 |   * `ssa_branch_builder.dart` | 
 |   * `value_range_analyzer.dart` | 
 |   * `ssa_tracer.dart` | 
 |   * `loop_handler.dart` | 
 |  | 
 | * `tool`: some helper scripts, some of these could be deleted | 
 |  | 
 |   * `tool/perf.dart`: used by our benchmark runners to measure performance of | 
 |     some frontend pieces of dart2js. We should be able to delete it in the near | 
 |     future once the front end code is moved into `fasta`. | 
 |  | 
 |   * `tool/perf_test.dart`: small test to ensure we don't break `perf.dart`. | 
 |  | 
 |   * `tool/track_memory.dart`: a helper script to see memory usage of dart2js | 
 |     while it's running. Used in the past to profile the global analysis phases | 
 |     when run on very large apps. | 
 |  | 
 |   * `tool/dart2js_stress.dart` and `tool/dart2js_profile_many.dart`: other | 
 |     helper wrappers to make it easier to profile dart2js with Observatory. | 
 |  | 
 | * Source map tracking (`lib/src/io`): helpers used to track source information | 
 |   and to build source map files. _TODO: add details_. | 
 |    * `lib/src/io/code_output.dart` | 
 |    * `lib/src/io/source_map_builder.dart` | 
 |    * `lib/src/io/start_end_information.dart` | 
 |    * `lib/src/io/position_information.dart` | 
 |    * `lib/src/io/source_information.dart` | 
 |    * `lib/src/io/source_file.dart` | 
 |    * `lib/src/io/line_column_provider.dart` | 
 |  | 
 | * Kernel conversion (`lib/src/kernel`): temporary code to create kernel within | 
 |   dart2js (previously known as `rasta`). Most of this code will be gone when we | 
 |   are in the final architecture. _TODO: add details_. | 
 |    * `lib/src/kernel/task.dart` | 
 |    * `lib/src/kernel/kernel_visitor.dart` | 
 |    * `lib/src/kernel/kernel_debug.dart` | 
 |    * `lib/src/kernel/unresolved.dart` | 
 |    * `lib/src/kernel/kernel.dart` | 
 |    * `lib/src/kernel/unavailable.dart` | 
 |    * `lib/src/kernel/accessors.dart` | 
 |    * `lib/src/kernel/constant_visitor.dart` | 
 |    * `lib/src/kernel/error.dart` | 
 |  | 
 | * Global whole-program analysis (a.k.a. type inference): We try to avoid the | 
 |   term "type inference" to avoid confusion with strong-mode type inference. | 
 |   However the code still uses the term inference for this global analysis. The | 
 |   code is contained under `lib/src/inferrer`. _TODO: add details_. | 
 |    * `lib/src/inferrer/type_graph_dump.dart` | 
 |    * `lib/src/inferrer/node_tracer.dart` | 
 |    * `lib/src/inferrer/list_tracer.dart` | 
 |    * `lib/src/inferrer/closure_tracer.dart` | 
 |    * `lib/src/inferrer/inferrer_engine.dart` | 
 |    * `lib/src/inferrer/type_graph_inferrer.dart` | 
 |    * `lib/src/inferrer/type_graph_nodes.dart` | 
 |    * `lib/src/inferrer/type_system.dart` | 
 |    * `lib/src/inferrer/debug.dart` | 
 |    * `lib/src/inferrer/locals_handler.dart` | 
 |    * `lib/src/inferrer/map_tracer.dart` | 
 |    * `lib/src/inferrer/builder.dart` | 
 |  | 
 | --------- | 
 |  | 
 | _TODO: complete the documentation for the following files_. | 
 |  | 
 | `lib/src/ordered_typeset.dart` | 
 | `lib/src/script.dart` | 
 | `lib/src/string_validator.dart` | 
 |  | 
 | `lib/src/native` | 
 | `lib/src/native/ssa.dart` | 
 | `lib/src/native/scanner.dart` | 
 | `lib/src/native/js.dart` | 
 | `lib/src/native/enqueue.dart` | 
 | `lib/src/native/behavior.dart` | 
 | `lib/src/native/native.dart` | 
 |  | 
 | `lib/src/js_emitter` | 
 | `lib/src/js_emitter/native_emitter.dart` | 
 | `lib/src/js_emitter/main_call_stub_generator.dart` | 
 | `lib/src/js_emitter/model.dart` | 
 | `lib/src/js_emitter/headers.dart` | 
 | `lib/src/js_emitter/native_generator.dart` | 
 | `lib/src/js_emitter/parameter_stub_generator.dart` | 
 | `lib/src/js_emitter/constant_ordering.dart` | 
 | `lib/src/js_emitter/program_builder` | 
 | `lib/src/js_emitter/program_builder/collector.dart` | 
 | `lib/src/js_emitter/program_builder/program_builder.dart` | 
 | `lib/src/js_emitter/program_builder/field_visitor.dart` | 
 | `lib/src/js_emitter/program_builder/registry.dart` | 
 | `lib/src/js_emitter/metadata_collector.dart` | 
 | `lib/src/js_emitter/code_emitter_task.dart.rej` | 
 | `lib/src/js_emitter/code_emitter_task.dart.orig` | 
 | `lib/src/js_emitter/code_emitter_task.dart` | 
 | `lib/src/js_emitter/interceptor_stub_generator.dart` | 
 | `lib/src/js_emitter/full_emitter` | 
 | `lib/src/js_emitter/full_emitter/class_builder.dart` | 
 | `lib/src/js_emitter/full_emitter/container_builder.dart` | 
 | `lib/src/js_emitter/full_emitter/deferred_output_unit_hash.dart` | 
 | `lib/src/js_emitter/full_emitter/class_emitter.dart` | 
 | `lib/src/js_emitter/full_emitter/interceptor_emitter.dart` | 
 | `lib/src/js_emitter/full_emitter/code_emitter_helper.dart` | 
 | `lib/src/js_emitter/full_emitter/emitter.dart` | 
 | `lib/src/js_emitter/full_emitter/setup_program_builder.dart` | 
 | `lib/src/js_emitter/full_emitter/declarations.dart` | 
 | `lib/src/js_emitter/full_emitter/nsm_emitter.dart` | 
 | `lib/src/js_emitter/type_test_registry.dart` | 
 | `lib/src/js_emitter/js_emitter.dart.rej` | 
 | `lib/src/js_emitter/class_stub_generator.dart` | 
 | `lib/src/js_emitter/startup_emitter` | 
 | `lib/src/js_emitter/startup_emitter/deferred_fragment_hash.dart` | 
 | `lib/src/js_emitter/startup_emitter/model_emitter.dart` | 
 | `lib/src/js_emitter/startup_emitter/emitter.dart` | 
 | `lib/src/js_emitter/startup_emitter/fragment_emitter.dart` | 
 | `lib/src/js_emitter/js_emitter.dart` | 
 | `lib/src/js_emitter/helpers.dart` | 
 | `lib/src/js_emitter/runtime_type_generator.dart` | 
 | `lib/src/js_emitter/js_emitter.dart.orig` | 
 |  | 
 | `lib/src/elements` | 
 | `lib/src/elements/modelx.dart` | 
 | `lib/src/elements/types.dart` | 
 | `lib/src/elements/resolution_types.dart` | 
 | `lib/src/elements/entities.dart` | 
 | `lib/src/elements/common.dart` | 
 | `lib/src/elements/names.dart` | 
 | `lib/src/elements/visitor.dart` | 
 | `lib/src/elements/elements.dart` | 
 |  | 
 | `lib/src/diagnostics` | 
 | `lib/src/diagnostics/invariant.dart` | 
 | `lib/src/diagnostics/generated` | 
 | `lib/src/diagnostics/generated/shared_messages.dart` | 
 | `lib/src/diagnostics/messages.dart` | 
 | `lib/src/diagnostics/source_span.dart` | 
 | `lib/src/diagnostics/code_location.dart` | 
 | `lib/src/diagnostics/diagnostic_listener.dart` | 
 | `lib/src/diagnostics/spannable.dart` | 
 |  | 
 | `lib/src/common` | 
 | `lib/src/common/codegen.dart` | 
 | `lib/src/common/resolution.dart` | 
 | `lib/src/common/tasks.dart` | 
 | `lib/src/common/work.dart` | 
 | `lib/src/common/backend_api.dart` | 
 | `lib/src/common/names.dart` | 
 |  | 
 | `lib/src/tokens/token_map.dart`: unused | 
 |  | 
 | `lib/src/resolution` | 
 | `lib/src/resolution/typedefs.dart` | 
 | `lib/src/resolution/registry.dart.orig` | 
 | `lib/src/resolution/scope.dart` | 
 | `lib/src/resolution/members.dart` | 
 | `lib/src/resolution/label_scope.dart` | 
 | `lib/src/resolution/registry.dart.rej` | 
 | `lib/src/resolution/resolution.dart` | 
 | `lib/src/resolution/access_semantics.dart` | 
 | `lib/src/resolution/operators.dart` | 
 | `lib/src/resolution/member_impl.dart` | 
 | `lib/src/resolution/resolution_common.dart` | 
 | `lib/src/resolution/semantic_visitor.dart` | 
 | `lib/src/resolution/resolution_result.dart` | 
 | `lib/src/resolution/send_resolver.dart` | 
 | `lib/src/resolution/send_structure.dart` | 
 | `lib/src/resolution/variables.dart` | 
 | `lib/src/resolution/enum_creator.dart` | 
 | `lib/src/resolution/members.dart.orig` | 
 | `lib/src/resolution/type_resolver.dart` | 
 | `lib/src/resolution/class_members.dart` | 
 | `lib/src/resolution/constructors.dart` | 
 | `lib/src/resolution/secret_tree_element.dart` | 
 | `lib/src/resolution/registry.dart` | 
 | `lib/src/resolution/tree_elements.dart` | 
 | `lib/src/resolution/semantic_visitor_mixins.dart` | 
 | `lib/src/resolution/class_hierarchy.dart` | 
 | `lib/src/resolution/signatures.dart` | 
 |  | 
 | `lib/src/scanner` | 
 | `lib/src/scanner/scanner_task.dart` | 
 |  | 
 | `lib/src/helpers` | 
 | `lib/src/helpers/trace.dart` | 
 | `lib/src/helpers/debug_collection.dart` | 
 | `lib/src/helpers/expensive_map.dart` | 
 | `lib/src/helpers/helpers.dart` | 
 | `lib/src/helpers/track_map.dart` | 
 | `lib/src/helpers/expensive_set.dart` | 
 | `lib/src/helpers/stats.dart` | 
 |  | 
 | `lib/src/js` | 
 | `lib/src/js/js.dart` | 
 | `lib/src/js/placeholder_safety.dart` | 
 | `lib/src/js/js_debug.dart` | 
 | `lib/src/js/js_source_mapping.dart` | 
 | `lib/src/js/rewrite_async.dart` | 
 |  | 
 | `lib/src/util` | 
 | `lib/src/util/uri_extras.dart` | 
 | `lib/src/util/indentation.dart` | 
 | `lib/src/util/enumset.dart` | 
 | `lib/src/util/link.dart` | 
 | `lib/src/util/util.dart` | 
 | `lib/src/util/maplet.dart` | 
 | `lib/src/util/setlet.dart` | 
 | `lib/src/util/characters.dart` | 
 | `lib/src/util/emptyset.dart` | 
 | `lib/src/util/link_implementation.dart` | 
 | `lib/src/util/util_implementation.dart` | 
 | `lib/src/util/command_line.dart` | 
 |  | 
 | `lib/src/js_backend` | 
 | `lib/src/js_backend/frequency_namer.dart` | 
 | `lib/src/js_backend/patch_resolver.dart` | 
 | `lib/src/js_backend/minify_namer.dart` | 
 | `lib/src/js_backend/mirrors_analysis.dart` | 
 | `lib/src/js_backend/js_backend.dart` | 
 | `lib/src/js_backend/field_naming_mixin.dart` | 
 | `lib/src/js_backend/native_data.dart` | 
 | `lib/src/js_backend/namer.dart` | 
 | `lib/src/js_backend/custom_elements_analysis.dart` | 
 | `lib/src/js_backend/type_variable_handler.dart` | 
 | `lib/src/js_backend/js_interop_analysis.dart` | 
 | `lib/src/js_backend/backend_impact.dart` | 
 | `lib/src/js_backend/constant_emitter.dart` | 
 | `lib/src/js_backend/namer_names.dart` | 
 | `lib/src/js_backend/runtime_types.dart` | 
 | `lib/src/js_backend/no_such_method_registry.dart` | 
 | `lib/src/js_backend/constant_system_javascript.dart` | 
 | `lib/src/js_backend/backend.dart` | 
 | `lib/src/js_backend/checked_mode_helpers.dart` | 
 | `lib/src/js_backend/constant_handler_javascript.dart` | 
 |  | 
 | `lib/src/tree` | 
 | `lib/src/tree/prettyprint.dart` | 
 | `lib/src/tree/tree.dart` | 
 | `lib/src/tree/nodes.dart` | 
 | `lib/src/tree/dartstring.dart` | 
 | `lib/src/tree/unparser.dart` | 
 |  | 
 | `lib/src/types` | 
 | `lib/src/types/abstract_value_domain.dart` | 
 | `lib/src/types/types.dart` | 
 | `lib/src/types/type_mask.dart` | 
 | `lib/src/types/dictionary_type_mask.dart` | 
 | `lib/src/types/map_type_mask.dart` | 
 | `lib/src/types/forwarding_type_mask.dart` | 
 | `lib/src/types/container_type_mask.dart` | 
 | `lib/src/types/constants.dart` | 
 | `lib/src/types/flat_type_mask.dart` | 
 | `lib/src/types/masks.dart` | 
 | `lib/src/types/value_type_mask.dart` | 
 | `lib/src/types/union_type_mask.dart` | 
 |  | 
 | `lib/src/hash` | 
 | `lib/src/hash/sha1.dart` |