From 1c906093f93ca55994bded24fa0f9c99b8d1a681 Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Sat, 21 Jul 2018 19:34:45 -0700 Subject: [PATCH] Add `try` to syntax_pos as an edition-2018-only keyword --- src/libsyntax_pos/symbol.rs | 29 ++++++++++++------- .../keyword-try-as-identifier-edition2018.rs | 15 ++++++++++ .../run-pass/try-is-identifier-edition2015.rs | 18 ++++++++++++ 3 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 src/test/parse-fail/keyword-try-as-identifier-edition2018.rs create mode 100644 src/test/run-pass/try-is-identifier-edition2015.rs diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs index 62f22475e7d..dc92ce56c79 100644 --- a/src/libsyntax_pos/symbol.rs +++ b/src/libsyntax_pos/symbol.rs @@ -413,23 +413,30 @@ pub fn fresh() -> Self { (49, Virtual, "virtual") (50, Yield, "yield") + // Edition-specific keywords currently in use. + (51, Try, "try") // >= 2018 Edition Only + // Edition-specific keywords reserved for future use. - (51, Async, "async") // >= 2018 Edition Only + (52, Async, "async") // >= 2018 Edition Only // Special lifetime names - (52, UnderscoreLifetime, "'_") - (53, StaticLifetime, "'static") + (53, UnderscoreLifetime, "'_") + (54, StaticLifetime, "'static") // Weak keywords, have special meaning only in specific contexts. - (54, Auto, "auto") - (55, Catch, "catch") - (56, Default, "default") - (57, Dyn, "dyn") - (58, Union, "union") - (59, Existential, "existential") + (55, Auto, "auto") + (56, Catch, "catch") + (57, Default, "default") + (58, Dyn, "dyn") + (59, Union, "union") + (60, Existential, "existential") } impl Symbol { + fn is_used_keyword_2018(self) -> bool { + self == keywords::Try.name() + } + fn is_unused_keyword_2018(self) -> bool { self == keywords::Async.name() } @@ -444,7 +451,9 @@ pub fn is_special(self) -> bool { /// Returns `true` if the token is a keyword used in the language. pub fn is_used_keyword(self) -> bool { - self.name >= keywords::As.name() && self.name <= keywords::While.name() + // Note: `span.edition()` is relatively expensive, don't call it unless necessary. + self.name >= keywords::As.name() && self.name <= keywords::While.name() || + self.name.is_used_keyword_2018() && self.span.edition() == Edition::Edition2018 } /// Returns `true` if the token is a keyword reserved for possible future use. diff --git a/src/test/parse-fail/keyword-try-as-identifier-edition2018.rs b/src/test/parse-fail/keyword-try-as-identifier-edition2018.rs new file mode 100644 index 00000000000..1fe67313a35 --- /dev/null +++ b/src/test/parse-fail/keyword-try-as-identifier-edition2018.rs @@ -0,0 +1,15 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-flags: -Z parse-only --edition 2018 + +fn main() { + let try = "foo"; //~ error: expected pattern, found keyword `try` +} diff --git a/src/test/run-pass/try-is-identifier-edition2015.rs b/src/test/run-pass/try-is-identifier-edition2015.rs new file mode 100644 index 00000000000..aafb52e4c49 --- /dev/null +++ b/src/test/run-pass/try-is-identifier-edition2015.rs @@ -0,0 +1,18 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-flags: --edition 2015 + +fn main() { + let try = 2; + struct try { try: u32 }; + let try: try = try { try }; + assert_eq!(try.try, 2); +} -- 2.44.0