#!/usr/bin/env bash # Control for duplicate-definition detection. # # El has no namespacing: import is textual inlining, so two modules defining the # same name emit two C functions into one translation unit. set -uo pipefail ELC="${1:?usage: definitions_query.sh }" LANG_DIR="${2:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}" W=$(mktemp -d); trap 'rm -rf "$W"' EXIT; F=0 chk(){ [ "$2" = "$3" ] && printf ' ok %s\n' "$1" || { printf ' FAIL %s\n expected %s got %s\n' "$1" "$2" "$3"; F=$((F+1)); }; } printf 'fn helper() -> Int { return 1 }\n' > "$W/a.el" printf 'fn helper() -> Int { return 2 }\n' > "$W/b.el" printf 'import "a.el"\nimport "b.el"\nfn main() { println(int_to_str(helper())) }\n' > "$W/m.el" EL_RELATIONS_OUT="$W/r.txt" "$ELC" "$W/m.el" >/dev/null 2>&1 out=$("$LANG_DIR/tools/check/definitions.sh" "$W/r.txt" 2>&1); rc=$? chk "a collision across modules is caught at El level" "1" "$rc" chk "the colliding name is reported" "1" "$(echo "$out" | grep -c "'helper' is defined 2 times")" chk "and the reason is given" "1" "$(echo "$out" | grep -c 'no namespacing')" chk "both source FILES are named" "1" "$(echo "$out" | grep -c 'a.el:1')" chk "with file-local line numbers, not combined ones" "1" "$(echo "$out" | grep -c 'b.el:1')" printf 'fn only_once() -> Int { return 1 }\nfn main() { println(int_to_str(only_once())) }\n' > "$W/c.el" EL_RELATIONS_OUT="$W/r2.txt" "$ELC" "$W/c.el" >/dev/null 2>&1 "$LANG_DIR/tools/check/definitions.sh" "$W/r2.txt" >/dev/null 2>&1 chk "a clean program exits 0" "0" "$?" echo; echo " 6 assertions, $((6-F)) passed, $F failed"; exit $F