41 lines
1.1 KiB
Rust
41 lines
1.1 KiB
Rust
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();
|
|
}
|
|
}
|
|
}
|