microsoft/qdk

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v1.2.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

compiler/qsc_ast/src/assigner.rs

127lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use crate::{
5 ast::{
6 Attr, Block, CallableDecl, Expr, FunctorExpr, Ident, Item, Namespace, NodeId, Package, Pat,
7 Path, QubitInit, SpecDecl, Stmt, Ty, TyDef, Visibility,
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_visibility(&mut self, visibility: &mut Visibility) {
66 self.assign(&mut visibility.id);
67 }
68
69 fn visit_ty_def(&mut self, def: &mut TyDef) {
70 self.assign(&mut def.id);
71 mut_visit::walk_ty_def(self, def);
72 }
73
74 fn visit_callable_decl(&mut self, decl: &mut CallableDecl) {
75 self.assign(&mut decl.id);
76 mut_visit::walk_callable_decl(self, decl);
77 }
78
79 fn visit_spec_decl(&mut self, decl: &mut SpecDecl) {
80 self.assign(&mut decl.id);
81 mut_visit::walk_spec_decl(self, decl);
82 }
83
84 fn visit_functor_expr(&mut self, expr: &mut FunctorExpr) {
85 self.assign(&mut expr.id);
86 mut_visit::walk_functor_expr(self, expr);
87 }
88
89 fn visit_ty(&mut self, ty: &mut Ty) {
90 self.assign(&mut ty.id);
91 mut_visit::walk_ty(self, ty);
92 }
93
94 fn visit_block(&mut self, block: &mut Block) {
95 self.assign(&mut block.id);
96 mut_visit::walk_block(self, block);
97 }
98
99 fn visit_stmt(&mut self, stmt: &mut Stmt) {
100 self.assign(&mut stmt.id);
101 mut_visit::walk_stmt(self, stmt);
102 }
103
104 fn visit_expr(&mut self, expr: &mut Expr) {
105 self.assign(&mut expr.id);
106 mut_visit::walk_expr(self, expr);
107 }
108
109 fn visit_pat(&mut self, pat: &mut Pat) {
110 self.assign(&mut pat.id);
111 mut_visit::walk_pat(self, pat);
112 }
113
114 fn visit_qubit_init(&mut self, init: &mut QubitInit) {
115 self.assign(&mut init.id);
116 mut_visit::walk_qubit_init(self, init);
117 }
118
119 fn visit_path(&mut self, path: &mut Path) {
120 self.assign(&mut path.id);
121 mut_visit::walk_path(self, path);
122 }
123
124 fn visit_ident(&mut self, ident: &mut Ident) {
125 self.assign(&mut ident.id);
126 }
127}
128