]> Nishi Git Mirror - gwion.git/commitdiff
:art: Introduce docstr
authorJérémie Astor <fennecdjay@gmail.com>
Sun, 22 Nov 2020 22:40:33 +0000 (23:40 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Sun, 22 Nov 2020 22:40:33 +0000 (23:40 +0100)
ast
include/env/context.h
include/env/value.h
src/env/context.c
src/parse/scan2.c

diff --git a/ast b/ast
index 31bfb80acafe4235a0446cde7c93b0e3687d503c..ba9550c1d998f0ddf81b901e633c901ebc92cb18 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit 31bfb80acafe4235a0446cde7c93b0e3687d503c
+Subproject commit ba9550c1d998f0ddf81b901e633c901ebc92cb18
index 0fea1b748e7eb163eef6d035cb83f0f21b7a6505..1810e04d1e6ec645f99507dbda6db72064036fc2 100644 (file)
@@ -6,6 +6,7 @@ struct Context_ {
   Ast         tree;
   Nspc        nspc;
   struct Map_ lbls;
+  GwText *docstr;
   m_bool error;
   m_bool global;
   uint16_t ref;
index c87da142e13d5defe0a55f74f5999ff3bf4e46e4..7adb5dccdd0715bac030a36ae6506f1fe41774d0 100644 (file)
@@ -30,6 +30,7 @@ struct Value_ {
     m_uint* ptr;
     Func func_ref;
   } d;
+  GwText *docstr;
   uint16_t ref;
   ae_flag flag;
   enum vflag vflag;
index c78d522e65f26fe0658211d78ed78f5ad7082f41..0599442df26c59e338b690b4a009626bf7f73b44 100644 (file)
@@ -7,6 +7,8 @@
 ANN void free_context(const Context a, Gwion gwion) {
   nspc_remref(a->nspc, gwion);
   free_mstr(gwion->mp, a->name);
+  if(a->docstr)
+    free_text(gwion->mp, a->docstr);
   mp_free(gwion->mp, Context, a);
 }
 
index ccaeb95e89c14f8a2be3884dd2c51dbbb08a412c..20cb1ac33b0e19fc222398d92a3c8a1c8af0fc05 100644 (file)
@@ -286,9 +286,27 @@ ANN m_bool scan2_union_def(const Env env, const Union_Def udef) {
 #define scan2_stmt_break    (void*)dummy_func
 #define scan2_stmt_return   scan2_stmt_exp
 
+#define DOCSTRING(name, value, prefix)                   \
+ANN static inline GwText* name##_docstr(const Env env) { \
+  prefix                                                 \
+  if(!(value))                                           \
+    (value) = new_text(env->gwion->mp);                  \
+  return value;                                          \
+}
+DOCSTRING(context, env->context->docstr,)
+DOCSTRING(func, env->func->value_ref->docstr,)
+DOCSTRING(class, v->docstr, const Value v = nspc_lookup_value0(env->curr->parent, insert_symbol(env->class_def->name));)
+typedef GwText* (*docfunc)(Env);
+
 ANN static m_bool scan2_stmt_pp(const Env env, const Stmt_PP stmt) {
   if(stmt->pp_type == ae_pp_include)
     env->name = stmt->data;
+  else if(stmt->pp_type == ae_pp_docstr) {
+    const docfunc df = env->func ? func_docstr : env->class_def ? class_docstr : context_docstr;
+    GwText *docstr = df(env);
+    text_add(docstr, stmt->data);
+
+  }
   return GW_OK;
 }