microsoft/qdk

Public

mirrored from https://github.com/microsoft/qdkAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
billt/revert-mimalloc

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

compiler/qsc_hir/src/mut_visit.rs

230lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use crate::hir::{
5 Block, CallableDecl, Expr, ExprKind, Ident, Item, ItemKind, Package, Pat, PatKind, QubitInit,
6 QubitInitKind, SpecBody, SpecDecl, Stmt, StmtKind, StringComponent,
7};
8use qsc_data_structures::span::Span;
9
10pub trait MutVisitor: Sized {
11 fn visit_package(&mut self, package: &mut Package) {
12 walk_package(self, package);
13 }
14
15 fn visit_item(&mut self, item: &mut Item) {
16 walk_item(self, item);
17 }
18
19 fn visit_callable_decl(&mut self, decl: &mut CallableDecl) {
20 walk_callable_decl(self, decl);
21 }
22
23 fn visit_spec_decl(&mut self, decl: &mut SpecDecl) {
24 walk_spec_decl(self, decl);
25 }
26
27 fn visit_block(&mut self, block: &mut Block) {
28 walk_block(self, block);
29 }
30
31 fn visit_stmt(&mut self, stmt: &mut Stmt) {
32 walk_stmt(self, stmt);
33 }
34
35 fn visit_expr(&mut self, expr: &mut Expr) {
36 walk_expr(self, expr);
37 }
38
39 fn visit_pat(&mut self, pat: &mut Pat) {
40 walk_pat(self, pat);
41 }
42
43 fn visit_qubit_init(&mut self, init: &mut QubitInit) {
44 walk_qubit_init(self, init);
45 }
46
47 fn visit_ident(&mut self, ident: &mut Ident) {
48 walk_ident(self, ident);
49 }
50
51 fn visit_span(&mut self, _: &mut Span) {}
52}
53
54pub fn walk_package(vis: &mut impl MutVisitor, package: &mut Package) {
55 package.items.values_mut().for_each(|i| vis.visit_item(i));
56 package.stmts.iter_mut().for_each(|s| vis.visit_stmt(s));
57 package.entry.iter_mut().for_each(|e| vis.visit_expr(e));
58}
59
60pub fn walk_item(vis: &mut impl MutVisitor, item: &mut Item) {
61 vis.visit_span(&mut item.span);
62
63 match &mut item.kind {
64 ItemKind::Callable(decl) => vis.visit_callable_decl(decl),
65 ItemKind::Namespace(name, _) | ItemKind::Ty(name, _) => vis.visit_ident(name),
66 }
67}
68
69pub fn walk_callable_decl(vis: &mut impl MutVisitor, decl: &mut CallableDecl) {
70 vis.visit_span(&mut decl.span);
71 vis.visit_ident(&mut decl.name);
72 vis.visit_pat(&mut decl.input);
73 vis.visit_spec_decl(&mut decl.body);
74 decl.adj
75 .iter_mut()
76 .for_each(|spec| vis.visit_spec_decl(spec));
77 decl.ctl
78 .iter_mut()
79 .for_each(|spec| vis.visit_spec_decl(spec));
80 decl.ctl_adj
81 .iter_mut()
82 .for_each(|spec| vis.visit_spec_decl(spec));
83}
84
85pub fn walk_spec_decl(vis: &mut impl MutVisitor, decl: &mut SpecDecl) {
86 vis.visit_span(&mut decl.span);
87
88 match &mut decl.body {
89 SpecBody::Gen(_) => {}
90 SpecBody::Impl(pat, block) => {
91 pat.iter_mut().for_each(|pat| vis.visit_pat(pat));
92 vis.visit_block(block);
93 }
94 }
95}
96
97pub fn walk_block(vis: &mut impl MutVisitor, block: &mut Block) {
98 vis.visit_span(&mut block.span);
99 block.stmts.iter_mut().for_each(|s| vis.visit_stmt(s));
100}
101
102pub fn walk_stmt(vis: &mut impl MutVisitor, stmt: &mut Stmt) {
103 vis.visit_span(&mut stmt.span);
104
105 match &mut stmt.kind {
106 StmtKind::Item(_) => {}
107 StmtKind::Expr(expr) | StmtKind::Semi(expr) => vis.visit_expr(expr),
108 StmtKind::Local(_, pat, value) => {
109 vis.visit_pat(pat);
110 vis.visit_expr(value);
111 }
112 StmtKind::Qubit(_, pat, init, block) => {
113 vis.visit_pat(pat);
114 vis.visit_qubit_init(init);
115 block.iter_mut().for_each(|b| vis.visit_block(b));
116 }
117 }
118}
119
120pub fn walk_expr(vis: &mut impl MutVisitor, expr: &mut Expr) {
121 vis.visit_span(&mut expr.span);
122
123 match &mut expr.kind {
124 ExprKind::Array(exprs) => exprs.iter_mut().for_each(|e| vis.visit_expr(e)),
125 ExprKind::ArrayRepeat(item, size) => {
126 vis.visit_expr(item);
127 vis.visit_expr(size);
128 }
129 ExprKind::Assign(lhs, rhs)
130 | ExprKind::AssignOp(_, lhs, rhs)
131 | ExprKind::BinOp(_, lhs, rhs) => {
132 vis.visit_expr(lhs);
133 vis.visit_expr(rhs);
134 }
135 ExprKind::AssignField(record, _, replace) | ExprKind::UpdateField(record, _, replace) => {
136 vis.visit_expr(record);
137 vis.visit_expr(replace);
138 }
139 ExprKind::AssignIndex(array, index, replace) => {
140 vis.visit_expr(array);
141 vis.visit_expr(index);
142 vis.visit_expr(replace);
143 }
144 ExprKind::Block(block) => vis.visit_block(block),
145 ExprKind::Call(callee, arg) => {
146 vis.visit_expr(callee);
147 vis.visit_expr(arg);
148 }
149 ExprKind::Conjugate(within, apply) => {
150 vis.visit_block(within);
151 vis.visit_block(apply);
152 }
153 ExprKind::Fail(msg) => vis.visit_expr(msg),
154 ExprKind::Field(record, _) => vis.visit_expr(record),
155 ExprKind::For(pat, iter, block) => {
156 vis.visit_pat(pat);
157 vis.visit_expr(iter);
158 vis.visit_block(block);
159 }
160 ExprKind::If(cond, body, otherwise) => {
161 vis.visit_expr(cond);
162 vis.visit_expr(body);
163 otherwise.iter_mut().for_each(|e| vis.visit_expr(e));
164 }
165 ExprKind::Index(array, index) => {
166 vis.visit_expr(array);
167 vis.visit_expr(index);
168 }
169 ExprKind::Return(expr) | ExprKind::UnOp(_, expr) => {
170 vis.visit_expr(expr);
171 }
172 ExprKind::Range(start, step, end) => {
173 start.iter_mut().for_each(|s| vis.visit_expr(s));
174 step.iter_mut().for_each(|s| vis.visit_expr(s));
175 end.iter_mut().for_each(|e| vis.visit_expr(e));
176 }
177 ExprKind::Repeat(body, until, fixup) => {
178 vis.visit_block(body);
179 vis.visit_expr(until);
180 fixup.iter_mut().for_each(|f| vis.visit_block(f));
181 }
182 ExprKind::String(components) => {
183 for component in components {
184 match component {
185 StringComponent::Expr(expr) => vis.visit_expr(expr),
186 StringComponent::Lit(_) => {}
187 }
188 }
189 }
190 ExprKind::UpdateIndex(e1, e2, e3) => {
191 vis.visit_expr(e1);
192 vis.visit_expr(e2);
193 vis.visit_expr(e3);
194 }
195 ExprKind::Tuple(exprs) => exprs.iter_mut().for_each(|e| vis.visit_expr(e)),
196 ExprKind::While(cond, block) => {
197 vis.visit_expr(cond);
198 vis.visit_block(block);
199 }
200 ExprKind::Closure(_, _)
201 | ExprKind::Err
202 | ExprKind::Hole
203 | ExprKind::Lit(_)
204 | ExprKind::Var(_, _) => {}
205 }
206}
207
208pub fn walk_pat(vis: &mut impl MutVisitor, pat: &mut Pat) {
209 vis.visit_span(&mut pat.span);
210
211 match &mut pat.kind {
212 PatKind::Bind(name) => vis.visit_ident(name),
213 PatKind::Discard | PatKind::Err => {}
214 PatKind::Tuple(pats) => pats.iter_mut().for_each(|p| vis.visit_pat(p)),
215 }
216}
217
218pub fn walk_qubit_init(vis: &mut impl MutVisitor, init: &mut QubitInit) {
219 vis.visit_span(&mut init.span);
220
221 match &mut init.kind {
222 QubitInitKind::Array(len) => vis.visit_expr(len),
223 QubitInitKind::Single | QubitInitKind::Err => {}
224 QubitInitKind::Tuple(inits) => inits.iter_mut().for_each(|i| vis.visit_qubit_init(i)),
225 }
226}
227
228pub fn walk_ident(vis: &mut impl MutVisitor, ident: &mut Ident) {
229 vis.visit_span(&mut ident.span);
230}
231