blob: f39b26ea33cbc1ccf4b3579904bf11e63c3e0990 [file] [log] [blame]
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of dart2js.js_emitter;
/**
* A data structure for collecting fragments of a class definition.
*/
class ClassBuilder {
final List<jsAst.Property> properties = <jsAst.Property>[];
final List<String> fields = <String>[];
String superName;
String functionType;
List<jsAst.Node> fieldMetadata;
final Namer namer;
/// Set to true by user if class is indistinguishable from its superclass.
bool isTrivial = false;
ClassBuilder(this.namer);
// Has the same signature as [DefineStubFunction].
void addProperty(String name, jsAst.Expression value) {
properties.add(new jsAst.Property(js.string(name), value));
}
void addField(String field) {
fields.add(field);
}
jsAst.ObjectInitializer toObjectInitializer() {
StringBuffer buffer = new StringBuffer();
if (superName != null) {
buffer.write('$superName');
if (functionType != null) {
buffer.write(':$functionType');
}
buffer.write(';');
}
buffer.writeAll(fields, ',');
var classData = js.string('$buffer');
if (fieldMetadata != null) {
// If we need to store fieldMetadata, classData is turned into an array,
// and the field metadata is appended. So if classData is just a string,
// there is no field metadata.
classData =
new jsAst.ArrayInitializer.from([classData]..addAll(fieldMetadata));
}
var fieldsAndProperties =
[new jsAst.Property(js.string(namer.classDescriptorProperty),
classData)]
..addAll(properties);
return new jsAst.ObjectInitializer(fieldsAndProperties, isOneLiner: false);
}
}