microsoft/qdk

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
minestarks-patch-1

Branches

Tags

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

Clone

HTTPS

Download ZIP

compiler/qsc_codegen/src/qsharp/test_utils.rs

79lines · modeblame

8bcde035Ian Davis2 years ago1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4#![allow(clippy::too_many_lines)]
5
6use std::sync::Arc;
7
8use expect_test::Expect;
9use qsc_ast::{ast::Package, mut_visit::MutVisitor};
da3795dcIan Davis2 years ago10use qsc_data_structures::{
11language_features::LanguageFeatures, span::Span, target::TargetCapabilityFlags,
12};
13use qsc_frontend::compile::{self, compile, PackageStore, SourceMap};
8bcde035Ian Davis2 years ago14use qsc_hir::hir::PackageId;
15use qsc_passes::{run_core_passes, run_default_passes, PackageType};
16
17use crate::qsharp::write_package_string;
18
19pub(crate) fn check(program: &str, expr: Option<&str>, expect: &Expect) {
20let (qsharp, src_ast_str) = compile_program(expr, program);
21expect.assert_eq(&qsharp);
22// Run the output against the compiler to ensure that input
23// and output both generate the same qsharp.
24let (round_trip_qsharp, gen_ast_str) = compile_program(expr, &qsharp);
25expect.assert_eq(&round_trip_qsharp);
26// we've validated the output, now validate the ASTs
27// We may have generated the same Q#, but may have changed semantics
28difference::assert_diff!(&src_ast_str, &gen_ast_str, "\n", 0);
29}
30
31pub(crate) fn get_compilation(sources: Option<SourceMap>) -> (PackageId, PackageStore) {
32let mut core = compile::core();
33assert!(run_core_passes(&mut core).is_empty());
34let mut store = PackageStore::new(core);
e874bfb8Ian Davis2 years ago35let mut std = compile::std(&store, TargetCapabilityFlags::empty());
308c5786Ian Davis2 years ago36assert!(run_default_passes(store.core(), &mut std, PackageType::Lib).is_empty());
8bcde035Ian Davis2 years ago37let std = store.insert(std);
38
39let mut unit = compile(
40&store,
18d5b5f5Alex Hansen1 years ago41&[(std, None)],
8bcde035Ian Davis2 years ago42sources.unwrap_or_default(),
e874bfb8Ian Davis2 years ago43TargetCapabilityFlags::all(),
8bcde035Ian Davis2 years ago44LanguageFeatures::empty(),
45);
46assert!(unit.errors.is_empty(), "{:?}", unit.errors);
308c5786Ian Davis2 years ago47assert!(run_default_passes(store.core(), &mut unit, PackageType::Lib,).is_empty());
8bcde035Ian Davis2 years ago48let package_id = store.insert(unit);
49(package_id, store)
50}
51
52pub(crate) fn compile_program(expr: Option<&str>, program: &str) -> (String, String) {
53let expr_as_arc: Option<Arc<str>> = expr.map(|s| Arc::from(s.to_string()));
54let sources = SourceMap::new([("test".into(), program.into())], expr_as_arc);
55
56let (package_id, store) = get_compilation(Some(sources));
57let package = &store.get(package_id).expect("package must exist");
58
59let despanned_ast = AstDespanner.despan(&package.ast.package);
60let qsharp = write_package_string(&despanned_ast);
61let ast = format!("{despanned_ast}");
62(qsharp, ast)
63}
64
65struct AstDespanner;
66impl AstDespanner {
67fn despan(&mut self, package: &Package) -> Package {
68let mut p = package.clone();
69self.visit_package(&mut p);
70p
71}
72}
73
74impl qsc_ast::mut_visit::MutVisitor for AstDespanner {
75fn visit_span(&mut self, span: &mut Span) {
76span.hi = 0;
77span.lo = 0;
78}
79}