#!/usr/bin/env bash # definitions.sh — catch duplicate top-level definitions at El level. # # El has no namespacing. `import` is textual inlining, so two modules defining # the same name emit two C functions into one translation unit. cc does catch # it, but reports the generated helpers (__el_body_f, __env_f, __thunk_f) before # the user's own function, so the first three errors name symbols the user never # wrote. # # LIMIT, stated rather than hidden: textual inlining destroys file provenance. # By the time codegen runs there is one source string and no record of which # file a definition came from, so this can say WHICH name collides but not which # files. Naming the files needs provenance threaded through resolve_imports. set -uo pipefail REL="${1:?usage: definitions.sh }" [ -f "$REL" ] || exit 0 V=0 while read -r name count; do [ "$count" -gt 1 ] || continue printf "duplicate definition: '%s' is defined %s times — El has no namespacing, so imported modules share one global scope\n" "$name" "$count" V=$((V+1)) done < <(grep ' calls defines$' "$REL" | awk '{print $1}' | sort | uniq -c | awk '{print $2, $1}') [ "$V" -eq 0 ] && echo "definitions: clean" exit "$V"