| 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 7a8bbe893a367623c4e3f1ada527b87396413855..11df1333c0b9503930eadf8d2672c2bdbaa6cd72 100644
|
| --- a/dart/pkg/dart2js_incremental/lib/library_updater.dart
|
| +++ b/dart/pkg/dart2js_incremental/lib/library_updater.dart
|
| @@ -44,8 +44,11 @@ import 'package:compiler/src/js/js.dart' show
|
| import 'package:compiler/src/js/js.dart' as jsAst;
|
|
|
| import 'package:compiler/src/js_emitter/js_emitter.dart' show
|
| + ClassBuilder,
|
| + ClassEmitter,
|
| CodeEmitterTask,
|
| - MemberInfo;
|
| + MemberInfo,
|
| + computeMixinClass;
|
|
|
| import 'package:_internal/compiler/js_lib/shared/embedded_names.dart'
|
| as embeddedNames;
|
| @@ -410,32 +413,39 @@ class LibraryUpdater extends JsFeatures {
|
| new Set.from(compiler.codegenWorld.directlyInstantiatedClasses);
|
| newClasses.removeAll(existingClasses);
|
|
|
| - for (ClassElementX cls in newClasses) {
|
| - jsAst.Node access = namer.elementAccess(cls);
|
| - String name = namer.getNameOfClass(cls);
|
| -
|
| - // TODO(ahe): Compute arguments.
|
| - List<jsAst.Node> arguments = <jsAst.Node>[];
|
| -
|
| - // TODO(ahe): Compute statements, that is initializers.
|
| - List<jsAst.Statement> statements = <jsAst.Statement>[];
|
| -
|
| - updates.add(
|
| - js.statement(
|
| - '# = function $name(#) {#}', [access, arguments, statements]));
|
| - }
|
| + List<jsAst.Statement> inherits = <jsAst.Statement>[];
|
|
|
| for (ClassElementX cls in newClasses) {
|
| - if (cls.isObject) continue;
|
| jsAst.Node classAccess = namer.elementAccess(cls);
|
| - jsAst.Node superAccess = namer.elementAccess(cls.superclass);
|
| + String name = namer.getNameOfClass(cls);
|
|
|
| - updates.add(
|
| - js.statement(
|
| - r'self.$dart_unsafe_eval.inheritFrom(#, #)',
|
| - [classAccess, superAccess]));
|
| + var descriptor = js('Object.create(null)');
|
| +
|
| + jsAst.Statement defineClass = js.statement(
|
| + r'''
|
| +# = (new Function(
|
| + "$collectedClasses", "$desc",
|
| + self.$dart_unsafe_eval.defineClass(#, #) +"\n;return " + #))({#: #})
|
| +''',
|
| + [classAccess,
|
| + js.string(name), js.stringArray(computeFields(cls)),
|
| + js.string(name),
|
| + js.string(name), descriptor]);
|
| +
|
| + updates.add(defineClass);
|
| +
|
| + ClassElement superclass = cls.superclass;
|
| + if (superclass != null) {
|
| + jsAst.Node superAccess = namer.elementAccess(superclass);
|
| + inherits.add(
|
| + js.statement(
|
| + r'self.$dart_unsafe_eval.inheritFrom(#, #)',
|
| + [classAccess, superAccess]));
|
| + }
|
| }
|
|
|
| + updates.addAll(inherits);
|
| +
|
| for (Element element in compiler.enqueuer.codegen.newlyEnqueuedElements) {
|
| if (!element.isField) {
|
| updates.add(computeMemberUpdateJs(element));
|
| @@ -506,6 +516,10 @@ class LibraryUpdater extends JsFeatures {
|
| int parameterCount = element.functionSignature.parameterCount;
|
| return '$callPrefix\$$parameterCount';
|
| }
|
| +
|
| + List<String> computeFields(ClassElement cls) {
|
| + return new EmitterHelper(compiler).computeFields(cls);
|
| + }
|
| }
|
|
|
| /// Represents an update (aka patch) of [before] to [after]. We use the word
|
| @@ -754,3 +768,18 @@ abstract class JsFeatures {
|
|
|
| CodeEmitterTask get emitter => backend.emitter;
|
| }
|
| +
|
| +class EmitterHelper extends JsFeatures {
|
| + final Compiler compiler;
|
| +
|
| + EmitterHelper(this.compiler);
|
| +
|
| + ClassEmitter get classEmitter => backend.emitter.oldEmitter.classEmitter;
|
| +
|
| + List<String> computeFields(ClassElement cls) {
|
| + // TODO(ahe): Rewrite for new emitter.
|
| + ClassBuilder builder = new ClassBuilder(cls, namer);
|
| + classEmitter.emitFields(cls, builder, "");
|
| + return builder.fields;
|
| + }
|
| +}
|
|
|