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

+5-3
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

+2-2
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

+3-5
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

+2-2
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

+3-4
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

+1-1
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

+2-2
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

+2-2
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

+3-3
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

+2-3
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)

src/librustc_resolve/lib.rs

+7-8
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ use syntax::ast::{CRATE_NODE_ID, Name, NodeId, CrateNum, IntTy, UintTy};
6262
use syntax::attr::AttrMetaMethods;
6363
use syntax::codemap::{self, Span, Pos};
6464
use syntax::errors::DiagnosticBuilder;
65-
use syntax::parse::token::{self, special_names, special_idents};
65+
use syntax::parse::token::{self, keywords};
6666
use syntax::util::lev_distance::find_best_match_for_name;
6767

6868
use rustc::hir::intravisit::{self, FnKind, Visitor};
@@ -1954,8 +1954,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
19541954
let mut self_type_rib = Rib::new(NormalRibKind);
19551955

19561956
// plain insert (no renaming, types are not currently hygienic....)
1957-
let name = special_names::type_self;
1958-
self_type_rib.bindings.insert(name, self_def);
1957+
self_type_rib.bindings.insert(keywords::SelfType.name(), self_def);
19591958
self.type_ribs.push(self_type_rib);
19601959
f(self);
19611960
if !self.resolved {
@@ -2195,11 +2194,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
21952194
"type name"
21962195
};
21972196

2198-
let self_type_name = special_idents::type_self.name;
21992197
let is_invalid_self_type_name = path.segments.len() > 0 &&
22002198
maybe_qself.is_none() &&
22012199
path.segments[0].identifier.name ==
2202-
self_type_name;
2200+
keywords::SelfType.name();
22032201
if is_invalid_self_type_name {
22042202
resolve_error(self,
22052203
ty.span,
@@ -2643,7 +2641,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
26432641
namespace: Namespace,
26442642
record_used: bool)
26452643
-> Option<LocalDef> {
2646-
if identifier.name == special_idents::invalid.name {
2644+
if identifier.unhygienic_name == keywords::Invalid.name() {
26472645
return Some(LocalDef::from_def(Def::Err));
26482646
}
26492647

@@ -3074,7 +3072,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
30743072
false // Stop advancing
30753073
});
30763074

3077-
if method_scope && special_names::self_.as_str() == &path_name[..] {
3075+
if method_scope &&
3076+
&path_name[..] == keywords::SelfValue.name().as_str() {
30783077
resolve_error(self,
30793078
expr.span,
30803079
ResolutionError::SelfNotAvailableInStaticMethod);
@@ -3612,7 +3611,7 @@ fn module_to_string(module: Module) -> String {
36123611
}
36133612
BlockParentLink(ref module, _) => {
36143613
// danger, shouldn't be ident?
3615-
names.push(special_idents::opaque.name);
3614+
names.push(token::intern("<opaque>"));
36163615
collect_mod(names, module);
36173616
}
36183617
}

src/librustc_save_analysis/dump_visitor.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,7 @@ impl<'v, 'l, 'tcx: 'l, 'll, D: Dump +'ll> Visitor<'v> for DumpVisitor<'l, 'tcx,
10111011
span: sub_span.expect("No span found for use"),
10121012
id: item.id,
10131013
mod_id: mod_id,
1014-
name: ident.name.to_string(),
1014+
name: ident.to_string(),
10151015
scope: self.cur_scope
10161016
}.normalize(&self.tcx));
10171017
}
@@ -1075,7 +1075,7 @@ impl<'v, 'l, 'tcx: 'l, 'll, D: Dump +'ll> Visitor<'v> for DumpVisitor<'l, 'tcx,
10751075
if !self.span.filter_generated(alias_span, item.span) {
10761076
self.dumper.extern_crate(item.span, ExternCrateData {
10771077
id: item.id,
1078-
name: item.ident.name.to_string(),
1078+
name: item.ident.to_string(),
10791079
crate_num: cnum,
10801080
location: location,
10811081
span: alias_span.expect("No span found for extern crate"),

src/librustc_trans/mir/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use machine;
2222
use type_of;
2323

2424
use syntax::codemap::DUMMY_SP;
25-
use syntax::parse::token;
25+
use syntax::parse::token::keywords;
2626

2727
use std::ops::Deref;
2828
use std::rc::Rc;
@@ -286,7 +286,7 @@ fn arg_value_refs<'bcx, 'tcx>(bcx: &BlockAndBuilder<'bcx, 'tcx>,
286286
alloca: lltemp,
287287
address_operations: &ops
288288
};
289-
declare_local(bcx, token::special_idents::invalid.name,
289+
declare_local(bcx, keywords::Invalid.name(),
290290
tupled_arg_ty, scope, variable_access,
291291
VariableKind::ArgumentVariable(arg_index + i + 1),
292292
bcx.fcx().span.unwrap_or(DUMMY_SP));

src/librustc_typeck/astconv.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ use syntax::{abi, ast};
7373
use syntax::codemap::{Span, Pos};
7474
use syntax::errors::DiagnosticBuilder;
7575
use syntax::feature_gate::{GateIssue, emit_feature_err};
76-
use syntax::parse::token;
76+
use syntax::parse::token::{self, keywords};
7777

7878
use rustc::hir::print as pprust;
7979
use rustc::hir;
@@ -1313,7 +1313,7 @@ fn associated_path_def_to_ty<'tcx>(this: &AstConv<'tcx>,
13131313
let trait_node_id = tcx.map.as_local_node_id(trait_did).unwrap();
13141314
match find_bound_for_assoc_item(this,
13151315
trait_node_id,
1316-
token::special_idents::type_self.name,
1316+
keywords::SelfType.name(),
13171317
assoc_name,
13181318
span) {
13191319
Ok(bound) => bound,

src/librustc_typeck/check/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ use syntax::attr;
120120
use syntax::attr::AttrMetaMethods;
121121
use syntax::codemap::{self, Span, Spanned};
122122
use syntax::errors::DiagnosticBuilder;
123-
use syntax::parse::token::{self, InternedString, special_idents};
123+
use syntax::parse::token::{self, InternedString, keywords};
124124
use syntax::ptr::P;
125125
use syntax::util::lev_distance::find_best_match_for_name;
126126

@@ -2851,7 +2851,7 @@ fn check_expr_with_expectation_and_lvalue_pref<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
28512851
method_ty
28522852
}
28532853
Err(error) => {
2854-
if method_name.node != special_idents::invalid.name {
2854+
if method_name.node != keywords::Invalid.name() {
28552855
method::report_error(fcx, method_name.span, expr_t,
28562856
method_name.node, Some(rcvr), error);
28572857
}
@@ -2990,7 +2990,7 @@ fn check_expr_with_expectation_and_lvalue_pref<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
29902990
let msg = format!("field `{}` of struct `{}` is private", field.node, struct_path);
29912991
fcx.tcx().sess.span_err(expr.span, &msg);
29922992
fcx.write_ty(expr.id, field_ty);
2993-
} else if field.node == special_idents::invalid.name {
2993+
} else if field.node == keywords::Invalid.name() {
29942994
fcx.write_error(expr.id);
29952995
} else if method::exists(fcx, field.span, field.node, expr_t, expr.id) {
29962996
fcx.type_error_struct(field.span,
@@ -3780,7 +3780,7 @@ pub fn resolve_ty_and_def_ufcs<'a, 'b, 'tcx>(fcx: &FnCtxt<'b, 'tcx>,
37803780
method::MethodError::PrivateMatch(def) => Some(def),
37813781
_ => None,
37823782
};
3783-
if item_name != special_idents::invalid.name {
3783+
if item_name != keywords::Invalid.name() {
37843784
method::report_error(fcx, span, ty, item_name, None, error);
37853785
}
37863786
def

src/librustc_typeck/check/wfcheck.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use std::collections::HashSet;
2424
use syntax::ast;
2525
use syntax::codemap::{Span};
2626
use syntax::errors::DiagnosticBuilder;
27-
use syntax::parse::token::{special_idents};
27+
use syntax::parse::token::keywords;
2828
use rustc::hir::intravisit::{self, Visitor};
2929
use rustc::hir;
3030

@@ -472,7 +472,7 @@ impl<'ccx, 'tcx> CheckTypeWellFormedVisitor<'ccx, 'tcx> {
472472
{
473473
let name = match space {
474474
TypeSpace => ast_generics.ty_params[index].name,
475-
SelfSpace => special_idents::type_self.name,
475+
SelfSpace => keywords::SelfType.name(),
476476
FnSpace => bug!("Fn space occupied?"),
477477
};
478478

src/librustc_typeck/collect.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ use syntax::abi;
9393
use syntax::ast;
9494
use syntax::attr;
9595
use syntax::codemap::Span;
96-
use syntax::parse::token::special_idents;
96+
use syntax::parse::token::keywords;
9797
use syntax::ptr::P;
9898
use rustc::hir::{self, PatKind};
9999
use rustc::hir::intravisit;
@@ -1655,7 +1655,7 @@ fn ty_generics_for_trait<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
16551655
let def = ty::TypeParameterDef {
16561656
space: SelfSpace,
16571657
index: 0,
1658-
name: special_idents::type_self.name,
1658+
name: keywords::SelfType.name(),
16591659
def_id: ccx.tcx.map.local_def_id(param_id),
16601660
default_def_id: ccx.tcx.map.local_def_id(parent),
16611661
default: None,

0 commit comments

Comments
 (0)