From 4771a5679188177e653262e69ed7e33b4bf60c65 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Thu, 18 Mar 2021 22:25:10 +0100 Subject: Parse extended_key_value_attributes --- Cargo.lock | 4 +-- crates/hir_def/src/attr.rs | 2 +- crates/ide/src/syntax_highlighting/inject.rs | 5 +-- crates/parser/src/grammar/attributes.rs | 4 +-- crates/syntax/src/ast/generated/nodes.rs | 46 ++++++++++++++-------------- crates/syntax/src/ast/node_ext.rs | 10 ------ xtask/Cargo.toml | 2 +- 7 files changed, 32 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b99c243a4..9f013c275 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1809,9 +1809,9 @@ checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" [[package]] name = "ungrammar" -version = "1.12.2" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6586a7c530704efe803d49a0b4132dcbdb4063163df39110548e6b5f2373ba" +checksum = "76760314176cc2b94047af2f921b92c39f11a34dc05c43a3c2b0fc91cb22959f" [[package]] name = "unicase" diff --git a/crates/hir_def/src/attr.rs b/crates/hir_def/src/attr.rs index e4c84afbf..85d01ac3e 100644 --- a/crates/hir_def/src/attr.rs +++ b/crates/hir_def/src/attr.rs @@ -414,7 +414,7 @@ pub enum AttrInput { impl Attr { fn from_src(ast: ast::Attr, hygiene: &Hygiene, index: u32) -> Option { let path = ModPath::from_src(ast.path()?, hygiene)?; - let input = if let Some(lit) = ast.literal() { + let input = if let Some(ast::Expr::Literal(lit)) = ast.expr() { let value = match lit.kind() { ast::LiteralKind::String(string) => string.value()?.into(), _ => lit.syntax().first_token()?.text().trim_matches('"').into(), diff --git a/crates/ide/src/syntax_highlighting/inject.rs b/crates/ide/src/syntax_highlighting/inject.rs index 947cc974c..90feb6c18 100644 --- a/crates/ide/src/syntax_highlighting/inject.rs +++ b/crates/ide/src/syntax_highlighting/inject.rs @@ -277,9 +277,9 @@ pub(super) fn doc_comment(hl: &mut Highlights, sema: &Semantics, n } fn find_doc_string_in_attr(attr: &hir::Attr, it: &ast::Attr) -> Option { - match it.literal() { + match it.expr() { // #[doc = lit] - Some(lit) => match lit.kind() { + Some(ast::Expr::Literal(lit)) => match lit.kind() { ast::LiteralKind::String(it) => Some(it), _ => None, }, @@ -297,6 +297,7 @@ fn find_doc_string_in_attr(attr: &hir::Attr, it: &ast::Attr) -> Option return None, } } diff --git a/crates/parser/src/grammar/attributes.rs b/crates/parser/src/grammar/attributes.rs index dab0f62c3..96791ffc2 100644 --- a/crates/parser/src/grammar/attributes.rs +++ b/crates/parser/src/grammar/attributes.rs @@ -30,8 +30,8 @@ fn attr(p: &mut Parser, inner: bool) { match p.current() { T![=] => { p.bump(T![=]); - if expressions::literal(p).is_none() { - p.error("expected literal"); + if expressions::expr(p).0.is_none() { + p.error("expected expression"); } } T!['('] | T!['['] | T!['{'] => items::token_tree(p), diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs index 6097178b6..9a88fdb56 100644 --- a/crates/syntax/src/ast/generated/nodes.rs +++ b/crates/syntax/src/ast/generated/nodes.rs @@ -152,7 +152,7 @@ impl Attr { pub fn l_brack_token(&self) -> Option { support::token(&self.syntax, T!['[']) } pub fn path(&self) -> Option { support::child(&self.syntax) } pub fn eq_token(&self) -> Option { support::token(&self.syntax, T![=]) } - pub fn literal(&self) -> Option { support::child(&self.syntax) } + pub fn expr(&self) -> Option { support::child(&self.syntax) } pub fn token_tree(&self) -> Option { support::child(&self.syntax) } pub fn r_brack_token(&self) -> Option { support::token(&self.syntax, T![']']) } } @@ -632,12 +632,6 @@ impl WherePred { pub fn ty(&self) -> Option { support::child(&self.syntax) } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct Literal { - pub(crate) syntax: SyntaxNode, -} -impl ast::AttrsOwner for Literal {} -impl Literal {} -#[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ExprStmt { pub(crate) syntax: SyntaxNode, } @@ -805,6 +799,12 @@ impl IndexExpr { pub fn r_brack_token(&self) -> Option { support::token(&self.syntax, T![']']) } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Literal { + pub(crate) syntax: SyntaxNode, +} +impl ast::AttrsOwner for Literal {} +impl Literal {} +#[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct LoopExpr { pub(crate) syntax: SyntaxNode, } @@ -2072,17 +2072,6 @@ impl AstNode for WherePred { } fn syntax(&self) -> &SyntaxNode { &self.syntax } } -impl AstNode for Literal { - fn can_cast(kind: SyntaxKind) -> bool { kind == LITERAL } - fn cast(syntax: SyntaxNode) -> Option { - if Self::can_cast(syntax.kind()) { - Some(Self { syntax }) - } else { - None - } - } - fn syntax(&self) -> &SyntaxNode { &self.syntax } -} impl AstNode for ExprStmt { fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_STMT } fn cast(syntax: SyntaxNode) -> Option { @@ -2259,6 +2248,17 @@ impl AstNode for IndexExpr { } fn syntax(&self) -> &SyntaxNode { &self.syntax } } +impl AstNode for Literal { + fn can_cast(kind: SyntaxKind) -> bool { kind == LITERAL } + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + fn syntax(&self) -> &SyntaxNode { &self.syntax } +} impl AstNode for LoopExpr { fn can_cast(kind: SyntaxKind) -> bool { kind == LOOP_EXPR } fn cast(syntax: SyntaxNode) -> Option { @@ -3887,11 +3887,6 @@ impl std::fmt::Display for WherePred { std::fmt::Display::fmt(self.syntax(), f) } } -impl std::fmt::Display for Literal { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) - } -} impl std::fmt::Display for ExprStmt { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { std::fmt::Display::fmt(self.syntax(), f) @@ -3972,6 +3967,11 @@ impl std::fmt::Display for IndexExpr { std::fmt::Display::fmt(self.syntax(), f) } } +impl std::fmt::Display for Literal { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(self.syntax(), f) + } +} impl std::fmt::Display for LoopExpr { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { std::fmt::Display::fmt(self.syntax(), f) diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index 0b0d39a75..5a9834cbb 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -109,16 +109,6 @@ impl ast::Attr { Some((self.simple_name()?, tt)) } - pub fn as_simple_key_value(&self) -> Option<(SmolStr, SmolStr)> { - let lit = self.literal()?; - let key = self.simple_name()?; - let value_token = lit.syntax().first_token()?; - - let value: SmolStr = ast::String::cast(value_token)?.value()?.into(); - - Some((key, value)) - } - pub fn simple_name(&self) -> Option { let path = self.path()?; match (path.segment(), path.qualifier()) { diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml index ad93fbe3b..997770958 100644 --- a/xtask/Cargo.toml +++ b/xtask/Cargo.toml @@ -11,7 +11,7 @@ anyhow = "1.0.26" flate2 = "1.0" proc-macro2 = "1.0.8" quote = "1.0.2" -ungrammar = "=1.12" +ungrammar = "=1.13" walkdir = "2.3.1" write-json = "0.1.0" xshell = "0.1" -- cgit v1.2.3