static char* S_gen_code_sample(CFCFunction *func, const char *alias, CFCClass *klass, int is_constructor) { char *invocant = NULL; if (is_constructor) { invocant = CFCUtil_strdup(CFCClass_get_name(klass)); } else { char *lower = S_camel_to_lower(CFCClass_get_struct_sym(klass)); invocant = CFCUtil_sprintf("$%s", lower); FREEMEM(lower); } CFCParamList *param_list = CFCFunction_get_param_list(func); size_t num_vars = CFCParamList_num_vars(param_list); size_t start = is_constructor ? 0 : 1; char *sample = NULL; if (start == num_vars) { sample = CFCUtil_sprintf(" %s->%s();\n", invocant, alias); } else if (is_constructor || num_vars - start >= 2) { sample = S_gen_labeled_sample(invocant, alias, param_list, start); } else { sample = S_gen_positional_sample(invocant, alias, param_list, start); } return sample; }
static char* S_gen_code_sample(CFCCallable *func, const char *alias, CFCClass *klass, int is_constructor) { char *prologue = CFCUtil_sprintf(""); char *class_var_name = S_camel_to_lower(CFCClass_get_struct_sym(klass)); CFCType *ret_type = CFCCallable_get_return_type(func); if (!CFCType_is_void(ret_type)) { char *ret_name = S_perl_var_name(ret_type, is_constructor); if (!is_constructor && strcmp(ret_name, class_var_name) == 0) { // Return type equals `klass`. Use a generic variable name // to avoid confusing code samples like // `my $string = $string->trim`. prologue = CFCUtil_cat(prologue, "my $result = ", NULL); } else { prologue = CFCUtil_cat(prologue, "my $", ret_name, " = ", NULL); } FREEMEM(ret_name); } if (is_constructor) { const char *invocant = CFCClass_get_name(klass); prologue = CFCUtil_cat(prologue, invocant, NULL); } else { prologue = CFCUtil_cat(prologue, "$", class_var_name, NULL); } prologue = CFCUtil_cat(prologue, "->", alias, NULL); CFCParamList *param_list = CFCCallable_get_param_list(func); int num_vars = CFCParamList_num_vars(param_list); int start = is_constructor ? 0 : 1; char *sample = NULL; if (start == num_vars) { sample = CFCUtil_sprintf(" %s();\n", prologue); } else if (is_constructor || num_vars - start >= 2) { sample = S_gen_labeled_sample(prologue, param_list, start); } else { sample = S_gen_positional_sample(prologue, param_list, start); } FREEMEM(class_var_name); FREEMEM(prologue); return sample; }
static char* S_perl_var_name(CFCType *type, int is_ctor_retval) { const char *specifier = CFCType_get_specifier(type); char *perl_name = NULL; if (CFCType_is_object(type)) { if (!is_ctor_retval && strcmp(specifier, "cfish_Vector") == 0) { perl_name = CFCUtil_strdup("arrayref"); } else if (!is_ctor_retval && strcmp(specifier, "cfish_Hash") == 0) { perl_name = CFCUtil_strdup("hashref"); } else { // Skip parcel prefix. if (CFCUtil_islower(*specifier)) { for (specifier++; *specifier; specifier++) { if (*specifier == '_') { specifier++; break; } } } perl_name = S_camel_to_lower(specifier); } } else if (CFCType_is_integer(type)) { if (strcmp(specifier, "bool") == 0) { perl_name = CFCUtil_strdup("bool"); } else { perl_name = CFCUtil_strdup("int"); } } else if (CFCType_is_floating(type)) { perl_name = CFCUtil_strdup("float"); } else { CFCUtil_die("Don't know how to create code sample for type '%s'", specifier); } return perl_name; }
static char* S_perl_var_name(CFCVariable *var) { CFCType *type = CFCVariable_get_type(var); const char *specifier = CFCType_get_specifier(type); char *perl_name = NULL; if (CFCType_is_object(type)) { // Skip parcel prefix. if (islower(*specifier)) { for (specifier++; *specifier; specifier++) { if (*specifier == '_') { specifier++; break; } } } perl_name = S_camel_to_lower(specifier); } else if (CFCType_is_integer(type)) { if (strcmp(specifier, "bool") == 0) { perl_name = CFCUtil_strdup("bool"); } else { perl_name = CFCUtil_strdup("int"); } } else if (CFCType_is_floating(type)) { perl_name = CFCUtil_strdup("float"); } else { CFCUtil_die("Don't know how to create code sample for type '%s'", specifier); } return perl_name; }