visitStructDecl method
Implementation
@override
Uint8List visitStructDecl(StructDecl stmt) {
final bytesBuilder = BytesBuilder();
bytesBuilder.addByte(HTOpCode.structDecl);
final docs = stmt.documentation;
if (docs.isNotEmpty && !config.removeDocumentation) {
bytesBuilder.addByte(1); // bool: has doc
bytesBuilder.add(_utf8String(docs));
} else {
bytesBuilder.addByte(0); // bool: has doc
}
bytesBuilder.add(_parseIdentifier(stmt.id.id));
bytesBuilder.addByte(stmt.isTopLevel ? 1 : 0);
if (stmt.prototypeId != null) {
bytesBuilder.addByte(1); // bool: hasPrototypeId
bytesBuilder.add(_parseIdentifier(stmt.prototypeId!.id));
} else {
bytesBuilder.addByte(0); // bool: hasPrototypeId
}
bytesBuilder.addByte(stmt.mixinIds.length);
for (final mixinId in stmt.mixinIds) {
bytesBuilder.add(_parseIdentifier(mixinId.id));
}
final staticFields = <StructObjField>[];
final fields = <StructObjField>[];
for (final node in stmt.definition) {
ASTNode initializer;
if (node is FuncDecl) {
FuncDecl initializer = node;
final field = StructObjField(
key: IdentifierExpr(
initializer.internalName,
isLocal: false,
),
fieldValue: initializer);
node.isStatic ? staticFields.add(field) : fields.add(field);
} else if (node is VarDecl) {
initializer = node.initializer ?? ASTLiteralNull();
final field = StructObjField(
key: IdentifierExpr(
node.id.id,
isLocal: false,
),
fieldValue: initializer);
node.isStatic ? staticFields.add(field) : fields.add(field);
}
// Other node type is ignored.
}
final staticBytes =
compileAST(StructObjExpr(staticFields), endOfExec: true);
final structBytes = compileAST(
StructObjExpr(fields,
id: IdentifierExpr(
stmt.id.id,
isLocal: false,
),
prototypeId: stmt.prototypeId),
endOfExec: true);
bytesBuilder.add(_uint16(staticBytes.length));
bytesBuilder.add(staticBytes);
bytesBuilder.add(_uint16(structBytes.length));
bytesBuilder.add(structBytes);
return bytesBuilder.toBytes();
}