1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//! Reserved-identifier rejection for procedure names and procedure
//! argument names — the two `.cstack` ident sites `procedure/types.rs`
//! feeds unguarded into `cratestack_macros::shared::ident` at codegen time
//! (`ident(&to_snake_case(&procedure.name))`, `ident(&arg.name)`). Split
//! out of `mod.rs` to keep that file under the crate's ~200-LoC
//! convention; see [`super::reserved_idents::validate_reserved_identifier`]
//! for the shared check itself.
use cratestack_core::{Procedure, TypeArity};
use crate::diagnostics::SchemaError;
use crate::validate::builder_setter_collisions::{
validate_no_add_setter_collision, validate_no_build_setter_collision,
};
use crate::validate::reserved_idents::validate_reserved_identifier;
pub(super) fn validate_procedure_idents(procedure: &Procedure) -> Result<(), SchemaError> {
validate_reserved_identifier(
&procedure.name,
procedure.name_span,
&format!("procedure `{}`", procedure.name),
)?;
for arg in &procedure.args {
validate_reserved_identifier(
&arg.name,
arg.name_span,
&format!(
"procedure argument `{}` on procedure `{}`",
arg.name, procedure.name
),
)?;
}
// Procedure `Args` are struct-shaped and builder-backed too (see
// `cratestack-macros/src/procedure/types.rs`) — same `build`/
// `set_build` collision as any other builder-backed field set.
validate_no_build_setter_collision(
procedure
.args
.iter()
.map(|arg| (arg.name.as_str(), arg.name_span)),
"procedure",
&procedure.name,
)?;
validate_no_add_setter_collision(
procedure.args.iter().map(|arg| {
(
arg.name.as_str(),
arg.name_span,
matches!(arg.ty.arity, TypeArity::List),
)
}),
"procedure",
&procedure.name,
)?;
Ok(())
}