cxx_build/gen/
pragma.rs

1use crate::gen::out::{Content, OutFile};
2use std::collections::BTreeSet;
3
4#[derive(#[automatically_derived]
impl<'a> ::core::default::Default for Pragma<'a> {
    #[inline]
    fn default() -> Pragma<'a> {
        Pragma {
            gnu_diagnostic_ignore: ::core::default::Default::default(),
            clang_diagnostic_ignore: ::core::default::Default::default(),
            dollar_in_identifier: ::core::default::Default::default(),
            mismatched_new_delete: ::core::default::Default::default(),
            missing_declarations: ::core::default::Default::default(),
            return_type_c_linkage: ::core::default::Default::default(),
            begin: ::core::default::Default::default(),
            end: ::core::default::Default::default(),
        }
    }
}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 mismatched_new_delete: bool,
10    pub missing_declarations: bool,
11    pub return_type_c_linkage: bool,
12    pub begin: Content<'a>,
13    pub end: Content<'a>,
14}
15
16impl<'a> Pragma<'a> {
17    pub fn new() -> Self {
18        Pragma::default()
19    }
20}
21
22pub(super) fn write(out: &mut OutFile) {
23    let Pragma {
24        ref mut gnu_diagnostic_ignore,
25        ref mut clang_diagnostic_ignore,
26        dollar_in_identifier,
27        mismatched_new_delete,
28        missing_declarations,
29        return_type_c_linkage,
30        ref mut begin,
31        ref mut end,
32    } = out.pragma;
33
34    if dollar_in_identifier {
35        clang_diagnostic_ignore.insert("-Wdollar-in-identifier-extension");
36    }
37    if mismatched_new_delete {
38        gnu_diagnostic_ignore.insert("-Wmismatched-new-delete");
39    }
40    if missing_declarations {
41        gnu_diagnostic_ignore.insert("-Wmissing-declarations");
42    }
43    if return_type_c_linkage {
44        clang_diagnostic_ignore.insert("-Wreturn-type-c-linkage");
45    }
46    let gnu_diagnostic_ignore = &*gnu_diagnostic_ignore;
47    let clang_diagnostic_ignore = &*clang_diagnostic_ignore;
48
49    if !gnu_diagnostic_ignore.is_empty() {
50        begin.write_fmt(format_args!("#ifdef __GNUC__\n"));writeln!(begin, "#ifdef __GNUC__");
51        if out.header {
52            begin.write_fmt(format_args!("#pragma GCC diagnostic push\n"));writeln!(begin, "#pragma GCC diagnostic push");
53        }
54        for diag in gnu_diagnostic_ignore {
55            begin.write_fmt(format_args!("#pragma GCC diagnostic ignored \"{0}\"\n",
        diag));writeln!(begin, "#pragma GCC diagnostic ignored \"{diag}\"");
56        }
57    }
58    if !clang_diagnostic_ignore.is_empty() {
59        begin.write_fmt(format_args!("#ifdef __clang__\n"));writeln!(begin, "#ifdef __clang__");
60        if out.header && gnu_diagnostic_ignore.is_empty() {
61            begin.write_fmt(format_args!("#pragma clang diagnostic push\n"));writeln!(begin, "#pragma clang diagnostic push");
62        }
63        for diag in clang_diagnostic_ignore {
64            begin.write_fmt(format_args!("#pragma clang diagnostic ignored \"{0}\"\n",
        diag));writeln!(begin, "#pragma clang diagnostic ignored \"{diag}\"");
65        }
66        begin.write_fmt(format_args!("#endif // __clang__\n"));writeln!(begin, "#endif // __clang__");
67    }
68    if !gnu_diagnostic_ignore.is_empty() {
69        begin.write_fmt(format_args!("#endif // __GNUC__\n"));writeln!(begin, "#endif // __GNUC__");
70    }
71
72    if out.header {
73        if !gnu_diagnostic_ignore.is_empty() {
74            end.write_fmt(format_args!("#ifdef __GNUC__\n"));writeln!(end, "#ifdef __GNUC__");
75            end.write_fmt(format_args!("#pragma GCC diagnostic pop\n"));writeln!(end, "#pragma GCC diagnostic pop");
76            end.write_fmt(format_args!("#endif // __GNUC__\n"));writeln!(end, "#endif // __GNUC__");
77        } else if !clang_diagnostic_ignore.is_empty() {
78            end.write_fmt(format_args!("#ifdef __clang__\n"));writeln!(end, "#ifdef __clang__");
79            end.write_fmt(format_args!("#pragma clang diagnostic pop\n"));writeln!(end, "#pragma clang diagnostic pop");
80            end.write_fmt(format_args!("#endif // __clang__\n"));writeln!(end, "#endif // __clang__");
81        }
82    }
83}