AP_Scripting: binding gen: add number of argument to manual functions and generate docs for manual

This commit is contained in:
Iampete1 2022-10-14 17:57:32 +01:00 committed by Andrew Tridgell
parent a1607b954c
commit 48ce8c4e16
2 changed files with 73 additions and 16 deletions

View File

@ -347,7 +347,7 @@ singleton AP_Param method add_table boolean uint8_t 0 200 string uint8_t 1 63
singleton AP_Param method add_param boolean uint8_t 0 200 uint8_t 1 63 string float'skip_check
include AP_Scripting/AP_Scripting_helpers.h
userdata Parameter creation lua_new_Parameter
userdata Parameter creation lua_new_Parameter 1
userdata Parameter method init boolean string
userdata Parameter method init_by_info boolean uint16_t 0 UINT16_MAX uint32_t'skip_check ap_var_type'enum AP_PARAM_INT8 AP_PARAM_FLOAT
userdata Parameter method get boolean float'Null
@ -438,7 +438,7 @@ include AP_HAL/I2CDevice.h
ap_object AP_HAL::I2CDevice semaphore-pointer
ap_object AP_HAL::I2CDevice method set_retries void uint8_t 0 20
ap_object AP_HAL::I2CDevice method write_register boolean uint8_t 0 UINT8_MAX uint8_t 0 UINT8_MAX
ap_object AP_HAL::I2CDevice manual read_registers AP_HAL__I2CDevice_read_registers
ap_object AP_HAL::I2CDevice manual read_registers AP_HAL__I2CDevice_read_registers 2
ap_object AP_HAL::I2CDevice method set_address void uint8_t 0 UINT8_MAX
@ -481,8 +481,8 @@ include AP_InertialSensor/AP_InertialSensor.h
singleton AP_InertialSensor rename ins
singleton AP_InertialSensor method get_temperature float uint8_t 0 INS_MAX_INSTANCES
singleton CAN manual get_device lua_get_CAN_device
singleton CAN manual get_device2 lua_get_CAN_device2
singleton CAN manual get_device lua_get_CAN_device 1
singleton CAN manual get_device2 lua_get_CAN_device2 1
singleton CAN depends HAL_MAX_CAN_PROTOCOL_DRIVERS
include AP_Scripting/AP_Scripting_CANSensor.h depends HAL_MAX_CAN_PROTOCOL_DRIVERS
@ -606,15 +606,15 @@ singleton AP_EFI method get_backend AP_EFI_Backend uint8_t 0 UINT8_MAX
-- ----END EFI Library----
singleton AP_Logger rename logger
singleton AP_Logger manual write AP_Logger_Write
singleton AP_Logger manual write AP_Logger_Write 7
singleton i2c manual get_device lua_get_i2c_device
singleton i2c manual get_device lua_get_i2c_device 4
global manual millis lua_millis
global manual micros lua_micros
global manual mission_receive lua_mission_receive
global manual millis lua_millis 0
global manual micros lua_micros 0
global manual mission_receive lua_mission_receive 0
userdata uint32_t creation lua_new_uint32_t
userdata uint32_t creation lua_new_uint32_t 1
userdata uint32_t manual_operator __add uint32_t___add
userdata uint32_t manual_operator __sub uint32_t___sub
userdata uint32_t manual_operator __mul uint32_t___mul
@ -631,6 +631,6 @@ userdata uint32_t manual_operator __lt uint32_t___lt
userdata uint32_t manual_operator __le uint32_t___le
userdata uint32_t manual_operator __bnot uint32_t___bnot
userdata uint32_t manual_operator __tostring uint32_t___tostring
userdata uint32_t manual toint uint32_t_toint
userdata uint32_t manual tofloat uint32_t_tofloat
userdata uint32_t manual toint uint32_t_toint 0
userdata uint32_t manual tofloat uint32_t_tofloat 0

View File

@ -365,6 +365,7 @@ struct method_alias {
char *name;
char *alias;
int line;
int num_args;
enum alias_type type;
};
@ -405,6 +406,7 @@ struct userdata {
int flags; // flags from the userdata_flags enum
char *dependency;
char *creation; // name of a manual creation function if set, note that this will not be used internally
int creation_args; // number of args for custom creation function
};
static struct userdata *parsed_userdata;
@ -856,13 +858,21 @@ void handle_manual(struct userdata *node, enum alias_type type) {
}
char *cpp_function_name = next_token();
if (cpp_function_name == NULL) {
error(ERROR_SINGLETON, "Expected a cpp name for manual %s method",node->name);
error(ERROR_SINGLETON, "Expected a cpp name for manual method %s %s", node->name, name);
}
struct method_alias *alias = allocate(sizeof(struct method_alias));
string_copy(&(alias->name), cpp_function_name);
string_copy(&(alias->alias), name);
alias->line = state.line_num;
alias->type = type;
if (type != ALIAS_TYPE_MANUAL_OPERATOR) {
char *num_args = next_token();
if (num_args == NULL) {
error(ERROR_SINGLETON, "Expected number of args for manual method %s %s", node->name, name);
}
alias->num_args = atoi(num_args);
}
alias->next = node->method_aliases;
node->method_aliases = alias;
}
@ -970,10 +980,16 @@ void handle_userdata(void) {
if (node->creation != NULL) {
error(ERROR_SINGLETON, "Userdata only support a single creation function");
}
char *creation = strtok(NULL, "");
char *creation = next_token();
if (creation == NULL) {
error(ERROR_USERDATA, "Expected a creation string for %s",node->name);
}
char *num_args = next_token();
if (num_args == NULL) {
error(ERROR_SINGLETON, "Expected number of args for creation method %s", node->name);
}
node->creation_args = atoi(num_args);
string_copy(&(node->creation), creation);
} else if (strcmp(type, keyword_manual_operator) == 0) {
@ -2503,7 +2519,19 @@ void emit_docs(struct userdata *node, int is_userdata, int emit_creation) {
if (emit_creation) {
// creation function
fprintf(docs, "---@return %s\n", name);
fprintf(docs, "function %s() end\n\n", node->rename ? node->rename : node->sanatized_name);
fprintf(docs, "function %s(", node->rename ? node->rename : node->sanatized_name);
if (node->creation == NULL) {
fprintf(docs, ") end\n\n");
} else {
for (int i = 0; i < node->creation_args; ++i) {
fprintf(docs, "param%i", i+1);
if (i < node->creation_args-1) {
fprintf(docs, ", ");
}
}
fprintf(docs, ") end\n\n");
}
}
} else {
// global
@ -2557,7 +2585,6 @@ void emit_docs(struct userdata *node, int is_userdata, int emit_creation) {
// aliases
struct method_alias *alias = node->method_aliases;
while(alias) {
// dont do manual bindings
if (alias->type == ALIAS_TYPE_NONE) {
// find the method this is a alias of
struct method * method = node->methods;
@ -2569,6 +2596,17 @@ void emit_docs(struct userdata *node, int is_userdata, int emit_creation) {
}
emit_docs_method(name, alias->alias, method);
} else if (alias->type == ALIAS_TYPE_MANUAL) {
// Cant do a great job, don't know types or return
fprintf(docs, "-- desc\nfunction %s:%s(", name, alias->alias);
for (int i = 0; i < alias->num_args; ++i) {
fprintf(docs, "param%i", i+1);
if (i < alias->num_args-1) {
fprintf(docs, ", ");
}
}
fprintf(docs, ") end\n\n");
}
alias = alias->next;
}
@ -2797,6 +2835,25 @@ int main(int argc, char **argv) {
emit_docs(parsed_singletons, FALSE, FALSE);
// global aliases
if (parsed_globals != NULL) {
struct method_alias *alias = parsed_globals->method_aliases;
while(alias) {
if (alias->type == ALIAS_TYPE_MANUAL) {
// Cant do a great job, don't know types or return
fprintf(docs, "-- desc\nfunction %s(", alias->alias);
for (int i = 0; i < alias->num_args; ++i) {
fprintf(docs, "param%i", i+1);
if (i < alias->num_args-1) {
fprintf(docs, ", ");
}
}
fprintf(docs, ") end\n\n");
}
alias = alias->next;
}
}
fclose(docs);
return 0;