blob: 7545e92ce0b8d472175996b0213d77fbe1024dfc [file] [log] [blame]
David Tolnaya83301c2020-04-30 20:32:37 -07001use crate::syntax::check::Check;
David Tolnay6b6423e2020-04-30 20:46:24 -07002use crate::syntax::namespace::Namespace;
David Tolnay7db73692019-10-20 14:51:12 -04003use crate::syntax::{error, Api};
4use proc_macro2::Ident;
David Tolnay7db73692019-10-20 14:51:12 -04005
David Tolnay6b6423e2020-04-30 20:46:24 -07006fn check(cx: &mut Check, ident: &Ident) {
David Tolnay7db73692019-10-20 14:51:12 -04007 let s = ident.to_string();
David Tolnaya83301c2020-04-30 20:32:37 -07008 if s.starts_with("cxxbridge") {
9 cx.error(ident, error::CXXBRIDGE_RESERVED.msg);
10 }
David Tolnay7db73692019-10-20 14:51:12 -040011 if s.contains("__") {
David Tolnaya83301c2020-04-30 20:32:37 -070012 cx.error(ident, error::DOUBLE_UNDERSCORE.msg);
David Tolnay7db73692019-10-20 14:51:12 -040013 }
14}
15
David Tolnay6b6423e2020-04-30 20:46:24 -070016pub(crate) fn check_all(cx: &mut Check, namespace: &Namespace, apis: &[Api]) {
17 for segment in namespace {
18 check(cx, segment);
19 }
20
David Tolnay7db73692019-10-20 14:51:12 -040021 for api in apis {
22 match api {
23 Api::Include(_) => {}
24 Api::Struct(strct) => {
David Tolnaya83301c2020-04-30 20:32:37 -070025 check(cx, &strct.ident);
David Tolnay7db73692019-10-20 14:51:12 -040026 for field in &strct.fields {
David Tolnaya83301c2020-04-30 20:32:37 -070027 check(cx, &field.ident);
David Tolnay7db73692019-10-20 14:51:12 -040028 }
29 }
Joel Galensonc03402a2020-04-23 17:31:09 -070030 Api::Enum(enm) => {
David Tolnaya83301c2020-04-30 20:32:37 -070031 check(cx, &enm.ident);
Joel Galensonc03402a2020-04-23 17:31:09 -070032 for variant in &enm.variants {
David Tolnaya83301c2020-04-30 20:32:37 -070033 check(cx, &variant.ident);
Joel Galensonc03402a2020-04-23 17:31:09 -070034 }
35 }
David Tolnay7db73692019-10-20 14:51:12 -040036 Api::CxxType(ety) | Api::RustType(ety) => {
David Tolnaya83301c2020-04-30 20:32:37 -070037 check(cx, &ety.ident);
David Tolnay7db73692019-10-20 14:51:12 -040038 }
39 Api::CxxFunction(efn) | Api::RustFunction(efn) => {
David Tolnaya83301c2020-04-30 20:32:37 -070040 check(cx, &efn.ident);
David Tolnay7db73692019-10-20 14:51:12 -040041 for arg in &efn.args {
David Tolnaya83301c2020-04-30 20:32:37 -070042 check(cx, &arg.ident);
David Tolnay7db73692019-10-20 14:51:12 -040043 }
44 }
David Tolnay3118fa62020-05-07 17:10:39 -070045 Api::TypeAlias(alias) => {
46 check(cx, &alias.ident);
47 }
David Tolnay7db73692019-10-20 14:51:12 -040048 }
49 }
50}