summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/matcher/definition.lua14
-rw-r--r--src/parser/grammar.lua10
-rw-r--r--test/definition/arg.lua11
-rw-r--r--test/definition/init.lua214
-rw-r--r--test/definition/local.lua208
5 files changed, 243 insertions, 214 deletions
diff --git a/src/matcher/definition.lua b/src/matcher/definition.lua
index bf7457e7..b18e1a01 100644
--- a/src/matcher/definition.lua
+++ b/src/matcher/definition.lua
@@ -54,6 +54,15 @@ function defs.Name(str)
return {str, namePos}
end
+function defs.DOTSPos(p)
+ namePos = p
+end
+
+function defs.DOTS(str)
+ checkDifinition(str, namePos)
+ return {str, namePos}
+end
+
function defs.LocalVar(names)
for _, name in ipairs(names) do
scopeSet(name)
@@ -66,10 +75,13 @@ function defs.LocalSet(names)
end
end
-function defs.FunctionDef(names)
+function defs.FunctionDef(names, args)
if #names == 1 then
scopeSet(names[1])
end
+ for _, arg in ipairs(args) do
+ scopeSet(arg)
+ end
scopePush()
end
diff --git a/src/parser/grammar.lua b/src/parser/grammar.lua
index 1e3a37c1..cb14fe6d 100644
--- a/src/parser/grammar.lua
+++ b/src/parser/grammar.lua
@@ -147,7 +147,8 @@ TL <- Sp '{'
TR <- Sp '}'
COMMA <- Sp ','
SEMICOLON <- Sp ';'
-DOTS <- Sp '...'
+DOTS <- Sp {} -> DOTSPos
+ '...' -> DOTS
DOT <- Sp '.'
COLON <- Sp ':'
LABEL <- Sp '::'
@@ -185,7 +186,8 @@ Float16 <- ('.' X16*)? ([pP] [+-]? [1-9]? [0-9]*)?
]]
grammar 'Name' [[
-Name <- Sp {} -> NamePos {[a-zA-Z_] [a-zA-Z0-9_]*} -> Name
+Name <- Sp {} -> NamePos
+ {[a-zA-Z_] [a-zA-Z0-9_]*} -> Name
]]
grammar 'Exp' [[
@@ -222,7 +224,7 @@ Suffix <- DOT Name
/ BL Exp BR
/ PL ArgList? PR
-ArgList <- Arg (COMMA Arg)*
+ArgList <- (Arg (COMMA Arg)*)
Arg <- DOTS
/ Exp
@@ -233,7 +235,7 @@ TableField <- NewIndex / NewField / Exp
NewIndex <- BL Exp BR ASSIGN Exp
NewField <- Name ASSIGN Exp
-Function <- (FUNCTION {| FuncName? |} PL ArgList? PR) -> FunctionDef
+Function <- (FUNCTION {| FuncName? |} PL {| ArgList? |} PR) -> FunctionDef
(!END Action)* -> Function
END
FuncName <- Name (FuncSuffix)*
diff --git a/test/definition/arg.lua b/test/definition/arg.lua
new file mode 100644
index 00000000..e1ce0891
--- /dev/null
+++ b/test/definition/arg.lua
@@ -0,0 +1,11 @@
+TEST [[
+local function x (<!x!>)
+ <?x?> = 1
+end
+]]
+
+TEST [[
+local function x (x, <!...!>)
+ x = <?...?>
+end
+]]
diff --git a/test/definition/init.lua b/test/definition/init.lua
index f9a0bf3e..88d6a1b9 100644
--- a/test/definition/init.lua
+++ b/test/definition/init.lua
@@ -1,6 +1,8 @@
local matcher = require 'matcher'
-local function test(script)
+rawset(_G, 'TEST', true)
+
+function TEST(script)
local start = script:find('<!', 1, true) + 2
local finish = script:find('!>', 1, true) - 1
local pos = script:find('<?', 1, true) + 2
@@ -12,211 +14,5 @@ local function test(script)
assert(b == finish)
end
-test [[
-local <!x!>
-<?x?> = 1
-]]
-
-test [[
-local z, y, <!x!>
-<?x?> = 1
-]]
-
-test [[
-local <!x!> = 1
-<?x?> = 1
-]]
-
-test [[
-local z, y, <!x!> = 1
-<?x?> = 1
-]]
-
-test [[
-function <!x!> () end
-<?x?> = 1
-]]
-
-test [[
-local function <!x!> () end
-<?x?> = 1
-]]
-
-test [[
-local x
-local <!x!>
-<?x?> = 1
-]]
-
-test [[
-local <!x!>
-do
- <?x?> = 1
-end
-]]
-
-test [[
-local <!x!>
-do
- local x
-end
-<?x?> = 1
-]]
-
-test [[
-local <!x!>
-if <?x?> then
- local x
-end
-]]
-
-test [[
-local <!x!>
-if x then
- local x
-elseif <?x?> then
- local x
-end
-]]
-
-test [[
-local <!x!>
-if x then
- local x
-elseif x then
- local x
-else
- local x
-end
-<?x?> = 1
-]]
-
-test [[
-local <!x!>
-if x then
- <?x?> = 1
-elseif x then
- local x
-else
- local x
-end
-]]
-
-test [[
-local <!x!>
-for x = 1, 10 do
-end
-<?x?> = 1
-]]
-
-test [[
-local x
-for <!x!> = 1, 10 do
- <?x?> = 1
-end
-]]
-
-test [[
-local <!x!>
-for x in x do
-end
-<?x?> = 1
-]]
-
-test [[
-local <!x!>
-for x in <?x?> do
-end
-]]
-
-test [[
-local x
-for <!x!> in x do
- <?x?> = 1
-end
-]]
-
-test [[
-local x
-for z, y, <!x!> in x do
- <?x?> = 1
-end
-]]
-
-test [[
-local <!x!>
-while <?x?> do
-end
-]]
-
-test [[
-local <!x!>
-while x do
- <?x?> = 1
-end
-]]
-
-test [[
-local <!x!>
-while x do
- local x
-end
-<?x?> = 1
-]]
-
-test [[
-local <!x!>
-repeat
- <?x?> = 1
-until true
-]]
-
-test [[
-local <!x!>
-repeat
- local x
-until true
-<?x?> = 1
-]]
-
-test [[
-local <!x!>
-repeat
-until <?x?>
-]]
-
-test [[
-local x
-repeat
- local <!x!>
-until <?x?>
-]]
-
-test [[
-local <!x!>
-function _()
- local x
-end
-<?x?> = 1
-]]
-
-test [[
-local <!x!>
-return function ()
- <?x?> = 1
-end
-]]
-
-test [[
-local <!x!>
-local x = function ()
- <?x?> = 1
-end
-]]
-
-test [[
-local x
-local function <!x!> ()
- <?x?> = 1
-end
-]]
+require 'definition.local'
+require 'definition.arg'
diff --git a/test/definition/local.lua b/test/definition/local.lua
new file mode 100644
index 00000000..bbfd3752
--- /dev/null
+++ b/test/definition/local.lua
@@ -0,0 +1,208 @@
+TEST [[
+local <!x!>
+<?x?> = 1
+]]
+
+TEST [[
+local z, y, <!x!>
+<?x?> = 1
+]]
+
+TEST [[
+local <!x!> = 1
+<?x?> = 1
+]]
+
+TEST [[
+local z, y, <!x!> = 1
+<?x?> = 1
+]]
+
+TEST [[
+function <!x!> () end
+<?x?> = 1
+]]
+
+TEST [[
+local function <!x!> () end
+<?x?> = 1
+]]
+
+TEST [[
+local x
+local <!x!>
+<?x?> = 1
+]]
+
+TEST [[
+local <!x!>
+do
+ <?x?> = 1
+end
+]]
+
+TEST [[
+local <!x!>
+do
+ local x
+end
+<?x?> = 1
+]]
+
+TEST [[
+local <!x!>
+if <?x?> then
+ local x
+end
+]]
+
+TEST [[
+local <!x!>
+if x then
+ local x
+elseif <?x?> then
+ local x
+end
+]]
+
+TEST [[
+local <!x!>
+if x then
+ local x
+elseif x then
+ local x
+else
+ local x
+end
+<?x?> = 1
+]]
+
+TEST [[
+local <!x!>
+if x then
+ <?x?> = 1
+elseif x then
+ local x
+else
+ local x
+end
+]]
+
+TEST [[
+local <!x!>
+for x = 1, 10 do
+end
+<?x?> = 1
+]]
+
+TEST [[
+local x
+for <!x!> = 1, 10 do
+ <?x?> = 1
+end
+]]
+
+TEST [[
+local <!x!>
+for x in x do
+end
+<?x?> = 1
+]]
+
+TEST [[
+local <!x!>
+for x in <?x?> do
+end
+]]
+
+TEST [[
+local x
+for <!x!> in x do
+ <?x?> = 1
+end
+]]
+
+TEST [[
+local x
+for z, y, <!x!> in x do
+ <?x?> = 1
+end
+]]
+
+TEST [[
+local <!x!>
+while <?x?> do
+end
+]]
+
+TEST [[
+local <!x!>
+while x do
+ <?x?> = 1
+end
+]]
+
+TEST [[
+local <!x!>
+while x do
+ local x
+end
+<?x?> = 1
+]]
+
+TEST [[
+local <!x!>
+repeat
+ <?x?> = 1
+until true
+]]
+
+TEST [[
+local <!x!>
+repeat
+ local x
+until true
+<?x?> = 1
+]]
+
+TEST [[
+local <!x!>
+repeat
+until <?x?>
+]]
+
+TEST [[
+local x
+repeat
+ local <!x!>
+until <?x?>
+]]
+
+TEST [[
+local <!x!>
+function _()
+ local x
+end
+<?x?> = 1
+]]
+
+TEST [[
+local <!x!>
+return function ()
+ <?x?> = 1
+end
+]]
+
+TEST [[
+local <!x!>
+local x = function ()
+ <?x?> = 1
+end
+]]
+
+TEST [[
+local x
+local function <!x!> ()
+ <?x?> = 1
+end
+]]