Skip to content

Commit 5eef7c7

Browse files
committed
Auto merge of #42902 - petrochenkov:keydcrate, r=jseyfried
Make `$crate` a keyword Fixes #42898 r? @jseyfried or @nrc
2 parents 3bfc18a + b33fd6d commit 5eef7c7

File tree

16 files changed

+185
-122
lines changed

16 files changed

+185
-122
lines changed

src/librustc/hir/print.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1527,7 +1527,8 @@ impl<'a> State<'a> {
15271527
if i > 0 {
15281528
word(&mut self.s, "::")?
15291529
}
1530-
if segment.name != keywords::CrateRoot.name() && segment.name != "$crate" {
1530+
if segment.name != keywords::CrateRoot.name() &&
1531+
segment.name != keywords::DollarCrate.name() {
15311532
self.print_name(segment.name)?;
15321533
self.print_path_parameters(&segment.parameters, colons_before_params)?;
15331534
}
@@ -1554,7 +1555,8 @@ impl<'a> State<'a> {
15541555
if i > 0 {
15551556
word(&mut self.s, "::")?
15561557
}
1557-
if segment.name != keywords::CrateRoot.name() && segment.name != "$crate" {
1558+
if segment.name != keywords::CrateRoot.name() &&
1559+
segment.name != keywords::DollarCrate.name() {
15581560
self.print_name(segment.name)?;
15591561
self.print_path_parameters(&segment.parameters, colons_before_params)?;
15601562
}

src/librustc_resolve/build_reduced_graph.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,15 @@ impl<'a> Resolver<'a> {
149149
resolve_error(self,
150150
view_path.span,
151151
ResolutionError::SelfImportsOnlyAllowedWithin);
152-
} else if source_name == "$crate" && full_path.segments.len() == 1 {
152+
} else if source_name == keywords::DollarCrate.name() &&
153+
full_path.segments.len() == 1 {
153154
let crate_root = self.resolve_crate_root(source.ctxt);
154155
let crate_name = match crate_root.kind {
155156
ModuleKind::Def(_, name) => name,
156157
ModuleKind::Block(..) => unreachable!(),
157158
};
158159
source.name = crate_name;
159-
if binding.name == "$crate" {
160+
if binding.name == keywords::DollarCrate.name() {
160161
binding.name = crate_name;
161162
}
162163

src/librustc_resolve/lib.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -2665,7 +2665,8 @@ impl<'a> Resolver<'a> {
26652665
};
26662666

26672667
if path.len() > 1 && !global_by_default && result.base_def() != Def::Err &&
2668-
path[0].name != keywords::CrateRoot.name() && path[0].name != "$crate" {
2668+
path[0].name != keywords::CrateRoot.name() &&
2669+
path[0].name != keywords::DollarCrate.name() {
26692670
let unqualified_result = {
26702671
match self.resolve_path(&[*path.last().unwrap()], Some(ns), false, span) {
26712672
PathResult::NonModule(path_res) => path_res.base_def(),
@@ -2718,7 +2719,7 @@ impl<'a> Resolver<'a> {
27182719
if i == 0 && ns == TypeNS && ident.name == keywords::CrateRoot.name() {
27192720
module = Some(self.resolve_crate_root(ident.ctxt.modern()));
27202721
continue
2721-
} else if i == 0 && ns == TypeNS && ident.name == "$crate" {
2722+
} else if i == 0 && ns == TypeNS && ident.name == keywords::DollarCrate.name() {
27222723
module = Some(self.resolve_crate_root(ident.ctxt));
27232724
continue
27242725
}

src/librustc_resolve/macros.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ impl<'a> base::Resolver for Resolver<'a> {
128128
impl<'a, 'b> Folder for EliminateCrateVar<'a, 'b> {
129129
fn fold_path(&mut self, mut path: ast::Path) -> ast::Path {
130130
let ident = path.segments[0].identifier;
131-
if ident.name == "$crate" {
131+
if ident.name == keywords::DollarCrate.name() {
132132
path.segments[0].identifier.name = keywords::CrateRoot.name();
133133
let module = self.0.resolve_crate_root(ident.ctxt);
134134
if !module.is_local() {

src/librustdoc/html/highlight.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ impl<'a> Classifier<'a> {
300300
"Some" | "None" | "Ok" | "Err" => Class::PreludeVal,
301301

302302
"$crate" => Class::KeyWord,
303-
_ if tas.tok.is_any_keyword() => Class::KeyWord,
303+
_ if tas.tok.is_reserved_ident() => Class::KeyWord,
304304

305305
_ => {
306306
if self.in_macro_nonterminal {

src/libsyntax/ast.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,8 @@ impl Path {
9797
}
9898

9999
pub fn default_to_global(mut self) -> Path {
100-
let name = self.segments[0].identifier.name;
101-
if !self.is_global() && name != "$crate" &&
102-
name != keywords::SelfValue.name() && name != keywords::Super.name() {
100+
if !self.is_global() &&
101+
!::parse::token::Ident(self.segments[0].identifier).is_path_segment_keyword() {
103102
self.segments.insert(0, PathSegment::crate_root());
104103
}
105104
self

src/libsyntax/ext/tt/quoted.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use ast;
1212
use ext::tt::macro_parser;
1313
use parse::{ParseSess, token};
1414
use print::pprust;
15-
use symbol::{keywords, Symbol};
15+
use symbol::keywords;
1616
use syntax_pos::{DUMMY_SP, Span, BytePos};
1717
use tokenstream;
1818

@@ -196,7 +196,7 @@ fn parse_tree<I>(tree: tokenstream::TokenTree,
196196
Some(tokenstream::TokenTree::Token(ident_span, token::Ident(ident))) => {
197197
let span = Span { lo: span.lo, ..ident_span };
198198
if ident.name == keywords::Crate.name() {
199-
let ident = ast::Ident { name: Symbol::intern("$crate"), ..ident };
199+
let ident = ast::Ident { name: keywords::DollarCrate.name(), ..ident };
200200
TokenTree::Token(span, token::Ident(ident))
201201
} else {
202202
TokenTree::Token(span, token::SubstNt(ident))

src/libsyntax/parse/lexer/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1283,7 +1283,7 @@ impl<'a> StringReader<'a> {
12831283
});
12841284
let keyword_checking_token = &token::Ident(keyword_checking_ident);
12851285
let last_bpos = self.pos;
1286-
if keyword_checking_token.is_any_keyword() &&
1286+
if keyword_checking_token.is_reserved_ident() &&
12871287
!keyword_checking_token.is_keyword(keywords::Static) {
12881288
self.err_span_(start, last_bpos, "lifetimes cannot use keyword names");
12891289
}

src/libsyntax/parse/parser.rs

+14-32
Original file line numberDiff line numberDiff line change
@@ -511,14 +511,13 @@ impl<'a> Parser<'a> {
511511
}
512512

513513
pub fn this_token_descr(&self) -> String {
514-
let s = self.this_token_to_string();
515-
if self.token.is_strict_keyword() {
516-
format!("keyword `{}`", s)
517-
} else if self.token.is_reserved_keyword() {
518-
format!("reserved keyword `{}`", s)
519-
} else {
520-
format!("`{}`", s)
521-
}
514+
let prefix = match &self.token {
515+
t if t.is_special_ident() => "reserved identifier ",
516+
t if t.is_used_keyword() => "keyword ",
517+
t if t.is_unused_keyword() => "reserved keyword ",
518+
_ => "",
519+
};
520+
format!("{}`{}`", prefix, self.this_token_to_string())
522521
}
523522

524523
pub fn unexpected_last<T>(&self, t: &token::Token) -> PResult<'a, T> {
@@ -637,10 +636,12 @@ impl<'a> Parser<'a> {
637636
}
638637

639638
pub fn parse_ident(&mut self) -> PResult<'a, ast::Ident> {
640-
self.check_strict_keywords();
641-
self.check_reserved_keywords();
642639
match self.token {
643640
token::Ident(i) => {
641+
if self.token.is_reserved_ident() {
642+
self.span_err(self.span, &format!("expected identifier, found {}",
643+
self.this_token_descr()));
644+
}
644645
self.bump();
645646
Ok(i)
646647
}
@@ -713,25 +714,6 @@ impl<'a> Parser<'a> {
713714
}
714715
}
715716

716-
/// Signal an error if the given string is a strict keyword
717-
pub fn check_strict_keywords(&mut self) {
718-
if self.token.is_strict_keyword() {
719-
let token_str = self.this_token_to_string();
720-
let span = self.span;
721-
self.span_err(span,
722-
&format!("expected identifier, found keyword `{}`",
723-
token_str));
724-
}
725-
}
726-
727-
/// Signal an error if the current token is a reserved keyword
728-
pub fn check_reserved_keywords(&mut self) {
729-
if self.token.is_reserved_keyword() {
730-
let token_str = self.this_token_to_string();
731-
self.fatal(&format!("`{}` is a reserved keyword", token_str)).emit()
732-
}
733-
}
734-
735717
fn check_ident(&mut self) -> bool {
736718
if self.token.is_ident() {
737719
true
@@ -2301,7 +2283,7 @@ impl<'a> Parser<'a> {
23012283
ex = ExprKind::Break(lt, e);
23022284
hi = self.prev_span;
23032285
} else if self.token.is_keyword(keywords::Let) {
2304-
// Catch this syntax error here, instead of in `check_strict_keywords`, so
2286+
// Catch this syntax error here, instead of in `parse_ident`, so
23052287
// that we can explicitly mention that let is not to be used as an expression
23062288
let mut db = self.fatal("expected expression, found statement (`let`)");
23072289
db.note("variable declaration using `let` is a statement");
@@ -3540,7 +3522,7 @@ impl<'a> Parser<'a> {
35403522
// Parse box pat
35413523
let subpat = self.parse_pat()?;
35423524
pat = PatKind::Box(subpat);
3543-
} else if self.token.is_ident() && !self.token.is_any_keyword() &&
3525+
} else if self.token.is_ident() && !self.token.is_reserved_ident() &&
35443526
self.parse_as_ident() {
35453527
// Parse ident @ pat
35463528
// This can give false positives and parse nullary enums,
@@ -3815,7 +3797,7 @@ impl<'a> Parser<'a> {
38153797

38163798
fn is_union_item(&self) -> bool {
38173799
self.token.is_keyword(keywords::Union) &&
3818-
self.look_ahead(1, |t| t.is_ident() && !t.is_any_keyword())
3800+
self.look_ahead(1, |t| t.is_ident() && !t.is_reserved_ident())
38193801
}
38203802

38213803
fn is_defaultness(&self) -> bool {

src/libsyntax/parse/token.rs

+20-10
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ impl Lit {
8787
fn ident_can_begin_expr(ident: ast::Ident) -> bool {
8888
let ident_token: Token = Ident(ident);
8989

90-
!ident_token.is_any_keyword() ||
90+
!ident_token.is_reserved_ident() ||
9191
ident_token.is_path_segment_keyword() ||
9292
[
9393
keywords::Do.name(),
@@ -110,7 +110,7 @@ fn ident_can_begin_expr(ident: ast::Ident) -> bool {
110110
fn ident_can_begin_type(ident: ast::Ident) -> bool {
111111
let ident_token: Token = Ident(ident);
112112

113-
!ident_token.is_any_keyword() ||
113+
!ident_token.is_reserved_ident() ||
114114
ident_token.is_path_segment_keyword() ||
115115
[
116116
keywords::For.name(),
@@ -315,7 +315,7 @@ impl Token {
315315

316316
pub fn is_path_start(&self) -> bool {
317317
self == &ModSep || self.is_qpath_start() || self.is_path() ||
318-
self.is_path_segment_keyword() || self.is_ident() && !self.is_any_keyword()
318+
self.is_path_segment_keyword() || self.is_ident() && !self.is_reserved_ident()
319319
}
320320

321321
/// Returns `true` if the token is a given keyword, `kw`.
@@ -327,31 +327,41 @@ impl Token {
327327
match self.ident() {
328328
Some(id) => id.name == keywords::Super.name() ||
329329
id.name == keywords::SelfValue.name() ||
330-
id.name == keywords::SelfType.name(),
330+
id.name == keywords::SelfType.name() ||
331+
id.name == keywords::DollarCrate.name(),
331332
None => false,
332333
}
333334
}
334335

335-
/// Returns `true` if the token is either a strict or reserved keyword.
336-
pub fn is_any_keyword(&self) -> bool {
337-
self.is_strict_keyword() || self.is_reserved_keyword()
336+
// Returns true for reserved identifiers used internally for elided lifetimes,
337+
// unnamed method parameters, crate root module, error recovery etc.
338+
pub fn is_special_ident(&self) -> bool {
339+
match self.ident() {
340+
Some(id) => id.name <= keywords::DollarCrate.name(),
341+
_ => false,
342+
}
338343
}
339344

340-
/// Returns `true` if the token is a strict keyword.
341-
pub fn is_strict_keyword(&self) -> bool {
345+
/// Returns `true` if the token is a keyword used in the language.
346+
pub fn is_used_keyword(&self) -> bool {
342347
match self.ident() {
343348
Some(id) => id.name >= keywords::As.name() && id.name <= keywords::While.name(),
344349
_ => false,
345350
}
346351
}
347352

348353
/// Returns `true` if the token is a keyword reserved for possible future use.
349-
pub fn is_reserved_keyword(&self) -> bool {
354+
pub fn is_unused_keyword(&self) -> bool {
350355
match self.ident() {
351356
Some(id) => id.name >= keywords::Abstract.name() && id.name <= keywords::Yield.name(),
352357
_ => false,
353358
}
354359
}
360+
361+
/// Returns `true` if the token is either a special identifier or a keyword.
362+
pub fn is_reserved_ident(&self) -> bool {
363+
self.is_special_ident() || self.is_used_keyword() || self.is_unused_keyword()
364+
}
355365
}
356366

357367
#[derive(Clone, RustcEncodable, RustcDecodable, PartialEq, Eq, Hash)]

src/libsyntax/print/pprust.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,7 @@ pub trait PrintState<'a> {
761761
word(self.writer(), "::")?
762762
}
763763
if segment.identifier.name != keywords::CrateRoot.name() &&
764-
segment.identifier.name != "$crate" {
764+
segment.identifier.name != keywords::DollarCrate.name() {
765765
word(self.writer(), &segment.identifier.name.as_str())?;
766766
}
767767
}
@@ -2375,7 +2375,7 @@ impl<'a> State<'a> {
23752375
-> io::Result<()>
23762376
{
23772377
if segment.identifier.name != keywords::CrateRoot.name() &&
2378-
segment.identifier.name != "$crate" {
2378+
segment.identifier.name != keywords::DollarCrate.name() {
23792379
self.print_ident(segment.identifier)?;
23802380
if let Some(ref parameters) = segment.parameters {
23812381
self.print_path_parameters(parameters, colons_before_params)?;

0 commit comments

Comments
 (0)