slicec/validators/
structs.rs1use crate::diagnostics::{Diagnostic, Diagnostics, Error};
4use crate::grammar::*;
5
6pub fn validate_struct(struct_def: &Struct, diagnostics: &mut Diagnostics) {
7 validate_compact_struct_not_empty(struct_def, diagnostics);
8 compact_structs_cannot_contain_tags(struct_def, diagnostics);
9}
10fn validate_compact_struct_not_empty(struct_def: &Struct, diagnostics: &mut Diagnostics) {
11 if struct_def.is_compact && struct_def.fields().is_empty() {
13 Diagnostic::new(Error::CompactStructCannotBeEmpty)
14 .set_span(struct_def.span())
15 .push_into(diagnostics);
16 }
17}
18
19fn compact_structs_cannot_contain_tags(struct_def: &Struct, diagnostics: &mut Diagnostics) {
21 if struct_def.is_compact {
22 for field in struct_def.fields() {
23 if field.is_tagged() {
24 Diagnostic::new(Error::CompactTypeCannotContainTaggedFields {
25 kind: struct_def.kind(),
26 })
27 .set_span(field.span())
28 .add_note(
29 format!("struct '{}' is declared compact here", struct_def.identifier()),
30 Some(struct_def.span()),
31 )
32 .push_into(diagnostics);
33 }
34 }
35 }
36}