From e1bdface0c1740680f4a1fe785f99975cf1aa34d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Lebrun?= Date: Wed, 5 Nov 2025 09:58:56 +0100 Subject: [PATCH] templates/ident: improve "Identifier not used" message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "Identifier not used" is weird, replace it by "unknown identifier" and give the search identifier name in the header. Also improve the autocomplete comment. Make it human-friendly and explain why people got autocompleted to a symbol that does not exist. Also, only show it if the symbol actually exists. That way we only tell "maybe autocomplete lead you here" only in cases where autocomplete can actually lead you here. To test this feature: - search for any random symbol, you'll see "Unknown identifier '...'" - search for a symbol that exists in another version as the selected one. For example __NR_epoll_pwait2 appeared in musl v1.2.5. You'll see the same header message plus a comment about how the symbol exists in another version. Signed-off-by: Théo Lebrun --- elixir/api.py | 2 +- elixir/query.py | 10 +++++----- elixir/web.py | 10 ++++++---- templates/ident.html | 9 +++++++-- utils/query.py | 2 +- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/elixir/api.py b/elixir/api.py index 57936f3..1574907 100755 --- a/elixir/api.py +++ b/elixir/api.py @@ -46,7 +46,7 @@ class ApiIdentGetterResource: if version == 'latest': version = query.get_latest_tag() - symbol_definitions, symbol_references, symbol_doccomments = query.search_ident(version, ident, family) + symbol_definitions, symbol_references, symbol_doccomments, _ = query.search_ident(version, ident, family) resp.status = falcon.HTTP_200 resp.content_type = falcon.MEDIA_JSON diff --git a/elixir/query.py b/elixir/query.py index 1e740bf..5de950a 100755 --- a/elixir/query.py +++ b/elixir/query.py @@ -212,7 +212,7 @@ class Query: ident = parse.quote(ident) if not self.dts_comp_support or not self.db.comps.exists(ident): - return symbol_c, symbol_dts, symbol_docs + return symbol_c, symbol_dts, symbol_docs, False files_this_version = self.db.vers.get(version).iter() comps = self.db.comps.get(ident).iter(dummy=True) @@ -253,7 +253,7 @@ class Query: for path, blines in sorted(compsBBuf): symbol_docs.append(SymbolInstance(path, blines)) - return symbol_c, symbol_dts, symbol_docs + return symbol_c, symbol_dts, symbol_docs, True def get_idents_defs(self, version, ident, family): @@ -262,10 +262,10 @@ class Query: symbol_doccomments = [] if not self.db.defs.exists(ident): - return symbol_definitions, symbol_references, symbol_doccomments + return symbol_definitions, symbol_references, symbol_doccomments, False if not self.db.vers.exists(version): - return symbol_definitions, symbol_references, symbol_doccomments + return symbol_definitions, symbol_references, symbol_doccomments, True files_this_version = self.db.vers.get(version).iter() this_ident = self.db.defs.get(ident) @@ -330,5 +330,5 @@ class Query: for path, docline in sorted(docBuf): symbol_doccomments.append(SymbolInstance(path, docline)) - return symbol_definitions, symbol_references, symbol_doccomments + return symbol_definitions, symbol_references, symbol_doccomments, True diff --git a/elixir/web.py b/elixir/web.py index edeef66..6eb2c28 100755 --- a/elixir/web.py +++ b/elixir/web.py @@ -695,7 +695,8 @@ def generate_ident_page(ctx: RequestContext, q: Query, status = falcon.HTTP_OK source_base_url = get_source_base_url(project, version) - symbol_definitions, symbol_references, symbol_doccomments = q.search_ident(version, ident, family) + symbol_definitions, symbol_references, symbol_doccomments, symbol_exists = q.search_ident( + version, ident, family) symbol_sections = [] if len(symbol_definitions) or len(symbol_references): @@ -734,9 +735,8 @@ def generate_ident_page(ctx: RequestContext, q: Query, 'message': 'No references found in the database', }) - else: - if ident != '': - status = falcon.HTTP_NOT_FOUND + elif ident != '': + status = falcon.HTTP_NOT_FOUND get_url_with_new_version = lambda v: stringify_ident_path(project, v, family, ident) @@ -747,6 +747,8 @@ def generate_ident_page(ctx: RequestContext, q: Query, 'current_family': family, 'symbol_sections': symbol_sections, + + 'symbol_exists': symbol_exists, } template = ctx.jinja_env.get_template('ident.html') diff --git a/templates/ident.html b/templates/ident.html index 91d5d4e..e0e5f2a 100644 --- a/templates/ident.html +++ b/templates/ident.html @@ -57,8 +57,13 @@ {% endif %} {% endfor %} {% else %} -

Identifier not used

-
Note: Autocomplete currently searches identifiers in all versions of the project.
+

Unknown identifier '{{ searched_ident|e }}'

+ {% if symbol_exists %} +
+ The '{{ searched_ident|e }}' symbol is defined in another version. + Elixir cannot efficiently tell where. +
+ {% endif %} {% endif %} diff --git a/utils/query.py b/utils/query.py index fbd35af..7afd38b 100644 --- a/utils/query.py +++ b/utils/query.py @@ -16,7 +16,7 @@ def cmd_versions(q, **kwargs): print(v) def cmd_ident(q, version, ident, family, **kwargs): - symbol_definitions, symbol_references, symbol_doccomments = q.search_ident(version, ident, family) + symbol_definitions, symbol_references, symbol_doccomments, _ = q.search_ident(version, ident, family) print("Symbol Definitions:") for symbol_definition in symbol_definitions: print(symbol_definition)