From 798d60dadd26dd5735a70b098ca664ea095a5e7e Mon Sep 17 00:00:00 2001 From: sam <30084950+lunaboards-dev@users.noreply.github.com> Date: Mon, 14 Feb 2022 21:48:54 -0500 Subject: [PATCH] experimental relative include --- examples/rel_include/bar.lua | 1 + examples/rel_include/foo.lua | 3 +++ examples/rel_include_test.lua | 2 ++ src/directives/include.lua | 14 ++++++++++++-- src/directives/pragma.lua | 1 + src/generator2.lua | 3 ++- src/luacomp_vars.lua | 6 +++++- 7 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 examples/rel_include/bar.lua create mode 100644 examples/rel_include/foo.lua create mode 100644 examples/rel_include_test.lua diff --git a/examples/rel_include/bar.lua b/examples/rel_include/bar.lua new file mode 100644 index 0000000..4518298 --- /dev/null +++ b/examples/rel_include/bar.lua @@ -0,0 +1 @@ +print("bar") \ No newline at end of file diff --git a/examples/rel_include/foo.lua b/examples/rel_include/foo.lua new file mode 100644 index 0000000..c71ed6c --- /dev/null +++ b/examples/rel_include/foo.lua @@ -0,0 +1,3 @@ +--#pragma "relative_include" "y" +print("foo") +--#include "bar.lua" \ No newline at end of file diff --git a/examples/rel_include_test.lua b/examples/rel_include_test.lua new file mode 100644 index 0000000..7973b45 --- /dev/null +++ b/examples/rel_include_test.lua @@ -0,0 +1,2 @@ +print("relative include test!") +--#include "rel_include/foo.lua" \ No newline at end of file diff --git a/src/directives/include.lua b/src/directives/include.lua index 1e1a353..e514b7e 100644 --- a/src/directives/include.lua +++ b/src/directives/include.lua @@ -3,7 +3,17 @@ -- file, You can obtain one at https://mozilla.org/MPL/2.0/. function directives.include(env, file, asmod) - local sr, err = stat.stat(file) + local rfile = file + --luacomp.warning("relative_include\t"..env.pragmas.relative_include) + if env.pragmas.relative_include == "y" or luacomp.experimental.relative_include then + --luacomp.warning("Experimental relative include enabled!") + if not env.fname:find("/") then + rfile = file + else + rfile = env.fname:gsub("/[^/]+$", "/")..file + end + end + local sr, err = stat.stat(rfile) if not sr then return false, err end --[[local f = io.open(file, "r") local fast = mkast(f, file) @@ -14,7 +24,7 @@ function directives.include(env, file, asmod) if env.pragmas.include_file_name == "y" then env.code = env.code .. "-- BEGIN " .. file .. "\n" end - local code = luacomp.process_file(file, file) .. "\n" + local code = luacomp.process_file(rfile, rfile) .. "\n" if env.pragmas.prefix_local_file_numbers == "y" then local newcode = "" local i = 1 diff --git a/src/directives/pragma.lua b/src/directives/pragma.lua index af3a36c..b225bee 100644 --- a/src/directives/pragma.lua +++ b/src/directives/pragma.lua @@ -11,6 +11,7 @@ local pragma_hooks = { } function directives.pragma(env, key, value) + --luacomp.warning(key.."\t"..value) if not env.pragmas[key] then return nil, "unknown pragma "..key end diff --git a/src/generator2.lua b/src/generator2.lua index 5f29738..c670c9f 100644 --- a/src/generator2.lua +++ b/src/generator2.lua @@ -65,7 +65,8 @@ do pragmas = { include_file_name = "n", prefix_local_file_numbers = "n", - wrap_includes = "n" + wrap_includes = "n", + relative_include = "n" } } local fenv = {} diff --git a/src/luacomp_vars.lua b/src/luacomp_vars.lua index 675e50b..a367d43 100644 --- a/src/luacomp_vars.lua +++ b/src/luacomp_vars.lua @@ -12,4 +12,8 @@ _sv("LUACOMP_V_MAJ", 2) _sv("LUACOMP_V_MIN", 0) _sv("LUACOMP_V_PAT", 4) _sv("LUACOMP_VERSION", LUACOMP_V_MAJ.."."..LUACOMP_V_MIN.."."..LUACOMP_V_PAT) -_sv("LUACOMP_NAME", "LuaComp") \ No newline at end of file +_sv("LUACOMP_NAME", "LuaComp") + +luacomp.experimental = { + relative_include = false +} \ No newline at end of file