use crate::lint::{EarlyContext, EarlyLintPass, LintArray, LintContext, LintPass}; use syntax::ast; declare_lint! { pub NON_ASCII_IDENTS, Allow, "detects non-ASCII identifiers" } declare_lint! { pub UNCOMMON_CODEPOINTS, Warn, "detects uncommon Unicode codepoints in identifiers" } declare_lint_pass!(NonAsciiIdents => [NON_ASCII_IDENTS, UNCOMMON_CODEPOINTS]); impl EarlyLintPass for NonAsciiIdents { fn check_ident(&mut self, cx: &EarlyContext<'_>, ident: ast::Ident) { use unicode_security::GeneralSecurityProfile; let name_str = ident.name.as_str(); if name_str.is_ascii() { return; } cx.struct_span_lint( NON_ASCII_IDENTS, ident.span, "identifier contains non-ASCII characters", ) .emit(); if !name_str.chars().all(GeneralSecurityProfile::identifier_allowed) { cx.struct_span_lint( UNCOMMON_CODEPOINTS, ident.span, "identifier contains uncommon Unicode codepoints", ) .emit(); } } }