2015-06-11 11:35:00 +02:00
|
|
|
use rustc::lint::*;
|
|
|
|
use syntax::ast::*;
|
|
|
|
use syntax::codemap::{BytePos, Span};
|
2015-07-26 20:23:11 +05:30
|
|
|
use utils::span_lint;
|
2015-06-11 11:35:00 +02:00
|
|
|
|
|
|
|
declare_lint!{ pub ZERO_WIDTH_SPACE, Deny, "Zero-width space is confusing" }
|
2015-08-12 20:36:10 +02:00
|
|
|
declare_lint!{ pub NON_ASCII_LITERAL, Allow, "Lint literal non-ASCII chars in literals" }
|
2015-06-11 11:35:00 +02:00
|
|
|
|
|
|
|
#[derive(Copy, Clone)]
|
|
|
|
pub struct Unicode;
|
|
|
|
|
|
|
|
impl LintPass for Unicode {
|
2015-08-11 20:22:20 +02:00
|
|
|
fn get_lints(&self) -> LintArray {
|
2015-08-12 20:36:10 +02:00
|
|
|
lint_array!(ZERO_WIDTH_SPACE, NON_ASCII_LITERAL)
|
2015-06-11 11:35:00 +02:00
|
|
|
}
|
2015-08-11 20:22:20 +02:00
|
|
|
|
2015-06-11 11:35:00 +02:00
|
|
|
fn check_expr(&mut self, cx: &Context, expr: &Expr) {
|
2015-08-11 20:22:20 +02:00
|
|
|
if let ExprLit(ref lit) = expr.node {
|
|
|
|
if let LitStr(ref string, _) = lit.node {
|
|
|
|
check_str(cx, string, lit.span)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-06-11 11:35:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
fn check_str(cx: &Context, string: &str, span: Span) {
|
2015-08-11 20:22:20 +02:00
|
|
|
for (i, c) in string.char_indices() {
|
|
|
|
if c == '\u{200B}' {
|
2015-08-12 20:36:10 +02:00
|
|
|
str_pos_lint(cx, ZERO_WIDTH_SPACE, span, i,
|
|
|
|
"zero-width space detected. Consider using `\\u{200B}`.");
|
|
|
|
}
|
|
|
|
if c as u32 > 0x7F {
|
|
|
|
str_pos_lint(cx, NON_ASCII_LITERAL, span, i, &format!(
|
|
|
|
"literal non-ASCII character detected. Consider using `\\u{{{:X}}}`.", c as u32));
|
2015-08-11 20:22:20 +02:00
|
|
|
}
|
|
|
|
}
|
2015-06-11 11:35:00 +02:00
|
|
|
}
|
|
|
|
|
2015-08-12 20:36:10 +02:00
|
|
|
fn str_pos_lint(cx: &Context, lint: &'static Lint, span: Span, index: usize, msg: &str) {
|
|
|
|
span_lint(cx, lint, Span { lo: span.lo + BytePos((1 + index) as u32),
|
|
|
|
hi: span.lo + BytePos((1 + index) as u32),
|
|
|
|
expn_id: span.expn_id }, msg);
|
|
|
|
|
2015-06-11 11:35:00 +02:00
|
|
|
}
|