in src/bindgen/language_backend/clike.rs [542:640]
fn write_struct<W: Write>(&mut self, out: &mut SourceWriter<W>, s: &Struct) {
let condition = s.cfg.to_condition(self.config);
condition.write_before(self.config, out);
self.write_documentation(out, &s.documentation);
if !s.is_enum_variant_body {
self.write_generic_param(out, &s.generic_params);
}
// The following results in
// C++ or C with Tag as style:
// struct Name {
// C with Type only style:
// typedef struct {
// C with Both as style:
// typedef struct Name {
if self.generate_typedef() {
out.write("typedef ");
}
out.write("struct");
if let Some(align) = s.alignment {
match align {
ReprAlign::Packed => {
if let Some(ref anno) = self.config.layout.packed {
write!(out, " {}", anno);
}
}
ReprAlign::Align(n) => {
if let Some(ref anno) = self.config.layout.aligned_n {
write!(out, " {}({})", anno, n);
}
}
}
}
if s.annotations.must_use(self.config) {
if let Some(ref anno) = self.config.structure.must_use {
write!(out, " {}", anno);
}
}
if let Some(note) = s
.annotations
.deprecated_note(self.config, DeprecatedNoteKind::Struct)
{
write!(out, " {}", note);
}
if self.config.language != Language::C || self.config.style.generate_tag() {
write!(out, " {}", s.export_name());
}
out.open_brace();
// Emit the pre_body section, if relevant
if let Some(body) = self.config.export.pre_body(&s.path) {
out.write_raw_block(body);
out.new_line();
}
out.write_vertical_source_list(self, &s.fields, ListType::Cap(";"), Self::write_field);
if self.config.language == Language::Cxx {
self.write_derived_cpp_ops(out, s);
}
// Emit the post_body section, if relevant
if let Some(body) = self.config.export.post_body(&s.path) {
out.new_line();
out.write_raw_block(body);
}
if self.config.language == Language::Cxx
&& self.config.structure.associated_constants_in_body
&& self.config.constant.allow_static_const
{
for constant in &s.associated_constants {
out.new_line();
constant.write_declaration(self.config, self, out, s);
}
}
if self.generate_typedef() {
out.close_brace(false);
write!(out, " {};", s.export_name());
} else {
out.close_brace(true);
}
for constant in &s.associated_constants {
out.new_line();
constant.write(self.config, self, out, Some(s));
}
condition.write_after(self.config, out);
}