Chromium Code Reviews| Index: dart/pkg/dart2js_incremental/lib/library_updater.dart |
| diff --git a/dart/pkg/dart2js_incremental/lib/library_updater.dart b/dart/pkg/dart2js_incremental/lib/library_updater.dart |
| index 246f7797e3cefcbe6e153f999adc814950af0068..33c69feff688aefc444a79b98b556b83122285a2 100644 |
| --- a/dart/pkg/dart2js_incremental/lib/library_updater.dart |
| +++ b/dart/pkg/dart2js_incremental/lib/library_updater.dart |
| @@ -32,6 +32,16 @@ import 'package:compiler/implementation/source_file.dart' show |
| import 'package:compiler/implementation/tree/tree.dart' show |
| FunctionExpression; |
| +import 'package:compiler/implementation/js/js.dart' show |
| + js; |
| + |
| +import 'package:compiler/implementation/js/js.dart' as jsAst; |
| + |
| +import 'package:compiler/implementation/js_emitter/js_emitter.dart' show |
| + ClassBuilder; |
| + |
| +import 'package:compiler/js_lib/shared/embedded_names.dart' as embeddedNames; |
| + |
| import 'diff.dart' show |
| Difference, |
| computeDifference; |
| @@ -175,6 +185,61 @@ class LibraryUpdater { |
| List<Element> applyUpdates() { |
| return updates.map((Update update) => update.apply()).toList(); |
| } |
| + |
| + String computeUpdateJs() { |
| + List<Element> updatedElements = applyUpdates(); |
| + compiler.progress.reset(); |
| + for (Element element in updatedElements) { |
| + compiler.enqueuer.resolution.addToWorkList(element); |
| + } |
| + compiler.processQueue(compiler.enqueuer.resolution, null); |
| + |
| + compiler.phase = Compiler.PHASE_DONE_RESOLVING; |
| + |
| + for (Element element in updatedElements) { |
| + compiler.enqueuer.codegen.addToWorkList(element); |
| + } |
| + compiler.processQueue(compiler.enqueuer.codegen, null); |
| + |
| + jsAst.Block updates = new jsAst.Block.empty(); |
| + for (Element element in compiler.enqueuer.codegen.newlyEnqueuedElements) { |
| + updates.statements.add(computeMemberUpdateJs(element)); |
|
sra1
2014/10/07 18:03:06
Construct ASTs functionally.
Don't modify construc
ahe
2014/10/08 12:09:45
I'm doing something like that.
|
| + } |
| + |
| + if (updates.statements.length == 1) { |
| + return prettyPrintJs(updates.statements.single); |
| + } else { |
| + return prettyPrintJs(updates); |
| + } |
| + } |
| + |
| + jsAst.Node computeMemberUpdateJs(Element element) { |
| + ClassBuilder builder = new ClassBuilder(element, compiler.backend.namer); |
| + |
| + compiler.backend.emitter.oldEmitter.containerBuilder.addMember( |
| + element, builder); |
| + jsAst.Property property = builder.properties.single; |
| + jsAst.Node name = property.name; |
| + jsAst.Node function = property.value; |
| + jsAst.Node globalObject = compiler.backend.namer.globalObjectFor(element); |
| + jsAst.Expression globalFunctionsAccess = |
| + compiler.backend.emitter.generateEmbeddedGlobalAccess( |
| + embeddedNames.GLOBAL_FUNCTIONS); |
| + jsAst.Node updateGlobalFunction = |
| + js.statement( |
| + '#.# = #.# = f', [globalFunctionsAccess, name, globalObject, name]); |
| + // Create a scope by creating a new function. The updated function literal |
| + // is passed as an argument to this function which ensures that temporary |
| + // names in updateScope don't shadow global names. |
|
floitsch
2014/10/07 15:56:58
The only temporary variable updateScope has is the
ahe
2014/10/07 16:32:40
Yes, but I know I want to add at least one more st
floitsch
2014/10/07 17:48:38
Maybe you could write it with conditions:
if (#) #
sra1
2014/10/07 18:03:06
You can conditionally generate code with templates
ahe
2014/10/08 12:09:45
I think I'll avoid templates with conditionals in
|
| + jsAst.Fun updateScope = new jsAst.Fun( |
| + [new jsAst.Parameter('f')], new jsAst.Block.empty()); |
|
floitsch
2014/10/07 15:56:58
does the following work?
jsAst.Fun = js('function
ahe
2014/10/07 16:32:40
Yes. But doesn't scale to multiple statements. I
floitsch
2014/10/07 17:48:38
I think you don't even need a block:
js('function
sra1
2014/10/07 18:03:06
It does work, with a minor tweak.
Blocks (and ite
ahe
2014/10/08 12:09:45
That's pretty nifty, but I feel that this is more
|
| + updateScope.body.statements.add(updateGlobalFunction); |
|
sra1
2014/10/07 18:03:06
Ditto: Construct ASTs functionally.
ahe
2014/10/08 12:09:45
I don't know what you mean by that.
|
| + return js.statement('(#)(#)', [updateScope, function]); |
| + } |
| + |
| + String prettyPrintJs(jsAst.Node node) { |
| + return jsAst.prettyPrint(node, compiler).getText(); |
| + } |
| } |
| /// Represents an update (aka patch) of [before] to [after]. We use the word |