Skip to content

Commit a31658d

Browse files
committed
Rollup merge of #33041 - petrochenkov:path, r=nrc,Manishearth
Paths are mostly parsed without taking whitespaces into account, e.g. `std :: vec :: Vec :: new ()` parses successfully, however, there are some special cases involving keywords `super`, `self` and `Self`. For example, `self::` is considered a path start only if there are no spaces between `self` and `::`. These restrictions probably made sense when `self` and friends weren't keywords, but now they are unnecessary. The first two commits remove this special treatment of whitespaces by removing `token::IdentStyle` entirely and therefore fix #14109. This change also affects naked `self` and `super` (which are not tightly followed by `::`, obviously) they can now be parsed as paths, however they are still not resolved correctly in imports (cc @jseyfried, see `compile-fail/use-keyword.rs`), so #29036 is not completely fixed. The third commit also makes `super`, `self`, `Self` and `static` keywords nominally (before this they acted as keywords for all purposes) and removes most of remaining \"special idents\". The last commit (before tests) contains some small improvements - some qualified paths with type parameters are parsed correctly, `parse_path` is not used for parsing single identifiers, imports are sanity checked for absence of type parameters - such type parameters can be generated by syntax extensions or by macros when #10415 is fixed (~~soon!~~already!). This patch changes some pretty basic things in `libsyntax`, like `token::Token` and the keyword list, so it's a plugin-[breaking-change]. r? @eddyb
2 parents 17ba11d + 4bd44be commit a31658d

File tree

111 files changed

+798
-858
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

111 files changed

+798
-858
lines changed

src/etc/generate-keyword-tests.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,17 @@
3434
// option. This file may not be copied, modified, or distributed
3535
// except according to those terms.
3636
37+
// compile-flags: -Z parse-only
38+
3739
// This file was auto-generated using 'src/etc/generate-keyword-tests.py %s'
3840
3941
fn main() {
40-
let %s = "foo"; //~ error: ident
42+
let %s = "foo"; //~ error: expected pattern, found keyword `%s`
4143
}
4244
"""
4345

4446
test_dir = os.path.abspath(
45-
os.path.join(os.path.dirname(__file__), '../test/compile-fail')
47+
os.path.join(os.path.dirname(__file__), '../test/parse-fail')
4648
)
4749

4850
for kw in sys.argv[1:]:
@@ -53,7 +55,7 @@
5355
os.chmod(test_file, stat.S_IWUSR)
5456

5557
with open(test_file, 'wt') as f:
56-
f.write(template % (datetime.datetime.now().year, kw, kw))
58+
f.write(template % (datetime.datetime.now().year, kw, kw, kw))
5759

5860
# mark file read-only
5961
os.chmod(test_file, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)

src/librustc/hir/fold.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use syntax::attr::ThinAttributesExt;
1818
use hir;
1919
use syntax::codemap::{respan, Span, Spanned};
2020
use syntax::ptr::P;
21-
use syntax::parse::token;
21+
use syntax::parse::token::keywords;
2222
use syntax::util::move_map::MoveMap;
2323

2424
pub trait Folder : Sized {
@@ -867,7 +867,7 @@ pub fn noop_fold_crate<T: Folder>(Crate { module, attrs, config, span,
867867
let config = folder.fold_meta_items(config);
868868

869869
let crate_mod = folder.fold_item(hir::Item {
870-
name: token::special_idents::invalid.name,
870+
name: keywords::Invalid.name(),
871871
attrs: attrs,
872872
id: DUMMY_NODE_ID,
873873
vis: hir::Public,

src/librustc/hir/print.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ use syntax::abi::Abi;
1414
use syntax::ast;
1515
use syntax::codemap::{self, CodeMap, BytePos, Spanned};
1616
use syntax::errors;
17-
use syntax::parse::token::{self, BinOpToken};
17+
use syntax::parse::token::{self, keywords, BinOpToken};
1818
use syntax::parse::lexer::comments;
19-
use syntax::parse;
2019
use syntax::print::pp::{self, break_offset, word, space, hardbreak};
2120
use syntax::print::pp::{Breaks, eof};
2221
use syntax::print::pp::Breaks::{Consistent, Inconsistent};
@@ -2209,9 +2208,8 @@ impl<'a> State<'a> {
22092208
hir::TyInfer if is_closure => self.print_pat(&input.pat)?,
22102209
_ => {
22112210
match input.pat.node {
2212-
PatKind::Ident(_, ref path1, _) if
2213-
path1.node.name ==
2214-
parse::token::special_idents::invalid.name => {
2211+
PatKind::Ident(_, ref path1, _)
2212+
if path1.node.name == keywords::Invalid.name() => {
22152213
// Do nothing.
22162214
}
22172215
_ => {

src/librustc/middle/liveness.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ use std::io;
125125
use std::rc::Rc;
126126
use syntax::ast::{self, NodeId};
127127
use syntax::codemap::{BytePos, original_sp, Span};
128-
use syntax::parse::token::special_idents;
128+
use syntax::parse::token::keywords;
129129
use syntax::ptr::P;
130130

131131
use hir::Expr;
@@ -1578,7 +1578,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
15781578
let var = self.variable(p_id, sp);
15791579
// Ignore unused self.
15801580
let name = path1.node;
1581-
if name != special_idents::self_.name {
1581+
if name != keywords::SelfValue.name() {
15821582
if !self.warn_about_unused(sp, p_id, entry_ln, var) {
15831583
if self.live_on_entry(entry_ln, var).is_none() {
15841584
self.report_dead_assign(p_id, sp, var, true);

src/librustc/middle/resolve_lifetime.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use std::fmt;
2929
use std::mem::replace;
3030
use syntax::ast;
3131
use syntax::codemap::Span;
32-
use syntax::parse::token::special_idents;
32+
use syntax::parse::token::keywords;
3333
use util::nodemap::NodeMap;
3434

3535
use hir;
@@ -245,7 +245,7 @@ impl<'a, 'v> Visitor<'v> for LifetimeContext<'a> {
245245
}
246246

247247
fn visit_lifetime(&mut self, lifetime_ref: &hir::Lifetime) {
248-
if lifetime_ref.name == special_idents::static_lifetime.name {
248+
if lifetime_ref.name == keywords::StaticLifetime.name() {
249249
self.insert_lifetime(lifetime_ref, DefStaticRegion);
250250
return;
251251
}
@@ -672,9 +672,8 @@ impl<'a> LifetimeContext<'a> {
672672
for i in 0..lifetimes.len() {
673673
let lifetime_i = &lifetimes[i];
674674

675-
let special_idents = [special_idents::static_lifetime];
676675
for lifetime in lifetimes {
677-
if special_idents.iter().any(|&i| i.name == lifetime.lifetime.name) {
676+
if lifetime.lifetime.name == keywords::StaticLifetime.name() {
678677
span_err!(self.sess, lifetime.lifetime.span, E0262,
679678
"invalid lifetime parameter name: `{}`", lifetime.lifetime.name);
680679
}

src/librustc/mir/repr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ pub struct ArgDecl<'tcx> {
200200
/// and has to be collected from multiple actual arguments.
201201
pub spread: bool,
202202

203-
/// Either special_idents::invalid or the name of a single-binding
203+
/// Either keywords::Invalid or the name of a single-binding
204204
/// pattern associated with this argument. Useful for debuginfo.
205205
pub debug_name: Name
206206
}

src/librustc/ty/context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ use std::hash::{Hash, Hasher};
4444
use std::rc::Rc;
4545
use syntax::ast::{self, Name, NodeId};
4646
use syntax::attr;
47-
use syntax::parse::token::{self, special_idents};
47+
use syntax::parse::token::{self, keywords};
4848

4949
use hir;
5050

@@ -1069,7 +1069,7 @@ impl<'tcx> TyCtxt<'tcx> {
10691069
}
10701070

10711071
pub fn mk_self_type(&self) -> Ty<'tcx> {
1072-
self.mk_param(subst::SelfSpace, 0, special_idents::type_self.name)
1072+
self.mk_param(subst::SelfSpace, 0, keywords::SelfType.name())
10731073
}
10741074

10751075
pub fn mk_param_from_def(&self, def: &ty::TypeParameterDef) -> Ty<'tcx> {

src/librustc/ty/sty.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use std::ops;
2424
use std::mem;
2525
use syntax::abi;
2626
use syntax::ast::{self, Name};
27-
use syntax::parse::token::special_idents;
27+
use syntax::parse::token::keywords;
2828

2929
use serialize::{Decodable, Decoder};
3030

@@ -533,7 +533,7 @@ impl ParamTy {
533533
}
534534

535535
pub fn for_self() -> ParamTy {
536-
ParamTy::new(subst::SelfSpace, 0, special_idents::type_self.name)
536+
ParamTy::new(subst::SelfSpace, 0, keywords::SelfType.name())
537537
}
538538

539539
pub fn for_def(def: &ty::TypeParameterDef) -> ParamTy {

src/librustc_mir/build/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use rustc::hir::pat_util::pat_is_binding;
1818
use std::ops::{Index, IndexMut};
1919
use syntax::ast;
2020
use syntax::codemap::Span;
21-
use syntax::parse::token;
21+
use syntax::parse::token::keywords;
2222

2323
pub struct Builder<'a, 'tcx: 'a> {
2424
hir: Cx<'a, 'tcx>,
@@ -238,7 +238,7 @@ pub fn construct<'a,'tcx>(hir: Cx<'a,'tcx>,
238238
ty::UpvarCapture::ByRef(..) => true
239239
});
240240
let mut decl = UpvarDecl {
241-
debug_name: token::special_idents::invalid.name,
241+
debug_name: keywords::Invalid.name(),
242242
by_ref: by_ref
243243
};
244244
if let Some(hir::map::NodeLocal(pat)) = tcx.map.find(fv.def.var_id()) {
@@ -296,7 +296,7 @@ impl<'a,'tcx> Builder<'a,'tcx> {
296296
self.schedule_drop(pattern.as_ref().map_or(ast_block.span, |pat| pat.span),
297297
argument_extent, &lvalue, ty);
298298

299-
let mut name = token::special_idents::invalid.name;
299+
let mut name = keywords::Invalid.name();
300300
if let Some(pat) = pattern {
301301
if let hir::PatKind::Ident(_, ref ident, _) = pat.node {
302302
if pat_is_binding(&self.hir.tcx().def_map.borrow(), pat) {

src/librustc_resolve/build_reduced_graph.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,14 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
112112
!segment.parameters.bindings().is_empty()
113113
});
114114
if found_param {
115-
self.session.span_err(path.span,
116-
"type or lifetime parameter is found in import path");
115+
self.session.span_err(path.span, "type or lifetime parameters in import path");
117116
}
118117

119118
// Checking for special identifiers in path
120119
// prevent `self` or `super` at beginning of global path
121120
if path.global && path.segments.len() > 0 {
122121
let first = path.segments[0].identifier.name;
123-
if first == keywords::Super.to_name() || first == keywords::SelfValue.to_name() {
122+
if first == keywords::Super.name() || first == keywords::SelfValue.name() {
124123
self.session.add_lint(
125124
lint::builtin::SUPER_OR_SELF_IN_GLOBAL_PATH, id, path.span,
126125
format!("expected identifier, found keyword `{}`", first)

0 commit comments

Comments
 (0)