| 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 b3a6c018cb5b9ccd5cacdf64332d7d9aa80ea2bb..d3eb2e87c98474dec7f8cd9cf6d19630c8cc36d7 100644
|
| --- a/dart/pkg/dart2js_incremental/lib/library_updater.dart
|
| +++ b/dart/pkg/dart2js_incremental/lib/library_updater.dart
|
| @@ -18,6 +18,7 @@ import 'package:compiler/implementation/dart2jslib.dart' show
|
|
|
| import 'package:compiler/implementation/elements/elements.dart' show
|
| Element,
|
| + FunctionElement,
|
| LibraryElement;
|
|
|
| import 'package:compiler/implementation/scanner/scannerlib.dart' show
|
| @@ -38,10 +39,15 @@ import 'package:compiler/implementation/js/js.dart' show
|
| import 'package:compiler/implementation/js/js.dart' as jsAst;
|
|
|
| import 'package:compiler/implementation/js_emitter/js_emitter.dart' show
|
| - ClassBuilder;
|
| + CodeEmitterTask,
|
| + MemberInfo;
|
|
|
| import 'package:compiler/js_lib/shared/embedded_names.dart' as embeddedNames;
|
|
|
| +import 'package:compiler/implementation/js_backend/js_backend.dart' show
|
| + JavaScriptBackend,
|
| + Namer;
|
| +
|
| import 'diff.dart' show
|
| Difference,
|
| computeDifference;
|
| @@ -76,6 +82,12 @@ class LibraryUpdater {
|
| this.logTime,
|
| this.logVerbose);
|
|
|
| + JavaScriptBackend get backend => compiler.backend;
|
| +
|
| + Namer get namer => backend.namer;
|
| +
|
| + CodeEmitterTask get emitter => backend.emitter;
|
| +
|
| /// Used as tear-off passed to [LibraryLoaderTask.resetAsync].
|
| Future<bool> reuseLibrary(LibraryElement library) {
|
| assert(compiler != null);
|
| @@ -205,7 +217,9 @@ class LibraryUpdater {
|
|
|
| List<jsAst.Statement> updates = <jsAst.Statement>[];
|
| for (Element element in compiler.enqueuer.codegen.newlyEnqueuedElements) {
|
| - updates.add(computeMemberUpdateJs(element));
|
| + if (!element.isField) {
|
| + updates.add(computeMemberUpdateJs(element));
|
| + }
|
| }
|
|
|
| if (updates.length == 1) {
|
| @@ -216,22 +230,28 @@ class LibraryUpdater {
|
| }
|
|
|
| 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 elementAccess = compiler.backend.namer.elementAccess(element);
|
| + MemberInfo info = emitter.oldEmitter.containerBuilder
|
| + .analyzeMemberMethod(element);
|
| + if (info == null) {
|
| + compiler.internalError(element, '${element.runtimeType}');
|
| + }
|
| + String name = info.name;
|
| + jsAst.Node function = info.code;
|
| + jsAst.Node elementAccess = namer.elementAccess(element);
|
| jsAst.Expression globalFunctionsAccess =
|
| - compiler.backend.emitter.generateEmbeddedGlobalAccess(
|
| - embeddedNames.GLOBAL_FUNCTIONS);
|
| + emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS);
|
| List<jsAst.Statement> statements = <jsAst.Statement>[];
|
| statements.add(
|
| js.statement(
|
| '#.# = # = f',
|
| [globalFunctionsAccess, name, elementAccess]));
|
| + if (info.canTearOff) {
|
| + String globalName = namer.globalObjectFor(element);
|
| + statements.add(
|
| + js.statement(
|
| + '#.#().# = f',
|
| + [globalName, info.tearOffName, callNameFor(element)]));
|
| + }
|
| // 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.
|
| @@ -244,6 +264,13 @@ class LibraryUpdater {
|
| printer.blockOutWithoutBraces(node);
|
| return printer.outBuffer.getText();
|
| }
|
| +
|
| + String callNameFor(FunctionElement element) {
|
| + // TODO(ahe): Call a method in the compiler to obtain this name.
|
| + String callPrefix = namer.callPrefix;
|
| + int parameterCount = element.functionSignature.parameterCount;
|
| + return '$callPrefix\$$parameterCount';
|
| + }
|
| }
|
|
|
| /// Represents an update (aka patch) of [before] to [after]. We use the word
|
|
|