slicec/validators/
structs.rs

1// Copyright (c) ZeroC, Inc.
2
3use 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    // Compact structs must be non-empty.
12    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
19/// Validate that tags cannot be used in compact structs.
20fn 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}