Chromium Code Reviews| Index: pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart |
| diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart |
| index 5048fe5f5cb7ea9024cd7c2a60ab652a034bcafa..d08db294f54961ca5c01aff651a032f639673677 100644 |
| --- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart |
| +++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart |
| @@ -35,6 +35,8 @@ import 'package:js_runtime/shared/embedded_names.dart' show |
| import '../js_emitter.dart' show NativeGenerator, buildTearOffCode; |
| import '../model.dart'; |
| +part 'fragment_emitter.dart'; |
| + |
| class ModelEmitter { |
| final Compiler compiler; |
| final Namer namer; |
| @@ -124,7 +126,55 @@ class ModelEmitter { |
| } |
| int emitProgram(Program program) { |
| - // TODO(floitsch): implement. |
| - throw new UnimplementedError("startup-emitter.emitProgram"); |
| + List<Fragment> fragments = program.fragments; |
|
herhut
2015/07/27 11:03:15
Should we add a getter for deferredFragments? I do
floitsch
2015/07/29 16:47:34
There is already one. I just need to use it...
|
| + MainFragment mainFragment = fragments.first; |
| + |
| + int totalSize = 0; |
| + |
| + FragmentEmitter fragmentEmitter = |
| + new FragmentEmitter(compiler, namer, backend, constantEmitter, this); |
| + |
| + // We have to emit the deferred fragments first, since we need their |
| + // deferred hash (which depends on the output) when emitting the main |
| + // fragment. |
| + List<js.Expression> fragmentsCode = fragments.skip(1).map( |
| + (DeferredFragment deferredFragment) { |
| + js.Expression types = |
| + program.metadataTypesForOutputUnit(deferredFragment.outputUnit); |
| + return fragmentEmitter.emitDeferredFragment( |
| + deferredFragment, types, program.holders); |
| + }).toList(); |
| + |
| + js.Statement mainAst = fragmentEmitter.emitMainFragment(program); |
| + |
| + js.TokenCounter counter = new js.TokenCounter(); |
| + fragmentsCode.forEach(counter.countTokens); |
| + counter.countTokens(mainAst); |
| + |
| + program.finalizers.forEach((js.TokenFinalizer f) => f.finalizeTokens()); |
| + |
| + for (int i = 0; i < fragmentsCode.length; ++i) { |
| + String code = js.prettyPrint(fragmentsCode[i], compiler).getText(); |
| + totalSize += code.length; |
| + compiler.outputProvider(fragments[i+1].outputFileName, deferredExtension) |
| + ..add(code) |
| + ..close(); |
| + } |
| + |
| + String mainCode = js.prettyPrint(mainAst, compiler).getText(); |
| + compiler.outputProvider(mainFragment.outputFileName, 'js') |
| + ..add(buildGeneratedBy(compiler)) |
| + ..add(mainCode) |
| + ..close(); |
| + totalSize += mainCode.length; |
| + |
| + return totalSize; |
| + } |
| + |
| + String buildGeneratedBy(compiler) { |
| + var suffix = ''; |
| + if (compiler.hasBuildId) suffix = ' version: ${compiler.buildId}'; |
| + return '// Generated by dart2js (CSP), ' |
| + 'the Dart to JavaScript compiler$suffix.\n'; |
| } |
| } |