ibex-runtime 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +337 -0
- data/lib/ibex/runtime/ast_data.rb +23 -0
- data/lib/ibex/runtime/cst/annotation.rb +16 -0
- data/lib/ibex/runtime/cst/cursor.rb +68 -0
- data/lib/ibex/runtime/cst/diff.rb +80 -0
- data/lib/ibex/runtime/cst/editing.rb +56 -0
- data/lib/ibex/runtime/cst/editor.rb +94 -0
- data/lib/ibex/runtime/cst/green/builder.rb +211 -0
- data/lib/ibex/runtime/cst/green/cache.rb +150 -0
- data/lib/ibex/runtime/cst/green/node.rb +78 -0
- data/lib/ibex/runtime/cst/green/token.rb +91 -0
- data/lib/ibex/runtime/cst/green/trivia.rb +36 -0
- data/lib/ibex/runtime/cst/incremental/blender.rb +233 -0
- data/lib/ibex/runtime/cst/incremental/lexed_syntax.rb +28 -0
- data/lib/ibex/runtime/cst/incremental/parse_memo.rb +95 -0
- data/lib/ibex/runtime/cst/incremental/relexer.rb +134 -0
- data/lib/ibex/runtime/cst/incremental/session.rb +229 -0
- data/lib/ibex/runtime/cst/incremental/token_memo.rb +66 -0
- data/lib/ibex/runtime/cst/kind.rb +133 -0
- data/lib/ibex/runtime/cst/parse_result.rb +41 -0
- data/lib/ibex/runtime/cst/rewriter.rb +75 -0
- data/lib/ibex/runtime/cst/serialize.rb +127 -0
- data/lib/ibex/runtime/cst/serialized_tree.rb +44 -0
- data/lib/ibex/runtime/cst/source_text.rb +112 -0
- data/lib/ibex/runtime/cst/syntax_node.rb +432 -0
- data/lib/ibex/runtime/cst/syntax_token.rb +160 -0
- data/lib/ibex/runtime/cst/text_edit.rb +77 -0
- data/lib/ibex/runtime/cst/typed_node.rb +87 -0
- data/lib/ibex/runtime/cst/validator.rb +428 -0
- data/lib/ibex/runtime/cst.rb +38 -0
- data/lib/ibex/runtime/event.rb +44 -0
- data/lib/ibex/runtime/event_jsonl_tracer.rb +37 -0
- data/lib/ibex/runtime/event_sanitizer.rb +273 -0
- data/lib/ibex/runtime/generated_lexer.rb +514 -0
- data/lib/ibex/runtime/jsonl_tracer.rb +75 -0
- data/lib/ibex/runtime/lexer_input.rb +107 -0
- data/lib/ibex/runtime/location_span.rb +114 -0
- data/lib/ibex/runtime/observation.rb +82 -0
- data/lib/ibex/runtime/parser.rb +3027 -0
- data/lib/ibex/runtime/parser_sync_recovery.rb +108 -0
- data/lib/ibex/runtime/repair.rb +126 -0
- data/lib/ibex/runtime/repair_priority_queue.rb +60 -0
- data/lib/ibex/runtime/repair_search.rb +318 -0
- data/lib/ibex/runtime/resource_limits.rb +64 -0
- data/lib/ibex/runtime/table_format.rb +11 -0
- data/lib/ibex/runtime/version.rb +7 -0
- data/lib/ibex/runtime.rb +27 -0
- data/lib/ibex/tables/compact.rb +186 -0
- data/lib/ibex/tables/compact_actions.rb +135 -0
- data/lib/ibex/tables/compact_productions.rb +167 -0
- data/sig/ibex/runtime/ast_data.rbs +12 -0
- data/sig/ibex/runtime/cst/annotation.rbs +13 -0
- data/sig/ibex/runtime/cst/cursor.rbs +34 -0
- data/sig/ibex/runtime/cst/diff.rbs +29 -0
- data/sig/ibex/runtime/cst/editing.rbs +23 -0
- data/sig/ibex/runtime/cst/editor.rbs +43 -0
- data/sig/ibex/runtime/cst/green/builder.rbs +84 -0
- data/sig/ibex/runtime/cst/green/cache.rbs +60 -0
- data/sig/ibex/runtime/cst/green/node.rbs +49 -0
- data/sig/ibex/runtime/cst/green/token.rbs +59 -0
- data/sig/ibex/runtime/cst/green/trivia.rbs +29 -0
- data/sig/ibex/runtime/cst/incremental/blender.rbs +114 -0
- data/sig/ibex/runtime/cst/incremental/lexed_syntax.rbs +20 -0
- data/sig/ibex/runtime/cst/incremental/parse_memo.rbs +59 -0
- data/sig/ibex/runtime/cst/incremental/relexer.rbs +54 -0
- data/sig/ibex/runtime/cst/incremental/session.rbs +89 -0
- data/sig/ibex/runtime/cst/incremental/token_memo.rbs +31 -0
- data/sig/ibex/runtime/cst/kind.rbs +93 -0
- data/sig/ibex/runtime/cst/parse_result.rbs +35 -0
- data/sig/ibex/runtime/cst/rewriter.rbs +31 -0
- data/sig/ibex/runtime/cst/serialize.rbs +39 -0
- data/sig/ibex/runtime/cst/serialized_tree.rbs +34 -0
- data/sig/ibex/runtime/cst/source_text.rbs +51 -0
- data/sig/ibex/runtime/cst/syntax_node.rbs +195 -0
- data/sig/ibex/runtime/cst/syntax_token.rbs +112 -0
- data/sig/ibex/runtime/cst/text_edit.rbs +33 -0
- data/sig/ibex/runtime/cst/typed_node.rbs +50 -0
- data/sig/ibex/runtime/cst/validator.rbs +108 -0
- data/sig/ibex/runtime/cst.rbs +9 -0
- data/sig/ibex/runtime/event.rbs +26 -0
- data/sig/ibex/runtime/event_jsonl_tracer.rbs +25 -0
- data/sig/ibex/runtime/event_sanitizer.rbs +92 -0
- data/sig/ibex/runtime/generated_lexer.rbs +169 -0
- data/sig/ibex/runtime/jsonl_tracer.rbs +42 -0
- data/sig/ibex/runtime/lexer_input.rbs +44 -0
- data/sig/ibex/runtime/location_span.rbs +64 -0
- data/sig/ibex/runtime/observation.rbs +35 -0
- data/sig/ibex/runtime/parser.rbs +926 -0
- data/sig/ibex/runtime/parser_sync_recovery.rbs +60 -0
- data/sig/ibex/runtime/repair.rbs +92 -0
- data/sig/ibex/runtime/repair_priority_queue.rbs +27 -0
- data/sig/ibex/runtime/repair_search.rbs +114 -0
- data/sig/ibex/runtime/resource_limits.rbs +39 -0
- data/sig/ibex/runtime/table_format.rbs +11 -0
- data/sig/ibex/runtime/version.rbs +7 -0
- data/sig/ibex/runtime.rbs +6 -0
- data/sig/ibex/tables/compact.rbs +70 -0
- data/sig/ibex/tables/compact_actions.rbs +57 -0
- data/sig/ibex/tables/compact_productions.rbs +68 -0
- metadata +144 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Generated from lib/ibex/runtime/cst/green/builder.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Runtime
|
|
5
|
+
module CST
|
|
6
|
+
# LR bottom-up builder backed by a Green element stack.
|
|
7
|
+
# rubocop:disable Naming/PredicateMethod -- mutation methods report whether they found a target.
|
|
8
|
+
class GreenBuilder
|
|
9
|
+
type child = GreenNode | GreenToken
|
|
10
|
+
|
|
11
|
+
# @type var empty_trivia: Array[GreenTrivia]
|
|
12
|
+
EMPTY_TRIVIA: Array[GreenTrivia]
|
|
13
|
+
|
|
14
|
+
@stack: Array[child]
|
|
15
|
+
|
|
16
|
+
@cache: NodeCache
|
|
17
|
+
|
|
18
|
+
@kinds: Kind
|
|
19
|
+
|
|
20
|
+
# @rbs (kinds: Kind, ?cache: NodeCache) -> void
|
|
21
|
+
def initialize: (kinds: Kind, ?cache: NodeCache) -> void
|
|
22
|
+
|
|
23
|
+
# @rbs (Integer kind, String text, ?leading: Array[GreenTrivia], ?trailing: Array[GreenTrivia],
|
|
24
|
+
# ?flags: Integer) -> GreenToken
|
|
25
|
+
def token: (Integer kind, String text, ?leading: Array[GreenTrivia], ?trailing: Array[GreenTrivia], ?flags: Integer) -> GreenToken
|
|
26
|
+
|
|
27
|
+
# Construct an interned token without changing the builder stack.
|
|
28
|
+
# @rbs (Integer kind, String text, ?leading: Array[GreenTrivia], ?trailing: Array[GreenTrivia],
|
|
29
|
+
# ?flags: Integer) -> GreenToken
|
|
30
|
+
def make_token: (Integer kind, String text, ?leading: Array[GreenTrivia], ?trailing: Array[GreenTrivia], ?flags: Integer) -> GreenToken
|
|
31
|
+
|
|
32
|
+
# @rbs (Integer kind, Integer arity, ?flags: Integer) -> GreenNode
|
|
33
|
+
def node: (Integer kind, Integer arity, ?flags: Integer) -> GreenNode
|
|
34
|
+
|
|
35
|
+
# Push one already validated nonterminal without rebuilding its descendants.
|
|
36
|
+
# @rbs (GreenNode value) -> GreenNode
|
|
37
|
+
def subtree: (GreenNode value) -> GreenNode
|
|
38
|
+
|
|
39
|
+
# @rbs (Integer expected_kind) -> GreenToken
|
|
40
|
+
def missing: (Integer expected_kind) -> GreenToken
|
|
41
|
+
|
|
42
|
+
# @rbs (String text, ?leading: Array[GreenTrivia]) -> GreenToken
|
|
43
|
+
def lexical_error: (String text, ?leading: Array[GreenTrivia]) -> GreenToken
|
|
44
|
+
|
|
45
|
+
# Preserve popped and discarded Green elements in one error node.
|
|
46
|
+
# @rbs (Integer pop_count, ?skipped: Array[child]) -> GreenNode
|
|
47
|
+
def absorb_into_error: (Integer pop_count, ?skipped: Array[child]) -> GreenNode
|
|
48
|
+
|
|
49
|
+
# Wrap the completed start node and explicit EOF token.
|
|
50
|
+
# @rbs (GreenToken eof_token, ?incomplete: bool) -> GreenNode
|
|
51
|
+
def finish_source_file: (GreenToken eof_token, ?incomplete: bool) -> GreenNode
|
|
52
|
+
|
|
53
|
+
# Preserve every available fragment when parsing terminates without a start node.
|
|
54
|
+
# @rbs (?Array[child] trailing, ?incomplete: bool) -> GreenNode
|
|
55
|
+
def finish_synthetic_root: (?Array[child] trailing, ?incomplete: bool) -> GreenNode
|
|
56
|
+
|
|
57
|
+
# Append discarded input to the most recent error node on the stack.
|
|
58
|
+
# @rbs (child skipped) -> bool
|
|
59
|
+
def append_to_last_error: (child skipped) -> bool
|
|
60
|
+
|
|
61
|
+
# Path-copy the right edge to attach balanced trailing trivia.
|
|
62
|
+
# @rbs (Array[GreenTrivia] trivia) -> bool
|
|
63
|
+
def append_trailing_to_last_token: (Array[GreenTrivia] trivia) -> bool
|
|
64
|
+
|
|
65
|
+
# @rbs () -> Array[child]
|
|
66
|
+
def snapshot: () -> Array[child]
|
|
67
|
+
|
|
68
|
+
# @rbs (Array[child] elements) -> void
|
|
69
|
+
def restore: (Array[child] elements) -> void
|
|
70
|
+
|
|
71
|
+
# @rbs () -> Integer
|
|
72
|
+
def size: () -> Integer
|
|
73
|
+
|
|
74
|
+
# @rbs () -> Array[child]
|
|
75
|
+
def elements: () -> Array[child]
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
# @rbs (child element, Array[GreenTrivia] trivia) -> child?
|
|
80
|
+
def with_rightmost_trailing: (child element, Array[GreenTrivia] trivia) -> child?
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Generated from lib/ibex/runtime/cst/green/cache.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Runtime
|
|
5
|
+
module CST
|
|
6
|
+
# Session-owned hash-consing cache for immutable Green elements.
|
|
7
|
+
class NodeCache
|
|
8
|
+
DEFAULT_NODE_ARITY_LIMIT: Integer
|
|
9
|
+
|
|
10
|
+
DEFAULT_NODE_DESCENDANT_LIMIT: Integer
|
|
11
|
+
|
|
12
|
+
# @type var empty_trivia: Array[GreenTrivia]
|
|
13
|
+
EMPTY_TRIVIA: Array[GreenTrivia]
|
|
14
|
+
|
|
15
|
+
@nodes: Hash[GreenNode, GreenNode]
|
|
16
|
+
|
|
17
|
+
@tokens: Hash[Integer, Array[GreenToken]]
|
|
18
|
+
|
|
19
|
+
@trivia: Hash[Integer, Array[GreenTrivia]]
|
|
20
|
+
|
|
21
|
+
@node_descendant_limit: Integer
|
|
22
|
+
|
|
23
|
+
@node_arity_limit: Integer
|
|
24
|
+
|
|
25
|
+
@enabled: bool
|
|
26
|
+
|
|
27
|
+
# @rbs (?enabled: bool, ?node_arity_limit: Integer, ?node_descendant_limit: Integer) -> void
|
|
28
|
+
def initialize: (?enabled: bool, ?node_arity_limit: Integer, ?node_descendant_limit: Integer) -> void
|
|
29
|
+
|
|
30
|
+
# Intern trivia before constructing it, using byte-equivalent text within this session.
|
|
31
|
+
# @rbs (kind: Integer, text: String) -> GreenTrivia
|
|
32
|
+
def intern_trivia_fields: (kind: Integer, text: String) -> GreenTrivia
|
|
33
|
+
|
|
34
|
+
# @rbs (GreenToken token) -> GreenToken
|
|
35
|
+
def intern_token: (GreenToken token) -> GreenToken
|
|
36
|
+
|
|
37
|
+
# Intern a token before constructing it, avoiding discarded duplicate immutable values.
|
|
38
|
+
# @rbs (kind: Integer, text: String, ?leading: Array[GreenTrivia], ?trailing: Array[GreenTrivia],
|
|
39
|
+
# ?flags: Integer, ?expected_kind: Integer?) -> GreenToken
|
|
40
|
+
def intern_token_fields: (kind: Integer, text: String, ?leading: Array[GreenTrivia], ?trailing: Array[GreenTrivia], ?flags: Integer, ?expected_kind: Integer?) -> GreenToken
|
|
41
|
+
|
|
42
|
+
# @rbs (GreenNode node) -> GreenNode
|
|
43
|
+
def intern_node: (GreenNode node) -> GreenNode
|
|
44
|
+
|
|
45
|
+
# @rbs () -> void
|
|
46
|
+
def clear: () -> void
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
# @rbs (Integer kind, String text, Array[GreenTrivia] leading, Array[GreenTrivia] trailing,
|
|
51
|
+
# Integer flags, Integer? expected_kind) -> Integer
|
|
52
|
+
def token_signature: (Integer kind, String text, Array[GreenTrivia] leading, Array[GreenTrivia] trailing, Integer flags, Integer? expected_kind) -> Integer
|
|
53
|
+
|
|
54
|
+
# @rbs (Array[GreenToken]? bucket, Integer kind, String text, Array[GreenTrivia] leading,
|
|
55
|
+
# Array[GreenTrivia] trailing, Integer flags, Integer? expected_kind) -> GreenToken?
|
|
56
|
+
def find_token: (Array[GreenToken]? bucket, Integer kind, String text, Array[GreenTrivia] leading, Array[GreenTrivia] trailing, Integer flags, Integer? expected_kind) -> GreenToken?
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Generated from lib/ibex/runtime/cst/green/node.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Runtime
|
|
5
|
+
module CST
|
|
6
|
+
# Immutable position-independent syntax node.
|
|
7
|
+
class GreenNode
|
|
8
|
+
type child = GreenNode | GreenToken
|
|
9
|
+
|
|
10
|
+
attr_reader kind: Integer
|
|
11
|
+
|
|
12
|
+
attr_reader children: Array[child]
|
|
13
|
+
|
|
14
|
+
attr_reader flags: Integer
|
|
15
|
+
|
|
16
|
+
attr_reader intrinsic_flags: Integer
|
|
17
|
+
|
|
18
|
+
attr_reader annotations: Array[SyntaxAnnotation]
|
|
19
|
+
|
|
20
|
+
attr_reader full_width: Integer
|
|
21
|
+
|
|
22
|
+
attr_reader leading_width: Integer
|
|
23
|
+
|
|
24
|
+
attr_reader trailing_width: Integer
|
|
25
|
+
|
|
26
|
+
attr_reader descendant_count: Integer
|
|
27
|
+
|
|
28
|
+
# @rbs (kind: Integer, children: Array[child], ?flags: Integer, ?annotations: Array[SyntaxAnnotation]) -> void
|
|
29
|
+
def initialize: (kind: Integer, children: Array[child], ?flags: Integer, ?annotations: Array[SyntaxAnnotation]) -> void
|
|
30
|
+
|
|
31
|
+
# @rbs () -> String
|
|
32
|
+
def to_source: () -> String
|
|
33
|
+
|
|
34
|
+
# @rbs (untyped other) -> bool
|
|
35
|
+
def ==: (untyped other) -> bool
|
|
36
|
+
|
|
37
|
+
alias eql? ==
|
|
38
|
+
|
|
39
|
+
# @rbs () -> Integer
|
|
40
|
+
def hash: () -> Integer
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
# @rbs (Enumerable[child] children, Symbol reader) -> Integer
|
|
45
|
+
def edge_width: (Enumerable[child] children, Symbol reader) -> Integer
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Generated from lib/ibex/runtime/cst/green/token.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Runtime
|
|
5
|
+
module CST
|
|
6
|
+
# Immutable position-independent terminal occurrence.
|
|
7
|
+
class GreenToken
|
|
8
|
+
# @type var empty_trivia: Array[GreenTrivia]
|
|
9
|
+
EMPTY_TRIVIA: Array[GreenTrivia]
|
|
10
|
+
|
|
11
|
+
attr_reader kind: Integer
|
|
12
|
+
|
|
13
|
+
attr_reader text: String
|
|
14
|
+
|
|
15
|
+
attr_reader leading: Array[GreenTrivia]
|
|
16
|
+
|
|
17
|
+
attr_reader trailing: Array[GreenTrivia]
|
|
18
|
+
|
|
19
|
+
attr_reader flags: Integer
|
|
20
|
+
|
|
21
|
+
attr_reader full_width: Integer
|
|
22
|
+
|
|
23
|
+
attr_reader leading_width: Integer
|
|
24
|
+
|
|
25
|
+
attr_reader trailing_width: Integer
|
|
26
|
+
|
|
27
|
+
attr_reader expected_kind: Integer?
|
|
28
|
+
|
|
29
|
+
attr_reader hash: Integer
|
|
30
|
+
|
|
31
|
+
# @rbs (kind: Integer, text: String, ?leading: Array[GreenTrivia], ?trailing: Array[GreenTrivia],
|
|
32
|
+
# ?flags: Integer, ?expected_kind: Integer?) -> void
|
|
33
|
+
def initialize: (kind: Integer, text: String, ?leading: Array[GreenTrivia], ?trailing: Array[GreenTrivia], ?flags: Integer, ?expected_kind: Integer?) -> void
|
|
34
|
+
|
|
35
|
+
# @rbs (kind: Integer, expected_kind: Integer) -> GreenToken
|
|
36
|
+
def self.missing: (kind: Integer, expected_kind: Integer) -> GreenToken
|
|
37
|
+
|
|
38
|
+
# @rbs (kind: Integer, text: String, ?leading: Array[GreenTrivia]) -> GreenToken
|
|
39
|
+
def self.lexical_error: (kind: Integer, text: String, ?leading: Array[GreenTrivia]) -> GreenToken
|
|
40
|
+
|
|
41
|
+
# @rbs () -> Integer
|
|
42
|
+
def descendant_count: () -> Integer
|
|
43
|
+
|
|
44
|
+
# @rbs () -> String
|
|
45
|
+
def to_source: () -> String
|
|
46
|
+
|
|
47
|
+
# @rbs (untyped other) -> bool
|
|
48
|
+
def ==: (untyped other) -> bool
|
|
49
|
+
|
|
50
|
+
alias eql? ==
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
# @rbs (Array[GreenTrivia] trivia) -> Integer
|
|
55
|
+
def trivia_width: (Array[GreenTrivia] trivia) -> Integer
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Generated from lib/ibex/runtime/cst/green/trivia.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Runtime
|
|
5
|
+
module CST
|
|
6
|
+
# Immutable source text ignored by the grammar but owned by a token.
|
|
7
|
+
class GreenTrivia
|
|
8
|
+
attr_reader kind: Integer
|
|
9
|
+
|
|
10
|
+
attr_reader text: String
|
|
11
|
+
|
|
12
|
+
attr_reader full_width: Integer
|
|
13
|
+
|
|
14
|
+
attr_reader hash: Integer
|
|
15
|
+
|
|
16
|
+
# @rbs (kind: Integer, text: String) -> void
|
|
17
|
+
def initialize: (kind: Integer, text: String) -> void
|
|
18
|
+
|
|
19
|
+
# @rbs () -> String
|
|
20
|
+
def to_source: () -> String
|
|
21
|
+
|
|
22
|
+
# @rbs (untyped other) -> bool
|
|
23
|
+
def ==: (untyped other) -> bool
|
|
24
|
+
|
|
25
|
+
alias eql? ==
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Generated from lib/ibex/runtime/cst/incremental/blender.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Runtime
|
|
5
|
+
module CST
|
|
6
|
+
# A Green nonterminal that can replace its old LR shift/reduce sequence.
|
|
7
|
+
class ReusableSubtree
|
|
8
|
+
attr_reader green: GreenNode
|
|
9
|
+
|
|
10
|
+
attr_reader lhs: Integer
|
|
11
|
+
|
|
12
|
+
attr_reader left_state: Integer
|
|
13
|
+
|
|
14
|
+
attr_reader left_states: Array[Integer?]
|
|
15
|
+
|
|
16
|
+
attr_reader previous_trailing: Array[GreenTrivia]
|
|
17
|
+
|
|
18
|
+
# @rbs (green: GreenNode, lhs: Integer, left_state: Integer, left_states: Array[Integer?],
|
|
19
|
+
# previous_trailing: Array[GreenTrivia]) -> void
|
|
20
|
+
def initialize: (green: GreenNode, lhs: Integer, left_state: Integer, left_states: Array[Integer?], previous_trailing: Array[GreenTrivia]) -> void
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# A state-aware token source that substitutes validated old subtrees.
|
|
24
|
+
class Blender
|
|
25
|
+
class Candidate
|
|
26
|
+
attr_reader entry: ReusableSubtree
|
|
27
|
+
|
|
28
|
+
attr_reader token_count: Integer
|
|
29
|
+
|
|
30
|
+
# @rbs (entry: ReusableSubtree, token_count: Integer) -> void
|
|
31
|
+
def initialize: (entry: ReusableSubtree, token_count: Integer) -> void
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
UNSAFE_FLAGS: Integer
|
|
35
|
+
|
|
36
|
+
attr_reader reused_descendants: Integer
|
|
37
|
+
|
|
38
|
+
attr_reader decomposed_nodes: Integer
|
|
39
|
+
|
|
40
|
+
attr_reader fallback_reason: Symbol?
|
|
41
|
+
|
|
42
|
+
@token_index: Integer
|
|
43
|
+
|
|
44
|
+
@old_tokens: Array[GreenToken]
|
|
45
|
+
|
|
46
|
+
@new_offsets: Hash[Integer, Integer]
|
|
47
|
+
|
|
48
|
+
@candidates: Hash[Integer, Array[Candidate]]
|
|
49
|
+
|
|
50
|
+
@enabled: bool
|
|
51
|
+
|
|
52
|
+
@max_decomposed_nodes: Integer
|
|
53
|
+
|
|
54
|
+
@edits: Array[TextEdit]
|
|
55
|
+
|
|
56
|
+
@lexed: LexedSyntax
|
|
57
|
+
|
|
58
|
+
@parse_memo: ParseMemo
|
|
59
|
+
|
|
60
|
+
@old_root: SyntaxNode
|
|
61
|
+
|
|
62
|
+
# @rbs (old_root: SyntaxNode, parse_memo: ParseMemo, lexed: LexedSyntax, edits: Array[TextEdit],
|
|
63
|
+
# max_decomposed_nodes: Integer, ?enabled: bool) -> void
|
|
64
|
+
def initialize: (old_root: SyntaxNode, parse_memo: ParseMemo, lexed: LexedSyntax, edits: Array[TextEdit], max_decomposed_nodes: Integer, ?enabled: bool) -> void
|
|
65
|
+
|
|
66
|
+
# Return the next token or a whole nonterminal valid in the current LR state.
|
|
67
|
+
# @rbs (Integer state) -> (Array[untyped] | ReusableSubtree | false)
|
|
68
|
+
def next_for_state: (Integer state) -> (Array[untyped] | ReusableSubtree | false)
|
|
69
|
+
|
|
70
|
+
# @rbs () -> Integer
|
|
71
|
+
def token_count: () -> Integer
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
# @rbs () -> bool
|
|
76
|
+
def reusable_root?: () -> bool
|
|
77
|
+
|
|
78
|
+
# @rbs () -> void
|
|
79
|
+
def build_candidates: () -> void
|
|
80
|
+
|
|
81
|
+
# @rbs (GreenNode | GreenToken element, offset: Integer, preorder: Integer, token_index: Integer) ->
|
|
82
|
+
# [Integer, Integer, Integer]
|
|
83
|
+
def walk: (GreenNode | GreenToken element, offset: Integer, preorder: Integer, token_index: Integer) -> [ Integer, Integer, Integer ]
|
|
84
|
+
|
|
85
|
+
# @rbs (GreenNode node, Integer preorder, Integer old_offset, Integer start_token, Integer end_token) -> void
|
|
86
|
+
def add_candidate: (GreenNode node, Integer preorder, Integer old_offset, Integer start_token, Integer end_token) -> void
|
|
87
|
+
|
|
88
|
+
# @rbs (GreenNode node, Integer old_offset) -> bool
|
|
89
|
+
def reusable_node?: (GreenNode node, Integer old_offset) -> bool
|
|
90
|
+
|
|
91
|
+
# @rbs (Integer start_offset, Integer finish_offset) -> bool
|
|
92
|
+
def outside_damage?: (Integer start_offset, Integer finish_offset) -> bool
|
|
93
|
+
|
|
94
|
+
# @rbs (Integer old_offset) -> Integer
|
|
95
|
+
def translated_offset: (Integer old_offset) -> Integer
|
|
96
|
+
|
|
97
|
+
# @rbs (Integer old_index, Integer new_index, Integer count) -> bool
|
|
98
|
+
def matching_tokens?: (Integer old_index, Integer new_index, Integer count) -> bool
|
|
99
|
+
|
|
100
|
+
# @rbs (Integer old_index, Integer new_index) -> bool
|
|
101
|
+
def matching_follow_token?: (Integer old_index, Integer new_index) -> bool
|
|
102
|
+
|
|
103
|
+
# @rbs (Integer token_index) -> Array[GreenTrivia]
|
|
104
|
+
def previous_trailing: (Integer token_index) -> Array[GreenTrivia]
|
|
105
|
+
|
|
106
|
+
# @rbs (Array[Integer] offsets) -> Hash[Integer, Integer]
|
|
107
|
+
def offset_index: (Array[Integer] offsets) -> Hash[Integer, Integer]
|
|
108
|
+
|
|
109
|
+
# @rbs () -> void
|
|
110
|
+
def consume_decomposition_budget!: () -> void
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Generated from lib/ibex/runtime/cst/incremental/lexed_syntax.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Runtime
|
|
5
|
+
module CST
|
|
6
|
+
# One complete generated-lexer pass, including the explicit EOF token.
|
|
7
|
+
class LexedSyntax
|
|
8
|
+
attr_reader raw_tokens: Array[Array[untyped]]
|
|
9
|
+
|
|
10
|
+
attr_reader memo: TokenMemo
|
|
11
|
+
|
|
12
|
+
# @rbs (raw_tokens: Array[Array[untyped]], memo: TokenMemo) -> void
|
|
13
|
+
def initialize: (raw_tokens: Array[Array[untyped]], memo: TokenMemo) -> void
|
|
14
|
+
|
|
15
|
+
# @rbs (TokenMemo replacement) -> LexedSyntax
|
|
16
|
+
def with_memo: (TokenMemo replacement) -> LexedSyntax
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Generated from lib/ibex/runtime/cst/incremental/parse_memo.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Runtime
|
|
5
|
+
module CST
|
|
6
|
+
# Parser-state metadata parallel to Green preorder occurrences.
|
|
7
|
+
class ParseMemo
|
|
8
|
+
VERSION: Integer
|
|
9
|
+
|
|
10
|
+
ENTRY_BYTES: Integer
|
|
11
|
+
|
|
12
|
+
attr_reader left_states: Array[Integer?]
|
|
13
|
+
|
|
14
|
+
attr_reader grammar_digest: String
|
|
15
|
+
|
|
16
|
+
attr_reader state_count: Integer
|
|
17
|
+
|
|
18
|
+
attr_reader production_count: Integer
|
|
19
|
+
|
|
20
|
+
# @rbs (left_states: Array[Integer?], grammar_digest: String, state_count: Integer,
|
|
21
|
+
# production_count: Integer) -> void
|
|
22
|
+
def initialize: (left_states: Array[Integer?], grammar_digest: String, state_count: Integer, production_count: Integer) -> void
|
|
23
|
+
|
|
24
|
+
# @rbs (Integer preorder_index) -> Integer?
|
|
25
|
+
def left_state: (Integer preorder_index) -> Integer?
|
|
26
|
+
|
|
27
|
+
# @rbs (Integer preorder_index, GreenNode | GreenToken element) -> Array[Integer?]
|
|
28
|
+
def slice: (Integer preorder_index, GreenNode | GreenToken element) -> Array[Integer?]
|
|
29
|
+
|
|
30
|
+
# @rbs (Hash[Symbol, untyped] tables) -> bool
|
|
31
|
+
def compatible?: (Hash[Symbol, untyped] tables) -> bool
|
|
32
|
+
|
|
33
|
+
# @rbs () -> Integer
|
|
34
|
+
def estimated_bytes: () -> Integer
|
|
35
|
+
|
|
36
|
+
# @rbs () -> Hash[String, untyped]
|
|
37
|
+
def to_h: () -> Hash[String, untyped]
|
|
38
|
+
|
|
39
|
+
# Lightweight construction tree flattened once when a parse completes.
|
|
40
|
+
class Entry
|
|
41
|
+
# @type var empty_children: Array[Entry]
|
|
42
|
+
EMPTY_CHILDREN: Array[Entry]
|
|
43
|
+
|
|
44
|
+
@state: Integer?
|
|
45
|
+
|
|
46
|
+
@children: Array[Entry]
|
|
47
|
+
|
|
48
|
+
@segment: Array[Integer?]?
|
|
49
|
+
|
|
50
|
+
# @rbs (Integer? state, ?children: Array[Entry], ?segment: Array[Integer?]?) -> void
|
|
51
|
+
def initialize: (Integer? state, ?children: Array[Entry], ?segment: Array[Integer?]?) -> void
|
|
52
|
+
|
|
53
|
+
# @rbs (Array[Integer?] output) -> void
|
|
54
|
+
def append_to: (Array[Integer?] output) -> void
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Generated from lib/ibex/runtime/cst/incremental/relexer.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Runtime
|
|
5
|
+
module CST
|
|
6
|
+
# Result of comparing one fresh lexical pass with the prior token memo.
|
|
7
|
+
class RelexResult
|
|
8
|
+
attr_reader memo: TokenMemo
|
|
9
|
+
|
|
10
|
+
attr_reader reused_count: Integer
|
|
11
|
+
|
|
12
|
+
attr_reader scanned_count: Integer
|
|
13
|
+
|
|
14
|
+
attr_reader resynchronized_at: Integer?
|
|
15
|
+
|
|
16
|
+
# @rbs (memo: TokenMemo, reused_count: Integer, scanned_count: Integer,
|
|
17
|
+
# resynchronized_at: Integer?) -> void
|
|
18
|
+
def initialize: (memo: TokenMemo, reused_count: Integer, scanned_count: Integer, resynchronized_at: Integer?) -> void
|
|
19
|
+
|
|
20
|
+
# @rbs () -> Float
|
|
21
|
+
def reused_ratio: () -> Float
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Sound Stage-A comparison: scan from the beginning and reuse only exact
|
|
25
|
+
# token/state/boundary matches, then recognize a shifted suffix boundary.
|
|
26
|
+
class Relexer
|
|
27
|
+
# @rbs (TokenMemo previous, TokenMemo current, Array[TextEdit] edits) -> RelexResult
|
|
28
|
+
def self.reconcile: (TokenMemo previous, TokenMemo current, Array[TextEdit] edits) -> RelexResult
|
|
29
|
+
|
|
30
|
+
# @rbs (Array[TextEdit] edits) -> [Integer, Integer, Integer]
|
|
31
|
+
def self.edit_window: (Array[TextEdit] edits) -> [ Integer, Integer, Integer ]
|
|
32
|
+
|
|
33
|
+
# @rbs (TokenMemo memo) -> Hash[Integer, Integer]
|
|
34
|
+
def self.offset_index: (TokenMemo memo) -> Hash[Integer, Integer]
|
|
35
|
+
|
|
36
|
+
# @rbs (TokenMemo previous, TokenMemo current, Array[GreenToken] tokens,
|
|
37
|
+
# Hash[Integer, Integer] old_by_offset, Integer damage, Integer delta, Integer resync_boundary) ->
|
|
38
|
+
# [Integer, Integer, Integer?]
|
|
39
|
+
def self.reuse_tokens: (TokenMemo previous, TokenMemo current, Array[GreenToken] tokens, Hash[Integer, Integer] old_by_offset, Integer damage, Integer delta, Integer resync_boundary) -> [ Integer, Integer, Integer? ]
|
|
40
|
+
|
|
41
|
+
# @rbs (TokenMemo previous, TokenMemo current, Integer index, Integer new_offset, Integer delta,
|
|
42
|
+
# Integer boundary, Hash[Integer, Integer] old_by_offset) -> [Integer, Integer]?
|
|
43
|
+
def self.reusable_suffix: (TokenMemo previous, TokenMemo current, Integer index, Integer new_offset, Integer delta, Integer boundary, Hash[Integer, Integer] old_by_offset) -> [ Integer, Integer ]?
|
|
44
|
+
|
|
45
|
+
# @rbs (Array[GreenToken] target, Array[GreenToken] source, Integer target_index,
|
|
46
|
+
# Integer source_index, Integer length) -> void
|
|
47
|
+
def self.copy_suffix: (Array[GreenToken] target, Array[GreenToken] source, Integer target_index, Integer source_index, Integer length) -> void
|
|
48
|
+
|
|
49
|
+
# @rbs (TokenMemo previous, Integer old_index, TokenMemo current, Integer new_index) -> bool
|
|
50
|
+
def self.reusable_token?: (TokenMemo previous, Integer old_index, TokenMemo current, Integer new_index) -> bool
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Generated from lib/ibex/runtime/cst/incremental/session.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Runtime
|
|
5
|
+
module CST
|
|
6
|
+
# Raised when incremental parsing cannot preserve its syntax-only contract.
|
|
7
|
+
class IncrementalUnsupportedError < ArgumentError
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# A mutable, single-owner session around immutable source and syntax results.
|
|
11
|
+
class IncrementalParseSession
|
|
12
|
+
attr_reader source_text: SourceText
|
|
13
|
+
|
|
14
|
+
attr_reader result: SyntaxResult
|
|
15
|
+
|
|
16
|
+
attr_reader token_memo: TokenMemo
|
|
17
|
+
|
|
18
|
+
attr_reader parse_memo: ParseMemo
|
|
19
|
+
|
|
20
|
+
attr_reader last_relex_result: RelexResult?
|
|
21
|
+
|
|
22
|
+
attr_reader last_blender: Blender?
|
|
23
|
+
|
|
24
|
+
@mutex: Mutex
|
|
25
|
+
|
|
26
|
+
@blender_enabled: bool
|
|
27
|
+
|
|
28
|
+
@cache: NodeCache
|
|
29
|
+
|
|
30
|
+
@parser: Parser
|
|
31
|
+
|
|
32
|
+
@resource_limits: ResourceLimits
|
|
33
|
+
|
|
34
|
+
# @rbs (Class parser_class, SourceText source_text, ?resource_limits: ResourceLimits?, ?blender: bool) -> void
|
|
35
|
+
def initialize: (Class parser_class, SourceText source_text, ?resource_limits: ResourceLimits?, ?blender: bool) -> void
|
|
36
|
+
|
|
37
|
+
# Apply edits expressed against the current source and return syntax only.
|
|
38
|
+
# @rbs (Array[TextEdit] edits) -> SyntaxResult
|
|
39
|
+
def edit: (Array[TextEdit] edits) -> SyntaxResult
|
|
40
|
+
|
|
41
|
+
# Observe parser and incremental runtime events.
|
|
42
|
+
# @rbs () { (Event) -> void } -> Observation::Subscription
|
|
43
|
+
def observe: () { (Event) -> void } -> Observation::Subscription
|
|
44
|
+
|
|
45
|
+
# @rbs (Observation::Subscription subscription) -> bool
|
|
46
|
+
def unobserve: (Observation::Subscription subscription) -> bool
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
# @rbs (Array[TextEdit] edits) -> SyntaxResult
|
|
51
|
+
def edit_locked: (Array[TextEdit] edits) -> SyntaxResult
|
|
52
|
+
|
|
53
|
+
# @rbs () -> LexedSyntax?
|
|
54
|
+
def scan_current: () -> LexedSyntax?
|
|
55
|
+
|
|
56
|
+
# @rbs (SyntaxNode old_root, ParseMemo old_memo, LexedSyntax lexed, Array[TextEdit] edits) -> Blender
|
|
57
|
+
def build_blender: (SyntaxNode old_root, ParseMemo old_memo, LexedSyntax lexed, Array[TextEdit] edits) -> Blender
|
|
58
|
+
|
|
59
|
+
# @rbs (RelexResult relexed, Blender blender) -> SyntaxResult
|
|
60
|
+
def finish_blended_edit: (RelexResult relexed, Blender blender) -> SyntaxResult
|
|
61
|
+
|
|
62
|
+
# @rbs (Blender blender, GreenNode root, RelexResult relexed) -> Float
|
|
63
|
+
def blender_reused_ratio: (Blender blender, GreenNode root, RelexResult relexed) -> Float
|
|
64
|
+
|
|
65
|
+
# @rbs (Blender blender, RelexResult relexed, Float reused_ratio) -> void
|
|
66
|
+
def emit_reuse_event: (Blender blender, RelexResult relexed, Float reused_ratio) -> void
|
|
67
|
+
|
|
68
|
+
# @rbs () -> void
|
|
69
|
+
def validate_parser!: () -> void
|
|
70
|
+
|
|
71
|
+
# @rbs (Float reused_ratio) -> [SyntaxResult, TokenMemo, ParseMemo]
|
|
72
|
+
def parse_current: (Float reused_ratio) -> [ SyntaxResult, TokenMemo, ParseMemo ]
|
|
73
|
+
|
|
74
|
+
# Error trees cannot be reused, but retain position-aligned disposable memo storage.
|
|
75
|
+
# @rbs (GreenNode root) -> ParseMemo
|
|
76
|
+
def empty_parse_memo: (GreenNode root) -> ParseMemo
|
|
77
|
+
|
|
78
|
+
# @rbs (Blender blender) -> void
|
|
79
|
+
def report_blender_fallback: (Blender blender) -> void
|
|
80
|
+
|
|
81
|
+
# @rbs (TokenMemo previous_memo, Array[TextEdit] edits, Symbol reason) -> SyntaxResult
|
|
82
|
+
def finish_full_fallback: (TokenMemo previous_memo, Array[TextEdit] edits, Symbol reason) -> SyntaxResult
|
|
83
|
+
|
|
84
|
+
# @rbs () -> void
|
|
85
|
+
def enforce_memo_budget!: () -> void
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Generated from lib/ibex/runtime/cst/incremental/token_memo.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Runtime
|
|
5
|
+
module CST
|
|
6
|
+
# Session-local token metadata used to validate lexical resynchronization.
|
|
7
|
+
class TokenMemo
|
|
8
|
+
ENTRY_BYTES: Integer
|
|
9
|
+
|
|
10
|
+
attr_reader tokens: Array[GreenToken]
|
|
11
|
+
|
|
12
|
+
attr_reader offsets: Array[Integer]
|
|
13
|
+
|
|
14
|
+
attr_reader states: Array[Symbol]
|
|
15
|
+
|
|
16
|
+
# @rbs (tokens: Array[GreenToken], offsets: Array[Integer], states: Array[Symbol]) -> void
|
|
17
|
+
def initialize: (tokens: Array[GreenToken], offsets: Array[Integer], states: Array[Symbol]) -> void
|
|
18
|
+
|
|
19
|
+
# @rbs (SyntaxNode root, ?states: Array[Symbol]) -> TokenMemo
|
|
20
|
+
def self.from_root: (SyntaxNode root, ?states: Array[Symbol]) -> TokenMemo
|
|
21
|
+
|
|
22
|
+
# The first token whose owned full span contains or follows an edit.
|
|
23
|
+
# @rbs (Array[TextEdit] edits) -> Integer?
|
|
24
|
+
def damage_index: (Array[TextEdit] edits) -> Integer?
|
|
25
|
+
|
|
26
|
+
# @rbs () -> Integer
|
|
27
|
+
def estimated_bytes: () -> Integer
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|