syntax: Introduce Ident::can_be_raw
This commit is contained in:
parent
5cb5083909
commit
6ad55b3dec
10 changed files with 33 additions and 36 deletions
|
@ -1,7 +1,7 @@
|
||||||
use crate::ast::{self, Ident};
|
use crate::ast::{self, Ident};
|
||||||
use crate::source_map::{SourceMap, FilePathMapping};
|
use crate::source_map::{SourceMap, FilePathMapping};
|
||||||
use crate::parse::{token, ParseSess};
|
use crate::parse::{token, ParseSess};
|
||||||
use crate::symbol::{Symbol, keywords};
|
use crate::symbol::Symbol;
|
||||||
|
|
||||||
use errors::{Applicability, FatalError, Diagnostic, DiagnosticBuilder};
|
use errors::{Applicability, FatalError, Diagnostic, DiagnosticBuilder};
|
||||||
use syntax_pos::{BytePos, CharPos, Pos, Span, NO_EXPANSION};
|
use syntax_pos::{BytePos, CharPos, Pos, Span, NO_EXPANSION};
|
||||||
|
@ -1249,15 +1249,11 @@ impl<'a> StringReader<'a> {
|
||||||
// FIXME: perform NFKC normalization here. (Issue #2253)
|
// FIXME: perform NFKC normalization here. (Issue #2253)
|
||||||
let ident = self.mk_ident(string);
|
let ident = self.mk_ident(string);
|
||||||
|
|
||||||
if is_raw_ident && (ident.is_path_segment_keyword() ||
|
|
||||||
ident.name == keywords::Underscore.name()) {
|
|
||||||
self.fatal_span_(raw_start, self.pos,
|
|
||||||
&format!("`r#{}` is not currently supported.", ident.name)
|
|
||||||
).raise();
|
|
||||||
}
|
|
||||||
|
|
||||||
if is_raw_ident {
|
if is_raw_ident {
|
||||||
let span = self.mk_sp(raw_start, self.pos);
|
let span = self.mk_sp(raw_start, self.pos);
|
||||||
|
if !ident.can_be_raw() {
|
||||||
|
self.err_span(span, &format!("`{}` cannot be a raw identifier", ident));
|
||||||
|
}
|
||||||
self.sess.raw_identifier_spans.borrow_mut().push(span);
|
self.sess.raw_identifier_spans.borrow_mut().push(span);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -895,9 +895,7 @@ impl<'a> Parser<'a> {
|
||||||
&format!("expected identifier, found {}",
|
&format!("expected identifier, found {}",
|
||||||
self.this_token_descr()));
|
self.this_token_descr()));
|
||||||
if let token::Ident(ident, false) = &self.token {
|
if let token::Ident(ident, false) = &self.token {
|
||||||
if ident.is_reserved() && !ident.is_path_segment_keyword() &&
|
if ident.is_raw_guess() {
|
||||||
ident.name != keywords::Underscore.name()
|
|
||||||
{
|
|
||||||
err.span_suggestion(
|
err.span_suggestion(
|
||||||
self.span,
|
self.span,
|
||||||
"you can escape reserved keywords to use them as identifiers",
|
"you can escape reserved keywords to use them as identifiers",
|
||||||
|
|
|
@ -128,7 +128,7 @@ impl<'a> CollectProcMacros<'a> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if trait_ident.is_path_segment_keyword() {
|
if !trait_ident.can_be_raw() {
|
||||||
self.handler.span_err(trait_attr.span(),
|
self.handler.span_err(trait_attr.span(),
|
||||||
&format!("`{}` cannot be a name of derive macro", trait_ident));
|
&format!("`{}` cannot be a name of derive macro", trait_ident));
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,7 @@ impl<'a> CollectProcMacros<'a> {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if ident.is_path_segment_keyword() {
|
if !ident.can_be_raw() {
|
||||||
self.handler.span_err(
|
self.handler.span_err(
|
||||||
attr.span(),
|
attr.span(),
|
||||||
&format!("`{}` cannot be a name of derive helper attribute", ident),
|
&format!("`{}` cannot be a name of derive helper attribute", ident),
|
||||||
|
|
|
@ -340,12 +340,8 @@ impl Ident {
|
||||||
if !Self::is_valid(string) {
|
if !Self::is_valid(string) {
|
||||||
panic!("`{:?}` is not a valid identifier", string)
|
panic!("`{:?}` is not a valid identifier", string)
|
||||||
}
|
}
|
||||||
if is_raw {
|
if is_raw && !ast::Ident::from_str(string).can_be_raw() {
|
||||||
let normalized_sym = Symbol::intern(string);
|
panic!("`{}` cannot be a raw identifier", string);
|
||||||
if normalized_sym == keywords::Underscore.name() ||
|
|
||||||
ast::Ident::with_empty_ctxt(normalized_sym).is_path_segment_keyword() {
|
|
||||||
panic!("`{:?}` is not a valid raw identifier", string)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Ident { sym, is_raw, span }
|
Ident { sym, is_raw, span }
|
||||||
}
|
}
|
||||||
|
|
|
@ -484,11 +484,16 @@ impl Ident {
|
||||||
self.name == keywords::DollarCrate.name()
|
self.name == keywords::DollarCrate.name()
|
||||||
}
|
}
|
||||||
|
|
||||||
// We see this identifier in a normal identifier position, like variable name or a type.
|
/// This identifier can be a raw identifier.
|
||||||
// How was it written originally? Did it use the raw form? Let's try to guess.
|
pub fn can_be_raw(self) -> bool {
|
||||||
pub fn is_raw_guess(self) -> bool {
|
|
||||||
self.name != keywords::Invalid.name() && self.name != keywords::Underscore.name() &&
|
self.name != keywords::Invalid.name() && self.name != keywords::Underscore.name() &&
|
||||||
self.is_reserved() && !self.is_path_segment_keyword()
|
!self.is_path_segment_keyword()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// We see this identifier in a normal identifier position, like variable name or a type.
|
||||||
|
/// How was it written originally? Did it use the raw form? Let's try to guess.
|
||||||
|
pub fn is_raw_guess(self) -> bool {
|
||||||
|
self.can_be_raw() && self.is_reserved()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
fn self_test(r#self: u32) {
|
fn main() {
|
||||||
//~^ ERROR `r#self` is not currently supported.
|
let r#self;
|
||||||
|
//~^ ERROR `self` cannot be a raw identifier
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
error: `r#self` is not currently supported.
|
error: `self` cannot be a raw identifier
|
||||||
--> $DIR/raw-literal-self.rs:1:14
|
--> $DIR/raw-literal-self.rs:2:9
|
||||||
|
|
|
|
||||||
LL | fn self_test(r#self: u32) {
|
LL | let r#self;
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
fn underscore_test(r#_: u32) {
|
fn main() {
|
||||||
//~^ ERROR `r#_` is not currently supported.
|
let r#_;
|
||||||
|
//~^ ERROR `_` cannot be a raw identifier
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
error: `r#_` is not currently supported.
|
error: `_` cannot be a raw identifier
|
||||||
--> $DIR/raw-literal-underscore.rs:1:20
|
--> $DIR/raw-literal-underscore.rs:2:9
|
||||||
|
|
|
|
||||||
LL | fn underscore_test(r#_: u32) {
|
LL | let r#_;
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
|
@ -4,7 +4,7 @@ error: proc macro panicked
|
||||||
LL | invalid_raw_ident!();
|
LL | invalid_raw_ident!();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= help: message: `"self"` is not a valid raw identifier
|
= help: message: `self` cannot be a raw identifier
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue