Flesh out Go interfaces.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/6002adcb Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/6002adcb Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/6002adcb Branch: refs/heads/master Commit: 6002adcbc9a3f58326910506f65e5753cdfd48b7 Parents: 3dc0240 Author: Marvin Humphrey <[email protected]> Authored: Fri Apr 3 11:37:48 2015 -0700 Committer: Marvin Humphrey <[email protected]> Committed: Wed May 6 14:28:15 2015 -0700 ---------------------------------------------------------------------- compiler/src/CFCGoClass.c | 23 ++++++++++++++++++++++- compiler/src/CFCGoMethod.c | 37 +++++++++++++++++++++++++++++++++++++ compiler/src/CFCGoMethod.h | 6 ++++++ 3 files changed, 65 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/6002adcb/compiler/src/CFCGoClass.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCGoClass.c b/compiler/src/CFCGoClass.c index 44884ec..21e6075 100644 --- a/compiler/src/CFCGoClass.c +++ b/compiler/src/CFCGoClass.c @@ -198,16 +198,37 @@ CFCGoClass_go_typing(CFCGoClass *self) { temp_hack_iface_methods = CFCUtil_strdup(""); } + char *novel_iface = CFCUtil_strdup(""); + S_lazy_init_method_bindings(self); + for (int i = 0; self->method_bindings[i] != NULL; i++) { + CFCGoMethod *meth_binding = self->method_bindings[i]; + CFCMethod *method = CFCGoMethod_get_client(meth_binding); + if (!CFCMethod_novel(method)) { + continue; + } + const char *sym = CFCMethod_get_macro_sym(method); + if (!CFCClass_fresh_method(self->client, sym)) { + continue; + } + + char *iface_sig = CFCGoMethod_iface_sig(meth_binding); + novel_iface + = CFCUtil_cat(novel_iface, "\t", iface_sig, "\n", NULL); + FREEMEM(iface_sig); + } + char pattern[] = "type %s interface {\n" "%s" "%s" + "%s" "}\n" "\n" "%s" ; content = CFCUtil_sprintf(pattern, short_struct, parent_iface, - temp_hack_iface_methods, go_struct_def); + temp_hack_iface_methods, novel_iface, + go_struct_def); FREEMEM(temp_hack_iface_methods); FREEMEM(go_struct_def); FREEMEM(parent_iface); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/6002adcb/compiler/src/CFCGoMethod.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCGoMethod.c b/compiler/src/CFCGoMethod.c index 92cc3c5..05ac230 100644 --- a/compiler/src/CFCGoMethod.c +++ b/compiler/src/CFCGoMethod.c @@ -67,6 +67,43 @@ S_CFCGoMethod_destroy(CFCGoMethod *self) { CFCBase_destroy((CFCBase*)self); } +CFCMethod* +CFCGoMethod_get_client(CFCGoMethod *self) { + return self->method; +} + +char* +CFCGoMethod_iface_sig(CFCGoMethod *self) { + CFCMethod *method = self->method; + CFCParcel *parcel = CFCMethod_get_parcel(method); + CFCType *return_type = CFCMethod_get_return_type(method); + char *name = CFCGoFunc_go_meth_name(CFCMethod_get_macro_sym(method)); + char *go_ret_type = CFCType_is_void(return_type) + ? CFCUtil_strdup("") + : CFCGoTypeMap_go_type_name(return_type, parcel); + + // Assemble list of argument types. + char *args = CFCUtil_strdup(""); + CFCParamList *param_list = CFCMethod_get_param_list(method); + CFCVariable **vars = CFCParamList_get_variables(param_list); + for (int i = 1; vars[i] != NULL; i++) { + CFCType *type = CFCVariable_get_type(vars[i]); + if (i > 1) { + args = CFCUtil_cat(args, ", ", NULL); + } + char *go_type = CFCGoTypeMap_go_type_name(type, parcel); + args = CFCUtil_cat(args, go_type, NULL); + FREEMEM(go_type); + } + + char *sig = CFCUtil_sprintf("%s(%s) %s", name, args, go_ret_type); + + FREEMEM(args); + FREEMEM(go_ret_type); + FREEMEM(name); + return sig; +} + static char* S_prep_cfargs(CFCParamList *param_list) { CFCVariable **vars = CFCParamList_get_variables(param_list); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/6002adcb/compiler/src/CFCGoMethod.h ---------------------------------------------------------------------- diff --git a/compiler/src/CFCGoMethod.h b/compiler/src/CFCGoMethod.h index 7b61c28..55314d8 100644 --- a/compiler/src/CFCGoMethod.h +++ b/compiler/src/CFCGoMethod.h @@ -31,6 +31,12 @@ struct CFCClass; CFCGoMethod* CFCGoMethod_new(struct CFCMethod *method); +struct CFCMethod* +CFCGoMethod_get_client(CFCGoMethod *self); + +char* +CFCGoMethod_iface_sig(CFCGoMethod *self); + char* CFCGoMethod_func_def(CFCGoMethod *self, struct CFCClass *invoker);
