This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch edje-vector-intergration
in repository efl.

View the commit online.

commit bcbcff41c6a61dd332bdb3995b52aa318f0bb81f
Author: [email protected] <[email protected]>
AuthorDate: Wed Apr 29 15:47:28 2026 -0600

    edje: add diagnostic emit infrastructure (Task 7.1)
    
    Implement the diagnostic severity override and emit mechanism that
    subsequent Phase 7 tasks will use to fire numbered VECxxx codes.
    
    Core infrastructure:
    - Edje_Diag_Severity enum: INFO, WARN, ERR. Numeric ordering
      is significant: override hash encodes as (sev + 1) so that
      a missing key (NULL) is distinguishable from INFO (0).
    - edje_diag_emit(code, default_sev, file, line, part, state, fmt, ...)
      with EINA_PRINTF(7,8). Resolves actual severity from override hash
      (or uses default_sev fallback). Logs to stderr in conventional
      format: <file>:<line>: <CODE>: <severity>: in part 'X' state 'Y': <body>.
      ERR severity calls error_and_abort after logging.
    - edje_diag_severity_override(code, sev) stores into static Eina_Hash
      (string-keyed; values encoded as integers, no data-free). Hash
      lifetime is process-bounded since keys/values come from argv.
    
    CLI integration:
    - Recognizes -W <code>=<level> in both joined (-WVEC014=warning)
      and separated (-W VEC014=warning) forms. Accepts human-readable
      aliases per spec: vector-topology → VEC004. Unknown levels fail
      with ERR + exit(-1). Help text updated to document the feature.
    
    The mechanism is general-purpose: any VECxxx code can be promoted/
    demoted via -W even if the spec doesn't explicitly mandate it.
    Spec only requires -W vector-topology=error (Phase 7.5 domain).
    
    No diagnostics consume the infrastructure yet; Tasks 7.2-7.5 wire
    the actual codes.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
---
 src/bin/edje/edje_cc.c      | 55 +++++++++++++++++++++++++++++++++++++++
 src/bin/edje/edje_cc.h      | 23 +++++++++++++++++
 src/bin/edje/edje_cc_diag.c | 63 +++++++++++++++++++++++++++++++++++++++++++++
 src/bin/edje/meson.build    |  3 ++-
 4 files changed, 143 insertions(+), 1 deletion(-)

diff --git a/src/bin/edje/edje_cc.c b/src/bin/edje/edje_cc.c
index 0362c15f79..6e147d6f3a 100644
--- a/src/bin/edje/edje_cc.c
+++ b/src/bin/edje/edje_cc.c
@@ -136,6 +136,8 @@ main_help(void)
       "-threads                 Compile the edje file using multiple parallel threads (by default)\n"
       "-nothreads               Compile the edje file using only the main loop\n"
       "-N                       Use the first segment of each group name as a namespace to verify parts/signals\n"
+      "-W <code>=<level>        Override severity of a numbered diagnostic (info|warn|warning|error|err)\n"
+      "                         Codes: VEC001..VEC014. Aliases: vector-topology=VEC004\n"
       "-V [--version]           show program version\n"
      , progname);
 }
@@ -320,6 +322,59 @@ main(int argc, char **argv)
           {
              no_warn_unused_images = 1;
           }
+        else if (!strncmp(argv[i], "-W", 2))
+          {
+             /* -W<code>=<level>  or  -W <code>=<level>
+              * e.g.  -WVEC014=warning  or  -W vector-topology=error */
+             const char *arg = argv[i] + 2;
+             if (!*arg)
+               {
+                  if (i + 1 < argc) { i++; arg = argv[i]; }
+                  else { ERR("option -W requires an argument"); exit(-1); }
+               }
+             const char *eq = strchr(arg, '=');
+             if (!eq)
+               {
+                  ERR("invalid -W argument '%s' (expected <code>=<level>)", arg);
+                  exit(-1);
+               }
+             char code[64];
+             size_t code_len = (size_t)(eq - arg);
+             if (code_len >= sizeof(code)) code_len = sizeof(code) - 1;
+             memcpy(code, arg, code_len);
+             code[code_len] = '\0';
+
+             /* Resolve human-readable aliases. */
+             static const struct { const char *human; const char *code; } _aliases[] = {
+                {"vector-topology", "VEC004"},
+                {NULL, NULL}
+             };
+             const char *resolved = code;
+             for (int j = 0; _aliases[j].human; j++)
+               {
+                  if (!strcmp(code, _aliases[j].human))
+                    {
+                       resolved = _aliases[j].code;
+                       break;
+                    }
+               }
+
+             const char *level = eq + 1;
+             Edje_Diag_Severity sev;
+             if (!strcmp(level, "info"))
+               sev = EDJE_DIAG_INFO;
+             else if (!strcmp(level, "warn") || !strcmp(level, "warning"))
+               sev = EDJE_DIAG_WARN;
+             else if (!strcmp(level, "error") || !strcmp(level, "err"))
+               sev = EDJE_DIAG_ERR;
+             else
+               {
+                  ERR("invalid -W level '%s' (expected info|warn|warning|error|err)", level);
+                  exit(-1);
+               }
+
+             edje_diag_severity_override(resolved, sev);
+          }
         else if ((!strcmp(argv[i], "-deps")) && (i < (argc - 1)))
           {
              i++;
diff --git a/src/bin/edje/edje_cc.h b/src/bin/edje/edje_cc.h
index 75c1b86328..ea8a376a76 100644
--- a/src/bin/edje/edje_cc.h
+++ b/src/bin/edje/edje_cc.h
@@ -288,6 +288,29 @@ void    using_file(const char *filename, const char type);
 
 void    error_and_abort(Eet_File *ef, const char *fmt, ...);
 
+/* Unified numbered-diagnostic infrastructure (Task 7.1) */
+typedef enum {
+   EDJE_DIAG_INFO,
+   EDJE_DIAG_WARN,
+   EDJE_DIAG_ERR
+} Edje_Diag_Severity;
+
+/* Emit a numbered diagnostic. Severity may be overridden by -W <code>=<level>
+ * CLI flags (defaults to default_sev otherwise). INFO logs to stderr at info
+ * level; WARN logs to stderr at warning level; ERR logs and calls
+ * error_and_abort.
+ *
+ * Pass NULL for any unavailable location component (file, part, state).
+ * Code is a short string like "VEC001". */
+void edje_diag_emit(const char *code,
+                    Edje_Diag_Severity default_sev,
+                    const char *file, int line,
+                    const char *part, const char *state,
+                    const char *fmt, ...) EINA_PRINTF(7, 8);
+
+/* Set a severity override for the named code. Called by main()'s -W parser. */
+void edje_diag_severity_override(const char *code, Edje_Diag_Severity sev);
+
 void stack_push_quick(const char *str);
 char *stack_pop_quick(Eina_Bool check_last, Eina_Bool do_free);
 void stack_replace_quick(const char *token);
diff --git a/src/bin/edje/edje_cc_diag.c b/src/bin/edje/edje_cc_diag.c
new file mode 100644
index 0000000000..49b6a97c08
--- /dev/null
+++ b/src/bin/edje/edje_cc_diag.c
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <Eina.h>
+
+#include "edje_cc.h"
+
+/* code → (uintptr_t)(sev + 1) so that NULL (missing key) is distinguishable
+ * from EDJE_DIAG_INFO (0). */
+static Eina_Hash *_diag_overrides = NULL;
+
+void
+edje_diag_severity_override(const char *code, Edje_Diag_Severity sev)
+{
+   if (!code) return;
+   if (!_diag_overrides)
+     _diag_overrides = eina_hash_string_superfast_new(NULL);
+   uintptr_t encoded = (uintptr_t)(sev + 1);
+   eina_hash_set(_diag_overrides, code, (void *)encoded);
+}
+
+static Edje_Diag_Severity
+_resolve_severity(const char *code, Edje_Diag_Severity default_sev)
+{
+   if (!_diag_overrides) return default_sev;
+   uintptr_t encoded = (uintptr_t)eina_hash_find(_diag_overrides, code);
+   if (encoded == 0) return default_sev;
+   return (Edje_Diag_Severity)(encoded - 1);
+}
+
+void
+edje_diag_emit(const char *code, Edje_Diag_Severity default_sev,
+               const char *file, int line,
+               const char *part, const char *state,
+               const char *fmt, ...)
+{
+   Edje_Diag_Severity sev = _resolve_severity(code, default_sev);
+
+   char body[2048];
+   va_list ap;
+   va_start(ap, fmt);
+   vsnprintf(body, sizeof(body), fmt, ap);
+   va_end(ap);
+
+   const char *sev_str = (sev == EDJE_DIAG_INFO  ? "info"    :
+                          sev == EDJE_DIAG_WARN   ? "warning" :
+                          "error");
+
+   if (file && line > 0)
+     fprintf(stderr, "%s:%d: %s: %s: ", file, line, code, sev_str);
+   else
+     fprintf(stderr, "%s: %s: ", code, sev_str);
+
+   if (part && state)
+     fprintf(stderr, "in part '%s' state '%s': ", part, state);
+   else if (part)
+     fprintf(stderr, "in part '%s': ", part);
+
+   fprintf(stderr, "%s\n", body);
+
+   if (sev == EDJE_DIAG_ERR)
+     error_and_abort(NULL, "diagnostic %s emitted as error", code);
+}
diff --git a/src/bin/edje/meson.build b/src/bin/edje/meson.build
index 2b4119d0f3..f397fced80 100644
--- a/src/bin/edje/meson.build
+++ b/src/bin/edje/meson.build
@@ -20,7 +20,8 @@ edje_cc_src = [
   'edje_cc_handlers.c',
   'edje_cc_sources.c',
   'edje_cc_script.c',
-  'edje_multisense_convert.c'
+  'edje_multisense_convert.c',
+  'edje_cc_diag.c'
 ]
 
 edje_cc = executable('edje_cc',

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to