cxx_gen/gen/
pragma.rs

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}