Skip to content

Commit ce1fed7

Browse files
author
Agustin Chiappe Berrini
committed
address comments
1 parent 65ccf24 commit ce1fed7

File tree

6 files changed

+32
-42
lines changed

6 files changed

+32
-42
lines changed

src/librustc_passes/ast_validation.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ use rustc::session::Session;
2121
use syntax::ast::*;
2222
use syntax::attr;
2323
use syntax::codemap::Spanned;
24+
use syntax::parse::token;
2425
use syntax::visit::{self, Visitor};
2526
use syntax_pos::Span;
27+
use syntax_pos::symbol::keywords;
2628
use errors;
2729

2830
struct AstValidator<'a> {
@@ -35,15 +37,15 @@ impl<'a> AstValidator<'a> {
3537
}
3638

3739
fn check_lifetime(&self, lifetime: &Lifetime) {
38-
if !lifetime.ident.without_first_quote().is_valid() &&
39-
!lifetime.ident.name.is_static_keyword() {
40+
let valid_names = [keywords::StaticLifetime.name(), keywords::Invalid.name()];
41+
if !valid_names.contains(&lifetime.ident.name) &&
42+
token::Ident(lifetime.ident.without_first_quote()).is_reserved_ident() {
4043
self.err_handler().span_err(lifetime.span, "lifetimes cannot use keyword names");
4144
}
4245
}
4346

4447
fn check_label(&self, label: Ident, span: Span) {
45-
if label.name.is_static_keyword() || !label.without_first_quote().is_valid()
46-
|| label.name == "'_" {
48+
if token::Ident(label.without_first_quote()).is_reserved_ident() || label.name == "'_" {
4749
self.err_handler().span_err(span, &format!("invalid label name `{}`", label.name));
4850
}
4951
}
@@ -207,23 +209,26 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
207209
visit::walk_use_tree(self, use_tree, id);
208210
}
209211

212+
fn visit_lifetime(&mut self, lifetime: &'a Lifetime) {
213+
self.check_lifetime(lifetime);
214+
visit::walk_lifetime(self, lifetime);
215+
}
216+
210217
fn visit_item(&mut self, item: &'a Item) {
211218
match item.node {
212-
ItemKind::Impl(.., ref generics, Some(..), _, ref impl_items) => {
219+
ItemKind::Impl(.., Some(..), _, ref impl_items) => {
213220
self.invalid_visibility(&item.vis, item.span, None);
214221
for impl_item in impl_items {
215222
self.invalid_visibility(&impl_item.vis, impl_item.span, None);
216223
if let ImplItemKind::Method(ref sig, _) = impl_item.node {
217224
self.check_trait_fn_not_const(sig.constness);
218225
}
219226
}
220-
generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
221227
}
222-
ItemKind::Impl(.., ref generics, None, _, _) => {
228+
ItemKind::Impl(.., None, _, _) => {
223229
self.invalid_visibility(&item.vis,
224230
item.span,
225231
Some("place qualifiers on individual impl items instead"));
226-
generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
227232
}
228233
ItemKind::AutoImpl(..) => {
229234
self.invalid_visibility(&item.vis, item.span, None);
@@ -234,14 +239,13 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
234239
Some("place qualifiers on individual foreign items \
235240
instead"));
236241
}
237-
ItemKind::Enum(ref def, ref generics) => {
242+
ItemKind::Enum(ref def, _) => {
238243
for variant in &def.variants {
239244
self.invalid_non_exhaustive_attribute(variant);
240245
for field in variant.node.data.fields() {
241246
self.invalid_visibility(&field.vis, field.span, None);
242247
}
243248
}
244-
generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
245249
}
246250
ItemKind::Trait(is_auto, _, ref generics, ref bounds, ref trait_items) => {
247251
if is_auto == IsAuto::Yes {
@@ -278,7 +282,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
278282
}
279283
}
280284
}
281-
generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
282285
}
283286
ItemKind::Mod(_) => {
284287
// Ensure that `path` attributes on modules are recorded as used (c.f. #35584).
@@ -289,7 +292,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
289292
self.session.buffer_lint(lint, item.id, item.span, msg);
290293
}
291294
}
292-
ItemKind::Union(ref vdata, ref generics) => {
295+
ItemKind::Union(ref vdata, _) => {
293296
if !vdata.is_struct() {
294297
self.err_handler().span_err(item.span,
295298
"tuple and unit unions are not permitted");
@@ -298,12 +301,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
298301
self.err_handler().span_err(item.span,
299302
"unions cannot have zero fields");
300303
}
301-
generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
302-
}
303-
ItemKind::Fn(.., ref generics, _) |
304-
ItemKind::Ty(_, ref generics) |
305-
ItemKind::Struct(_, ref generics) => {
306-
generics.lifetimes.iter().for_each(|l| self.check_lifetime(&l.lifetime))
307304
}
308305
_ => {}
309306
}

src/libsyntax/parse/lexer/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use codemap::{CodeMap, FilePathMapping};
1414
use errors::{FatalError, DiagnosticBuilder};
1515
use parse::{token, ParseSess};
1616
use str::char_at;
17-
use symbol::{Symbol};
17+
use symbol::Symbol;
1818
use std_unicode::property::Pattern_White_Space;
1919

2020
use std::borrow::Cow;

src/libsyntax/parse/token.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,12 +364,18 @@ impl Token {
364364

365365
/// Returns `true` if the token is a keyword used in the language.
366366
pub fn is_used_keyword(&self) -> bool {
367-
self.ident().map(|id| id.name.is_used_keyword()).unwrap_or(false)
367+
match self.ident() {
368+
Some(id) => id.name >= keywords::As.name() && id.name <= keywords::While.name(),
369+
_ => false,
370+
}
368371
}
369372

370373
/// Returns `true` if the token is a keyword reserved for possible future use.
371374
pub fn is_unused_keyword(&self) -> bool {
372-
self.ident().map(|id| id.name.is_unused_keyword()).unwrap_or(false)
375+
match self.ident() {
376+
Some(id) => id.name >= keywords::Abstract.name() && id.name <= keywords::Yield.name(),
377+
_ => false,
378+
}
373379
}
374380

375381
pub fn glue(self, joint: Token) -> Option<Token> {

src/libsyntax_pos/symbol.rs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,6 @@ impl Ident {
4242
pub fn modern(self) -> Ident {
4343
Ident { name: self.name, ctxt: self.ctxt.modern() }
4444
}
45-
46-
pub fn is_valid(&self) -> bool {
47-
!self.name.is_used_keyword() && !self.name.is_unused_keyword()
48-
}
4945
}
5046

5147
impl fmt::Debug for Ident {
@@ -122,20 +118,6 @@ impl Symbol {
122118
self.0
123119
}
124120

125-
/// Returns `true` if the token is a keyword used in the language.
126-
pub fn is_used_keyword(&self) -> bool {
127-
self >= &keywords::As.name() && self <= &keywords::While.name()
128-
}
129-
130-
/// Returns `true` if the token is a keyword reserved for possible future use.
131-
pub fn is_unused_keyword(&self) -> bool {
132-
self >= &keywords::Abstract.name() && self <= &keywords::Yield.name()
133-
}
134-
135-
pub fn is_static_keyword(&self) -> bool {
136-
self == &keywords::StaticLifetime.name()
137-
}
138-
139121
pub fn without_first_quote(&self) -> Symbol {
140122
Symbol::from(self.as_str().trim_left_matches('\''))
141123
}

src/test/compile-fail/issue-10412.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,21 @@
99
// except according to those terms.
1010

1111
trait Serializable<'self, T> { //~ ERROR lifetimes cannot use keyword names
12-
fn serialize(val : &'self T) -> Vec<u8> ;
12+
fn serialize(val : &'self T) -> Vec<u8>;
13+
//~^ ERROR lifetimes cannot use keyword names
1314
fn deserialize(repr : &[u8]) -> &'self T;
15+
//~^ ERROR lifetimes cannot use keyword names
1416
}
1517

16-
impl<'self> Serializable<str> for &'self str {
18+
impl<'self> Serializable<str> for &'self str { //~ ERROR lifetimes cannot use keyword names
1719
//~^ ERROR lifetimes cannot use keyword names
1820
//~| ERROR missing lifetime specifier
1921
fn serialize(val : &'self str) -> Vec<u8> {
22+
//~^ ERROR lifetimes cannot use keyword names
2023
vec![1]
2124
}
2225
fn deserialize(repr: &[u8]) -> &'self str {
26+
//~^ ERROR lifetimes cannot use keyword names
2327
"hi"
2428
}
2529
}

src/test/compile-fail/lifetime-no-keyword.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
fn foo<'a>(a: &'a isize) { }
1212
fn bar(a: &'static isize) { }
1313
fn baz<'let>(a: &'let isize) { } //~ ERROR lifetimes cannot use keyword names
14+
//~^ ERROR lifetimes cannot use keyword names
1415
fn zab<'self>(a: &'self isize) { } //~ ERROR lifetimes cannot use keyword names
15-
16+
//~^ ERROR lifetimes cannot use keyword names
1617
fn main() { }

0 commit comments

Comments
 (0)