visitFuncDecl method
Implementation
@override
Uint8List visitFuncDecl(FuncDecl stmt) {
final bytesBuilder = BytesBuilder();
if (stmt.category != FunctionCategory.literal) {
bytesBuilder.addByte(HTOpCode.funcDecl);
final docs = stmt.documentation;
if (docs.isNotEmpty && !config.removeDocumentation) {
bytesBuilder.addByte(1);
bytesBuilder.add(_utf8String(docs));
} else {
bytesBuilder.addByte(0);
}
bytesBuilder.add(_parseIdentifier(stmt.internalName));
if (stmt.id != null) {
bytesBuilder.addByte(1);
bytesBuilder.add(_parseIdentifier(stmt.id!.id));
} else {
bytesBuilder.addByte(0);
}
if (stmt.classId != null) {
bytesBuilder.addByte(1);
bytesBuilder.add(_parseIdentifier(stmt.classId!));
} else {
bytesBuilder.addByte(0);
}
if (stmt.externalTypeId != null) {
bytesBuilder.addByte(1);
bytesBuilder.add(_parseIdentifier(stmt.externalTypeId!));
} else {
bytesBuilder.addByte(0);
}
bytesBuilder.addByte(stmt.category.index);
bytesBuilder.addByte(stmt.isAsync ? 1 : 0);
bytesBuilder.addByte(stmt.isField ? 1 : 0);
bytesBuilder.addByte(stmt.isExternal ? 1 : 0);
bytesBuilder.addByte(stmt.isStatic ? 1 : 0);
bytesBuilder.addByte(stmt.isTopLevel ? 1 : 0);
bytesBuilder.addByte(stmt.isConstValue ? 1 : 0);
} else {
bytesBuilder.addByte(HTOpCode.local);
bytesBuilder.addByte(HTValueTypeCode.function);
bytesBuilder.add(_parseIdentifier(stmt.internalName));
if (stmt.externalTypeId != null) {
bytesBuilder.addByte(1);
bytesBuilder.add(_parseIdentifier(stmt.externalTypeId!));
} else {
bytesBuilder.addByte(0);
}
bytesBuilder.addByte(stmt.isAsync ? 1 : 0);
}
bytesBuilder.addByte(stmt.hasParamDecls ? 1 : 0);
bytesBuilder.addByte(stmt.isVariadic ? 1 : 0);
bytesBuilder.addByte(stmt.minArity);
bytesBuilder.addByte(stmt.maxArity);
bytesBuilder.addByte(stmt.paramDecls.length);
for (var param in stmt.paramDecls) {
final bytes = visitParamDecl(param);
bytesBuilder.add(bytes);
}
if (stmt.returnType != null) {
bytesBuilder.addByte(1);
final bytes = compileAST(stmt.returnType!);
bytesBuilder.add(bytes);
} else {
bytesBuilder.addByte(0);
}
if (stmt.category == FunctionCategory.constructor) {
if (stmt.redirectingCtorCallExpr != null) {
bytesBuilder.addByte(1);
final bytes =
visitReferConstructCallExpr(stmt.redirectingCtorCallExpr!);
bytesBuilder.add(bytes);
} else {
bytesBuilder.addByte(0);
}
}
if (stmt.definition != null) {
bytesBuilder.addByte(1);
bytesBuilder.add(_uint16(stmt.definition!.line));
bytesBuilder.add(_uint16(stmt.definition!.column));
final body = compileAST(stmt.definition!);
bytesBuilder.add(_uint16(body.length + 1));
bytesBuilder.add(body);
bytesBuilder.addByte(HTOpCode.endOfFunc);
} else {
bytesBuilder.addByte(0);
}
return bytesBuilder.toBytes();
}