1use crate::gen::out::{Content, OutFile};
2use std::collections::BTreeSet;
3
4#[derive(Default)]
5pub(crate) struct Pragma<'a> {
6 pub gnu_diagnostic_ignore: BTreeSet<&'a str>,
7 pub clang_diagnostic_ignore: BTreeSet<&'a str>,
8 pub dollar_in_identifier: bool,
9 pub begin: Content<'a>,
10 pub end: Content<'a>,
11}
12
13impl<'a> Pragma<'a> {
14 pub fn new() -> Self {
15 Pragma::default()
16 }
17}
18
19pub(super) fn write(out: &mut OutFile) {
20 if out.pragma.dollar_in_identifier {
21 out.pragma
22 .clang_diagnostic_ignore
23 .insert("-Wdollar-in-identifier-extension");
24 }
25
26 let begin = &mut out.pragma.begin;
27 if !out.pragma.gnu_diagnostic_ignore.is_empty() {
28 writeln!(begin, "#ifdef __GNUC__");
29 if out.header {
30 writeln!(begin, "#pragma GCC diagnostic push");
31 }
32 for diag in &out.pragma.gnu_diagnostic_ignore {
33 writeln!(begin, "#pragma GCC diagnostic ignored \"{diag}\"");
34 }
35 }
36 if !out.pragma.clang_diagnostic_ignore.is_empty() {
37 writeln!(begin, "#ifdef __clang__");
38 if out.header && out.pragma.gnu_diagnostic_ignore.is_empty() {
39 writeln!(begin, "#pragma clang diagnostic push");
40 }
41 for diag in &out.pragma.clang_diagnostic_ignore {
42 writeln!(begin, "#pragma clang diagnostic ignored \"{diag}\"");
43 }
44 writeln!(begin, "#endif // __clang__");
45 }
46 if !out.pragma.gnu_diagnostic_ignore.is_empty() {
47 writeln!(begin, "#endif // __GNUC__");
48 }
49
50 if out.header {
51 let end = &mut out.pragma.end;
52 if !out.pragma.gnu_diagnostic_ignore.is_empty() {
53 writeln!(end, "#ifdef __GNUC__");
54 writeln!(end, "#pragma GCC diagnostic pop");
55 writeln!(end, "#endif // __GNUC__");
56 } else if !out.pragma.clang_diagnostic_ignore.is_empty() {
57 writeln!(end, "#ifdef __clang__");
58 writeln!(end, "#pragma clang diagnostic pop");
59 writeln!(end, "#endif // __clang__");
60 }
61 }
62}