From c43266260d456e7eeda884a92182ec44c9b44f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Reuh=20Fildadut?= Date: Fri, 16 Sep 2022 21:40:45 +0900 Subject: [PATCH] Fix _._ operator not working with arbitrary expressions --- parser/common.lua | 30 +++++++++++-------- ...amespace operator arbitrary expression.ans | 6 ++++ ...amespace operator arbitrary expression.lua | 14 +++++++++ 3 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 test/tests/namespace operator arbitrary expression.ans create mode 100644 test/tests/namespace operator arbitrary expression.lua diff --git a/parser/common.lua b/parser/common.lua index 1dcea17..b7adfff 100644 --- a/parser/common.lua +++ b/parser/common.lua @@ -82,7 +82,7 @@ common = { --- split a string separated by . split = function(str) local address = {} - for name in str:gmatch("[^%.]+") do + for name in (str.."."):gmatch("(.-)%.") do table.insert(address, name) end return address @@ -92,12 +92,14 @@ common = { -- returns value, fqm in case of success -- returns nil, err in case of error find = function(aliases, list, namespace, name) - local ns = common.split(namespace) - for i=#ns, 1, -1 do - local current_namespace = table.concat(ns, ".", 1, i) - local fqm = replace_aliases(aliases, current_namespace, name) - if list[fqm] then - return list[fqm], fqm + if namespace ~= "" then + local ns = common.split(namespace:gsub("%.$", "")) + for i=#ns, 1, -1 do + local current_namespace = table.concat(ns, ".", 1, i) + local fqm = replace_aliases(aliases, current_namespace, name) + if list[fqm] then + return list[fqm], fqm + end end end -- root namespace @@ -111,12 +113,14 @@ common = { -- returns a list of fqm find_all = function(aliases, list, namespace, name) local l = {} - local ns = common.split(namespace) - for i=#ns, 1, -1 do - local current_namespace = table.concat(ns, ".", 1, i) - local fqm = replace_aliases(aliases, current_namespace, name) - if list[fqm] then - table.insert(l, fqm) + if namespace ~= "" then + local ns = common.split(namespace:gsub("%.$", "")) + for i=#ns, 1, -1 do + local current_namespace = table.concat(ns, ".", 1, i) + local fqm = replace_aliases(aliases, current_namespace, name) + if list[fqm] then + table.insert(l, fqm) + end end end -- root namespace diff --git a/test/tests/namespace operator arbitrary expression.ans b/test/tests/namespace operator arbitrary expression.ans new file mode 100644 index 0000000..9503464 --- /dev/null +++ b/test/tests/namespace operator arbitrary expression.ans @@ -0,0 +1,6 @@ +:$ f + :x = 5 + +:a = &f + +{a.("x")} diff --git a/test/tests/namespace operator arbitrary expression.lua b/test/tests/namespace operator arbitrary expression.lua new file mode 100644 index 0000000..917ecac --- /dev/null +++ b/test/tests/namespace operator arbitrary expression.lua @@ -0,0 +1,14 @@ +local _={} +_[5]={} +_[4]={text="5",tags=_[5]} +_[3]={_[4]} +_[2]={"return"} +_[1]={"text",_[3]} +return {_[1],_[2]} +--[[ +{ "text", { { + tags = {}, + text = "5" + } } } +{ "return" } +]]-- \ No newline at end of file