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.