blob: d5bb33f74001e7cdee9f8ef1808ef0190042bd42 [file] [log] [blame]
David Tolnay7db73692019-10-20 14:51:12 -04001use crate::syntax::{error, Api};
2use proc_macro2::Ident;
3use syn::{Error, Result};
4
5pub(crate) fn check(ident: &Ident) -> Result<()> {
6 let s = ident.to_string();
7 if s.contains("__") {
8 Err(Error::new(ident.span(), error::DOUBLE_UNDERSCORE.msg))
9 } else if s.starts_with("cxxbridge") {
10 Err(Error::new(ident.span(), error::CXXBRIDGE_RESERVED.msg))
11 } else {
12 Ok(())
13 }
14}
15
16pub(crate) fn check_all(apis: &[Api], errors: &mut Vec<Error>) {
17 for api in apis {
18 match api {
19 Api::Include(_) => {}
20 Api::Struct(strct) => {
21 errors.extend(check(&strct.ident).err());
22 for field in &strct.fields {
23 errors.extend(check(&field.ident).err());
24 }
25 }
Joel Galensonc03402a2020-04-23 17:31:09 -070026 Api::Enum(enm) => {
27 errors.extend(check(&enm.ident).err());
28 for variant in &enm.variants {
29 errors.extend(check(&variant.ident).err());
30 }
31 }
David Tolnay7db73692019-10-20 14:51:12 -040032 Api::CxxType(ety) | Api::RustType(ety) => {
33 errors.extend(check(&ety.ident).err());
34 }
35 Api::CxxFunction(efn) | Api::RustFunction(efn) => {
36 errors.extend(check(&efn.ident).err());
37 for arg in &efn.args {
38 errors.extend(check(&arg.ident).err());
39 }
40 }
41 }
42 }
43}