microsoft/qdk

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
e874bfb8e1dbfc3eec7aebe87f45fc0cb4c547b6

Branches

Tags

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

Clone

HTTPS

Download ZIP

compiler/qsc/src/interpret/debug.rs

91lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4#[cfg(test)]
5mod tests;
6
7use qsc_eval::debug::Frame;
8use qsc_fir::fir::{Global, PackageStoreLookup, StoreItemId};
9use qsc_frontend::compile::PackageStore;
10use qsc_hir::hir;
11use qsc_hir::hir::{Item, ItemKind};
12use qsc_lowerer::map_fir_package_to_hir;
13
14#[must_use]
15pub(crate) fn format_call_stack(
16 store: &PackageStore,
17 globals: &impl PackageStoreLookup,
18 frames: Vec<Frame>,
19 error: &dyn std::error::Error,
20) -> String {
21 let mut trace = String::new();
22 trace.push_str(&format!("Error: {error}\n"));
23 trace.push_str("Call stack:\n");
24
25 let mut frames = frames;
26 frames.reverse();
27
28 for frame in frames {
29 let Some(Global::Callable(call)) = globals.get_global(frame.id) else {
30 panic!("missing global");
31 };
32
33 trace.push_str(" at ");
34 if frame.functor.adjoint {
35 trace.push_str("Adjoint ");
36 }
37 if frame.functor.controlled > 0 {
38 trace.push_str(&format!("Controlled({}) ", frame.functor.controlled));
39 }
40 if let Some(item) = get_item_parent(store, frame.id) {
41 if let Some(ns) = get_ns_name(&item) {
42 trace.push_str(&format!("{ns}."));
43 }
44 }
45 trace.push_str(&format!("{}", call.name.name));
46
47 let name = get_item_file_name(store, frame.id);
48 trace.push_str(&format!(
49 " in {}",
50 name.unwrap_or("<expression>".to_string())
51 ));
52
53 trace.push('\n');
54 }
55 trace
56}
57
58#[must_use]
59fn get_item_parent(store: &PackageStore, id: StoreItemId) -> Option<Item> {
60 let package = map_fir_package_to_hir(id.package);
61 let item = hir::LocalItemId::from(usize::from(id.item));
62 store.get(package).and_then(|unit| {
63 let item = unit.package.items.get(item)?;
64 if let Some(parent) = item.parent {
65 let parent = unit.package.items.get(parent)?;
66 Some(parent.clone())
67 } else {
68 None
69 }
70 })
71}
72
73#[must_use]
74fn get_item_file_name(store: &PackageStore, id: StoreItemId) -> Option<String> {
75 let package = map_fir_package_to_hir(id.package);
76 let item = hir::LocalItemId::from(usize::from(id.item));
77 store.get(package).and_then(|unit| {
78 let item = unit.package.items.get(item)?;
79 let source = unit.sources.find_by_offset(item.span.lo);
80 source.map(|s| s.name.to_string())
81 })
82}
83
84#[must_use]
85fn get_ns_name(item: &Item) -> Option<String> {
86 if let ItemKind::Namespace(ns, _) = &item.kind {
87 Some(ns.name.to_string())
88 } else {
89 None
90 }
91}
92