aboutsummaryrefslogtreecommitdiff
path: root/spec/inputs/macro-teal.mp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--spec/inputs/macro-teal.mp34
1 files changed, 28 insertions, 6 deletions
diff --git a/spec/inputs/macro-teal.mp b/spec/inputs/macro-teal.mp
index 20444e1..9ce1bcd 100644
--- a/spec/inputs/macro-teal.mp
+++ b/spec/inputs/macro-teal.mp
@@ -2,6 +2,7 @@ $ ->
2 import "moonp" as {:options} 2 import "moonp" as {:options}
3 if options.tl_enabled 3 if options.tl_enabled
4 options.target_extension = "tl" 4 options.target_extension = "tl"
5 package.path ..= "?.lua;./spec/lib/?.lua"
5 6
6macro expr to_lua = (codes)-> 7macro expr to_lua = (codes)->
7 "require('moonp').to_lua(#{codes}, reserve_line_number:false, same_module:true)" 8 "require('moonp').to_lua(#{codes}, reserve_line_number:false, same_module:true)"
@@ -9,19 +10,31 @@ macro expr to_lua = (codes)->
9macro expr trim = (name)-> 10macro expr trim = (name)->
10 "if result = #{name}\\match '[\\'\"](.*)[\\'\"]' then result else #{name}" 11 "if result = #{name}\\match '[\\'\"](.*)[\\'\"]' then result else #{name}"
11 12
12export macro text var = (name, type, value = nil)-> 13export macro text local = (decl, value = nil)->
13 import "moonp" as {options:{:tl_enabled}} 14 import "moonp" as {options:{:tl_enabled}}
15 name, type = ($trim decl)\match "(.-):(.*)"
16 if not (name and type)
17 error "invalid local varaible declaration for \"#{decl}\""
14 value = $to_lua(value)\gsub "^return ", "" 18 value = $to_lua(value)\gsub "^return ", ""
15 if tl_enabled 19 if tl_enabled
16 "local #{name}:#{$trim type} = #{value}", {name} 20 "local #{name}:#{$trim type} = #{value}", {name}
17 else 21 else
18 "local #{name} = #{value}", {name} 22 "local #{name} = #{value}", {name}
19 23
20export macro text def = (name, type, value)-> 24export macro text function = (decl, value)->
21 import "moonp" as {options:{:tl_enabled}} 25 import "moonp" as {options:{:tl_enabled}}
26 import "tl"
27 decl = $trim decl
28 name, type = decl\match "(.-)(%(.*)"
29 if not (name and type)
30 error "invalid function declaration for \"#{decl}\""
31 tokens = tl.lex "function #{decl}"
32 _, node = tl.parse_program tokens,{},"macro-function"
33 args = table.concat [arg.tk for arg in *node[1].args],", "
34 value = "(#{args})#{value}"
22 if tl_enabled 35 if tl_enabled
23 value = $to_lua(value)\match "function%(.*%)(.*)end" 36 value = $to_lua(value)\match "function%([^\n]*%)(.*)end"
24 "local function #{name}#{$trim type}\n#{value}\nend", {name} 37 "local function #{name}#{type}\n#{value}\nend", {name}
25 else 38 else
26 value = $to_lua(value)\gsub "^return ", "" 39 value = $to_lua(value)\gsub "^return ", ""
27 "local #{name} = #{value}", {name} 40 "local #{name} = #{value}", {name}
@@ -35,11 +48,20 @@ end", {name}
35 else 48 else
36 "local #{name} = {}", {name} 49 "local #{name} = {}", {name}
37 50
38export macro text field = (tab, sym, func, type, value)-> 51export macro text method = (decl, value)->
39 import "moonp" as {options:{:tl_enabled}} 52 import "moonp" as {options:{:tl_enabled}}
53 import "tl"
54 decl = $trim decl
55 tab, sym, func, type = decl\match "(.-)([%.:])(.-)(%(.*)"
56 if not (tab and sym and func and type)
57 error "invalid method declaration for \"#{decl}\""
58 tokens = tl.lex "function #{decl}"
59 _, node = tl.parse_program tokens,{},"macro-function"
60 args = table.concat [arg.tk for arg in *node[1].args],", "
61 value = "(#{args})->#{value\match "[%-=]>(.*)"}"
40 if tl_enabled 62 if tl_enabled
41 value = $to_lua(value)\match "^return function%(.-%)\n(.*)end" 63 value = $to_lua(value)\match "^return function%(.-%)\n(.*)end"
42 "function #{tab}#{$trim sym}#{func}#{$trim type}\n#{value}\nend" 64 "function #{tab}#{sym}#{func}#{type}\n#{value}\nend"
43 else 65 else
44 value = $to_lua(value)\gsub "^return ", "" 66 value = $to_lua(value)\gsub "^return ", ""
45 "#{tab}.#{func} = #{value}" 67 "#{tab}.#{func} = #{value}"