1
0
treerack/mml_test.go

2439 lines
41 KiB
Go
Raw Permalink Normal View History

2017-07-15 21:49:08 +02:00
package treerack
2017-06-25 17:51:08 +02:00
2018-08-19 19:36:23 +02:00
import "testing"
2017-06-25 17:51:08 +02:00
func TestMML(t *testing.T) {
s, err := openSyntaxFile("doc/example/mml.treerack")
2017-10-27 18:30:39 +02:00
if err != nil {
t.Error(err)
return
}
t.Run("comment", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "empty",
2026-06-01 22:26:27 +02:00
node: Node{Name: "mml"},
2017-10-27 18:30:39 +02:00
}, {
title: "single line comment",
text: "// foo bar baz",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-29 02:16:59 +02:00
Name: "line-comment-content",
From: 2,
2017-06-26 01:21:46 +02:00
To: 14,
2017-06-25 17:51:08 +02:00
}},
2017-10-27 18:30:39 +02:00
}, {
title: "multiple line comments",
text: "// foo bar\n// baz qux",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-29 02:16:59 +02:00
Name: "line-comment-content",
From: 2,
To: 10,
}, {
Name: "line-comment-content",
From: 13,
2017-06-26 01:21:46 +02:00
To: 21,
2017-06-25 17:51:08 +02:00
}},
2017-10-27 18:30:39 +02:00
}, {
title: "block comment",
text: "/* foo bar baz */",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-29 02:16:59 +02:00
Name: "block-comment-content",
From: 2,
To: 15,
2017-06-25 17:51:08 +02:00
}},
2017-10-27 18:30:39 +02:00
}, {
title: "block comments",
text: "/* foo bar */\n/* baz qux */",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-29 02:16:59 +02:00
Name: "block-comment-content",
From: 2,
To: 11,
}, {
Name: "block-comment-content",
From: 16,
To: 25,
2017-06-25 17:51:08 +02:00
}},
2017-10-27 18:30:39 +02:00
}, {
title: "mixed comments",
text: "// foo\n/* bar */\n// baz",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-29 02:16:59 +02:00
Name: "line-comment-content",
From: 2,
To: 6,
}, {
Name: "block-comment-content",
From: 9,
To: 14,
}, {
Name: "line-comment-content",
From: 19,
2017-06-26 01:21:46 +02:00
To: 23,
2017-06-25 17:51:08 +02:00
}},
2017-10-27 18:30:39 +02:00
}})
})
t.Run("int", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "int",
text: "42",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "int",
2017-06-26 01:21:46 +02:00
To: 2,
2017-06-25 17:51:08 +02:00
}},
2017-10-27 18:30:39 +02:00
}, {
title: "ints",
text: "1; 2; 3",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "int",
To: 1,
}, {
Name: "int",
From: 3,
To: 4,
}, {
Name: "int",
From: 6,
To: 7,
}},
}, {
title: "int, octal",
text: "052",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "int",
To: 3,
}},
}, {
title: "int, hexa",
text: "0x2a",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "int",
To: 4,
}},
}})
})
t.Run("float", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "float, 0.",
text: "0.",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "float",
To: 2,
}},
}, {
title: "float, 72.40",
text: "72.40",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "float",
To: 5,
}},
}, {
title: "float, 072.40",
text: "072.40",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "float",
2017-06-26 01:21:46 +02:00
To: 6,
2017-06-25 17:51:08 +02:00
}},
2017-10-27 18:30:39 +02:00
}, {
title: "float, 2.71828",
text: "2.71828",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "float",
To: 7,
}},
}, {
title: "float, 6.67428e-11",
text: "6.67428e-11",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "float",
2017-06-26 01:21:46 +02:00
To: 11,
2017-10-27 18:30:39 +02:00
}},
}, {
title: "float, 1E6",
text: "1E6",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "float",
To: 3,
}},
}, {
title: "float, .25",
text: ".25",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "float",
To: 3,
}},
}, {
title: "float, .12345E+5",
text: ".12345E+5",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "float",
To: 9,
}},
}, {
title: "float on a new line",
text: "f()\n.9",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}},
}, {
Name: "float",
}},
ignorePosition: true,
}})
})
t.Run("string", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "string, empty",
text: "\"\"",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "string",
To: 2,
}},
}, {
title: "string",
text: "\"foo\"",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "string",
To: 5,
}},
}, {
title: "string, with new line",
text: "\"foo\nbar\"",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "string",
To: 9,
}},
}, {
title: "string, with escaped new line",
text: "\"foo\\nbar\"",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "string",
To: 10,
}},
}, {
title: "string, with quotes",
text: "\"foo \\\"bar\\\" baz\"",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "string",
To: 17,
}},
}})
})
t.Run("bool", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "bool, true",
text: "true",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "true",
To: 4,
}},
}, {
title: "bool, false",
text: "false",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "false",
To: 5,
}},
}})
})
t.Run("symbol", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "symbol",
text: "foo",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 3,
}},
}})
})
t.Run("list", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "empty list",
text: "[]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "list",
2017-10-27 18:30:39 +02:00
To: 2,
2017-06-25 17:51:08 +02:00
}},
2017-10-27 18:30:39 +02:00
}, {
title: "list",
text: "[a, b, c]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "list",
2017-06-26 01:21:46 +02:00
To: 9,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-06-26 01:21:46 +02:00
From: 1,
2017-10-27 18:30:39 +02:00
To: 2,
2017-06-25 17:51:08 +02:00
}, {
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 4,
To: 5,
}, {
Name: "symbol",
From: 7,
To: 8,
2017-06-25 17:51:08 +02:00
}},
2017-10-27 18:30:39 +02:00
}},
}, {
title: "list, new lines",
text: "[ \n a \n b \n c \n ]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "list",
2017-06-26 01:21:46 +02:00
To: 17,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 4,
To: 5,
2017-06-25 17:51:08 +02:00
}, {
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 8,
To: 9,
2017-06-25 17:51:08 +02:00
}, {
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 12,
To: 13,
2017-06-25 17:51:08 +02:00
}},
}},
2017-10-27 18:30:39 +02:00
}, {
title: "list, complex",
text: "[a, b, c..., [d, e], [f, [g]]...]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "list",
To: 33,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-06-26 01:21:46 +02:00
From: 1,
2017-10-27 18:30:39 +02:00
To: 2,
2017-06-25 17:51:08 +02:00
}, {
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 4,
To: 5,
}, {
Name: "spread-expression",
From: 7,
To: 11,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 7,
To: 8,
}},
}, {
Name: "list",
From: 13,
To: 19,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 14,
To: 15,
}, {
Name: "symbol",
From: 17,
To: 18,
}},
}, {
Name: "spread-expression",
From: 21,
To: 32,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "list",
From: 21,
To: 29,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
From: 22,
To: 23,
2017-06-25 17:51:08 +02:00
}, {
2017-10-27 18:30:39 +02:00
Name: "list",
From: 25,
To: 28,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 26,
To: 27,
}},
2017-06-25 17:51:08 +02:00
}},
}},
}},
2017-10-27 18:30:39 +02:00
}},
}})
})
t.Run("mutable list", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "mutable list",
text: "~[a, b, c]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "mutable-list",
To: 10,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 2,
To: 3,
}, {
Name: "symbol",
From: 5,
To: 6,
}, {
Name: "symbol",
From: 8,
To: 9,
}},
}},
}})
})
t.Run("struct", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "empty struct",
text: "{}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "struct",
To: 2,
}},
}, {
title: "struct",
2018-08-19 19:36:23 +02:00
text: "{foo: 1, \"bar\": 2}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "struct",
2018-08-19 19:36:23 +02:00
To: 18,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "entry",
From: 1,
To: 7,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 1,
To: 4,
}, {
Name: "int",
From: 6,
To: 7,
}},
}, {
Name: "entry",
From: 9,
To: 17,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "string",
From: 9,
To: 14,
}, {
Name: "int",
From: 16,
To: 17,
}},
}},
}},
}, {
title: "struct, complex",
text: "{foo: 1, {bar: 2}..., {baz: {}}...}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "struct",
To: 35,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "entry",
From: 1,
To: 7,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 1,
To: 4,
}, {
Name: "int",
From: 6,
To: 7,
}},
}, {
Name: "spread-expression",
From: 9,
To: 20,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "struct",
From: 9,
To: 17,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "entry",
From: 10,
To: 16,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 10,
To: 13,
}, {
Name: "int",
From: 15,
To: 16,
}},
}},
}},
}, {
Name: "spread-expression",
From: 22,
To: 34,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "struct",
From: 22,
To: 31,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "entry",
2017-06-26 01:21:46 +02:00
From: 23,
To: 30,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 23,
To: 26,
}, {
Name: "struct",
From: 28,
To: 30,
}},
2017-06-25 17:51:08 +02:00
}},
}},
}},
}},
2017-06-26 02:20:23 +02:00
}, {
2018-08-19 19:36:23 +02:00
title: "with indexer key",
2017-10-27 18:30:39 +02:00
text: "{[a]: b}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "struct",
To: 8,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "entry",
From: 1,
To: 7,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "expression-key",
2017-10-27 18:30:39 +02:00
From: 1,
To: 4,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 2,
To: 3,
}},
2017-06-25 17:51:08 +02:00
}, {
Name: "symbol",
2017-06-26 01:21:46 +02:00
From: 6,
To: 7,
2017-06-25 17:51:08 +02:00
}},
}},
}},
2017-10-27 18:30:39 +02:00
}})
})
t.Run("mutable struct", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "mutable struct",
text: "~{foo: 1}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "mutable-struct",
To: 9,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "entry",
From: 2,
To: 8,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 2,
To: 5,
}, {
Name: "int",
From: 7,
To: 8,
}},
}},
}},
}})
})
t.Run("channel", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "channel",
text: "<>",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "channel",
To: 2,
}},
}, {
title: "buffered channel",
text: "<42>",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "channel",
2017-06-26 01:21:46 +02:00
To: 4,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "int",
From: 1,
To: 3,
}},
}},
}})
})
t.Run("boolean expressions", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "and expression",
text: "and(a, b, c)",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
2017-06-26 01:21:46 +02:00
To: 12,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 3,
}, {
Name: "symbol",
From: 4,
To: 5,
}, {
Name: "symbol",
2017-06-26 01:21:46 +02:00
From: 7,
2017-10-27 18:30:39 +02:00
To: 8,
}, {
Name: "symbol",
From: 10,
To: 11,
}},
}},
}, {
title: "or expression",
text: "or(a, b, c)",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
To: 11,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 2,
}, {
Name: "symbol",
From: 3,
To: 4,
}, {
Name: "symbol",
From: 6,
To: 7,
}, {
Name: "symbol",
From: 9,
To: 10,
}},
}},
}})
})
t.Run("function", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "function",
text: "fn () 42",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function",
To: 8,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "int",
From: 6,
To: 8,
}},
}},
}, {
title: "function, noop",
text: "fn () {;}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function",
To: 9,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "block",
From: 6,
To: 9,
}},
}},
}, {
title: "function with args",
text: "fn (a, b, c) [a, b, c]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function",
To: 22,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 4,
To: 5,
}, {
Name: "symbol",
From: 7,
To: 8,
}, {
Name: "symbol",
From: 10,
To: 11,
}, {
Name: "list",
From: 13,
To: 22,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 14,
To: 15,
}, {
Name: "symbol",
From: 17,
To: 18,
}, {
Name: "symbol",
From: 20,
To: 21,
}},
}},
}},
}, {
title: "function with args in new lines",
text: "fn ( \n a \n b \n c ) [a, b, c]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function",
To: 28,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 7,
To: 8,
}, {
Name: "symbol",
From: 11,
To: 12,
}, {
Name: "symbol",
From: 15,
To: 16,
}, {
Name: "list",
From: 19,
To: 28,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 20,
To: 21,
}, {
Name: "symbol",
From: 23,
To: 24,
}, {
Name: "symbol",
From: 26,
To: 27,
}},
}},
}},
}, {
title: "function with spread arg",
text: "fn (a, b, ...c) [a, b, c]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function",
To: 25,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 4,
To: 5,
}, {
Name: "symbol",
From: 7,
To: 8,
}, {
2018-08-19 19:36:23 +02:00
Name: "collect-parameter",
2017-10-27 18:30:39 +02:00
From: 10,
To: 14,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 13,
To: 14,
}},
}, {
Name: "list",
From: 16,
To: 25,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 17,
To: 18,
}, {
Name: "symbol",
From: 20,
To: 21,
}, {
Name: "symbol",
From: 23,
To: 24,
}},
}},
}},
}})
})
t.Run("effect", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "effect",
text: "fn ~ () 42",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "effect",
To: 10,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "int",
From: 8,
To: 10,
}},
}},
}})
})
t.Run("indexer", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "indexer",
text: "a[42]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "expression-indexer",
2017-10-27 18:30:39 +02:00
To: 5,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "int",
From: 2,
To: 4,
}},
}},
}, {
title: "range indexer",
text: "a[3:9]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "expression-indexer",
2017-10-27 18:30:39 +02:00
To: 6,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "range-from",
From: 2,
To: 3,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "int",
From: 2,
To: 3,
}},
}, {
Name: "range-to",
From: 4,
To: 5,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "int",
From: 4,
To: 5,
}},
}},
}},
}, {
title: "range indexer, lower unbound",
text: "a[:9]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "expression-indexer",
2017-10-27 18:30:39 +02:00
To: 5,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "range-to",
From: 3,
To: 4,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "int",
From: 3,
To: 4,
}},
}},
}},
}, {
title: "range indexer, upper unbound",
text: "a[3:]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "expression-indexer",
2017-10-27 18:30:39 +02:00
To: 5,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "range-from",
From: 2,
To: 3,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "int",
From: 2,
To: 3,
}},
}},
}},
}, {
title: "indexer, chained",
text: "a[b][c][d]",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "expression-indexer",
2017-10-27 18:30:39 +02:00
To: 10,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "expression-indexer",
2017-10-27 18:30:39 +02:00
To: 7,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "expression-indexer",
2017-10-27 18:30:39 +02:00
To: 4,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "symbol",
From: 2,
To: 3,
}},
}, {
Name: "symbol",
From: 5,
To: 6,
}},
}, {
Name: "symbol",
From: 8,
To: 9,
}},
}},
}})
})
t.Run("symbol indexer", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "symbol indexer",
text: "a.b",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol-indexer",
2017-10-27 18:30:39 +02:00
To: 3,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "symbol",
From: 2,
To: 3,
}},
}},
}, {
title: "chained symbol indexer",
text: "a.b.c.d",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol-indexer",
2017-10-27 18:30:39 +02:00
To: 7,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol-indexer",
2017-10-27 18:30:39 +02:00
To: 5,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol-indexer",
2017-10-27 18:30:39 +02:00
To: 3,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "symbol",
From: 2,
To: 3,
}},
}, {
Name: "symbol",
From: 4,
To: 5,
}},
}, {
Name: "symbol",
From: 6,
To: 7,
}},
}},
}, {
title: "chained symbol indexer on new line",
text: "a\n.b\n.c",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol-indexer",
2017-10-27 18:30:39 +02:00
To: 7,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol-indexer",
2017-10-27 18:30:39 +02:00
To: 4,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "symbol",
From: 3,
To: 4,
}},
}, {
Name: "symbol",
From: 6,
To: 7,
}},
}},
}, {
title: "chained symbol indexer on new line after dot",
text: "a.\nb.\nc",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol-indexer",
2017-10-27 18:30:39 +02:00
To: 7,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol-indexer",
2017-10-27 18:30:39 +02:00
To: 4,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "symbol",
From: 3,
To: 4,
}},
}, {
Name: "symbol",
From: 6,
To: 7,
}},
}},
}})
})
t.Run("function application", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "function application",
text: "f()",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
To: 3,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}},
}},
}, {
title: "function application, single arg",
text: "f(a)",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
To: 4,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "symbol",
From: 2,
To: 3,
}},
}},
}, {
title: "function application, multiple args",
text: "f(a, b, c)",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
To: 10,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "symbol",
From: 2,
To: 3,
}, {
Name: "symbol",
From: 5,
To: 6,
}, {
Name: "symbol",
From: 8,
To: 9,
}},
}},
}, {
title: "function application, multiple args, new line",
text: "f(a\nb\nc\n)",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
To: 9,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "symbol",
From: 2,
To: 3,
}, {
Name: "symbol",
From: 4,
To: 5,
}, {
Name: "symbol",
From: 6,
To: 7,
}},
}},
}, {
title: "function application, spread",
text: "f(a, b..., c, d...)",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
To: 19,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "symbol",
From: 2,
To: 3,
}, {
Name: "spread-expression",
From: 5,
To: 9,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 5,
To: 6,
}},
}, {
Name: "symbol",
From: 11,
To: 12,
}, {
Name: "spread-expression",
From: 14,
To: 18,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 14,
To: 15,
}},
}},
}},
}, {
title: "chained function application",
text: "f(a)(b)(c)",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
To: 10,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
To: 7,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
To: 4,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "symbol",
From: 2,
To: 3,
}},
}, {
Name: "symbol",
From: 5,
To: 6,
}},
}, {
Name: "symbol",
From: 8,
To: 9,
}},
}},
}, {
title: "embedded function application",
text: "f(g(h(a)))",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
To: 10,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
Name: "function-application",
From: 2,
To: 9,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 2,
To: 3,
}, {
Name: "function-application",
From: 4,
To: 8,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 4,
To: 5,
}, {
Name: "symbol",
From: 6,
To: 7,
}},
}},
}},
}},
}})
})
t.Run("if", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "if",
text: "if a { b() }",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "if",
To: 12,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 3,
To: 4,
}, {
Name: "block",
From: 5,
To: 12,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
From: 7,
To: 10,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 7,
To: 8,
}},
}},
}},
}},
}, {
title: "if, else",
text: "if a { b } else { c }",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "if",
To: 21,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 3,
To: 4,
}, {
Name: "block",
From: 5,
2017-06-26 01:21:46 +02:00
To: 10,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-06-26 01:21:46 +02:00
From: 7,
To: 8,
2017-06-25 17:51:08 +02:00
}},
2017-10-27 18:30:39 +02:00
}, {
Name: "block",
From: 16,
To: 21,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 18,
To: 19,
}},
2017-06-25 17:51:08 +02:00
}},
}},
2017-10-27 18:30:39 +02:00
}, {
title: "if, else if, else if, else",
text: "if a { b }\nelse if c { d }\nelse if e { f }\nelse { g }",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "if",
From: 0,
To: 53,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 3,
To: 4,
}, {
Name: "block",
From: 5,
To: 10,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 7,
To: 8,
}},
}, {
Name: "symbol",
From: 19,
To: 20,
}, {
Name: "block",
From: 21,
To: 26,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 23,
To: 24,
}},
}, {
Name: "symbol",
From: 35,
To: 36,
}, {
Name: "block",
From: 37,
To: 42,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 39,
To: 40,
}},
}, {
Name: "block",
From: 48,
To: 53,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 50,
To: 51,
}},
}},
}},
}})
})
t.Run("switch", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "switch, empty",
text: "switch {default:}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "switch",
To: 17,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "default",
From: 8,
To: 16,
}},
}},
}, {
title: "switch, empty cases",
text: `
switch {
case a:
case b:
default:
f()
}
`,
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "switch",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "case",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}},
}, {
Name: "case",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}},
}, {
Name: "default",
}, {
Name: "function-application",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}, {
title: "switch, single case",
text: "switch a {case b: c}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "switch",
To: 20,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-06-26 01:21:46 +02:00
From: 7,
To: 8,
2017-10-27 18:30:39 +02:00
}, {
Name: "case",
From: 10,
To: 17,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 15,
To: 16,
}},
}, {
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-06-26 01:21:46 +02:00
From: 18,
To: 19,
2017-06-25 17:51:08 +02:00
}},
}},
2017-10-27 18:30:39 +02:00
}, {
title: "switch",
text: "switch a {case b: c; case d: e; default: f}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "switch",
To: 43,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
From: 7,
To: 8,
}, {
Name: "case",
From: 10,
To: 17,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 15,
To: 16,
}},
}, {
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
From: 18,
To: 19,
}, {
Name: "case",
From: 21,
To: 28,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 26,
To: 27,
}},
}, {
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
From: 29,
To: 30,
}, {
Name: "default",
From: 32,
To: 40,
}, {
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
From: 41,
To: 42,
2017-06-25 17:51:08 +02:00
}},
}},
2017-10-27 18:30:39 +02:00
}, {
title: "switch, all new lines",
text: "switch \n a \n { \n case \n b \n : \n c \n case \n d \n : \n e \n default \n : \n f \n }",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "switch",
To: 74,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-26 02:20:23 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
From: 9,
To: 10,
}, {
Name: "case",
From: 17,
2017-06-26 01:21:46 +02:00
To: 29,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 24,
To: 25,
}},
}, {
Name: "symbol",
From: 32,
To: 33,
}, {
Name: "case",
From: 36,
To: 48,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 43,
To: 44,
}},
}, {
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-06-26 01:21:46 +02:00
From: 51,
To: 52,
2017-10-27 18:30:39 +02:00
}, {
Name: "default",
From: 55,
To: 66,
}, {
Name: "symbol",
From: 69,
To: 70,
2017-06-25 17:51:08 +02:00
}},
}},
2017-10-27 18:30:39 +02:00
}})
})
t.Run("send/receive", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "receive op",
2018-08-19 19:36:23 +02:00
text: "<<>chan",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "receive",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
}},
}},
ignorePosition: true,
}, {
title: "send op",
2018-08-19 19:36:23 +02:00
text: "chan <<> a",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "send",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
2017-10-27 18:30:39 +02:00
}},
ignorePosition: true,
}})
})
t.Run("select", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "select, empty",
text: "select {\n}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "select",
To: 10,
}},
}, {
title: "select",
text: `select {
2018-08-19 19:36:23 +02:00
case let a <<>r: s <<> a
case s <<> f(): g()
default: h()
}`,
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "select",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "select-case",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "receive-definition",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
2018-08-19 19:36:23 +02:00
Name: "receive",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}},
}},
}},
}, {
2017-06-25 17:51:08 +02:00
Name: "send",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
}, {
Name: "symbol",
2017-10-27 18:30:39 +02:00
}},
}, {
Name: "select-case",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "send",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
}, {
2017-07-15 19:04:04 +02:00
Name: "function-application",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-07-15 19:04:04 +02:00
Name: "symbol",
}},
}},
}},
2017-10-27 18:30:39 +02:00
}, {
Name: "function-application",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}},
}, {
Name: "default",
}, {
Name: "function-application",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}},
2017-07-15 19:04:04 +02:00
}},
}},
2017-10-27 18:30:39 +02:00
ignorePosition: true,
}})
})
t.Run("go", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "go",
text: "go f()",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "go",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}},
2017-06-25 17:51:08 +02:00
}},
}},
2017-10-27 18:30:39 +02:00
ignorePosition: true,
}})
})
t.Run("require", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "require, dot, equal",
text: "require . = \"mml/foo\"",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require-fact",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require-inline",
}, {
Name: "string",
}},
2017-06-25 17:51:08 +02:00
}},
}},
2017-10-27 18:30:39 +02:00
ignorePosition: true,
}, {
title: "require, symbol, equal",
text: "require bar = \"mml/foo\"",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require-fact",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "string",
}},
}},
}},
ignorePosition: true,
}, {
title: "require, symbol",
text: "require bar \"mml/foo\"",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require-fact",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "string",
}},
}},
}},
ignorePosition: true,
}, {
title: "require",
text: "require \"mml/foo\"",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require-fact",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "string",
}},
}},
}},
ignorePosition: true,
}, {
title: "require, group",
text: `require (
. = "mml/foo"
bar = "mml/foo"
. "mml/foo"
bar "mml/foo"
"mml/foo"
)`,
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require-fact",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require-inline",
}, {
Name: "string",
}},
}, {
Name: "require-fact",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "string",
}},
}, {
Name: "require-fact",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "require-inline",
}, {
Name: "string",
}},
}, {
Name: "require-fact",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "string",
}},
}, {
Name: "require-fact",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "string",
}},
}},
}},
ignorePosition: true,
}})
})
t.Run("expression group", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "expression group",
text: "(fn (a) a)(a)",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-application",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
2017-06-25 17:51:08 +02:00
}, {
Name: "symbol",
}},
}},
2017-10-27 18:30:39 +02:00
ignorePosition: true,
}})
})
t.Run("unary", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "unary operator",
text: "!foo",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "unary-expression",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "logical-not",
2017-06-25 17:51:08 +02:00
}, {
Name: "symbol",
}},
2017-10-27 18:30:39 +02:00
}},
ignorePosition: true,
}})
})
t.Run("binary", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "binary 0",
text: "a * b",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "binary0",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
}, {
Name: "mul",
}, {
Name: "symbol",
}},
}},
2017-10-27 18:30:39 +02:00
ignorePosition: true,
}, {
title: "binary 1",
text: "a * b + c * d",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "binary1",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "binary0",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
}, {
Name: "mul",
}, {
Name: "symbol",
}},
}, {
Name: "add",
}, {
Name: "binary0",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
}, {
Name: "mul",
}, {
Name: "symbol",
}},
}},
}},
2017-10-27 18:30:39 +02:00
ignorePosition: true,
}, {
title: "binary 2",
text: "a * b + c * d == e * f",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "binary2",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "binary1",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "binary0",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
2017-06-25 17:51:08 +02:00
}, {
2017-10-27 18:30:39 +02:00
Name: "mul",
2017-06-25 17:51:08 +02:00
}, {
2017-10-27 18:30:39 +02:00
Name: "symbol",
2017-06-25 17:51:08 +02:00
}},
}, {
2017-10-27 18:30:39 +02:00
Name: "add",
}, {
Name: "binary0",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "mul",
}, {
Name: "symbol",
}},
}},
}, {
Name: "eq",
}, {
Name: "binary0",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "mul",
}, {
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}, {
title: "binary 1, 1, 1",
text: "a + b + c",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
Name: "binary1",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
Name: "symbol",
}, {
Name: "add",
}, {
Name: "symbol",
}, {
Name: "add",
}, {
Name: "symbol",
}},
}},
ignorePosition: true,
2017-10-27 18:30:39 +02:00
}, {
title: "binary 3, 4, 5",
text: "a * b + c * d == e * f && g || h -> f()",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "chaining",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "binary4",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "binary3",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "binary2",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "binary1",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "binary0",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "mul",
}, {
Name: "symbol",
}},
}, {
Name: "add",
}, {
Name: "binary0",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "mul",
}, {
Name: "symbol",
}},
}},
}, {
Name: "eq",
}, {
Name: "binary0",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "mul",
}, {
Name: "symbol",
}},
}},
}, {
Name: "logical-and",
}, {
Name: "symbol",
}},
}, {
Name: "logical-or",
2017-06-25 17:51:08 +02:00
}, {
Name: "symbol",
}},
}, {
2017-10-27 18:30:39 +02:00
Name: "function-application",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}},
2017-06-25 17:51:08 +02:00
}},
}},
2017-10-27 18:30:39 +02:00
ignorePosition: true,
}})
})
t.Run("ternary", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "ternary expression",
text: "a ? b : c",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "ternary-expression",
2017-10-27 18:30:39 +02:00
To: 9,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
To: 1,
}, {
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-06-26 01:21:46 +02:00
From: 4,
To: 5,
2017-06-25 17:51:08 +02:00
}, {
Name: "symbol",
2017-06-26 01:21:46 +02:00
From: 8,
To: 9,
2017-06-25 17:51:08 +02:00
}},
}},
2017-10-27 18:30:39 +02:00
}, {
title: "multiple ternary expressions, consequence",
text: "a ? b ? c : d : e",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "ternary-expression",
2017-06-26 01:21:46 +02:00
To: 17,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
To: 1,
2017-06-25 17:51:08 +02:00
}, {
2017-10-27 18:30:39 +02:00
Name: "ternary-expression",
From: 4,
2017-06-26 01:21:46 +02:00
To: 13,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 4,
To: 5,
}, {
Name: "symbol",
From: 8,
To: 9,
}, {
Name: "symbol",
From: 12,
To: 13,
}},
2017-06-25 17:51:08 +02:00
}, {
Name: "symbol",
2017-06-26 01:21:46 +02:00
From: 16,
To: 17,
2017-06-25 17:51:08 +02:00
}},
}},
}, {
2017-10-27 18:30:39 +02:00
title: "multiple ternary expressions, alternative",
text: "a ? b : c ? d : e",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "ternary-expression",
To: 17,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-06-25 17:51:08 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
To: 1,
2017-06-25 17:51:08 +02:00
}, {
Name: "symbol",
2017-10-27 18:30:39 +02:00
From: 4,
To: 5,
2017-06-25 17:51:08 +02:00
}, {
2017-10-27 18:30:39 +02:00
Name: "ternary-expression",
From: 8,
To: 17,
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
From: 8,
To: 9,
}, {
Name: "symbol",
From: 12,
To: 13,
}, {
Name: "symbol",
From: 16,
To: 17,
}},
}},
}},
}})
})
t.Run("loop", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "infinite loop",
text: "for {}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "loop",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "block",
}},
}},
ignorePosition: true,
}, {
title: "conditional loop",
text: "for foo {}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "loop",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
}, {
Name: "block",
}},
}},
ignorePosition: true,
}, {
title: "in list loop",
text: "for i in [1, 2, 3] {}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "loop",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "range-over-expression",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol",
}, {
Name: "list",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "int",
2017-10-27 18:30:39 +02:00
}, {
2018-08-19 19:36:23 +02:00
Name: "int",
}, {
Name: "int",
2017-10-27 18:30:39 +02:00
}},
}},
}, {
Name: "block",
}},
}},
ignorePosition: true,
}, {
title: "in range loop",
text: "for i in -3:42 {}",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "loop",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "range-over-expression",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol",
}, {
Name: "range-from",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "unary-expression",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "minus",
}, {
2017-10-27 18:30:39 +02:00
Name: "int",
}},
}},
2018-08-19 19:36:23 +02:00
}, {
Name: "range-to",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "int",
}},
2017-10-27 18:30:39 +02:00
}},
}, {
Name: "block",
}},
}},
ignorePosition: true,
}, {
title: "loop control",
text: `for i in l {
2018-08-19 19:36:23 +02:00
if i % 2 == 0 {
break
}
}`,
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "loop",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "range-over-expression",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol",
}, {
Name: "symbol",
2017-10-27 18:30:39 +02:00
}},
}, {
Name: "block",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "if",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "binary2",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "binary0",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "mod",
}, {
Name: "int",
}},
}, {
Name: "eq",
}, {
Name: "int",
}},
}, {
Name: "block",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol",
2017-10-27 18:30:39 +02:00
}},
}},
}},
}},
}},
ignorePosition: true,
}})
})
t.Run("assign", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "assign, eq",
text: "a = b",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "assignment",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 19:36:23 +02:00
Name: "symbol",
}, {
Name: "symbol",
2017-06-25 17:51:08 +02:00
}},
}},
2017-10-27 18:30:39 +02:00
ignorePosition: true,
}, {
title: "assign, set, eq",
text: "set a = b",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "assignment",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "symbol",
}, {
Name: "symbol",
2017-10-27 18:30:39 +02:00
}},
}},
ignorePosition: true,
}, {
title: "assign, set",
text: "set a b",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "assignment",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "symbol",
}, {
Name: "symbol",
2017-10-27 18:30:39 +02:00
}},
}},
ignorePosition: true,
}, {
title: "assign, group",
text: `set (
2018-08-19 22:40:01 +02:00
a = b
c d
)`,
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "assignment",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "symbol",
}, {
Name: "symbol",
}, {
Name: "symbol",
}, {
Name: "symbol",
}},
}},
ignorePosition: true,
}, {
title: "assign to struct field",
text: "set a.b c",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "assignment",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "symbol-indexer",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}, {
2018-08-19 22:40:01 +02:00
Name: "symbol",
}},
}},
ignorePosition: true,
}, {
title: "indexer",
text: "set a[1] 42",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "assignment",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "expression-indexer",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
2018-08-19 22:40:01 +02:00
Name: "int",
2017-10-27 18:30:39 +02:00
}},
2018-08-19 22:40:01 +02:00
}, {
Name: "int",
}},
}},
ignorePosition: true,
}, {
title: "indexer, eq",
text: "a[1] = 42",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "assignment",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "expression-indexer",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "symbol",
}, {
Name: "int",
}},
}, {
Name: "int",
}},
}},
ignorePosition: true,
}, {
title: "indexer, set, eq",
text: "set a[1] = 42",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "assignment",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "expression-indexer",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2018-08-19 22:40:01 +02:00
Name: "symbol",
}, {
Name: "int",
}},
}, {
Name: "int",
2017-10-27 18:30:39 +02:00
}},
}},
ignorePosition: true,
}})
})
t.Run("define", func(t *testing.T) {
runTestsSyntax(t, s, []testItem{{
title: "define, eq",
text: "let a = b",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "value-definition",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "value-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}, {
title: "define",
text: "let a b",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "value-definition",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "value-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}, {
title: "define mutable, eq",
text: "let ~ a = b",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "value-definition",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "mutable-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}, {
title: "define mutable",
text: "let ~ a b",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "value-definition",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "mutable-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}, {
title: "mixed define group",
text: `let (
a = b
c d
~ e f
~ g h
)`,
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "value-definition-group",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "value-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}, {
Name: "value-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}, {
Name: "mutable-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}, {
Name: "mutable-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}, {
title: "mutable define group",
text: `let ~ (
a = b
c d
)`,
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "mutable-definition-group",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "value-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}, {
Name: "value-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}, {
title: "define function",
text: "fn a() b",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-definition",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}, {
title: "define effect",
text: "fn ~ a() b",
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-definition",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "effect-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}, {
title: "define function group",
text: `fn (
a() b
~ c() d
)`,
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-definition-group",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}, {
Name: "effect-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}, {
title: "define effect group",
text: `fn ~ (
a() b
c() d
)`,
2026-06-01 22:26:27 +02:00
nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "effect-definition-group",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "function-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}, {
Name: "function-capture",
2026-06-01 22:26:27 +02:00
Nodes: []Node{{
2017-10-27 18:30:39 +02:00
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}},
ignorePosition: true,
}})
})
2017-07-16 18:26:17 +02:00
}