microsoft/qdk

Public

mirrored fromhttps://github.com/microsoft/qdkAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
alex/telemmocks

Branches

Tags

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

Clone

HTTPS

Download ZIP

compiler/qsc_ast/src/validate.rs

125lines · 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 visit::{self, Visitor},
10};
11use qsc_data_structures::index_map::IndexMap;
12use std::fmt::Display;
13
14#[derive(Default)]
15pub struct Validator {
16 ids: IndexMap<NodeId, ()>,
17}
18
19impl Validator {
20 fn check(&mut self, id: NodeId, node: impl Display) {
21 if id.is_default() {
22 panic!("default node ID should be replaced: {node}")
23 } else if self.ids.contains_key(id) {
24 panic!("duplicate node ID: {node}");
25 } else {
26 self.ids.insert(id, ());
27 }
28 }
29}
30
31impl Visitor<'_> for Validator {
32 fn visit_package(&mut self, package: &Package) {
33 self.check(package.id, package);
34 visit::walk_package(self, package);
35 }
36
37 fn visit_namespace(&mut self, namespace: &Namespace) {
38 self.check(namespace.id, namespace);
39 visit::walk_namespace(self, namespace);
40 }
41
42 fn visit_item(&mut self, item: &Item) {
43 self.check(item.id, item);
44 visit::walk_item(self, item);
45 }
46
47 fn visit_attr(&mut self, attr: &Attr) {
48 self.check(attr.id, attr);
49 visit::walk_attr(self, attr);
50 }
51
52 fn visit_ty_def(&mut self, def: &TyDef) {
53 self.check(def.id, def);
54 visit::walk_ty_def(self, def);
55 }
56
57 fn visit_callable_decl(&mut self, decl: &CallableDecl) {
58 self.check(decl.id, decl);
59 visit::walk_callable_decl(self, decl);
60 }
61
62 fn visit_struct_decl(&mut self, decl: &'_ crate::ast::StructDecl) {
63 self.check(decl.id, decl);
64 visit::walk_struct_decl(self, decl);
65 }
66
67 fn visit_field_def(&mut self, def: &'_ crate::ast::FieldDef) {
68 self.check(def.id, def);
69 visit::walk_field_def(self, def);
70 }
71
72 fn visit_spec_decl(&mut self, decl: &SpecDecl) {
73 self.check(decl.id, decl);
74 visit::walk_spec_decl(self, decl);
75 }
76
77 fn visit_functor_expr(&mut self, expr: &FunctorExpr) {
78 self.check(expr.id, expr);
79 visit::walk_functor_expr(self, expr);
80 }
81
82 fn visit_ty(&mut self, ty: &Ty) {
83 self.check(ty.id, ty);
84 visit::walk_ty(self, ty);
85 }
86
87 fn visit_block(&mut self, block: &Block) {
88 self.check(block.id, block);
89 visit::walk_block(self, block);
90 }
91
92 fn visit_stmt(&mut self, stmt: &Stmt) {
93 self.check(stmt.id, stmt);
94 visit::walk_stmt(self, stmt);
95 }
96
97 fn visit_expr(&mut self, expr: &Expr) {
98 self.check(expr.id, expr);
99 visit::walk_expr(self, expr);
100 }
101
102 fn visit_field_assign(&mut self, assign: &FieldAssign) {
103 self.check(assign.id, assign);
104 visit::walk_field_assign(self, assign);
105 }
106
107 fn visit_pat(&mut self, pat: &Pat) {
108 self.check(pat.id, pat);
109 visit::walk_pat(self, pat);
110 }
111
112 fn visit_qubit_init(&mut self, init: &QubitInit) {
113 self.check(init.id, init);
114 visit::walk_qubit_init(self, init);
115 }
116
117 fn visit_path(&mut self, path: &Path) {
118 self.check(path.id, path);
119 visit::walk_path(self, path);
120 }
121
122 fn visit_ident(&mut self, ident: &Ident) {
123 self.check(ident.id, ident);
124 }
125}
126