]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve dym
authorJérémie Astor <fennecdjay@gmail.com>
Tue, 30 Mar 2021 08:10:47 +0000 (10:10 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Tue, 30 Mar 2021 08:11:05 +0000 (10:11 +0200)
include/env/env.h
src/parse/check.c
src/parse/did_you_mean.c

index 63be0aab9cf75dcc3f86835c46f455014e618e25..0962ba9e6ccd59b0c31edf69adda01ec109605d5 100644 (file)
@@ -5,17 +5,16 @@
 #define NSPC(a) { nspc_push_value(env->curr); SCOPE(a); nspc_pop_value(env->curr); }
 
 struct Env_Scope_ {
-  struct Vector_    nspc_stack;
-  struct Vector_    class_stack;
-  struct Vector_    breaks;
-  struct Vector_    conts;
-  struct Vector_    known_ctx;
-  struct Match_ *match;
+  struct Vector_  nspc_stack;
+  struct Vector_  class_stack;
+  struct Vector_  breaks;
+  struct Vector_  conts;
+  struct Vector_  known_ctx;
+  struct Match_  *match;
   size_t depth;
 };
 
-typedef struct Env_       * Env;
-struct Env_ {
+typedef struct Env_ {
   m_str name;
   Nspc curr;
   Nspc global_nspc;
@@ -24,7 +23,7 @@ struct Env_ {
   Func      func;
   struct Gwion_ *gwion;
   struct Env_Scope_* scope;
-};
+} *Env;
 
 ANEW Env new_env(MemPool);
 ANN void env_reset(const Env);
index 2a4578d45df59ac2b609de58115cad037e1db1e2..82c2b10a5b0d31a9074b48e8176ca5c8b72a4e57 100644 (file)
@@ -289,7 +289,7 @@ ANN static Type prim_id_non_res(const Env env, const Symbol *data) {
   const Symbol sym = *data;
   const Value v = check_non_res_value(env, data);
   if(!v || !vflag(v, vflag_valid) || (v->from->ctx && v->from->ctx->error)) {
-    gwerr_basic(_("Invalid variable"), _("not legit at this point."), "did you mean:",
+    gwerr_basic(_("Invalid variable"), _("not legit at this point."), NULL,
          env->name, prim_pos(data), 0);
     did_you_mean_nspc(v ? value_owner(env, v) : env->curr, s_name(sym));
     env->context->error++;
index b8b3d2e88b5bcd0b1d3bf75252fcf39aba144b00..2d724d6b816fadb7ae5ecb72b36b25e7d862ac2b 100644 (file)
@@ -32,13 +32,17 @@ static m_bool wagner_fisher(const char *s, const char* t) {
   return (i && j && d[m-1][n-1] < MAX_DISTANCE);
 }
 
-ANN static void ressembles(const Vector v, const Nspc nspc, const char* name) {
+ANN static void ressembles(const Vector v, const Nspc nspc, const char* name, bool *const done) {
   struct scope_iter iter = { nspc->info->value, 0, 0 };
   Value value;
   while(scope_iter(&iter, &value) > 0) {
     if(vector_find(v, (vtype)value->name) > 0 &&!strcmp(name, value->name))
       continue;
     if(wagner_fisher(name, value->name)) {
+      if(!*done) {
+        *done = true;
+        gw_err("{-/}did you mean{0}:");
+      }
       if(!vflag(value, vflag_builtin))
         gwerr_secondary("declared here", value->from->filename, value->from->loc);
     }
@@ -54,7 +58,8 @@ ANN void did_you_mean_nspc(Nspc nspc, const char* name) {
   CHECK_LEN(name)
   struct Vector_ v;
   vector_init(&v);
-  do ressembles(&v, nspc, name);
+  bool done;
+  do ressembles(&v, nspc, name, &done);
   while((nspc = nspc->parent));
   vector_release(&v);
 }
@@ -65,7 +70,8 @@ ANN void did_you_mean_type(Type type, const char* name) {
   Type t = type;
   struct Vector_ v;
   vector_init(&v);
-  do ressembles(&v, t->nspc, name);
+  bool done;
+  do ressembles(&v, t->nspc, name, &done);
   while((t = t->info->parent) && t->nspc);
   vector_release(&v);
 }