Index: dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart b/dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart |
index 5067c2870c58cb727a6f292edd32c7c3b180c34c..35e1178adcbaef88d2a4ed56eb1e912434dc61d9 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart |
@@ -108,7 +108,6 @@ class ClassEmitter extends CodeEmitterHelper { |
throw new SpannableAssertionFailure( |
element, 'Must be a ClassElement or a LibraryElement'); |
} |
- StringBuffer buffer = new StringBuffer(); |
if (emitStatics) { |
assert(invariant(element, superName == null, message: superName)); |
} else { |
@@ -116,16 +115,13 @@ class ClassEmitter extends CodeEmitterHelper { |
String nativeName = |
namer.getPrimitiveInterceptorRuntimeName(element); |
if (nativeName != null) { |
- buffer.write('$nativeName/'); |
+ builder.nativeName = nativeName; |
} |
- buffer.write('$superName;'); |
+ builder.superName = superName; |
} |
- int bufferClassLength = buffer.length; |
- |
- String separator = ''; |
- |
var fieldMetadata = []; |
bool hasMetadata = false; |
+ bool fieldsAdded = false; |
if (!onlyForRti) { |
visitFields(element, emitStatics, |
@@ -142,8 +138,6 @@ class ClassEmitter extends CodeEmitterHelper { |
// constructors, so we don't need the fields unless we are generating |
// accessors at runtime. |
if (!classIsNative || needsAccessor) { |
- buffer.write(separator); |
- separator = ','; |
var metadata = task.metadataEmitter.buildMetadataFunction(field); |
if (metadata != null) { |
hasMetadata = true; |
@@ -152,16 +146,17 @@ class ClassEmitter extends CodeEmitterHelper { |
} |
fieldMetadata.add(metadata); |
recordMangledField(field, accessorName, field.name); |
+ String fieldName = name; |
+ String fieldCode = ''; |
+ String reflectionMarker = ''; |
if (!needsAccessor) { |
// Emit field for constructor generation. |
assert(!classIsNative); |
- buffer.write(name); |
} else { |
// Emit (possibly renaming) field name so we can add accessors at |
// runtime. |
- buffer.write(accessorName); |
if (name != accessorName) { |
- buffer.write(':$name'); |
+ fieldName = '$accessorName:$name'; |
} |
int getterCode = 0; |
@@ -208,28 +203,25 @@ class ClassEmitter extends CodeEmitterHelper { |
compiler.reportInternalError( |
field, 'Internal error: code is 0 ($element/$field)'); |
} else { |
- buffer.write(FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE]); |
+ fieldCode = FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE]; |
} |
} |
if (backend.isAccessibleByReflection(field)) { |
- buffer.write('-'); |
+ reflectionMarker = '-'; |
if (backend.isNeededForReflection(field)) { |
DartType type = field.computeType(compiler); |
- buffer.write('${task.metadataEmitter.reifyType(type)}'); |
+ reflectionMarker = '-${task.metadataEmitter.reifyType(type)}'; |
} |
} |
+ builder.addField('$fieldName$fieldCode$reflectionMarker'); |
+ fieldsAdded = true; |
} |
}); |
} |
- bool fieldsAdded = buffer.length > bufferClassLength; |
- String compactClassData = buffer.toString(); |
- jsAst.Expression classDataNode = js.string(compactClassData); |
if (hasMetadata) { |
- fieldMetadata.insert(0, classDataNode); |
- classDataNode = new jsAst.ArrayInitializer.from(fieldMetadata); |
+ builder.fieldMetadata = fieldMetadata; |
} |
- builder.addProperty('', classDataNode); |
return fieldsAdded; |
} |
@@ -321,7 +313,7 @@ class ClassEmitter extends CodeEmitterHelper { |
List<jsAst.Property> statics = new List<jsAst.Property>(); |
ClassBuilder staticsBuilder = new ClassBuilder(); |
if (emitFields(classElement, staticsBuilder, null, emitStatics: true)) { |
- statics.add(staticsBuilder.properties.single); |
+ statics.add(staticsBuilder.toObjectInitializer().properties.single); |
} |
Map<String, ClassBuilder> classPropertyLists = |