Repository: lucy-clownfish
Updated Branches:
  refs/heads/master ac9fc2bb5 -> fd74182c1


Add return value to generated Perl code samples


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/5f6a9cb5
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/5f6a9cb5
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/5f6a9cb5

Branch: refs/heads/master
Commit: 5f6a9cb5a63571123233f9e216281a30bcc5e7b0
Parents: ac9fc2b
Author: Nick Wellnhofer <[email protected]>
Authored: Thu Feb 11 13:58:00 2016 +0100
Committer: Nick Wellnhofer <[email protected]>
Committed: Fri Feb 26 12:10:27 2016 +0100

----------------------------------------------------------------------
 compiler/src/CFCPerlPod.c                       | 66 ++++++++++++--------
 .../perl/buildlib/Clownfish/Build/Binding.pm    | 26 ++------
 2 files changed, 45 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5f6a9cb5/compiler/src/CFCPerlPod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlPod.c b/compiler/src/CFCPerlPod.c
index 632eb35..ec0bf87 100644
--- a/compiler/src/CFCPerlPod.c
+++ b/compiler/src/CFCPerlPod.c
@@ -71,15 +71,15 @@ S_gen_code_sample(CFCCallable *func, const char *alias, 
CFCClass *klass,
                   int is_constructor);
 
 static char*
-S_gen_positional_sample(const char *invocant, const char *alias,
-                        CFCParamList *param_list, size_t start);
+S_gen_positional_sample(const char *prologue, CFCParamList *param_list,
+                        size_t start);
 
 static char*
-S_gen_labeled_sample(const char *invocant, const char *alias,
-                     CFCParamList *param_list, size_t start);
+S_gen_labeled_sample(const char *prologue, CFCParamList *param_list,
+                     size_t start);
 
 static char*
-S_perl_var_name(CFCVariable *var);
+S_perl_var_name(CFCType *type);
 
 static char*
 S_camel_to_lower(const char *camel);
@@ -392,38 +392,54 @@ CFCPerlPod_gen_subroutine_pod(CFCCallable *func,
 static char*
 S_gen_code_sample(CFCCallable *func, const char *alias, CFCClass *klass,
                   int is_constructor) {
-    char *invocant = NULL;
+    char *prologue = CFCUtil_sprintf("");
+
+    CFCType *ret_type = CFCCallable_get_return_type(func);
+    if (!CFCType_is_void(ret_type)) {
+        if (is_constructor) {
+            char *ret_name = S_perl_var_name(ret_type);
+            prologue = CFCUtil_cat(prologue, "my $", ret_name, " = ", NULL);
+            FREEMEM(ret_name);
+        }
+        else {
+            prologue = CFCUtil_cat(prologue, "my $retval = ", NULL);
+        }
+    }
 
     if (is_constructor) {
-        invocant = CFCUtil_strdup(CFCClass_get_name(klass));
+        const char *invocant = CFCClass_get_name(klass);
+        prologue = CFCUtil_cat(prologue, invocant, NULL);
     }
     else {
         char *lower = S_camel_to_lower(CFCClass_get_struct_sym(klass));
-        invocant = CFCUtil_sprintf("$%s", lower);
+        prologue = CFCUtil_cat(prologue, "$", lower, NULL);
         FREEMEM(lower);
     }
 
+    prologue = CFCUtil_cat(prologue, "->", alias, NULL);
+
     CFCParamList *param_list = CFCCallable_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);
+        sample = CFCUtil_sprintf("    %s();\n", prologue);
     }
     else if (is_constructor || num_vars - start >= 2) {
-        sample = S_gen_labeled_sample(invocant, alias, param_list, start);
+        sample = S_gen_labeled_sample(prologue, param_list, start);
     }
     else {
-        sample = S_gen_positional_sample(invocant, alias, param_list, start);
+        sample = S_gen_positional_sample(prologue, param_list, start);
     }
 
+    FREEMEM(prologue);
     return sample;
 }
 
 static char*
-S_gen_positional_sample(const char *invocant, const char *alias,
-                        CFCParamList *param_list, size_t start) {
+S_gen_positional_sample(const char *prologue, CFCParamList *param_list,
+                        size_t start) {
     size_t        num_vars = CFCParamList_num_vars(param_list);
     CFCVariable **vars     = CFCParamList_get_variables(param_list);
     const char  **inits    = CFCParamList_get_initial_values(param_list);
@@ -434,14 +450,13 @@ S_gen_positional_sample(const char *invocant, const char 
*alias,
     }
 
     const char *name = CFCVariable_get_name(vars[start]);
-    char *sample
-        = CFCUtil_sprintf("    %s->%s($%s);\n", invocant, alias, name);
+    char *sample = CFCUtil_sprintf("    %s($%s);\n", prologue, name);
 
     const char *init = inits[start];
     if (init) {
         if (strcmp(init, "NULL") == 0) { init = "undef"; }
-        char *def_sample = CFCUtil_sprintf("    %s->%s();  # default: %s\n",
-                                           invocant, alias, init);
+        char *def_sample = CFCUtil_sprintf("    %s();  # default: %s\n",
+                                           prologue, init);
         sample = CFCUtil_cat(sample, def_sample, NULL);
         FREEMEM(def_sample);
     }
@@ -450,8 +465,8 @@ S_gen_positional_sample(const char *invocant, const char 
*alias,
 }
 
 static char*
-S_gen_labeled_sample(const char *invocant, const char *alias,
-                     CFCParamList *param_list, size_t start) {
+S_gen_labeled_sample(const char *prologue, CFCParamList *param_list,
+                     size_t start) {
     size_t        num_vars = CFCParamList_num_vars(param_list);
     CFCVariable **vars     = CFCParamList_get_variables(param_list);
     const char  **inits    = CFCParamList_get_initial_values(param_list);
@@ -467,7 +482,8 @@ S_gen_labeled_sample(const char *invocant, const char 
*alias,
         size_t label_len = strlen(label);
         if (label_len > max_label_len) { max_label_len = label_len; }
 
-        char *perl_var = S_perl_var_name(var);
+        CFCType *type = CFCVariable_get_type(var);
+        char *perl_var = S_perl_var_name(type);
         size_t perl_var_len = strlen(perl_var);
         if (perl_var_len > max_var_len) { max_var_len = perl_var_len; }
         FREEMEM(perl_var);
@@ -478,7 +494,8 @@ S_gen_labeled_sample(const char *invocant, const char 
*alias,
     for (size_t i = start; i < num_vars; i++) {
         CFCVariable *var      = vars[i];
         const char  *label    = CFCVariable_get_name(var);
-        char        *perl_var = S_perl_var_name(var);
+        CFCType     *type     = CFCVariable_get_type(var);
+        char        *perl_var = S_perl_var_name(type);
         perl_var = CFCUtil_cat(perl_var, ",", NULL);
 
         char       *comment = NULL;
@@ -503,18 +520,17 @@ S_gen_labeled_sample(const char *invocant, const char 
*alias,
     }
 
     const char pattern[] =
-        "    %s->%s(\n"
+        "    %s(\n"
         "%s"
         "    );\n";
-    char *sample = CFCUtil_sprintf(pattern, invocant, alias, params);
+    char *sample = CFCUtil_sprintf(pattern, prologue, params);
 
     FREEMEM(params);
     return sample;
 }
 
 static char*
-S_perl_var_name(CFCVariable *var) {
-    CFCType    *type      = CFCVariable_get_type(var);
+S_perl_var_name(CFCType *type) {
     const char *specifier = CFCType_get_specifier(type);
     char       *perl_name = NULL;
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5f6a9cb5/runtime/perl/buildlib/Clownfish/Build/Binding.pm
----------------------------------------------------------------------
diff --git a/runtime/perl/buildlib/Clownfish/Build/Binding.pm 
b/runtime/perl/buildlib/Clownfish/Build/Binding.pm
index b58205a..1c5cb58 100644
--- a/runtime/perl/buildlib/Clownfish/Build/Binding.pm
+++ b/runtime/perl/buildlib/Clownfish/Build/Binding.pm
@@ -269,11 +269,8 @@ sub bind_charbuf {
     $buf->cat_char(ord("\n"));
     print $buf->to_string;
 END_SYNOPSIS
-    my $constructor = <<'END_CONSTRUCTOR';
-    my $buf = Clownfish::CharBuf->new( capacity => 256 );
-END_CONSTRUCTOR
     $pod_spec->set_synopsis($synopsis);
-    $pod_spec->add_constructor( sample => $constructor );
+    $pod_spec->add_constructor();
 
     my $binding = Clownfish::CFC::Binding::Perl::Class->new(
         parcel     => "Clownfish",
@@ -487,9 +484,6 @@ sub bind_hash {
     $hash->store($key, $value);
     my $value = $hash->fetch($key);
 END_SYNOPSIS
-    my $constructor = <<'END_CONSTRUCTOR';
-    my $hash = Clownfish::Hash->new( capacity => 256 );
-END_CONSTRUCTOR
     my $store_pod = <<'END_POD';
 =head2 store
 
@@ -498,7 +492,7 @@ END_CONSTRUCTOR
 Store a key-value pair.
 END_POD
     $pod_spec->set_synopsis($synopsis);
-    $pod_spec->add_constructor( sample => $constructor );
+    $pod_spec->add_constructor();
     $pod_spec->add_method(
         method => 'Store',
         alias  => 'store',
@@ -836,9 +830,6 @@ sub bind_vector {
     $vector->store($tick, $value);
     my $value = $vector->fetch($tick);
 END_SYNOPSIS
-    my $constructor = <<'END_CONSTRUCTOR';
-    my $vector = Clownfish::Vector->new( capacity => 256 );
-END_CONSTRUCTOR
     my $store_pod = <<'END_POD';
 =head2 store
 
@@ -847,7 +838,7 @@ END_CONSTRUCTOR
 Store an element at index C<tick>, possibly displacing an existing element.
 END_POD
     $pod_spec->set_synopsis($synopsis);
-    $pod_spec->add_constructor( sample => $constructor );
+    $pod_spec->add_constructor();
     $pod_spec->add_method(
         method => 'Store',
         alias  => 'store',
@@ -912,21 +903,12 @@ END_SYNOPSIS
     my $fetch_class_sample = <<'END_CONSTRUCTOR';
     my $class = Clownfish::Class->fetch_class($class_name);
 END_CONSTRUCTOR
-    my $singleton_sample = <<'END_CONSTRUCTOR';
-    my $class = Clownfish::Class->singleton(
-        class_name => $class_name,
-        parent     => $parent,
-    );
-END_CONSTRUCTOR
     $pod_spec->set_synopsis($synopsis);
     $pod_spec->add_constructor(
         alias  => 'fetch_class',
         sample => $fetch_class_sample,
     );
-    $pod_spec->add_constructor(
-        alias  => 'singleton',
-        sample => $singleton_sample,
-    );
+    $pod_spec->add_constructor( alias  => 'singleton' );
 
     my $xs_code = <<'END_XS_CODE';
 MODULE = Clownfish   PACKAGE = Clownfish::Class

Reply via email to