mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
Indexes allow associating extra data with nodes in the AST using an array and then quickly looking up the array to fetch the extra data. - Index eidx for expressions - Index sidx for statements - Index qidx for queries. AST nodes are not cloneable. Therefore once a module is created, it is not possible to accidentally create two nodes with the same index inadvertently via clone. Also added IndexChecker in debug builds. When a module is parsed, it will assert that indexes have been constructed correctly. AST Cleanup - Make literal expressions (null, val, number, string etc) also structs to match all other expressions - Merge True and False nodes into a single Bool node. Also update dependencies. Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
282 lines
7.8 KiB
YAML
282 lines
7.8 KiB
YAML
# Copyright (c) Microsoft Corporation.
|
|
# Licensed under the MIT License.
|
|
|
|
cases:
|
|
- note: all
|
|
rego: |
|
|
package test
|
|
import future.keywords.in
|
|
|
|
x = y {
|
|
# Empty set. This evaluates to false.
|
|
some a in {1}
|
|
|
|
# Key, value combo
|
|
some a
|
|
, b in r
|
|
|
|
# Key, value combo can be non-vars
|
|
some 5, x in array
|
|
|
|
some "hello", "world" in map
|
|
|
|
some p, q in { r |
|
|
some a, b in d
|
|
}
|
|
}
|
|
num_expressions: 25
|
|
num_statements: 6
|
|
num_queries: 2
|
|
policy:
|
|
- spec:
|
|
head: --skip--
|
|
bodies:
|
|
- query:
|
|
qidx: 1
|
|
stmts:
|
|
- span: some a in {1}
|
|
sidx: 0
|
|
literal:
|
|
some-decl:
|
|
value:
|
|
var: a
|
|
eidx: 6
|
|
collection:
|
|
set:
|
|
- number: 1
|
|
eidx: 7
|
|
eidx: 8
|
|
- span: "some a\n , b in r"
|
|
sidx: 1
|
|
literal:
|
|
some-decl:
|
|
key:
|
|
var: a
|
|
eidx: 9
|
|
value:
|
|
var: b
|
|
eidx: 10
|
|
collection:
|
|
var: r
|
|
eidx: 11
|
|
- span: "some 5, x in array"
|
|
sidx: 2
|
|
literal:
|
|
some-decl:
|
|
key:
|
|
number: 5
|
|
eidx: 12
|
|
value:
|
|
var: x
|
|
eidx: 13
|
|
collection:
|
|
var: array
|
|
eidx: 14
|
|
- span: "some \"hello\", \"world\" in map"
|
|
sidx: 3
|
|
literal:
|
|
some-decl:
|
|
key:
|
|
string: hello
|
|
eidx: 15
|
|
value:
|
|
string: world
|
|
eidx: 16
|
|
collection:
|
|
var: map
|
|
eidx: 17
|
|
- sidx: 5
|
|
literal:
|
|
some-decl:
|
|
key:
|
|
var: p
|
|
eidx: 18
|
|
value:
|
|
var: q
|
|
eidx: 19
|
|
collection:
|
|
setcompr:
|
|
term:
|
|
var: r
|
|
eidx: 20
|
|
query:
|
|
qidx: 0
|
|
stmts:
|
|
- literal:
|
|
some-decl:
|
|
key:
|
|
var: a
|
|
eidx: 21
|
|
value:
|
|
var: b
|
|
eidx: 22
|
|
collection:
|
|
var: d
|
|
eidx: 23
|
|
sidx: 4
|
|
eidx: 24
|
|
|
|
|
|
- note: unimported-in
|
|
rego: |
|
|
package test
|
|
x = y {
|
|
some a in b
|
|
}
|
|
error: expecting `}` while parsing query
|
|
|
|
- note: more-refs
|
|
rego: |
|
|
package test
|
|
import future.keywords.in
|
|
x = y {
|
|
some a, b, c in d
|
|
}
|
|
error: encountered `c` while expecting `in`
|
|
|
|
- note: eof
|
|
rego: |
|
|
package test
|
|
import future.keywords.in
|
|
x = y {
|
|
some a, b in
|
|
error: expecting expression
|
|
|
|
- note: missing-expr
|
|
rego: |
|
|
package test
|
|
import future.keywords.in
|
|
x = y {
|
|
some a, b in
|
|
}
|
|
error: expecting expression
|
|
|
|
- note: missing-comma
|
|
rego: |
|
|
package test
|
|
import future.keywords.in
|
|
x = y {
|
|
some a b in c
|
|
}
|
|
error: expecting `}` while parsing query
|
|
|
|
- note: same-line
|
|
rego: |
|
|
package test
|
|
import future.keywords.in
|
|
x = y{
|
|
some a b in {4, 5}
|
|
[1, 2, 3][a] == 3
|
|
y = a
|
|
}
|
|
error: expecting `}` while parsing query
|
|
|
|
- note: multi-line-parsed-as-membership
|
|
rego: |
|
|
package test
|
|
import future.keywords.in
|
|
b := 5
|
|
x = y{
|
|
some a
|
|
b in {4, 5}
|
|
# The following [ starting a line ought to get
|
|
# parsed as a literal statement and not raise errors
|
|
# regarding gap from previous refr.
|
|
[1, 2, 3][a] == 3
|
|
y = a
|
|
}
|
|
num_expressions: 24
|
|
num_statements: 4
|
|
num_queries: 1
|
|
policy:
|
|
- spec:
|
|
head:
|
|
compr:
|
|
span: b := 5
|
|
refr:
|
|
var: b
|
|
eidx: 4
|
|
assign:
|
|
op: :=
|
|
value:
|
|
number: 5
|
|
eidx: 5
|
|
bodies: []
|
|
- spec:
|
|
head:
|
|
compr:
|
|
span: x = y
|
|
refr:
|
|
var: x
|
|
eidx: 6
|
|
assign:
|
|
op: =
|
|
value:
|
|
var: y
|
|
eidx: 7
|
|
bodies:
|
|
- query:
|
|
qidx: 0
|
|
stmts:
|
|
- literal:
|
|
some-vars:
|
|
span: some a
|
|
vars:
|
|
- a
|
|
sidx: 0
|
|
- literal:
|
|
expr:
|
|
inexpr:
|
|
span: b in {4, 5}
|
|
value:
|
|
var: b
|
|
eidx: 8
|
|
collection:
|
|
set:
|
|
- number: 4
|
|
eidx: 9
|
|
- number: 5
|
|
eidx: 10
|
|
eidx: 11
|
|
eidx: 12
|
|
sidx: 1
|
|
- literal:
|
|
expr:
|
|
boolexpr:
|
|
span: "[1, 2, 3][a] == 3"
|
|
op: ==
|
|
lhs:
|
|
refbrack:
|
|
span: "[1, 2, 3][a]"
|
|
refr:
|
|
array:
|
|
- number: 1
|
|
eidx: 13
|
|
- number: 2
|
|
eidx: 14
|
|
- number: 3
|
|
eidx: 15
|
|
eidx: 16
|
|
index:
|
|
var: a
|
|
eidx: 17
|
|
eidx: 18
|
|
rhs:
|
|
number: 3
|
|
eidx: 19
|
|
eidx: 20
|
|
sidx: 2
|
|
- literal:
|
|
expr:
|
|
assignexpr:
|
|
span: y = a
|
|
op: =
|
|
lhs:
|
|
var: y
|
|
eidx: 21
|
|
rhs:
|
|
var: a
|
|
eidx: 22
|
|
eidx: 23
|
|
sidx: 3
|