mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
feat!: Indexes for nodes in the AST (#414)
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>
This commit is contained in:
committed by
GitHub
parent
620f8a4547
commit
444b2970a1
@@ -6,6 +6,7 @@ cases:
|
||||
rego: |
|
||||
package test
|
||||
import future.keywords
|
||||
num_expressions: 3
|
||||
imports:
|
||||
- span: import future.keywords
|
||||
refr:
|
||||
@@ -13,7 +14,9 @@ cases:
|
||||
span: future.keywords
|
||||
refr:
|
||||
var: future
|
||||
eidx: 1
|
||||
field: keywords
|
||||
eidx: 2
|
||||
|
||||
- note: all
|
||||
rego: |
|
||||
@@ -22,6 +25,7 @@ cases:
|
||||
import future.keywords.if
|
||||
import
|
||||
future.keywords.in
|
||||
num_expressions: 13
|
||||
imports:
|
||||
- span: import future.keywords.contains
|
||||
refr:
|
||||
@@ -32,8 +36,11 @@ cases:
|
||||
span: future.keywords
|
||||
refr:
|
||||
var: future
|
||||
eidx: 1
|
||||
field: keywords
|
||||
eidx: 2
|
||||
field: contains
|
||||
eidx: 3
|
||||
- span: import future.keywords.every
|
||||
refr:
|
||||
refdot:
|
||||
@@ -43,8 +50,11 @@ cases:
|
||||
span: future.keywords
|
||||
refr:
|
||||
var: future
|
||||
eidx: 4
|
||||
field: keywords
|
||||
eidx: 5
|
||||
field: every
|
||||
eidx: 6
|
||||
- span: import future.keywords.if
|
||||
refr:
|
||||
refdot:
|
||||
@@ -54,8 +64,11 @@ cases:
|
||||
span: future.keywords
|
||||
refr:
|
||||
var: future
|
||||
eidx: 7
|
||||
field: keywords
|
||||
eidx: 8
|
||||
field: if
|
||||
eidx: 9
|
||||
- span: "import\nfuture.keywords.in"
|
||||
refr:
|
||||
refdot:
|
||||
@@ -65,8 +78,11 @@ cases:
|
||||
span: future.keywords
|
||||
refr:
|
||||
var: future
|
||||
eidx: 10
|
||||
field: keywords
|
||||
eidx: 11
|
||||
field: in
|
||||
eidx: 12
|
||||
|
||||
- note: bracket
|
||||
rego: |
|
||||
@@ -74,6 +90,9 @@ cases:
|
||||
import future["keywords"]["contains"] import future.keywords["every"]
|
||||
import
|
||||
future["keywords"].if
|
||||
num_expressions: 14
|
||||
num_statements: 0
|
||||
num_queries: 0
|
||||
imports:
|
||||
- span: import future["keywords"]["contains"]
|
||||
refr:
|
||||
@@ -84,10 +103,15 @@ cases:
|
||||
span: future["keywords"]
|
||||
refr:
|
||||
var: future
|
||||
eidx: 1
|
||||
index:
|
||||
string: keywords
|
||||
eidx: 2
|
||||
eidx: 3
|
||||
index:
|
||||
string: contains
|
||||
eidx: 4
|
||||
eidx: 5
|
||||
- span: import future.keywords["every"]
|
||||
refr:
|
||||
refbrack:
|
||||
@@ -97,9 +121,13 @@ cases:
|
||||
span: future.keywords
|
||||
refr:
|
||||
var: future
|
||||
eidx: 6
|
||||
field: keywords
|
||||
eidx: 7
|
||||
index:
|
||||
string: every
|
||||
eidx: 8
|
||||
eidx: 9
|
||||
- span: "import\nfuture[\"keywords\"].if"
|
||||
refr:
|
||||
refdot:
|
||||
@@ -109,9 +137,13 @@ cases:
|
||||
span: future["keywords"]
|
||||
refr:
|
||||
var: future
|
||||
eidx: 10
|
||||
index:
|
||||
string: keywords
|
||||
eidx: 11
|
||||
eidx: 12
|
||||
field: if
|
||||
eidx: 13
|
||||
|
||||
- note: as
|
||||
rego: |
|
||||
@@ -126,6 +158,9 @@ cases:
|
||||
import future["keywords"]
|
||||
#error: "this import shadows previous import of `contains`"
|
||||
query: data.test
|
||||
num_expressions: 6
|
||||
num_queries: 0
|
||||
num_statements: 0
|
||||
want_result: {}
|
||||
|
||||
- note: shadow/1
|
||||
@@ -134,6 +169,9 @@ cases:
|
||||
import future.keywords
|
||||
import future.keywords.if
|
||||
#error: "this import shadows previous import of `if`"
|
||||
num_expressions: 6
|
||||
num_queries: 0
|
||||
num_statements: 0
|
||||
query: data.test
|
||||
want_result: {}
|
||||
|
||||
@@ -144,6 +182,9 @@ cases:
|
||||
import future.keywords
|
||||
#error: "this import shadows previous import of `if`"
|
||||
query: data.test
|
||||
num_expressions: 6
|
||||
num_queries: 0
|
||||
num_statements: 0
|
||||
want_result: {}
|
||||
|
||||
- note: in-as-var
|
||||
@@ -151,6 +192,9 @@ cases:
|
||||
package test
|
||||
import future.keywords.if
|
||||
in = 5
|
||||
num_expressions: 6
|
||||
num_queries: 0
|
||||
num_statements: 0
|
||||
|
||||
- note: in-as-var-imported
|
||||
rego: |
|
||||
|
||||
@@ -7,68 +7,96 @@ cases:
|
||||
package test
|
||||
import data
|
||||
import input
|
||||
num_expressions: 3
|
||||
num_statements: 0
|
||||
num_queries: 0
|
||||
imports:
|
||||
- span: import data
|
||||
refr:
|
||||
var: data
|
||||
eidx: 1
|
||||
- span: import input
|
||||
refr:
|
||||
var: input
|
||||
eidx: 2
|
||||
|
||||
- note: input
|
||||
rego: |
|
||||
package test
|
||||
import input
|
||||
num_expressions: 2
|
||||
num_statements: 0
|
||||
num_queries: 0
|
||||
imports:
|
||||
- span: import input
|
||||
refr:
|
||||
var: input
|
||||
eidx: 1
|
||||
|
||||
- note: dot
|
||||
rego: |
|
||||
package test
|
||||
import input.a
|
||||
import data.b
|
||||
num_expressions: 5
|
||||
num_statements: 0
|
||||
num_queries: 0
|
||||
imports:
|
||||
- span: import input.a
|
||||
refr:
|
||||
refdot:
|
||||
refr:
|
||||
var: input
|
||||
eidx: 1
|
||||
field: a
|
||||
eidx: 2
|
||||
- span: import data.b
|
||||
refr:
|
||||
refdot:
|
||||
refr:
|
||||
var: data
|
||||
eidx: 3
|
||||
field: b
|
||||
eidx: 4
|
||||
|
||||
- note: bracket
|
||||
rego: |
|
||||
package test
|
||||
import input["a"]
|
||||
import data["b"]
|
||||
num_expressions: 7
|
||||
num_statements: 0
|
||||
num_queries: 0
|
||||
imports:
|
||||
- span: import input["a"]
|
||||
refr:
|
||||
refbrack:
|
||||
refr:
|
||||
var: input
|
||||
eidx: 1
|
||||
index:
|
||||
string: a
|
||||
eidx: 2
|
||||
eidx: 3
|
||||
- span: import data["b"]
|
||||
refr:
|
||||
refbrack:
|
||||
refr:
|
||||
var: data
|
||||
eidx: 4
|
||||
index:
|
||||
string: b
|
||||
eidx: 5
|
||||
eidx: 6
|
||||
|
||||
- note: multi-dot
|
||||
rego: |
|
||||
package test
|
||||
import input.a.b
|
||||
import data.c.d
|
||||
num_expressions: 7
|
||||
num_statements: 0
|
||||
num_queries: 0
|
||||
imports:
|
||||
- span: import input.a.b
|
||||
refr:
|
||||
@@ -79,8 +107,11 @@ cases:
|
||||
span: input.a
|
||||
refr:
|
||||
var: input
|
||||
eidx: 1
|
||||
field: a
|
||||
eidx: 2
|
||||
field: b
|
||||
eidx: 3
|
||||
- span: import data.c.d
|
||||
refr:
|
||||
refdot:
|
||||
@@ -90,8 +121,11 @@ cases:
|
||||
span: data.c
|
||||
refr:
|
||||
var: data
|
||||
eidx: 4
|
||||
field: c
|
||||
eidx: 5
|
||||
field: d
|
||||
eidx: 6
|
||||
policy: []
|
||||
|
||||
|
||||
@@ -100,6 +134,9 @@ cases:
|
||||
package test
|
||||
import input["b.c"].d["e.f"].g
|
||||
import data.a["b.c"].d["e.f"]
|
||||
num_expressions: 15
|
||||
num_statements: 0
|
||||
num_queries: 0
|
||||
package: --skip--
|
||||
imports:
|
||||
- span: import input["b.c"].d["e.f"].g
|
||||
@@ -117,12 +154,19 @@ cases:
|
||||
span: input["b.c"]
|
||||
refr:
|
||||
var: input
|
||||
eidx: 1
|
||||
index:
|
||||
string: b.c
|
||||
eidx: 2
|
||||
eidx: 3
|
||||
field: d
|
||||
eidx: 4
|
||||
index:
|
||||
string: e.f
|
||||
eidx: 5
|
||||
eidx: 6
|
||||
field: g
|
||||
eidx: 7
|
||||
- span: import data.a["b.c"].d["e.f"]
|
||||
refr:
|
||||
refbrack:
|
||||
@@ -138,12 +182,19 @@ cases:
|
||||
span: data.a
|
||||
refr:
|
||||
var: data
|
||||
eidx: 8
|
||||
field: a
|
||||
eidx: 9
|
||||
index:
|
||||
string: b.c
|
||||
eidx: 10
|
||||
eidx: 11
|
||||
field: d
|
||||
eidx: 12
|
||||
index:
|
||||
string: e.f
|
||||
eidx: 13
|
||||
eidx: 14
|
||||
|
||||
- note: same-line
|
||||
rego: package test import input.a["b"] import data["c"].d
|
||||
@@ -151,6 +202,10 @@ cases:
|
||||
span: package test
|
||||
refr:
|
||||
var: test
|
||||
eidx: 0
|
||||
num_expressions: 9
|
||||
num_statements: 0
|
||||
num_queries: 0
|
||||
imports:
|
||||
- span: import input.a["b"]
|
||||
refr:
|
||||
@@ -161,9 +216,13 @@ cases:
|
||||
span: input.a
|
||||
refr:
|
||||
var: input
|
||||
eidx: 1
|
||||
field: a
|
||||
eidx: 2
|
||||
index:
|
||||
string: b
|
||||
eidx: 3
|
||||
eidx: 4
|
||||
- span: import data["c"].d
|
||||
refr:
|
||||
refdot:
|
||||
@@ -173,14 +232,20 @@ cases:
|
||||
span: data["c"]
|
||||
refr:
|
||||
var: data
|
||||
eidx: 5
|
||||
index:
|
||||
string: c
|
||||
eidx: 6
|
||||
eidx: 7
|
||||
field: d
|
||||
|
||||
eidx: 8
|
||||
- note: as
|
||||
rego: |
|
||||
package test
|
||||
import input.x as y
|
||||
num_expressions: 3
|
||||
num_statements: 0
|
||||
num_queries: 0
|
||||
imports:
|
||||
- span: import input.x as y
|
||||
refr:
|
||||
@@ -188,7 +253,9 @@ cases:
|
||||
span: input.x
|
||||
refr:
|
||||
var: input
|
||||
eidx: 1
|
||||
field: x
|
||||
eidx: 2
|
||||
as: y
|
||||
|
||||
- note: as/newline
|
||||
@@ -198,6 +265,9 @@ cases:
|
||||
input.x
|
||||
as
|
||||
y
|
||||
num_expressions: 3
|
||||
num_statements: 0
|
||||
num_queries: 0
|
||||
imports:
|
||||
- span: "import\ninput.x\nas\ny"
|
||||
refr:
|
||||
@@ -205,7 +275,9 @@ cases:
|
||||
span: input.x
|
||||
refr:
|
||||
var: input
|
||||
eidx: 1
|
||||
field: x
|
||||
eidx: 2
|
||||
as: y
|
||||
|
||||
- note: missing-ref
|
||||
|
||||
Reference in New Issue
Block a user