Luon & lua log file: Fix handling of keyword keys

This commit is contained in:
Lars Mueller 2021-12-30 17:12:51 +01:00
parent a243d2ae48
commit fa328b16db
4 changed files with 16 additions and 4 deletions

@ -2,6 +2,7 @@ local assert, next, pairs, pcall, error, type, table_insert, table_concat, strin
= assert, next, pairs, pcall, error, type, table.insert, table.concat, string.format, string.match, setmetatable, select, setfenv, math.huge, loadfile, loadstring = assert, next, pairs, pcall, error, type, table.insert, table.concat, string.format, string.match, setmetatable, select, setfenv, math.huge, loadfile, loadstring
local count_objects = modlib.table.count_objects local count_objects = modlib.table.count_objects
local is_identifier = modlib.text.is_identifier
-- Build a table with the succeeding character from A-Z -- Build a table with the succeeding character from A-Z
local succ = {} local succ = {}
@ -60,7 +61,7 @@ function write(self, value, write)
end end
end end
local function is_short_key(key) local function is_short_key(key)
return not references[key] and type(key) == "string" and string_match(key, "^[%a_][%a%d_]*$") return not references[key] and type(key) == "string" and is_identifier(key)
end end
local function dump(value) local function dump(value)
-- Primitive types -- Primitive types

@ -124,7 +124,7 @@ local function _dump(self, value, is_key)
end end
if _type == "string" then if _type == "string" then
local reference_strings = self.reference_strings local reference_strings = self.reference_strings
if is_key and ((not reference_strings) or value:len() <= key:len()) and value:match"^[%a_][%a%d_]*$" then if is_key and ((not reference_strings) or value:len() <= key:len()) and modlib.text.is_identifier(value) then
-- Short key -- Short key
return value, true return value, true
end end

@ -274,6 +274,7 @@ local function serializer_test(is_json, preserve)
c[a] = a; c[b] = b; c[c] = c; c[a] = a; c[b] = b; c[c] = c;
a.a = {"a", a = a} a.a = {"a", a = a}
assert_preserves(a) assert_preserves(a)
assert_preserves{["for"] = "keyword", ["in"] = "keyword"}
end end
-- JSON -- JSON
@ -352,7 +353,7 @@ local function test_logfile(reference_strings)
assert(logfile.root.root_preserved) assert(logfile.root.root_preserved)
logfile.root = {a_longer_string = "test"} logfile.root = {a_longer_string = "test"}
logfile:rewrite() logfile:rewrite()
logfile:set_root({a = 1}, {b = 2, c = 3, d = _G.math.huge, e = -_G.math.huge}) logfile:set_root({a = 1}, {b = 2, c = 3, d = _G.math.huge, e = -_G.math.huge, ["in"] = "keyword"})
local circular = {} local circular = {}
circular[circular] = circular circular[circular] = circular
logfile:set_root(circular, circular) logfile:set_root(circular, circular)
@ -360,7 +361,7 @@ local function test_logfile(reference_strings)
logfile:init() logfile:init()
assert(table.equals_references(logfile.root, { assert(table.equals_references(logfile.root, {
a_longer_string = "test", a_longer_string = "test",
[{a = 1}] = {b = 2, c = 3, d = _G.math.huge, e = -_G.math.huge}, [{a = 1}] = {b = 2, c = 3, d = _G.math.huge, e = -_G.math.huge, ["in"] = "keyword"},
[circular] = circular, [circular] = circular,
})) }))
if not reference_strings then if not reference_strings then

@ -176,5 +176,15 @@ function handle_ifdefs(code, vars)
return table.concat(finalcode, "") return table.concat(finalcode, "")
end end
local keywords = modlib.table.set{"and", "break", "do", "else", "elseif", "end", "false", "for", "function", "if", "in", "local", "nil", "not", "or", "repeat", "return", "then", "true", "until", "while"}
function is_keyword(text)
return keywords[text]
end
function is_identifier(text)
return (not keywords[text]) and text:match"^[%a_][%a%d_]*$"
end
-- Export environment -- Export environment
return _ENV return _ENV