use syntax::ast::*;
use syntax::attr;
use syntax::codemap::Spanned;
+use syntax::parse::token;
use syntax::visit::{self, Visitor};
use syntax_pos::Span;
+use syntax_pos::symbol::keywords;
use errors;
struct AstValidator<'a> {
}
fn check_lifetime(&self, lifetime: &Lifetime) {
- if !lifetime.ident.without_first_quote().is_valid() &&
- !lifetime.ident.name.is_static_keyword() {
+ let valid_names = [keywords::StaticLifetime.name(), keywords::Invalid.name()];
+ if !valid_names.contains(&lifetime.ident.name) &&
+ token::Ident(lifetime.ident.without_first_quote()).is_reserved_ident() {
self.err_handler().span_err(lifetime.span, "lifetimes cannot use keyword names");
}
}
fn check_label(&self, label: Ident, span: Span) {
- if label.name.is_static_keyword() || !label.without_first_quote().is_valid()
- || label.name == "'_" {
+ if token::Ident(label.without_first_quote()).is_reserved_ident() || label.name == "'_" {
self.err_handler().span_err(span, &format!("invalid label name `{}`", label.name));
}
}
visit::walk_use_tree(self, use_tree, id);
}
+ fn visit_lifetime(&mut self, lifetime: &'a Lifetime) {
+ self.check_lifetime(lifetime);
+ visit::walk_lifetime(self, lifetime);
+ }
+
fn visit_item(&mut self, item: &'a Item) {
match item.node {
- ItemKind::Impl(.., ref generics, Some(..), _, ref impl_items) => {
+ ItemKind::Impl(.., Some(..), _, ref impl_items) => {
self.invalid_visibility(&item.vis, item.span, None);
for impl_item in impl_items {
self.invalid_visibility(&impl_item.vis, impl_item.span, None);
self.check_trait_fn_not_const(sig.constness);
}
}
- generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
}
- ItemKind::Impl(.., ref generics, None, _, _) => {
+ ItemKind::Impl(.., None, _, _) => {
self.invalid_visibility(&item.vis,
item.span,
Some("place qualifiers on individual impl items instead"));
- generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
}
ItemKind::AutoImpl(..) => {
self.invalid_visibility(&item.vis, item.span, None);
Some("place qualifiers on individual foreign items \
instead"));
}
- ItemKind::Enum(ref def, ref generics) => {
+ ItemKind::Enum(ref def, _) => {
for variant in &def.variants {
self.invalid_non_exhaustive_attribute(variant);
for field in variant.node.data.fields() {
self.invalid_visibility(&field.vis, field.span, None);
}
}
- generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
}
ItemKind::Trait(is_auto, _, ref generics, ref bounds, ref trait_items) => {
if is_auto == IsAuto::Yes {
}
}
}
- generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
}
ItemKind::Mod(_) => {
// Ensure that `path` attributes on modules are recorded as used (c.f. #35584).
self.session.buffer_lint(lint, item.id, item.span, msg);
}
}
- ItemKind::Union(ref vdata, ref generics) => {
+ ItemKind::Union(ref vdata, _) => {
if !vdata.is_struct() {
self.err_handler().span_err(item.span,
"tuple and unit unions are not permitted");
self.err_handler().span_err(item.span,
"unions cannot have zero fields");
}
- generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
- }
- ItemKind::Fn(.., ref generics, _) |
- ItemKind::Ty(_, ref generics) |
- ItemKind::Struct(_, ref generics) => {
- generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
}
_ => {}
}
pub fn modern(self) -> Ident {
Ident { name: self.name, ctxt: self.ctxt.modern() }
}
-
- pub fn is_valid(&self) -> bool {
- !self.name.is_used_keyword() && !self.name.is_unused_keyword()
- }
}
impl fmt::Debug for Ident {
self.0
}
- /// Returns `true` if the token is a keyword used in the language.
- pub fn is_used_keyword(&self) -> bool {
- self >= &keywords::As.name() && self <= &keywords::While.name()
- }
-
- /// Returns `true` if the token is a keyword reserved for possible future use.
- pub fn is_unused_keyword(&self) -> bool {
- self >= &keywords::Abstract.name() && self <= &keywords::Yield.name()
- }
-
- pub fn is_static_keyword(&self) -> bool {
- self == &keywords::StaticLifetime.name()
- }
-
pub fn without_first_quote(&self) -> Symbol {
Symbol::from(self.as_str().trim_left_matches('\''))
}