Skip to content

Commit 634985a

Browse files
committed
refactor
1 parent 35e474d commit 634985a

6 files changed

Lines changed: 246 additions & 171 deletions

File tree

matching/matching.mbt

Lines changed: 13 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,16 @@ fn match_expr_placeholder(
9393
if pattern.kind != Expr_Ident {
9494
return None
9595
}
96-
guard expr_ident_name(pattern) is Some(name) else { return None }
96+
guard pattern.normalized_expr_identifier_name() is Some(name) else {
97+
return None
98+
}
9799
if is_ignore_placeholder(name) {
98100
Some(true)
99101
} else if is_special_expr_metavar(compiled, name) ||
100102
contains_name(compiled.expr_metavars, name) {
101103
Some(bind_value(bindings, name, candidate))
102104
} else if contains_name(compiled.identifier_metavars, name) {
103-
match normalize_expr(candidate) {
105+
match candidate.normalized_expr_identifier_name() {
104106
Some(candidate_name) =>
105107
Some(
106108
bind_value(bindings, name, string_binding(candidate_name, candidate)),
@@ -127,13 +129,15 @@ fn match_pattern_placeholder(
127129
if pattern.kind != Pattern_Var {
128130
return None
129131
}
130-
guard pattern_var_name(pattern) is Some(name) else { return None }
132+
guard pattern.normalized_pattern_identifier_name() is Some(name) else {
133+
return None
134+
}
131135
if parse_pattern_metavar_name(name) is Some(meta_name) {
132136
Some(bind_value(bindings, meta_name, candidate))
133137
} else if is_ignore_placeholder(name) {
134138
Some(true)
135139
} else if contains_name(compiled.identifier_metavars, name) {
136-
match normalize_pattern(candidate) {
140+
match candidate.normalized_pattern_identifier_name() {
137141
Some(candidate_name) =>
138142
Some(
139143
bind_value(bindings, name, string_binding(candidate_name, candidate)),
@@ -239,7 +243,7 @@ fn match_long_ident(
239243
guard leaf_string_child(pattern, "value") is Some(pattern_name) else {
240244
return false
241245
}
242-
guard normalized_long_ident(candidate) is Some(candidate_name) else {
246+
guard candidate.normalized_long_ident() is Some(candidate_name) else {
243247
return false
244248
}
245249
match_identifier_name(
@@ -262,7 +266,7 @@ fn match_long_ident(
262266
guard leaf_string_child(candidate, "id") is Some(candidate_id) else {
263267
return false
264268
}
265-
guard normalized_long_ident(candidate) is Some(bound_candidate) else {
269+
guard candidate.normalized_long_ident() is Some(bound_candidate) else {
266270
return false
267271
}
268272
pattern_pkg == candidate_pkg &&
@@ -284,7 +288,7 @@ fn match_binder(
284288
if candidate.kind != Binder {
285289
return false
286290
}
287-
match (binder_name(pattern), binder_name(candidate)) {
291+
match (pattern.normalized_binder_name(), candidate.normalized_binder_name()) {
288292
(Some(pattern_name), Some(candidate_name)) =>
289293
match_identifier_name(
290294
pattern_name, candidate_name, candidate_name, candidate, compiled, bindings,
@@ -303,7 +307,7 @@ fn match_label(
303307
if candidate.kind != Label {
304308
return false
305309
}
306-
match (label_name(pattern), label_name(candidate)) {
310+
match (pattern.normalized_label_name(), candidate.normalized_label_name()) {
307311
(Some(pattern_name), Some(candidate_name)) =>
308312
match_identifier_name(
309313
pattern_name, candidate_name, candidate_name, candidate, compiled, bindings,
@@ -525,25 +529,6 @@ fn leaf_bool_child(node : @untyped_ast.Node, name : String) -> Bool? {
525529
}
526530
}
527531

528-
///|
529-
fn first_child(node : @untyped_ast.Node) -> @untyped_ast.Node? {
530-
if node.children.length() == 0 {
531-
None
532-
} else {
533-
let (_, value) = node.children[0]
534-
Some(value)
535-
}
536-
}
537-
538-
///|
539-
fn expr_ident_name(node : @untyped_ast.Node) -> String? {
540-
if child(node, "id") is Some(var_node) {
541-
normalize_var(var_node)
542-
} else {
543-
None
544-
}
545-
}
546-
547532
///|
548533
fn expr_constant(node : @untyped_ast.Node) -> @untyped_ast.Node? {
549534
if node.kind == Expr_Constant {
@@ -562,77 +547,6 @@ fn pattern_constant(node : @untyped_ast.Node) -> @untyped_ast.Node? {
562547
}
563548
}
564549

565-
///|
566-
fn pattern_var_name(node : @untyped_ast.Node) -> String? {
567-
if first_child(node) is Some(binder) {
568-
binder_name(binder)
569-
} else {
570-
None
571-
}
572-
}
573-
574-
///|
575-
fn normalize_expr(node : @untyped_ast.Node) -> String? {
576-
if node.kind == Expr_Ident {
577-
expr_ident_name(node)
578-
} else {
579-
None
580-
}
581-
}
582-
583-
///|
584-
fn normalize_pattern(node : @untyped_ast.Node) -> String? {
585-
if node.kind == Pattern_Var {
586-
pattern_var_name(node)
587-
} else {
588-
None
589-
}
590-
}
591-
592-
///|
593-
fn normalize_var(node : @untyped_ast.Node) -> String? {
594-
if node.kind == Var {
595-
if child(node, "name") is Some(name) {
596-
normalized_long_ident(name)
597-
} else {
598-
None
599-
}
600-
} else {
601-
None
602-
}
603-
}
604-
605-
///|
606-
fn normalized_long_ident(node : @untyped_ast.Node) -> String? {
607-
match node.kind {
608-
LongIdent_Ident => leaf_string_child(node, "value")
609-
LongIdent_Dot =>
610-
match (leaf_string_child(node, "pkg"), leaf_string_child(node, "id")) {
611-
(Some(pkg), Some(id)) => Some("@\{pkg}.\{id}")
612-
_ => None
613-
}
614-
_ => None
615-
}
616-
}
617-
618-
///|
619-
fn binder_name(node : @untyped_ast.Node) -> String? {
620-
if node.kind == Binder {
621-
leaf_string_child(node, "name")
622-
} else {
623-
None
624-
}
625-
}
626-
627-
///|
628-
fn label_name(node : @untyped_ast.Node) -> String? {
629-
if node.kind == Label {
630-
leaf_string_child(node, "name")
631-
} else {
632-
None
633-
}
634-
}
635-
636550
///|
637551
fn constructor_name(node : @untyped_ast.Node) -> String? {
638552
guard child(node, "name") is Some(name_node) else { return None }
@@ -677,7 +591,7 @@ fn normalized_constructor(constr : @untyped_ast.Node) -> String {
677591
///|
678592
fn normalized_type_name(type_name : @untyped_ast.Node) -> String {
679593
let name = if child(type_name, "name") is Some(long_ident) {
680-
normalized_long_ident(long_ident).unwrap_or("")
594+
long_ident.normalized_long_ident().unwrap_or("")
681595
} else {
682596
""
683597
}

rule/apply/ast_bucket.mbt

Lines changed: 1 addition & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ fn compiled_pattern_root_key(
109109
) -> @untyped_ast.NodeKind? {
110110
let compiled = pattern.compiled
111111
if compiled.ast.kind == Expr_Ident {
112-
if ast_bucket_expr_ident_name(compiled.ast) is Some(name) {
112+
if compiled.ast.normalized_expr_identifier_name() is Some(name) {
113113
if compiled_root_ident_key(compiled, name) is Some(key) {
114114
key
115115
} else {
@@ -206,58 +206,6 @@ fn keyed_patterns_for_key(
206206
None
207207
}
208208

209-
///|
210-
fn ast_bucket_child(
211-
node : @untyped_ast.Node,
212-
name : String,
213-
) -> @untyped_ast.Node? {
214-
for entry in node.children {
215-
let (child_name, value) = entry
216-
if child_name == Some(name) {
217-
return Some(value)
218-
}
219-
}
220-
None
221-
}
222-
223-
///|
224-
fn ast_bucket_leaf_string(node : @untyped_ast.Node) -> String? {
225-
match node.kind {
226-
Leaf(PString(value)) => Some(value)
227-
_ => None
228-
}
229-
}
230-
231-
///|
232-
fn ast_bucket_expr_ident_name(node : @untyped_ast.Node) -> String? {
233-
guard ast_bucket_child(node, "id") is Some(var_node) else { return None }
234-
guard ast_bucket_child(var_node, "name") is Some(long_ident) else {
235-
return None
236-
}
237-
match long_ident.kind {
238-
LongIdent_Ident =>
239-
if ast_bucket_child(long_ident, "value") is Some(value) {
240-
ast_bucket_leaf_string(value)
241-
} else {
242-
None
243-
}
244-
LongIdent_Dot =>
245-
match
246-
(
247-
ast_bucket_child(long_ident, "pkg"),
248-
ast_bucket_child(long_ident, "id"),
249-
) {
250-
(Some(pkg), Some(id)) =>
251-
match (ast_bucket_leaf_string(pkg), ast_bucket_leaf_string(id)) {
252-
(Some(pkg), Some(id)) => Some("@\{pkg}.\{id}")
253-
_ => None
254-
}
255-
_ => None
256-
}
257-
_ => None
258-
}
259-
}
260-
261209
///|
262210
// Merges two already-sorted buckets without reordering pattern priority.
263211
fn merge_indexed_patterns(

rule/prefilter/prefilter.mbt

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ fn collect_node_literals(
166166
) -> Unit {
167167
match node.kind {
168168
Var =>
169-
if prefilter_normalize_var(node) is Some(name) {
169+
if node.normalized_var_name() is Some(name) {
170170
if !is_filter_placeholder(name, compiled) {
171171
push_literal(literals, name)
172172
}
@@ -286,24 +286,6 @@ fn prefilter_first_leaf_bool(node : @untyped_ast.Node) -> Bool? {
286286
}
287287
}
288288

289-
///|
290-
fn prefilter_normalize_var(node : @untyped_ast.Node) -> String? {
291-
guard prefilter_child(node, "name") is Some(long_ident) else { return None }
292-
match long_ident.kind {
293-
LongIdent_Ident => prefilter_leaf_string_child(long_ident, "value")
294-
LongIdent_Dot =>
295-
match
296-
(
297-
prefilter_leaf_string_child(long_ident, "pkg"),
298-
prefilter_leaf_string_child(long_ident, "id"),
299-
) {
300-
(Some(pkg), Some(id)) => Some("@\{pkg}.\{id}")
301-
_ => None
302-
}
303-
_ => None
304-
}
305-
}
306-
307289
///|
308290
fn is_filter_placeholder(
309291
name : String,

untyped_ast/normalize.mbt

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
///|
2+
pub fn Node::normalized_long_ident(self : Node) -> String? {
3+
match self.kind {
4+
LongIdent_Ident => normalize_leaf_string_child(self, "value")
5+
LongIdent_Dot =>
6+
match
7+
(
8+
normalize_leaf_string_child(self, "pkg"),
9+
normalize_leaf_string_child(self, "id"),
10+
) {
11+
(Some(pkg), Some(id)) => Some("@\{pkg}.\{id}")
12+
_ => None
13+
}
14+
_ => None
15+
}
16+
}
17+
18+
///|
19+
pub fn Node::normalized_var_name(self : Node) -> String? {
20+
guard self.kind == Var else { return None }
21+
guard normalize_child(self, "name") is Some(name) else { return None }
22+
name.normalized_long_ident()
23+
}
24+
25+
///|
26+
pub fn Node::normalized_binder_name(self : Node) -> String? {
27+
guard self.kind == Binder else { return None }
28+
normalize_leaf_string_child(self, "name")
29+
}
30+
31+
///|
32+
pub fn Node::normalized_label_name(self : Node) -> String? {
33+
guard self.kind == Label else { return None }
34+
normalize_leaf_string_child(self, "name")
35+
}
36+
37+
///|
38+
pub fn Node::normalized_expr_identifier_name(self : Node) -> String? {
39+
guard self.kind == Expr_Ident else { return None }
40+
guard normalize_child(self, "id") is Some(var_node) else { return None }
41+
var_node.normalized_var_name()
42+
}
43+
44+
///|
45+
pub fn Node::normalized_pattern_identifier_name(self : Node) -> String? {
46+
guard self.kind == Pattern_Var else { return None }
47+
guard normalize_first_child(self) is Some(binder) else { return None }
48+
binder.normalized_binder_name()
49+
}
50+
51+
///|
52+
fn normalize_child(node : Node, name : String) -> Node? {
53+
for entry in node.children {
54+
let (child_name, value) = entry
55+
if child_name == Some(name) {
56+
return Some(value)
57+
}
58+
}
59+
None
60+
}
61+
62+
///|
63+
fn normalize_leaf_string(node : Node) -> String? {
64+
match node.kind {
65+
Leaf(PString(value)) => Some(value)
66+
_ => None
67+
}
68+
}
69+
70+
///|
71+
fn normalize_leaf_string_child(node : Node, name : String) -> String? {
72+
if normalize_child(node, name) is Some(value) {
73+
normalize_leaf_string(value)
74+
} else {
75+
None
76+
}
77+
}
78+
79+
///|
80+
fn normalize_first_child(node : Node) -> Node? {
81+
if node.children.length() == 0 {
82+
None
83+
} else {
84+
let (_, value) = node.children[0]
85+
Some(value)
86+
}
87+
}

untyped_ast/pkg.generated.mbti

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ pub(all) struct Node {
3232
children : FixedArray[(String?, Node)]
3333
} derive(@debug.Debug)
3434
pub fn Node::contains_unshadowed(Self, id~ : String) -> Bool
35+
pub fn Node::normalized_binder_name(Self) -> String?
36+
pub fn Node::normalized_expr_identifier_name(Self) -> String?
37+
pub fn Node::normalized_label_name(Self) -> String?
38+
pub fn Node::normalized_long_ident(Self) -> String?
39+
pub fn Node::normalized_pattern_identifier_name(Self) -> String?
40+
pub fn Node::normalized_var_name(Self) -> String?
3541
pub fn Node::to_json(Self) -> Json
3642
pub impl ToJson for Node
3743

0 commit comments

Comments
 (0)