microsoft/qdk

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v1.19.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

source/compiler/qsc_ast/src/assigner.rs

138lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use crate::{
5 ast::{
6 Attr, Block, CallableDecl, Expr, FieldAssign, FunctorExpr, Ident, Item, Namespace, NodeId,
7 Package, Pat, Path, QubitInit, SpecDecl, Stmt, Ty, TyDef,
8 },
9 mut_visit::{self, MutVisitor},
10};
11
12#[derive(Debug)]
13pub struct Assigner {
14 next_id: NodeId,
15}
16
17impl Assigner {
18 #[must_use]
19 pub fn new() -> Self {
20 Self {
21 next_id: NodeId::FIRST,
22 }
23 }
24
25 pub fn next_id(&mut self) -> NodeId {
26 let id = self.next_id;
27 self.next_id = self.next_id.successor();
28 id
29 }
30
31 fn assign(&mut self, id: &mut NodeId) {
32 if id.is_default() {
33 *id = self.next_id();
34 }
35 }
36}
37
38impl Default for Assigner {
39 fn default() -> Self {
40 Self::new()
41 }
42}
43
44impl MutVisitor for Assigner {
45 fn visit_package(&mut self, package: &mut Package) {
46 self.assign(&mut package.id);
47 mut_visit::walk_package(self, package);
48 }
49
50 fn visit_namespace(&mut self, namespace: &mut Namespace) {
51 self.assign(&mut namespace.id);
52 mut_visit::walk_namespace(self, namespace);
53 }
54
55 fn visit_item(&mut self, item: &mut Item) {
56 self.assign(&mut item.id);
57 mut_visit::walk_item(self, item);
58 }
59
60 fn visit_attr(&mut self, attr: &mut Attr) {
61 self.assign(&mut attr.id);
62 mut_visit::walk_attr(self, attr);
63 }
64
65 fn visit_ty_def(&mut self, def: &mut TyDef) {
66 self.assign(&mut def.id);
67 mut_visit::walk_ty_def(self, def);
68 }
69
70 fn visit_callable_decl(&mut self, decl: &mut CallableDecl) {
71 self.assign(&mut decl.id);
72 mut_visit::walk_callable_decl(self, decl);
73 }
74
75 fn visit_struct_decl(&mut self, decl: &mut crate::ast::StructDecl) {
76 self.assign(&mut decl.id);
77 mut_visit::walk_struct_decl(self, decl);
78 }
79
80 fn visit_field_def(&mut self, def: &mut crate::ast::FieldDef) {
81 self.assign(&mut def.id);
82 mut_visit::walk_field_def(self, def);
83 }
84
85 fn visit_spec_decl(&mut self, decl: &mut SpecDecl) {
86 self.assign(&mut decl.id);
87 mut_visit::walk_spec_decl(self, decl);
88 }
89
90 fn visit_functor_expr(&mut self, expr: &mut FunctorExpr) {
91 self.assign(&mut expr.id);
92 mut_visit::walk_functor_expr(self, expr);
93 }
94
95 fn visit_ty(&mut self, ty: &mut Ty) {
96 self.assign(&mut ty.id);
97 mut_visit::walk_ty(self, ty);
98 }
99
100 fn visit_block(&mut self, block: &mut Block) {
101 self.assign(&mut block.id);
102 mut_visit::walk_block(self, block);
103 }
104
105 fn visit_stmt(&mut self, stmt: &mut Stmt) {
106 self.assign(&mut stmt.id);
107 mut_visit::walk_stmt(self, stmt);
108 }
109
110 fn visit_expr(&mut self, expr: &mut Expr) {
111 self.assign(&mut expr.id);
112 mut_visit::walk_expr(self, expr);
113 }
114
115 fn visit_field_assign(&mut self, assign: &mut FieldAssign) {
116 self.assign(&mut assign.id);
117 mut_visit::walk_field_assign(self, assign);
118 }
119
120 fn visit_pat(&mut self, pat: &mut Pat) {
121 self.assign(&mut pat.id);
122 mut_visit::walk_pat(self, pat);
123 }
124
125 fn visit_qubit_init(&mut self, init: &mut QubitInit) {
126 self.assign(&mut init.id);
127 mut_visit::walk_qubit_init(self, init);
128 }
129
130 fn visit_path(&mut self, path: &mut Path) {
131 self.assign(&mut path.id);
132 mut_visit::walk_path(self, path);
133 }
134
135 fn visit_ident(&mut self, ident: &mut Ident) {
136 self.assign(&mut ident.id);
137 }
138}
139