Skip to content
This repository has been archived by the owner on Aug 31, 2023. It is now read-only.

Commit

Permalink
Fix code gen for union tokens to correctly reflect optionality.
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaReiser committed Nov 12, 2021
1 parent a96d636 commit 586ee7d
Show file tree
Hide file tree
Showing 8 changed files with 562 additions and 816 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ use crate::{
Formatter, ToFormatElement,
};
use rslint_parser::ast::{
AstNode, JsVariableDeclaration, JsVariableDeclarationStatement, JsVariableDeclarator,
JsVariableDeclaration, JsVariableDeclarationStatement, JsVariableDeclarator,
};
use rslint_parser::SyntaxError;

impl ToFormatElement for JsVariableDeclarationStatement {
fn to_format_element(&self, formatter: &Formatter) -> FormatResult<FormatElement> {
Expand All @@ -25,11 +24,7 @@ impl ToFormatElement for JsVariableDeclaration {
}

Ok(format_elements![
formatter.format_token(
&self
.kind_token()
.ok_or_else(|| SyntaxError::MissingRequiredChild(self.syntax().clone()))?
)?,
formatter.format_token(&self.kind_token()?)?,
space_token(),
join_elements(token(","), declarators),
])
Expand Down
38 changes: 13 additions & 25 deletions crates/rslint_parser/src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -364,14 +364,12 @@ mod support {
use crate::SyntaxList;
use crate::{SyntaxError, SyntaxResult};

// TODO: #1725 remove once API are set in stone
#[allow(dead_code)]
pub(super) fn child<N: AstNode>(parent: &SyntaxNode) -> Option<N> {
pub(super) fn node<N: AstNode>(parent: &SyntaxNode) -> Option<N> {
parent.children().find_map(N::cast)
}

pub(super) fn as_optional_node<N: AstNode>(parent: &SyntaxNode) -> Option<N> {
parent.children().find_map(N::cast)
pub(super) fn required_node<N: AstNode>(parent: &SyntaxNode) -> SyntaxResult<N> {
node(parent).ok_or_else(|| SyntaxError::MissingRequiredChild(parent.clone()))
}

pub(super) fn elements(parent: &SyntaxNode) -> SyntaxElementChildren {
Expand Down Expand Up @@ -409,29 +407,11 @@ mod support {
.find(|it| it.kind() == kind)
}

pub(super) fn as_optional_token(parent: &SyntaxNode, kind: SyntaxKind) -> Option<SyntaxToken> {
parent
.children_with_tokens()
.filter_map(|it| it.into_token())
.find(|it| it.kind() == kind)
}

pub(super) fn as_mandatory_node<N: AstNode>(parent: &SyntaxNode) -> SyntaxResult<N> {
parent
.children()
.find_map(N::cast)
.ok_or_else(|| SyntaxError::MissingRequiredChild(parent.clone()))
}

pub(super) fn as_mandatory_token(
pub(super) fn required_token(
parent: &SyntaxNode,
kind: SyntaxKind,
) -> SyntaxResult<SyntaxToken> {
parent
.children_with_tokens()
.filter_map(|it| it.into_token())
.find(|it| it.kind() == kind)
.ok_or_else(|| SyntaxError::MissingRequiredChild(parent.clone()))
token(parent, kind).ok_or_else(|| SyntaxError::MissingRequiredChild(parent.clone()))
}

pub(super) fn find_token(
Expand All @@ -447,6 +427,14 @@ mod support {
.any(|possible_kind| *possible_kind == it.kind())
})
}

pub(super) fn find_required_token(
parent: &SyntaxNode,
possible_kinds: &[SyntaxKind],
) -> SyntaxResult<SyntaxToken> {
find_token(parent, possible_kinds)
.ok_or_else(|| SyntaxError::MissingRequiredChild(parent.clone()))
}
}

#[cfg(test)]
Expand Down
8 changes: 4 additions & 4 deletions crates/rslint_parser/src/ast/expr_ext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use SyntaxKind::*;

impl BracketExpr {
pub fn object(&self) -> Option<JsAnyExpression> {
support::child(self.syntax())
support::node(self.syntax())
}

pub fn prop(&self) -> Option<JsAnyExpression> {
Expand All @@ -15,7 +15,7 @@ impl BracketExpr {

impl CondExpr {
pub fn test(&self) -> Option<JsAnyExpression> {
support::child(self.syntax())
support::node(self.syntax())
}

pub fn cons(&self) -> Option<JsAnyExpression> {
Expand All @@ -29,7 +29,7 @@ impl CondExpr {

impl LiteralProp {
pub fn key(&self) -> SyntaxResult<PropName> {
support::as_mandatory_node::<PropName>(self.syntax())
support::required_node::<PropName>(self.syntax())
}

pub fn value(&self) -> SyntaxResult<JsAnyExpression> {
Expand Down Expand Up @@ -144,7 +144,7 @@ impl BinExpr {
}

pub fn lhs(&self) -> Option<JsAnyExpression> {
support::child(self.syntax())
support::node(self.syntax())
}

pub fn rhs(&self) -> Option<JsAnyExpression> {
Expand Down
Loading

0 comments on commit 586ee7d

Please sign in to comment.