blob: bb2281e7298c0b45b6f9afd5dcf524dd22544bfc [file] [log] [blame]
David Tolnaya83301c2020-04-30 20:32:37 -07001use crate::syntax::check::Check;
David Tolnay8faec772020-11-02 00:18:19 -08002use crate::syntax::{error, Api, Pair};
David Tolnay7db73692019-10-20 14:51:12 -04003
David Tolnay9f84fe82021-01-01 15:59:46 -08004fn check(cx: &mut Check, name: &Pair) {
David Tolnay8faec772020-11-02 00:18:19 -08005 for segment in &name.namespace {
David Tolnayed6ba4a2021-01-01 14:59:40 -08006 check_cxx_ident(cx, &segment.to_string());
David Tolnay6b6423e2020-04-30 20:46:24 -07007 }
David Tolnayed6ba4a2021-01-01 14:59:40 -08008 check_cxx_ident(cx, &name.cxx.to_string());
9 check_rust_ident(cx, &name.rust.to_string());
David Tolnay9f84fe82021-01-01 15:59:46 -080010
David Tolnayed6ba4a2021-01-01 14:59:40 -080011 fn check_cxx_ident(cx: &mut Check, ident: &str) {
12 if ident.starts_with("cxxbridge") {
David Tolnay9f84fe82021-01-01 15:59:46 -080013 cx.error(ident, error::CXXBRIDGE_RESERVED.msg);
14 }
David Tolnayed6ba4a2021-01-01 14:59:40 -080015 if ident.contains("__") {
David Tolnay9f84fe82021-01-01 15:59:46 -080016 cx.error(ident, error::DOUBLE_UNDERSCORE.msg);
17 }
18 }
19
David Tolnayed6ba4a2021-01-01 14:59:40 -080020 fn check_rust_ident(cx: &mut Check, ident: &str) {
21 if ident.starts_with("cxxbridge") {
David Tolnay9f84fe82021-01-01 15:59:46 -080022 cx.error(ident, error::CXXBRIDGE_RESERVED.msg);
23 }
24 }
Adrian Taylorc8713432020-10-21 18:20:55 -070025}
David Tolnay6b6423e2020-04-30 20:46:24 -070026
Adrian Taylorc8713432020-10-21 18:20:55 -070027pub(crate) fn check_all(cx: &mut Check, apis: &[Api]) {
David Tolnay7db73692019-10-20 14:51:12 -040028 for api in apis {
29 match api {
David Tolnay7e69f892020-10-03 22:20:22 -070030 Api::Include(_) | Api::Impl(_) => {}
David Tolnay7db73692019-10-20 14:51:12 -040031 Api::Struct(strct) => {
David Tolnay9f84fe82021-01-01 15:59:46 -080032 check(cx, &strct.name);
David Tolnay7db73692019-10-20 14:51:12 -040033 for field in &strct.fields {
David Tolnay9f84fe82021-01-01 15:59:46 -080034 check(cx, &field.name);
David Tolnay7db73692019-10-20 14:51:12 -040035 }
36 }
Joel Galensonc03402a2020-04-23 17:31:09 -070037 Api::Enum(enm) => {
David Tolnay9f84fe82021-01-01 15:59:46 -080038 check(cx, &enm.name);
Joel Galensonc03402a2020-04-23 17:31:09 -070039 for variant in &enm.variants {
David Tolnay9f84fe82021-01-01 15:59:46 -080040 check(cx, &variant.name);
Joel Galensonc03402a2020-04-23 17:31:09 -070041 }
42 }
David Tolnay7db73692019-10-20 14:51:12 -040043 Api::CxxType(ety) | Api::RustType(ety) => {
David Tolnay9f84fe82021-01-01 15:59:46 -080044 check(cx, &ety.name);
David Tolnay7db73692019-10-20 14:51:12 -040045 }
46 Api::CxxFunction(efn) | Api::RustFunction(efn) => {
David Tolnay9f84fe82021-01-01 15:59:46 -080047 check(cx, &efn.name);
David Tolnay7db73692019-10-20 14:51:12 -040048 for arg in &efn.args {
David Tolnay9f84fe82021-01-01 15:59:46 -080049 check(cx, &arg.name);
David Tolnay7db73692019-10-20 14:51:12 -040050 }
51 }
David Tolnay3118fa62020-05-07 17:10:39 -070052 Api::TypeAlias(alias) => {
David Tolnay9f84fe82021-01-01 15:59:46 -080053 check(cx, &alias.name);
David Tolnay3118fa62020-05-07 17:10:39 -070054 }
David Tolnay7db73692019-10-20 14:51:12 -040055 }
56 }
57}