From 73735192bdb5c325cd39cdee6206e3457c7cb061 Mon Sep 17 00:00:00 2001 From: Lazar Bulovan Date: Wed, 22 Jul 2026 17:10:05 +0200 Subject: [PATCH] fix: skip number literal hashes in SCL001 diagnostic 16#FFFF (hex), 2#1010 (binary), 8#777 (octal) are TIA Portal base-specific number literals, not hash-prefixed variables. Check if the character before # is a digit to distinguish them. --- src/diagnostics.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/diagnostics.lua b/src/diagnostics.lua index a1b82cf..d5cfd36 100644 --- a/src/diagnostics.lua +++ b/src/diagnostics.lua @@ -138,12 +138,20 @@ function M.validate_diagnostics(content, workspace_types, root_dir) return prefix == "T" or prefix == "D" or prefix == "S" end + -- Check if hash is part of a base-specific number literal like 16#FFFF, 2#1010 + local function is_number_literal_at(line, match_start) + if not line or not match_start then return false end + if match_start <= 1 then return false end + local before = line:sub(match_start - 1, match_start - 1) + return before:match("%d") ~= nil + end + if not in_var_section then local hash_vars = {} for var in line:gmatch("#[%w_]+") do local var_name = var:sub(2) local match_start = line:find(var, 1, true) - if not is_iec_literal_at(line, match_start) then + if not is_iec_literal_at(line, match_start) and not is_number_literal_at(line, match_start) then hash_vars[var_name] = true end end