use std::sync::Arc;
use haskelujah_syntax_chirho::cst_chirho::SyntaxKindChirho;
use haskelujah_syntax_chirho::green_chirho::{GreenBuilderChirho, GreenNodeChirho};
use haskelujah_syntax_chirho::token_chirho::TokenKindChirho;
use crate::layout_chirho::apply_layout_chirho;
use crate::lexer_chirho::{LexerChirho, RawTokenChirho, RawTokenKindChirho};
use haskelujah_span_chirho::FileIdChirho;
fn map_token_kind_chirho(raw_chirho: RawTokenKindChirho, text_chirho: &str) -> TokenKindChirho {
match raw_chirho {
RawTokenKindChirho::CaseChirho => TokenKindChirho::CaseKeywordChirho,
RawTokenKindChirho::ClassChirho => TokenKindChirho::ClassKeywordChirho,
RawTokenKindChirho::DataChirho => TokenKindChirho::DataKeywordChirho,
RawTokenKindChirho::DefaultChirho => TokenKindChirho::DefaultKeywordChirho,
RawTokenKindChirho::DerivingChirho => TokenKindChirho::DerivingKeywordChirho,
RawTokenKindChirho::DoChirho => TokenKindChirho::DoKeywordChirho,
RawTokenKindChirho::ElseChirho => TokenKindChirho::ElseKeywordChirho,
RawTokenKindChirho::ForeignChirho => TokenKindChirho::ForeignKeywordChirho,
RawTokenKindChirho::IfChirho => TokenKindChirho::IfKeywordChirho,
RawTokenKindChirho::ImportChirho => TokenKindChirho::ImportKeywordChirho,
RawTokenKindChirho::InChirho => TokenKindChirho::InKeywordChirho,
RawTokenKindChirho::InfixChirho => TokenKindChirho::InfixKeywordChirho,
RawTokenKindChirho::InfixlChirho => TokenKindChirho::InfixlKeywordChirho,
RawTokenKindChirho::InfixrChirho => TokenKindChirho::InfixrKeywordChirho,
RawTokenKindChirho::InstanceChirho => TokenKindChirho::InstanceKeywordChirho,
RawTokenKindChirho::LetChirho => TokenKindChirho::LetKeywordChirho,
RawTokenKindChirho::ModuleChirho => TokenKindChirho::ModuleKeywordChirho,
RawTokenKindChirho::NewtypeChirho => TokenKindChirho::NewtypeKeywordChirho,
RawTokenKindChirho::OfChirho => TokenKindChirho::OfKeywordChirho,
RawTokenKindChirho::ThenChirho => TokenKindChirho::ThenKeywordChirho,
RawTokenKindChirho::TypeChirho => TokenKindChirho::TypeKeywordChirho,
RawTokenKindChirho::WhereChirho => TokenKindChirho::WhereKeywordChirho,
RawTokenKindChirho::ForallChirho => TokenKindChirho::ForallKeywordChirho,
RawTokenKindChirho::VarIdChirho => TokenKindChirho::VarIdChirho,
RawTokenKindChirho::ConIdChirho => TokenKindChirho::ConIdChirho,
RawTokenKindChirho::VarSymChirho => TokenKindChirho::VarSymChirho,
RawTokenKindChirho::ConSymChirho => TokenKindChirho::ConSymChirho,
RawTokenKindChirho::QualifiedIdChirho => {
let local_chirho = text_chirho.rsplit('.').next().unwrap_or(text_chirho);
if local_chirho
.starts_with(|c_chirho: char| c_chirho.is_ascii_lowercase() || c_chirho == '_')
{
TokenKindChirho::QualifiedVarIdChirho
} else {
TokenKindChirho::QualifiedConIdChirho
}
}
RawTokenKindChirho::IntLitChirho => TokenKindChirho::IntegerLiteralChirho,
RawTokenKindChirho::FloatLitChirho => TokenKindChirho::FloatLiteralChirho,
RawTokenKindChirho::CharLitChirho => TokenKindChirho::CharLiteralChirho,
RawTokenKindChirho::StringLitChirho => TokenKindChirho::StringLiteralChirho,
RawTokenKindChirho::LeftParenChirho => TokenKindChirho::LeftParenChirho,
RawTokenKindChirho::RightParenChirho => TokenKindChirho::RightParenChirho,
RawTokenKindChirho::LeftBracketChirho => TokenKindChirho::LeftBracketChirho,
RawTokenKindChirho::RightBracketChirho => TokenKindChirho::RightBracketChirho,
RawTokenKindChirho::LeftBraceChirho => TokenKindChirho::LeftBraceChirho,
RawTokenKindChirho::RightBraceChirho => TokenKindChirho::RightBraceChirho,
RawTokenKindChirho::CommaChirho => TokenKindChirho::CommaChirho,
RawTokenKindChirho::SemicolonChirho => TokenKindChirho::SemicolonChirho,
RawTokenKindChirho::BacktickChirho => TokenKindChirho::BacktickChirho,
RawTokenKindChirho::DotDotChirho => TokenKindChirho::DotDotChirho,
RawTokenKindChirho::ColonColonChirho => TokenKindChirho::DoubleColonChirho,
RawTokenKindChirho::EqualsChirho => TokenKindChirho::EqualsChirho,
RawTokenKindChirho::BackslashChirho => TokenKindChirho::BackslashChirho,
RawTokenKindChirho::PipeChirho => TokenKindChirho::PipeChirho,
RawTokenKindChirho::LeftArrowChirho => TokenKindChirho::LeftArrowChirho,
RawTokenKindChirho::RightArrowChirho => TokenKindChirho::RightArrowChirho,
RawTokenKindChirho::LinearArrowChirho => TokenKindChirho::LinearArrowChirho,
RawTokenKindChirho::FatArrowChirho => TokenKindChirho::DoubleArrowChirho,
RawTokenKindChirho::AtChirho => TokenKindChirho::AtSignChirho,
RawTokenKindChirho::TildeChirho => TokenKindChirho::TildeChirho,
RawTokenKindChirho::UnderscoreChirho => TokenKindChirho::UnderscoreReservedIdChirho,
RawTokenKindChirho::TickChirho => TokenKindChirho::TickChirho,
RawTokenKindChirho::WhitespaceChirho => TokenKindChirho::WhitespaceTriviaChirho,
RawTokenKindChirho::LineCommentChirho => TokenKindChirho::LineCommentTriviaChirho,
RawTokenKindChirho::BlockCommentChirho => TokenKindChirho::BlockCommentTriviaChirho,
RawTokenKindChirho::DocCommentChirho => TokenKindChirho::DocCommentTriviaChirho,
RawTokenKindChirho::PragmaChirho => TokenKindChirho::PragmaChirho,
RawTokenKindChirho::VirtualLeftBraceChirho => TokenKindChirho::VirtualLeftBraceChirho,
RawTokenKindChirho::VirtualRightBraceChirho => TokenKindChirho::VirtualRightBraceChirho,
RawTokenKindChirho::VirtualSemicolonChirho => TokenKindChirho::VirtualSemicolonChirho,
RawTokenKindChirho::ThSpliceChirho => TokenKindChirho::ThSpliceChirho,
RawTokenKindChirho::ThTypedSpliceChirho => TokenKindChirho::ThTypedSpliceChirho,
RawTokenKindChirho::ThOpenExpQuoteChirho => TokenKindChirho::ThOpenExpQuoteChirho,
RawTokenKindChirho::ThCloseQuoteChirho => TokenKindChirho::ThCloseQuoteChirho,
RawTokenKindChirho::ThOpenDecQuoteChirho => TokenKindChirho::ThOpenDecQuoteChirho,
RawTokenKindChirho::ThOpenTypeQuoteChirho => TokenKindChirho::ThOpenTypeQuoteChirho,
RawTokenKindChirho::ThOpenPatQuoteChirho => TokenKindChirho::ThOpenPatQuoteChirho,
RawTokenKindChirho::ThOpenExpExplicitQuoteChirho => {
TokenKindChirho::ThOpenExpExplicitQuoteChirho
}
RawTokenKindChirho::ThOpenTypedExpQuoteChirho => TokenKindChirho::ThOpenTypedExpQuoteChirho,
RawTokenKindChirho::ThCloseTypedQuoteChirho => TokenKindChirho::ThCloseTypedQuoteChirho,
RawTokenKindChirho::EofChirho => TokenKindChirho::VarIdChirho, RawTokenKindChirho::ErrorChirho => TokenKindChirho::VarIdChirho, }
}
pub struct ParserChirho<'src> {
source_chirho: &'src str,
tokens_chirho: Vec<RawTokenChirho>,
pos_chirho: usize,
builder_chirho: GreenBuilderChirho,
}
impl<'src> ParserChirho<'src> {
pub fn new_chirho(source_chirho: &'src str, file_id_chirho: FileIdChirho) -> Self {
let mut lexer_chirho = LexerChirho::new_chirho(source_chirho, file_id_chirho);
let raw_chirho = lexer_chirho.lex_all_chirho();
let tokens_chirho = apply_layout_chirho(source_chirho, raw_chirho, file_id_chirho);
Self {
source_chirho,
tokens_chirho,
pos_chirho: 0,
builder_chirho: GreenBuilderChirho::new_chirho(),
}
}
pub fn parse_chirho(mut self) -> Arc<GreenNodeChirho> {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::SourceFileChirho);
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ModuleChirho) {
self.parse_module_header_chirho();
}
self.parse_top_level_decls_chirho();
self.eat_trivia_chirho();
if self.pos_chirho < self.tokens_chirho.len() {
self.bump_chirho(); }
self.builder_chirho.finish_node_chirho();
self.builder_chirho.finish_chirho()
}
fn parse_module_header_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ModuleHeaderChirho);
self.eat_trivia_chirho();
self.expect_chirho(RawTokenKindChirho::ModuleChirho);
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ConIdChirho)
|| self.at_chirho(RawTokenKindChirho::QualifiedIdChirho)
{
self.bump_chirho();
}
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::LeftParenChirho) {
self.parse_export_list_chirho();
}
self.eat_trivia_chirho();
self.expect_chirho(RawTokenKindChirho::WhereChirho);
self.builder_chirho.finish_node_chirho();
}
fn parse_export_list_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ExportListChirho);
self.expect_chirho(RawTokenKindChirho::LeftParenChirho);
self.eat_trivia_chirho();
while !self.at_chirho(RawTokenKindChirho::RightParenChirho) && !self.at_eof_chirho() {
let before_chirho = self.pos_chirho;
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ExportSpecChirho);
let mut paren_depth_chirho: u32 = 0;
loop {
self.eat_trivia_chirho();
if self.at_eof_chirho() {
break;
}
if paren_depth_chirho == 0
&& (self.at_chirho(RawTokenKindChirho::CommaChirho)
|| self.at_chirho(RawTokenKindChirho::RightParenChirho))
{
break;
}
if self.at_chirho(RawTokenKindChirho::LeftParenChirho) {
paren_depth_chirho += 1;
} else if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
paren_depth_chirho = paren_depth_chirho.saturating_sub(1);
}
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
}
if self.pos_chirho == before_chirho {
break;
}
}
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_top_level_decls_chirho(&mut self) {
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::VirtualLeftBraceChirho)
|| self.at_chirho(RawTokenKindChirho::LeftBraceChirho)
{
self.bump_chirho();
}
loop {
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::VirtualRightBraceChirho)
|| self.at_chirho(RawTokenKindChirho::RightBraceChirho)
{
self.bump_chirho();
break;
}
if self.at_eof_chirho() {
break;
}
if self.at_chirho(RawTokenKindChirho::VirtualSemicolonChirho)
|| self.at_chirho(RawTokenKindChirho::SemicolonChirho)
{
self.bump_chirho();
continue;
}
let before_chirho = self.pos_chirho;
self.parse_decl_chirho();
if self.pos_chirho == before_chirho {
if !self.at_eof_chirho() {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ErrorNodeChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
} else {
break;
}
}
}
}
fn parse_decl_chirho(&mut self) {
self.eat_trivia_chirho();
match self.current_kind_chirho() {
Some(RawTokenKindChirho::ImportChirho) => self.parse_import_decl_chirho(),
Some(RawTokenKindChirho::DataChirho) => self.parse_data_decl_chirho(),
Some(RawTokenKindChirho::TypeChirho) => self.parse_type_or_family_decl_chirho(),
Some(RawTokenKindChirho::NewtypeChirho) => self.parse_newtype_decl_chirho(),
Some(RawTokenKindChirho::ClassChirho) => self.parse_class_decl_chirho(),
Some(RawTokenKindChirho::InstanceChirho) => self.parse_instance_decl_chirho(),
Some(RawTokenKindChirho::InfixChirho)
| Some(RawTokenKindChirho::InfixlChirho)
| Some(RawTokenKindChirho::InfixrChirho) => self.parse_fixity_decl_chirho(),
Some(RawTokenKindChirho::DefaultChirho) => self.parse_default_decl_chirho(),
Some(RawTokenKindChirho::DerivingChirho) => self.parse_standalone_deriving_chirho(),
Some(RawTokenKindChirho::ForeignChirho) => self.parse_foreign_decl_chirho(),
Some(RawTokenKindChirho::ThSpliceChirho) => self.parse_splice_decl_chirho(),
_ => {
if self.at_varid_text_chirho("pattern") && self.peek_next_is_conid_chirho() {
self.parse_pat_syn_decl_chirho();
} else {
self.parse_value_decl_chirho();
}
}
}
}
fn parse_import_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ImportDeclChirho);
self.expect_chirho(RawTokenKindChirho::ImportChirho);
self.eat_trivia_chirho();
if self.at_varid_text_chirho("qualified") {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::StringLitChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::ConIdChirho)
|| self.at_chirho(RawTokenKindChirho::QualifiedIdChirho)
{
self.bump_chirho();
}
self.eat_trivia_chirho();
if self.at_varid_text_chirho("qualified") {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_varid_text_chirho("as") {
self.bump_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ConIdChirho) {
self.bump_chirho();
}
self.eat_trivia_chirho();
}
if self.at_varid_text_chirho("hiding") {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::LeftParenChirho) {
self.parse_import_spec_list_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_import_spec_list_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ImportSpecListChirho);
self.expect_chirho(RawTokenKindChirho::LeftParenChirho);
self.eat_trivia_chirho();
while !self.at_chirho(RawTokenKindChirho::RightParenChirho) && !self.at_eof_chirho() {
let before_chirho = self.pos_chirho;
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ImportSpecChirho);
let mut nested_paren_depth_chirho = 0usize;
let mut nested_bracket_depth_chirho = 0usize;
while !self.at_eof_chirho() {
self.eat_trivia_chirho();
if self.at_eof_chirho() {
break;
}
let should_end_spec_chirho = match self.current_kind_chirho() {
Some(RawTokenKindChirho::CommaChirho) => {
nested_paren_depth_chirho == 0 && nested_bracket_depth_chirho == 0
}
Some(RawTokenKindChirho::RightParenChirho) => {
nested_paren_depth_chirho == 0 && nested_bracket_depth_chirho == 0
}
_ => false,
};
if should_end_spec_chirho {
break;
}
match self.current_kind_chirho() {
Some(RawTokenKindChirho::LeftParenChirho) => {
nested_paren_depth_chirho += 1;
}
Some(RawTokenKindChirho::RightParenChirho) => {
nested_paren_depth_chirho =
nested_paren_depth_chirho.saturating_sub(1);
}
Some(RawTokenKindChirho::LeftBracketChirho) => {
nested_bracket_depth_chirho += 1;
}
Some(RawTokenKindChirho::RightBracketChirho) => {
nested_bracket_depth_chirho =
nested_bracket_depth_chirho.saturating_sub(1);
}
_ => {}
}
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.pos_chirho == before_chirho {
break;
}
}
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_data_decl_chirho(&mut self) {
let mut look_chirho = self.pos_chirho + 1;
while look_chirho < self.tokens_chirho.len()
&& matches!(
self.tokens_chirho[look_chirho].kind_chirho,
RawTokenKindChirho::WhitespaceChirho
| RawTokenKindChirho::LineCommentChirho
| RawTokenKindChirho::BlockCommentChirho
)
{
look_chirho += 1;
}
let next_text_chirho = if look_chirho < self.tokens_chirho.len() {
self.token_text_chirho(&self.tokens_chirho[look_chirho])
} else {
""
};
if next_text_chirho == "family" || next_text_chirho == "instance" {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::DataDeclChirho);
self.eat_until_decl_end_chirho();
self.builder_chirho.finish_node_chirho();
return;
}
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::DataDeclChirho);
self.expect_chirho(RawTokenKindChirho::DataChirho);
self.eat_trivia_chirho();
self.eat_until_any_chirho(&[
RawTokenKindChirho::EqualsChirho,
RawTokenKindChirho::WhereChirho,
RawTokenKindChirho::DerivingChirho,
RawTokenKindChirho::VirtualSemicolonChirho,
RawTokenKindChirho::VirtualRightBraceChirho,
]);
if self.at_chirho(RawTokenKindChirho::EqualsChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
self.parse_con_decl_chirho();
while self.at_chirho(RawTokenKindChirho::PipeChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_con_decl_chirho();
}
} else if self.at_chirho(RawTokenKindChirho::WhereChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
let has_brace_chirho = self.at_chirho(RawTokenKindChirho::VirtualLeftBraceChirho)
|| self.at_chirho(RawTokenKindChirho::LeftBraceChirho);
if has_brace_chirho {
self.bump_chirho(); self.eat_trivia_chirho();
}
loop {
if self.at_chirho(RawTokenKindChirho::VirtualRightBraceChirho)
|| self.at_chirho(RawTokenKindChirho::RightBraceChirho)
{
self.bump_chirho();
break;
}
if self.at_eof_chirho() || self.at_chirho(RawTokenKindChirho::DerivingChirho) {
break;
}
if self.at_chirho(RawTokenKindChirho::VirtualSemicolonChirho)
|| self.at_chirho(RawTokenKindChirho::SemicolonChirho)
{
self.bump_chirho();
self.eat_trivia_chirho();
continue;
}
if self.at_chirho(RawTokenKindChirho::ConIdChirho) {
self.parse_gadt_con_decl_chirho();
} else {
let before_chirho = self.pos_chirho;
self.bump_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
break;
}
}
self.eat_trivia_chirho();
}
}
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::DerivingChirho) {
self.parse_deriving_clause_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_con_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ConDeclChirho);
if self.at_chirho(RawTokenKindChirho::ForallChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
while self.at_chirho(RawTokenKindChirho::VarIdChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_dot_chirho() {
self.bump_chirho(); self.eat_trivia_chirho();
}
let _save_pos_chirho = self.pos_chirho;
let mut found_arrow_chirho = false;
let mut lookahead_chirho = self.pos_chirho;
while lookahead_chirho < self.tokens_chirho.len() {
let tk_chirho = self.tokens_chirho[lookahead_chirho].kind_chirho;
if tk_chirho == RawTokenKindChirho::RightArrowChirho {
break;
}
if tk_chirho == RawTokenKindChirho::FatArrowChirho {
found_arrow_chirho = true;
break;
}
if tk_chirho == RawTokenKindChirho::VirtualSemicolonChirho
|| tk_chirho == RawTokenKindChirho::PipeChirho
{
break;
}
lookahead_chirho += 1;
}
if found_arrow_chirho {
while !self.at_chirho(RawTokenKindChirho::FatArrowChirho) && !self.at_eof_chirho() {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::FatArrowChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
}
}
}
if self.at_chirho(RawTokenKindChirho::ConIdChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::LeftBraceChirho) {
self.parse_record_fields_chirho();
} else {
while self.can_start_atype_chirho() || self.at_strict_prefix_chirho() {
let before_chirho = self.pos_chirho;
if self.at_strict_prefix_chirho() {
self.bump_chirho(); self.eat_trivia_chirho();
}
if self.can_start_atype_chirho() {
self.parse_atype_chirho();
self.eat_trivia_chirho();
}
if self.pos_chirho == before_chirho {
break;
}
}
}
} else {
self.eat_until_any_chirho(&[
RawTokenKindChirho::PipeChirho,
RawTokenKindChirho::DerivingChirho,
RawTokenKindChirho::VirtualSemicolonChirho,
RawTokenKindChirho::VirtualRightBraceChirho,
RawTokenKindChirho::SemicolonChirho,
RawTokenKindChirho::RightBraceChirho,
]);
}
self.builder_chirho.finish_node_chirho();
}
fn parse_gadt_con_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::GadtConDeclChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ColonColonChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
}
self.parse_type_chirho();
self.builder_chirho.finish_node_chirho();
}
fn parse_record_fields_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::RecordFieldsChirho);
self.expect_chirho(RawTokenKindChirho::LeftBraceChirho);
self.eat_trivia_chirho();
while !self.at_chirho(RawTokenKindChirho::RightBraceChirho)
&& !self.at_decl_boundary_chirho()
&& !self.at_eof_chirho()
{
let outer_before_chirho = self.pos_chirho;
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::FieldDeclChirho);
let mut paren_depth_chirho = 0usize;
let mut bracket_depth_chirho = 0usize;
let mut brace_depth_chirho = 0usize;
while !self.at_decl_boundary_chirho() && !self.at_eof_chirho() {
self.eat_trivia_chirho();
if self.at_decl_boundary_chirho() || self.at_eof_chirho() {
break;
}
let should_end_field_chirho = match self.current_chirho().map(|t_chirho| t_chirho.kind_chirho) {
Some(RawTokenKindChirho::CommaChirho) => {
paren_depth_chirho == 0
&& bracket_depth_chirho == 0
&& brace_depth_chirho == 0
}
Some(RawTokenKindChirho::RightBraceChirho) => {
paren_depth_chirho == 0
&& bracket_depth_chirho == 0
&& brace_depth_chirho == 0
}
_ => false,
};
if should_end_field_chirho {
break;
}
match self.current_chirho().map(|t_chirho| t_chirho.kind_chirho) {
Some(RawTokenKindChirho::LeftParenChirho) => paren_depth_chirho += 1,
Some(RawTokenKindChirho::RightParenChirho) => {
paren_depth_chirho = paren_depth_chirho.saturating_sub(1);
}
Some(RawTokenKindChirho::LeftBracketChirho) => bracket_depth_chirho += 1,
Some(RawTokenKindChirho::RightBracketChirho) => {
bracket_depth_chirho = bracket_depth_chirho.saturating_sub(1);
}
Some(RawTokenKindChirho::LeftBraceChirho) => brace_depth_chirho += 1,
Some(RawTokenKindChirho::RightBraceChirho) => {
brace_depth_chirho = brace_depth_chirho.saturating_sub(1);
}
_ => {}
}
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.pos_chirho == outer_before_chirho {
break;
}
}
if self.at_chirho(RawTokenKindChirho::RightBraceChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_deriving_clause_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::DerivingClauseChirho);
self.expect_chirho(RawTokenKindChirho::DerivingChirho);
self.eat_trivia_chirho();
if self.at_varid_text_chirho("stock")
|| self.at_varid_text_chirho("newtype")
|| self.at_varid_text_chirho("anyclass")
{
self.bump_chirho(); self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::LeftParenChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
while !self.at_chirho(RawTokenKindChirho::RightParenChirho) && !self.at_eof_chirho() {
self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::CommaChirho)
&& !self.at_chirho(RawTokenKindChirho::RightParenChirho)
{
self.bump_chirho();
}
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho();
}
}
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
} else if self.at_chirho(RawTokenKindChirho::ConIdChirho) {
self.bump_chirho();
}
self.eat_trivia_chirho();
if self.at_varid_text_chirho("via") {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_atype_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_type_or_family_decl_chirho(&mut self) {
let mut look_chirho = self.pos_chirho + 1;
while look_chirho < self.tokens_chirho.len()
&& matches!(
self.tokens_chirho[look_chirho].kind_chirho,
RawTokenKindChirho::WhitespaceChirho
| RawTokenKindChirho::LineCommentChirho
| RawTokenKindChirho::BlockCommentChirho
)
{
look_chirho += 1;
}
let next_text_chirho = if look_chirho < self.tokens_chirho.len() {
self.token_text_chirho(&self.tokens_chirho[look_chirho])
} else {
""
};
match next_text_chirho {
"family" => self.parse_type_family_decl_chirho(),
"instance" => self.parse_type_family_instance_decl_chirho(),
"role" => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::TypeSigDeclChirho);
self.eat_until_decl_end_chirho();
self.builder_chirho.finish_node_chirho();
}
_ => {
let mut scan_chirho = look_chirho;
let mut is_kind_sig_chirho = false;
if scan_chirho < self.tokens_chirho.len() {
scan_chirho += 1; while scan_chirho < self.tokens_chirho.len()
&& matches!(
self.tokens_chirho[scan_chirho].kind_chirho,
RawTokenKindChirho::WhitespaceChirho
| RawTokenKindChirho::LineCommentChirho
| RawTokenKindChirho::BlockCommentChirho
)
{
scan_chirho += 1;
}
if scan_chirho < self.tokens_chirho.len()
&& self.tokens_chirho[scan_chirho].kind_chirho
== RawTokenKindChirho::ColonColonChirho
{
is_kind_sig_chirho = true;
}
}
if is_kind_sig_chirho {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::TypeSigDeclChirho);
self.eat_until_decl_end_chirho();
self.builder_chirho.finish_node_chirho();
} else {
self.parse_type_alias_decl_chirho();
}
}
}
}
fn parse_type_family_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::TypeFamilyDeclChirho);
self.expect_chirho(RawTokenKindChirho::TypeChirho); self.eat_trivia_chirho();
self.bump_chirho(); self.eat_trivia_chirho();
self.eat_until_any_chirho(&[
RawTokenKindChirho::WhereChirho,
RawTokenKindChirho::ColonColonChirho,
RawTokenKindChirho::VirtualSemicolonChirho,
RawTokenKindChirho::VirtualRightBraceChirho,
]);
if self.at_chirho(RawTokenKindChirho::ColonColonChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho(); }
if self.at_chirho(RawTokenKindChirho::WhereChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::VirtualLeftBraceChirho) {
self.bump_chirho();
}
while !self.at_eof_chirho()
&& !self.at_chirho(RawTokenKindChirho::VirtualRightBraceChirho)
{
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::VirtualSemicolonChirho) {
self.bump_chirho();
continue;
}
if self.at_chirho(RawTokenKindChirho::VirtualRightBraceChirho) {
break;
}
self.eat_until_any_chirho(&[
RawTokenKindChirho::EqualsChirho,
RawTokenKindChirho::VirtualSemicolonChirho,
RawTokenKindChirho::VirtualRightBraceChirho,
]);
if self.at_chirho(RawTokenKindChirho::EqualsChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho(); }
}
if self.at_chirho(RawTokenKindChirho::VirtualRightBraceChirho) {
self.bump_chirho();
}
}
self.builder_chirho.finish_node_chirho();
}
fn parse_type_family_instance_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::TypeFamilyInstanceDeclChirho);
self.expect_chirho(RawTokenKindChirho::TypeChirho); self.eat_trivia_chirho();
self.bump_chirho(); self.eat_trivia_chirho();
self.eat_until_any_chirho(&[
RawTokenKindChirho::EqualsChirho,
RawTokenKindChirho::VirtualSemicolonChirho,
RawTokenKindChirho::VirtualRightBraceChirho,
]);
if self.at_chirho(RawTokenKindChirho::EqualsChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho(); }
self.builder_chirho.finish_node_chirho();
}
fn parse_type_alias_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::TypeAliasDeclChirho);
self.expect_chirho(RawTokenKindChirho::TypeChirho);
self.eat_trivia_chirho();
self.eat_until_any_chirho(&[
RawTokenKindChirho::EqualsChirho,
RawTokenKindChirho::VirtualSemicolonChirho,
RawTokenKindChirho::VirtualRightBraceChirho,
]);
if self.at_chirho(RawTokenKindChirho::EqualsChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_newtype_decl_chirho(&mut self) {
let mut look_chirho = self.pos_chirho + 1;
while look_chirho < self.tokens_chirho.len()
&& matches!(
self.tokens_chirho[look_chirho].kind_chirho,
RawTokenKindChirho::WhitespaceChirho
| RawTokenKindChirho::LineCommentChirho
| RawTokenKindChirho::BlockCommentChirho
)
{
look_chirho += 1;
}
if look_chirho < self.tokens_chirho.len()
&& self.token_text_chirho(&self.tokens_chirho[look_chirho]) == "instance"
{
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::NewtypeDeclChirho);
self.eat_until_decl_end_chirho();
self.builder_chirho.finish_node_chirho();
return;
}
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::NewtypeDeclChirho);
self.expect_chirho(RawTokenKindChirho::NewtypeChirho);
self.eat_trivia_chirho();
self.eat_until_any_chirho(&[
RawTokenKindChirho::EqualsChirho,
RawTokenKindChirho::VirtualSemicolonChirho,
RawTokenKindChirho::VirtualRightBraceChirho,
]);
if self.at_chirho(RawTokenKindChirho::EqualsChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_con_decl_chirho();
}
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::DerivingChirho) {
self.parse_deriving_clause_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_class_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ClassDeclChirho);
self.expect_chirho(RawTokenKindChirho::ClassChirho);
self.eat_trivia_chirho();
self.eat_until_any_chirho(&[
RawTokenKindChirho::WhereChirho,
RawTokenKindChirho::VirtualSemicolonChirho,
RawTokenKindChirho::VirtualRightBraceChirho,
]);
if self.at_chirho(RawTokenKindChirho::WhereChirho) {
self.parse_where_block_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_instance_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::InstanceDeclChirho);
self.expect_chirho(RawTokenKindChirho::InstanceChirho);
self.eat_trivia_chirho();
self.eat_until_any_chirho(&[
RawTokenKindChirho::WhereChirho,
RawTokenKindChirho::VirtualSemicolonChirho,
RawTokenKindChirho::VirtualRightBraceChirho,
]);
if self.at_chirho(RawTokenKindChirho::WhereChirho) {
self.parse_where_block_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_fixity_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::FixityDeclChirho);
self.bump_chirho();
self.eat_trivia_chirho();
self.eat_until_decl_end_chirho();
self.builder_chirho.finish_node_chirho();
}
fn parse_standalone_deriving_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::StandaloneDerivingDeclChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::InstanceChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
}
self.eat_until_decl_end_chirho();
self.builder_chirho.finish_node_chirho();
}
fn parse_default_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::DefaultDeclChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.eat_until_decl_end_chirho();
self.builder_chirho.finish_node_chirho();
}
fn parse_pat_syn_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::PatSynDeclChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ConIdChirho) {
self.bump_chirho();
}
self.eat_trivia_chirho();
while self.at_chirho(RawTokenKindChirho::VarIdChirho) && !self.at_varid_text_chirho("where")
{
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::EqualsChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_pat_chirho();
} else if self.at_chirho(RawTokenKindChirho::LeftArrowChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_pat_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::WhereChirho) {
self.parse_where_block_chirho();
}
}
self.builder_chirho.finish_node_chirho();
}
fn parse_foreign_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ForeignDeclChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ImportChirho) || self.at_varid_text_chirho("export") {
self.bump_chirho();
}
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::VarIdChirho) {
let text_chirho = self.current_text_chirho();
if matches!(
text_chirho,
"ccall" | "capi" | "stdcall" | "prim" | "javascript" | "cplusplus"
) {
self.bump_chirho();
self.eat_trivia_chirho();
}
}
if self.at_varid_text_chirho("safe")
|| self.at_varid_text_chirho("unsafe")
|| self.at_varid_text_chirho("interruptible")
{
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::StringLitChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::VarIdChirho)
|| self.at_chirho(RawTokenKindChirho::ConIdChirho)
{
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::ColonColonChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
self.eat_until_decl_end_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_value_decl_chirho(&mut self) {
if self.current_kind_chirho() == Some(RawTokenKindChirho::VarSymChirho)
&& self.current_text_chirho() == "!"
{
self.bump_chirho(); self.eat_trivia_chirho();
}
if self.is_type_sig_chirho() {
self.parse_type_sig_chirho();
} else if self.starts_pat_bind_chirho() {
self.parse_pat_bind_cst_chirho();
} else {
self.parse_fun_bind_chirho();
}
}
fn starts_pat_bind_chirho(&self) -> bool {
match self.current_kind_chirho() {
Some(RawTokenKindChirho::LeftParenChirho) => {
let mut i_chirho = self.pos_chirho + 1;
while i_chirho < self.tokens_chirho.len()
&& self.tokens_chirho[i_chirho].kind_chirho.is_trivia_chirho()
{
i_chirho += 1;
}
if i_chirho >= self.tokens_chirho.len() {
return false;
}
let next_kind_chirho = self.tokens_chirho[i_chirho].kind_chirho;
!matches!(
next_kind_chirho,
RawTokenKindChirho::VarSymChirho | RawTokenKindChirho::ConSymChirho
)
}
Some(RawTokenKindChirho::ConIdChirho) => true,
Some(RawTokenKindChirho::UnderscoreChirho)
| Some(RawTokenKindChirho::LeftBracketChirho)
| Some(RawTokenKindChirho::IntLitChirho)
| Some(RawTokenKindChirho::FloatLitChirho)
| Some(RawTokenKindChirho::CharLitChirho)
| Some(RawTokenKindChirho::StringLitChirho)
| Some(RawTokenKindChirho::TildeChirho) => true,
_ => false,
}
}
fn parse_pat_bind_cst_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::PatBindChirho);
self.parse_pat_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::EqualsChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
}
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::WhereChirho) {
self.parse_where_block_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_type_sig_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::TypeSigDeclChirho);
if self.at_chirho(RawTokenKindChirho::LeftParenChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
while !self.at_chirho(RawTokenKindChirho::RightParenChirho) && !self.at_eof_chirho() {
self.bump_chirho();
}
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
} else {
self.bump_chirho(); }
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ColonColonChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
self.parse_type_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_fun_bind_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::FunBindChirho);
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::MatchChirho);
if self.starts_infix_fun_bind_chirho() {
self.parse_fun_arg_pat_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::BacktickChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
if !self.at_eof_chirho()
&& (self.at_chirho(RawTokenKindChirho::VarIdChirho)
|| self.at_chirho(RawTokenKindChirho::ConIdChirho)
|| self.at_chirho(RawTokenKindChirho::VarSymChirho)
|| self.at_chirho(RawTokenKindChirho::ConSymChirho))
{
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::BacktickChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
}
} else if self.at_chirho(RawTokenKindChirho::VarSymChirho)
|| self.at_chirho(RawTokenKindChirho::ConSymChirho)
{
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.can_start_apat_chirho()
|| (self.current_kind_chirho() == Some(RawTokenKindChirho::VarSymChirho)
&& (self.current_text_chirho() == "-" || self.current_text_chirho() == "!"))
{
self.parse_fun_arg_pat_chirho();
self.eat_trivia_chirho();
}
} else {
if self.at_chirho(RawTokenKindChirho::VarIdChirho)
|| self.at_chirho(RawTokenKindChirho::ConIdChirho)
{
self.bump_chirho();
self.eat_trivia_chirho();
} else if self.at_chirho(RawTokenKindChirho::LeftParenChirho) {
self.parse_apat_chirho();
self.eat_trivia_chirho();
} else if self.can_start_apat_chirho() {
self.parse_apat_chirho();
self.eat_trivia_chirho();
}
while self.can_start_apat_chirho()
|| (self.current_kind_chirho() == Some(RawTokenKindChirho::VarSymChirho)
&& (self.current_text_chirho() == "-" || self.current_text_chirho() == "!"))
{
let before_chirho = self.pos_chirho;
self.parse_fun_arg_pat_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
break;
}
}
}
while self.can_start_apat_chirho()
|| (self.current_kind_chirho() == Some(RawTokenKindChirho::VarSymChirho)
&& (self.current_text_chirho() == "-" || self.current_text_chirho() == "!"))
{
let before_chirho = self.pos_chirho;
self.parse_fun_arg_pat_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
break;
}
}
if self.at_chirho(RawTokenKindChirho::PipeChirho) {
self.parse_guarded_rhs_chirho();
} else if self.at_chirho(RawTokenKindChirho::EqualsChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
}
self.builder_chirho.finish_node_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::WhereChirho) {
self.parse_where_block_chirho();
}
self.builder_chirho.finish_node_chirho(); }
fn starts_infix_fun_bind_chirho(&self) -> bool {
let Some(current_kind_chirho) = self.current_kind_chirho() else {
return false;
};
let starts_simple_lhs_pat_chirho = matches!(
current_kind_chirho,
RawTokenKindChirho::VarIdChirho
| RawTokenKindChirho::ConIdChirho
| RawTokenKindChirho::UnderscoreChirho
| RawTokenKindChirho::IntLitChirho
| RawTokenKindChirho::FloatLitChirho
| RawTokenKindChirho::CharLitChirho
| RawTokenKindChirho::StringLitChirho
);
if !starts_simple_lhs_pat_chirho {
return false;
}
let mut lookahead_idx_chirho = self.pos_chirho + 1;
while lookahead_idx_chirho < self.tokens_chirho.len()
&& self.tokens_chirho[lookahead_idx_chirho]
.kind_chirho
.is_trivia_chirho()
{
lookahead_idx_chirho += 1;
}
if lookahead_idx_chirho >= self.tokens_chirho.len() {
return false;
}
matches!(
self.tokens_chirho[lookahead_idx_chirho].kind_chirho,
RawTokenKindChirho::BacktickChirho
| RawTokenKindChirho::VarSymChirho
| RawTokenKindChirho::ConSymChirho
)
}
fn parse_guarded_rhs_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::GuardedRhsChirho);
while self.at_chirho(RawTokenKindChirho::PipeChirho) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::GuardChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_guard_expr_chirho();
if self.at_chirho(RawTokenKindChirho::EqualsChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
}
self.builder_chirho.finish_node_chirho(); self.eat_trivia_chirho();
}
self.builder_chirho.finish_node_chirho(); }
fn parse_guard_expr_chirho(&mut self) {
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
fn parse_where_block_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::WhereClauseChirho);
self.expect_chirho(RawTokenKindChirho::WhereChirho);
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::VirtualLeftBraceChirho)
|| self.at_chirho(RawTokenKindChirho::LeftBraceChirho)
{
self.bump_chirho(); self.eat_trivia_chirho();
loop {
if self.at_chirho(RawTokenKindChirho::VirtualRightBraceChirho)
|| self.at_chirho(RawTokenKindChirho::RightBraceChirho)
{
self.bump_chirho(); break;
}
if self.at_eof_chirho() {
break;
}
if self.at_chirho(RawTokenKindChirho::VirtualSemicolonChirho)
|| self.at_chirho(RawTokenKindChirho::SemicolonChirho)
{
self.bump_chirho();
self.eat_trivia_chirho();
continue;
}
let before_chirho = self.pos_chirho;
self.parse_decl_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
if !self.at_eof_chirho() {
self.bump_chirho();
} else {
break;
}
}
}
}
self.builder_chirho.finish_node_chirho();
}
fn parse_type_chirho(&mut self) {
if self.at_chirho(RawTokenKindChirho::ForallChirho) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ForallTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
while !self.at_dot_chirho() && !self.at_eof_chirho() && !self.at_decl_boundary_chirho()
{
if self.at_chirho(RawTokenKindChirho::VarIdChirho) {
self.bump_chirho();
} else if self.at_chirho(RawTokenKindChirho::LeftParenChirho) {
if self.is_simple_kind_annotated_binder_chirho() {
self.parse_paren_type_chirho();
} else {
break;
}
} else {
break;
}
self.eat_trivia_chirho();
}
if self.at_dot_chirho() {
self.bump_chirho(); self.eat_trivia_chirho();
}
self.parse_type_chirho(); self.builder_chirho.finish_node_chirho();
return;
}
let cp_chirho = self.builder_chirho.checkpoint_chirho();
self.parse_btype_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::FatArrowChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::QualTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho(); self.builder_chirho.finish_node_chirho();
return;
}
if self.at_chirho(RawTokenKindChirho::LinearArrowChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::FunTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho(); self.builder_chirho.finish_node_chirho();
return;
}
if self.at_varsym_chirho("%") {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::FunTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::IntLitChirho)
|| self.at_chirho(RawTokenKindChirho::ConIdChirho)
|| self.at_chirho(RawTokenKindChirho::VarIdChirho)
{
self.bump_chirho(); self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::RightArrowChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
}
self.parse_type_chirho(); self.builder_chirho.finish_node_chirho();
return;
}
if self.at_chirho(RawTokenKindChirho::RightArrowChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::FunTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho(); self.builder_chirho.finish_node_chirho();
}
if self.at_chirho(RawTokenKindChirho::TildeChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::InfixTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_btype_chirho(); self.builder_chirho.finish_node_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::FatArrowChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::QualTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho();
self.builder_chirho.finish_node_chirho();
}
return;
}
if (self.at_chirho(RawTokenKindChirho::VarSymChirho)
|| self.at_chirho(RawTokenKindChirho::ConSymChirho))
&& !matches!(self.current_text_chirho(), "%" | "!" | "@" | "|")
{
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::InfixTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_btype_chirho(); self.builder_chirho.finish_node_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightArrowChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::FunTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho();
self.builder_chirho.finish_node_chirho();
} else if self.at_chirho(RawTokenKindChirho::FatArrowChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::QualTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho();
self.builder_chirho.finish_node_chirho();
}
return;
}
if self.at_chirho(RawTokenKindChirho::BacktickChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::InfixTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ConIdChirho)
|| self.at_chirho(RawTokenKindChirho::VarIdChirho)
|| self.at_chirho(RawTokenKindChirho::QualifiedIdChirho)
{
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::BacktickChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
}
self.parse_btype_chirho(); self.builder_chirho.finish_node_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightArrowChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::FunTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho();
self.builder_chirho.finish_node_chirho();
} else if self.at_chirho(RawTokenKindChirho::FatArrowChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::QualTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho();
self.builder_chirho.finish_node_chirho();
}
return;
}
}
fn parse_btype_chirho(&mut self) {
if !self.can_start_atype_chirho() {
return;
}
let cp_chirho = self.builder_chirho.checkpoint_chirho();
self.parse_atype_chirho();
self.eat_trivia_chirho();
let mut count_chirho = 1u32;
while self.can_start_atype_chirho() {
let before_chirho = self.pos_chirho;
if count_chirho == 1 {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::AppTypeChirho);
}
count_chirho += 1;
self.parse_atype_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
break;
}
}
if count_chirho > 1 {
self.builder_chirho.finish_node_chirho(); }
}
fn parse_atype_chirho(&mut self) {
match self.current_kind_chirho() {
Some(RawTokenKindChirho::VarIdChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::VarTypeChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::ConIdChirho) | Some(RawTokenKindChirho::QualifiedIdChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ConTypeChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::LeftParenChirho) => {
self.parse_paren_type_chirho();
}
Some(RawTokenKindChirho::LeftBracketChirho) => {
self.parse_list_type_chirho();
}
Some(RawTokenKindChirho::TickChirho) => {
self.parse_promoted_type_chirho();
}
Some(RawTokenKindChirho::UnderscoreChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::WildcardTypeChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::IntLitChirho)
| Some(RawTokenKindChirho::StringLitChirho)
| Some(RawTokenKindChirho::CharLitChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::LitTypeChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
_ => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ErrorNodeChirho);
if !self.at_eof_chirho() {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
}
}
fn parse_paren_type_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ParenTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
return;
}
if self.at_chirho(RawTokenKindChirho::RightArrowChirho)
|| self.at_chirho(RawTokenKindChirho::VarSymChirho)
|| self.at_chirho(RawTokenKindChirho::ConSymChirho)
{
self.bump_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
return;
}
}
self.parse_type_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ColonColonChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho(); self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::CommaChirho) {
while self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho();
self.eat_trivia_chirho();
}
}
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_list_type_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ListTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
return;
}
self.parse_type_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_promoted_type_chirho(&mut self) {
match self.peek_after_tick_chirho() {
Some(RawTokenKindChirho::ConIdChirho) | Some(RawTokenKindChirho::QualifiedIdChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::PromotedConTypeChirho);
self.bump_chirho(); self.bump_chirho(); self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::LeftBracketChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::PromotedListTypeChirho);
self.bump_chirho(); self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.parse_type_chirho();
self.eat_trivia_chirho();
while self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho();
self.eat_trivia_chirho();
}
}
if self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.bump_chirho(); }
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::LeftParenChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::PromotedConTypeChirho);
self.bump_chirho(); self.bump_chirho(); self.eat_trivia_chirho();
while self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
_ => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ErrorNodeChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
}
}
fn peek_next_is_conid_chirho(&self) -> bool {
let mut i_chirho = self.pos_chirho + 1;
while i_chirho < self.tokens_chirho.len() {
let kind_chirho = self.tokens_chirho[i_chirho].kind_chirho;
if kind_chirho.is_trivia_chirho() {
i_chirho += 1;
continue;
}
return kind_chirho == RawTokenKindChirho::ConIdChirho;
}
false
}
fn peek_after_tick_chirho(&self) -> Option<RawTokenKindChirho> {
let mut i_chirho = self.pos_chirho + 1;
while i_chirho < self.tokens_chirho.len() {
let kind_chirho = self.tokens_chirho[i_chirho].kind_chirho;
if !kind_chirho.is_trivia_chirho() {
return Some(kind_chirho);
}
i_chirho += 1;
}
None
}
fn is_simple_kind_annotated_binder_chirho(&self) -> bool {
let mut i_chirho = self.pos_chirho + 1; while i_chirho < self.tokens_chirho.len()
&& self.tokens_chirho[i_chirho].kind_chirho.is_trivia_chirho()
{
i_chirho += 1;
}
if i_chirho >= self.tokens_chirho.len()
|| self.tokens_chirho[i_chirho].kind_chirho != RawTokenKindChirho::VarIdChirho
{
return false;
}
i_chirho += 1;
while i_chirho < self.tokens_chirho.len()
&& self.tokens_chirho[i_chirho].kind_chirho.is_trivia_chirho()
{
i_chirho += 1;
}
if i_chirho >= self.tokens_chirho.len()
|| self.tokens_chirho[i_chirho].kind_chirho != RawTokenKindChirho::ColonColonChirho
{
return false;
}
i_chirho += 1;
let mut paren_depth_chirho: u32 = 0;
let mut last_was_name_chirho = false;
while i_chirho < self.tokens_chirho.len() {
let k_chirho = self.tokens_chirho[i_chirho].kind_chirho;
if k_chirho.is_trivia_chirho() {
i_chirho += 1;
continue;
}
match k_chirho {
RawTokenKindChirho::RightParenChirho if paren_depth_chirho == 0 => return true,
RawTokenKindChirho::RightParenChirho => {
paren_depth_chirho -= 1;
last_was_name_chirho = false;
}
RawTokenKindChirho::LeftParenChirho => {
paren_depth_chirho += 1;
last_was_name_chirho = false;
}
RawTokenKindChirho::VarIdChirho | RawTokenKindChirho::ConIdChirho => {
if last_was_name_chirho && paren_depth_chirho == 0 {
return false;
}
last_was_name_chirho = true;
}
RawTokenKindChirho::RightArrowChirho => {
last_was_name_chirho = false;
}
RawTokenKindChirho::VarSymChirho => {
last_was_name_chirho = false;
}
_ => return false,
}
i_chirho += 1;
}
false
}
fn parse_expr_chirho(&mut self) {
let cp_chirho = self.builder_chirho.checkpoint_chirho();
self.parse_infixexp_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ColonColonChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::TypeAnnotExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho();
self.builder_chirho.finish_node_chirho();
}
}
fn parse_infixexp_chirho(&mut self) {
let cp_chirho = self.builder_chirho.checkpoint_chirho();
self.parse_lexp_chirho();
self.eat_trivia_chirho();
let mut has_infix_chirho = false;
while self.at_infix_op_chirho() {
let before_chirho = self.pos_chirho;
if !has_infix_chirho {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::InfixExprChirho);
has_infix_chirho = true;
}
if self.at_chirho(RawTokenKindChirho::BacktickChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::BacktickChirho) && !self.at_eof_chirho() {
self.bump_chirho(); }
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::BacktickChirho) {
self.bump_chirho(); }
} else {
self.bump_chirho(); }
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::BackslashChirho)
|| self.at_chirho(RawTokenKindChirho::LetChirho)
|| self.at_chirho(RawTokenKindChirho::IfChirho)
|| self.at_chirho(RawTokenKindChirho::CaseChirho)
|| self.at_chirho(RawTokenKindChirho::DoChirho)
{
self.parse_expr_chirho();
} else {
self.parse_lexp_chirho();
}
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
break;
}
}
if has_infix_chirho {
self.builder_chirho.finish_node_chirho(); }
}
fn parse_lexp_chirho(&mut self) {
match self.current_kind_chirho() {
Some(RawTokenKindChirho::BackslashChirho) => self.parse_lambda_chirho(),
Some(RawTokenKindChirho::LetChirho) => self.parse_let_expr_chirho(),
Some(RawTokenKindChirho::IfChirho) => self.parse_if_expr_chirho(),
Some(RawTokenKindChirho::CaseChirho) => self.parse_case_expr_chirho(),
Some(RawTokenKindChirho::DoChirho) => self.parse_do_expr_chirho(),
Some(RawTokenKindChirho::VarSymChirho)
if self.current_text_chirho() == "-" && !self.at_decl_boundary_chirho() =>
{
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::NegateExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_fexp_chirho();
self.builder_chirho.finish_node_chirho();
}
_ => self.parse_fexp_chirho(),
}
}
fn parse_lambda_chirho(&mut self) {
if self.peek_after_backslash_is_case_chirho() {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::LambdaCaseExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::OfChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
}
self.parse_case_alts_chirho();
self.builder_chirho.finish_node_chirho();
} else {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::LambdaExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
while self.can_start_apat_chirho() {
let before_chirho = self.pos_chirho;
self.parse_apat_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
break;
}
}
if self.at_chirho(RawTokenKindChirho::RightArrowChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
}
self.builder_chirho.finish_node_chirho();
}
}
fn peek_after_backslash_is_case_chirho(&self) -> bool {
let mut i_chirho = self.pos_chirho + 1;
while i_chirho < self.tokens_chirho.len() {
let kind_chirho = self.tokens_chirho[i_chirho].kind_chirho;
if kind_chirho.is_trivia_chirho() {
i_chirho += 1;
continue;
}
return kind_chirho == RawTokenKindChirho::CaseChirho;
}
false
}
fn parse_let_expr_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::LetExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_layout_block_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::InChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_if_expr_chirho(&mut self) {
if self.peek_after_if_is_pipe_chirho() {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::MultiWayIfExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
while self.at_chirho(RawTokenKindChirho::PipeChirho)
|| self.at_chirho(RawTokenKindChirho::VirtualSemicolonChirho)
{
if self.at_chirho(RawTokenKindChirho::VirtualSemicolonChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
continue;
}
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightArrowChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
}
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
self.builder_chirho.finish_node_chirho();
return;
}
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::IfExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ThenChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::ElseChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn peek_after_if_is_pipe_chirho(&self) -> bool {
let mut i_chirho = self.pos_chirho + 1;
while i_chirho < self.tokens_chirho.len() {
let kind_chirho = self.tokens_chirho[i_chirho].kind_chirho;
if kind_chirho == RawTokenKindChirho::WhitespaceChirho
|| kind_chirho == RawTokenKindChirho::LineCommentChirho
|| kind_chirho == RawTokenKindChirho::BlockCommentChirho
|| kind_chirho == RawTokenKindChirho::VirtualLeftBraceChirho
|| kind_chirho == RawTokenKindChirho::VirtualSemicolonChirho
{
i_chirho += 1;
continue;
}
return kind_chirho == RawTokenKindChirho::PipeChirho;
}
false
}
fn parse_case_expr_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::CaseExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::OfChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_case_alts_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_case_alts_chirho(&mut self) {
if self.at_chirho(RawTokenKindChirho::VirtualLeftBraceChirho)
|| self.at_chirho(RawTokenKindChirho::LeftBraceChirho)
{
self.bump_chirho(); }
self.eat_trivia_chirho();
loop {
if self.at_chirho(RawTokenKindChirho::VirtualRightBraceChirho)
|| self.at_chirho(RawTokenKindChirho::RightBraceChirho)
{
self.bump_chirho(); break;
}
if self.at_eof_chirho() {
break;
}
if self.at_chirho(RawTokenKindChirho::VirtualSemicolonChirho)
|| self.at_chirho(RawTokenKindChirho::SemicolonChirho)
{
self.bump_chirho();
self.eat_trivia_chirho();
continue;
}
let before_chirho = self.pos_chirho;
self.parse_case_alt_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
if !self.at_eof_chirho() {
self.bump_chirho();
} else {
break;
}
}
}
}
fn parse_case_alt_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::CaseAltChirho);
if self.can_start_apat_chirho() {
self.parse_pat_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::RightArrowChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
} else if self.at_chirho(RawTokenKindChirho::PipeChirho) {
while self.at_chirho(RawTokenKindChirho::PipeChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_guard_expr_case_chirho();
if self.at_chirho(RawTokenKindChirho::RightArrowChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
}
self.eat_trivia_chirho();
}
}
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::WhereChirho) {
self.parse_where_block_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_guard_expr_case_chirho(&mut self) {
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
fn parse_do_expr_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::DoExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::VirtualLeftBraceChirho)
|| self.at_chirho(RawTokenKindChirho::LeftBraceChirho)
{
self.bump_chirho(); self.eat_trivia_chirho();
loop {
if self.at_chirho(RawTokenKindChirho::VirtualRightBraceChirho)
|| self.at_chirho(RawTokenKindChirho::RightBraceChirho)
{
self.bump_chirho(); break;
}
if self.at_eof_chirho() {
break;
}
if self.at_chirho(RawTokenKindChirho::VirtualSemicolonChirho)
|| self.at_chirho(RawTokenKindChirho::SemicolonChirho)
{
self.bump_chirho();
self.eat_trivia_chirho();
continue;
}
let before_chirho = self.pos_chirho;
self.parse_do_stmt_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
if !self.at_eof_chirho() {
self.bump_chirho();
} else {
break;
}
}
}
}
self.builder_chirho.finish_node_chirho();
}
fn parse_do_stmt_chirho(&mut self) {
if self.at_chirho(RawTokenKindChirho::LetChirho) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::LetStmtChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_layout_block_chirho();
self.builder_chirho.finish_node_chirho();
return;
}
let cp_chirho = self.builder_chirho.checkpoint_chirho();
let saved_pos_chirho = self.pos_chirho;
let has_bind_chirho = self.scan_for_bind_arrow_chirho();
if has_bind_chirho {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::BindStmtChirho);
self.parse_pat_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::LeftArrowChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
}
self.builder_chirho.finish_node_chirho();
} else {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::DoStmtChirho);
self.pos_chirho = saved_pos_chirho;
self.parse_expr_chirho();
self.builder_chirho.finish_node_chirho();
}
}
fn scan_for_bind_arrow_chirho(&self) -> bool {
let mut i_chirho = self.pos_chirho;
let mut paren_depth_chirho = 0u32;
let mut bracket_depth_chirho = 0u32;
while i_chirho < self.tokens_chirho.len() {
let k_chirho = self.tokens_chirho[i_chirho].kind_chirho;
match k_chirho {
RawTokenKindChirho::LeftArrowChirho
if paren_depth_chirho == 0 && bracket_depth_chirho == 0 =>
{
return true;
}
RawTokenKindChirho::LeftParenChirho => paren_depth_chirho += 1,
RawTokenKindChirho::RightParenChirho => {
paren_depth_chirho = paren_depth_chirho.saturating_sub(1);
}
RawTokenKindChirho::LeftBracketChirho => bracket_depth_chirho += 1,
RawTokenKindChirho::RightBracketChirho => {
bracket_depth_chirho = bracket_depth_chirho.saturating_sub(1);
}
RawTokenKindChirho::VirtualSemicolonChirho
| RawTokenKindChirho::SemicolonChirho
| RawTokenKindChirho::VirtualRightBraceChirho
| RawTokenKindChirho::RightBraceChirho
| RawTokenKindChirho::EofChirho => {
return false;
}
_ => {}
}
i_chirho += 1;
}
false
}
fn parse_fexp_chirho(&mut self) {
if !self.can_start_aexp_chirho() {
return;
}
let cp_chirho = self.builder_chirho.checkpoint_chirho();
self.parse_aexp_chirho();
self.eat_trivia_chirho();
let mut count_chirho = 1u32;
loop {
if self.at_chirho(RawTokenKindChirho::AtChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::TypeAppExprChirho);
if count_chirho > 1 {
self.builder_chirho.finish_node_chirho(); count_chirho = 1; }
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_atype_chirho();
self.builder_chirho.finish_node_chirho(); self.eat_trivia_chirho();
continue;
}
if !self.can_start_aexp_chirho() {
break;
}
let before_chirho = self.pos_chirho;
if count_chirho == 1 {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::AppExprChirho);
}
count_chirho += 1;
self.parse_aexp_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
break;
}
}
if count_chirho > 1 {
self.builder_chirho.finish_node_chirho(); }
if self.at_chirho(RawTokenKindChirho::LeftBraceChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::RecordUpdateExprChirho);
self.parse_record_expr_chirho();
self.builder_chirho.finish_node_chirho();
}
}
fn parse_aexp_chirho(&mut self) {
match self.current_kind_chirho() {
Some(RawTokenKindChirho::VarIdChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::NameExprChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::ConIdChirho) | Some(RawTokenKindChirho::QualifiedIdChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::NameExprChirho);
self.bump_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::LeftBraceChirho) {
self.parse_record_expr_chirho();
}
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::IntLitChirho)
| Some(RawTokenKindChirho::FloatLitChirho)
| Some(RawTokenKindChirho::CharLitChirho)
| Some(RawTokenKindChirho::StringLitChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::LiteralExprChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::UnderscoreChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::NameExprChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::LeftParenChirho) => {
self.parse_paren_expr_chirho();
}
Some(RawTokenKindChirho::LeftBracketChirho) => {
self.parse_list_expr_chirho();
}
Some(RawTokenKindChirho::BackslashChirho) => {
self.parse_lambda_chirho();
}
Some(RawTokenKindChirho::DoChirho) => {
self.parse_do_expr_chirho();
}
Some(RawTokenKindChirho::CaseChirho) => {
self.parse_case_expr_chirho();
}
Some(RawTokenKindChirho::IfChirho) => {
self.parse_if_expr_chirho();
}
Some(RawTokenKindChirho::LetChirho) => {
self.parse_let_expr_chirho();
}
Some(RawTokenKindChirho::ThSpliceChirho) => {
self.parse_splice_expr_chirho();
}
Some(RawTokenKindChirho::ThTypedSpliceChirho) => {
self.parse_typed_splice_expr_chirho();
}
Some(RawTokenKindChirho::ThOpenExpQuoteChirho)
| Some(RawTokenKindChirho::ThOpenExpExplicitQuoteChirho) => {
self.parse_quote_expr_chirho();
}
Some(RawTokenKindChirho::ThOpenDecQuoteChirho) => {
self.parse_quote_decl_chirho();
}
Some(RawTokenKindChirho::ThOpenTypeQuoteChirho) => {
self.parse_quote_type_chirho();
}
Some(RawTokenKindChirho::ThOpenPatQuoteChirho) => {
self.parse_quote_pat_chirho();
}
Some(RawTokenKindChirho::ThOpenTypedExpQuoteChirho) => {
self.parse_typed_quote_expr_chirho();
}
_ => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ErrorNodeChirho);
if !self.at_eof_chirho() {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
}
}
fn parse_paren_expr_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ParenExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
return;
}
if self.is_operator_section_chirho() {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::NameExprChirho);
self.bump_chirho(); self.builder_chirho.finish_node_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
return;
}
let is_op_chirho = matches!(
self.current_kind_chirho(),
Some(RawTokenKindChirho::VarSymChirho) | Some(RawTokenKindChirho::ConSymChirho)
);
let is_minus_chirho = is_op_chirho && self.current_text_chirho() == "-";
if is_op_chirho && !is_minus_chirho && !self.is_operator_section_chirho() {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
return;
}
if !self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.parse_expr_chirho();
self.eat_trivia_chirho();
let is_right_op_chirho = matches!(
self.current_kind_chirho(),
Some(RawTokenKindChirho::VarSymChirho) | Some(RawTokenKindChirho::ConSymChirho)
);
if is_right_op_chirho {
let mut look_chirho = self.pos_chirho + 1;
while look_chirho < self.tokens_chirho.len()
&& self.tokens_chirho[look_chirho]
.kind_chirho
.is_trivia_chirho()
{
look_chirho += 1;
}
let is_right_section_chirho = look_chirho < self.tokens_chirho.len()
&& self.tokens_chirho[look_chirho].kind_chirho
== RawTokenKindChirho::RightParenChirho;
if is_right_section_chirho {
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
return;
}
}
}
if self.at_chirho(RawTokenKindChirho::CommaChirho) {
while self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::RightParenChirho)
&& !self.at_chirho(RawTokenKindChirho::CommaChirho)
&& !self.at_eof_chirho()
{
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
}
}
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_list_expr_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ListExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
return;
}
self.parse_expr_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::PipeChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
while !self.at_chirho(RawTokenKindChirho::RightBracketChirho)
&& !self.at_eof_chirho()
&& !self.at_decl_boundary_chirho()
{
let before_chirho = self.pos_chirho;
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
}
if !self.at_chirho(RawTokenKindChirho::RightBracketChirho)
&& !self.at_eof_chirho()
&& !self.at_decl_boundary_chirho()
{
self.parse_expr_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::LeftArrowChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
}
if self.pos_chirho == before_chirho {
break;
}
}
} else if self.at_chirho(RawTokenKindChirho::DotDotChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
} else if self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::DotDotChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
} else {
while self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
}
}
}
if self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_record_expr_chirho(&mut self) {
self.bump_chirho(); self.eat_trivia_chirho();
while !self.at_chirho(RawTokenKindChirho::RightBraceChirho)
&& !self.at_eof_chirho()
&& !self.at_decl_boundary_chirho()
{
let outer_before_chirho = self.pos_chirho;
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::FieldAssignChirho);
if self.at_chirho(RawTokenKindChirho::VarIdChirho)
|| self.at_chirho(RawTokenKindChirho::ConIdChirho)
{
self.bump_chirho(); self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::EqualsChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
if self.can_start_aexp_chirho()
|| self.at_chirho(RawTokenKindChirho::BackslashChirho)
|| self.at_chirho(RawTokenKindChirho::LetChirho)
|| self.at_chirho(RawTokenKindChirho::IfChirho)
|| self.at_chirho(RawTokenKindChirho::CaseChirho)
|| self.at_chirho(RawTokenKindChirho::DoChirho)
{
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
} else {
while !self.at_chirho(RawTokenKindChirho::CommaChirho)
&& !self.at_chirho(RawTokenKindChirho::RightBraceChirho)
&& !self.at_eof_chirho()
&& !self.at_decl_boundary_chirho()
{
self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::CommaChirho)
&& !self.at_chirho(RawTokenKindChirho::RightBraceChirho)
&& !self.at_decl_boundary_chirho()
&& !self.at_eof_chirho()
{
self.bump_chirho();
}
}
}
self.builder_chirho.finish_node_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.pos_chirho == outer_before_chirho {
break;
}
}
if self.at_chirho(RawTokenKindChirho::RightBraceChirho) {
self.bump_chirho();
}
}
fn parse_layout_block_chirho(&mut self) {
if self.at_chirho(RawTokenKindChirho::VirtualLeftBraceChirho)
|| self.at_chirho(RawTokenKindChirho::LeftBraceChirho)
{
self.bump_chirho(); self.eat_trivia_chirho();
loop {
if self.at_chirho(RawTokenKindChirho::VirtualRightBraceChirho)
|| self.at_chirho(RawTokenKindChirho::RightBraceChirho)
{
self.bump_chirho(); break;
}
if self.at_eof_chirho() {
break;
}
if self.at_chirho(RawTokenKindChirho::VirtualSemicolonChirho)
|| self.at_chirho(RawTokenKindChirho::SemicolonChirho)
{
self.bump_chirho();
self.eat_trivia_chirho();
continue;
}
let before_chirho = self.pos_chirho;
self.parse_decl_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
if !self.at_eof_chirho() {
self.bump_chirho();
} else {
break;
}
}
}
}
}
fn parse_pat_chirho(&mut self) {
let cp_chirho = self.builder_chirho.checkpoint_chirho();
self.parse_lpat_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::ColonColonChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::SigPatChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho(); self.builder_chirho.finish_node_chirho();
return;
}
if self.at_chirho(RawTokenKindChirho::ConSymChirho)
|| self.at_chirho(RawTokenKindChirho::BacktickChirho)
{
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::InfixConPatChirho);
if self.at_chirho(RawTokenKindChirho::BacktickChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_eof_chirho() {
self.bump_chirho(); }
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::BacktickChirho) {
self.bump_chirho(); }
} else {
self.bump_chirho(); }
self.eat_trivia_chirho();
self.parse_pat_chirho();
self.builder_chirho.finish_node_chirho();
}
}
fn parse_fun_arg_pat_chirho(&mut self) {
match self.current_kind_chirho() {
Some(RawTokenKindChirho::VarIdChirho) => {
let cp_chirho = self.builder_chirho.checkpoint_chirho();
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::VarPatChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::AtChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::AsPatChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_apat_chirho();
self.builder_chirho.finish_node_chirho();
}
}
Some(RawTokenKindChirho::ConIdChirho) | Some(RawTokenKindChirho::QualifiedIdChirho) => {
let cp_chirho = self.builder_chirho.checkpoint_chirho();
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::LeftBraceChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::RecordPatChirho);
self.parse_record_pat_fields_chirho();
self.builder_chirho.finish_node_chirho();
} else {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::ConPatChirho);
self.builder_chirho.finish_node_chirho();
}
}
Some(RawTokenKindChirho::VarSymChirho) if self.current_text_chirho() == "-" => {
self.parse_apat_chirho();
}
Some(RawTokenKindChirho::VarSymChirho) if self.current_text_chirho() == "!" => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::BangPatChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_apat_chirho();
self.builder_chirho.finish_node_chirho();
}
_ => {
self.parse_apat_chirho();
}
}
}
fn parse_lpat_chirho(&mut self) {
match self.current_kind_chirho() {
Some(RawTokenKindChirho::VarIdChirho) => {
let cp_chirho = self.builder_chirho.checkpoint_chirho();
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::VarPatChirho);
self.bump_chirho(); self.builder_chirho.finish_node_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::AtChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::AsPatChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_apat_chirho();
self.builder_chirho.finish_node_chirho();
}
}
Some(RawTokenKindChirho::ConIdChirho) | Some(RawTokenKindChirho::QualifiedIdChirho) => {
let cp_chirho = self.builder_chirho.checkpoint_chirho();
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::LeftBraceChirho) {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::RecordPatChirho);
self.parse_record_pat_fields_chirho();
self.builder_chirho.finish_node_chirho();
} else {
self.builder_chirho
.start_node_at_chirho(cp_chirho, SyntaxKindChirho::ConPatChirho);
while self.can_start_apat_chirho()
|| self.at_chirho(RawTokenKindChirho::AtChirho)
{
let before_chirho = self.pos_chirho;
if self.at_chirho(RawTokenKindChirho::AtChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
if self.can_start_atype_chirho() {
self.parse_atype_chirho();
}
self.eat_trivia_chirho();
continue;
}
self.parse_apat_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
break;
}
}
self.builder_chirho.finish_node_chirho();
}
}
Some(RawTokenKindChirho::TildeChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::LazyPatChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_apat_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::VarSymChirho) if self.current_text_chirho() == "!" => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::BangPatChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_apat_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::VarSymChirho) if self.current_text_chirho() == "-" => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::NegPatChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_apat_chirho();
self.builder_chirho.finish_node_chirho();
}
_ => self.parse_apat_chirho(),
}
}
fn parse_apat_chirho(&mut self) {
match self.current_kind_chirho() {
Some(RawTokenKindChirho::VarIdChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::VarPatChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::ConIdChirho) | Some(RawTokenKindChirho::QualifiedIdChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ConPatChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::IntLitChirho)
| Some(RawTokenKindChirho::FloatLitChirho)
| Some(RawTokenKindChirho::CharLitChirho)
| Some(RawTokenKindChirho::StringLitChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::LitPatChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::UnderscoreChirho) => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::WildcardPatChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
Some(RawTokenKindChirho::LeftParenChirho) => {
self.parse_paren_pat_chirho();
}
Some(RawTokenKindChirho::LeftBracketChirho) => {
self.parse_list_pat_chirho();
}
_ => {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ErrorNodeChirho);
if !self.at_eof_chirho() {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
}
}
fn parse_paren_pat_chirho(&mut self) {
let is_view_chirho = self.scan_for_view_arrow_chirho();
if is_view_chirho {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ViewPatChirho);
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
self.eat_trivia_chirho();
if self.current_kind_chirho() == Some(RawTokenKindChirho::RightArrowChirho)
|| (self.current_kind_chirho() == Some(RawTokenKindChirho::VarSymChirho)
&& self.current_text_chirho() == "->")
{
self.bump_chirho(); }
self.eat_trivia_chirho();
self.parse_pat_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
return;
}
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ParenPatChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
return;
}
self.parse_pat_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
return;
}
if self.at_chirho(RawTokenKindChirho::ColonColonChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_type_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
return;
}
if self.at_chirho(RawTokenKindChirho::CommaChirho) {
while self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.parse_pat_chirho();
self.eat_trivia_chirho();
}
}
}
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn scan_for_view_arrow_chirho(&self) -> bool {
if self.current_kind_chirho() != Some(RawTokenKindChirho::LeftParenChirho) {
return false;
}
let mut pos_chirho = self.pos_chirho + 1;
let mut depth_chirho: i32 = 1;
let mut in_type_annotation_chirho = false;
while pos_chirho < self.tokens_chirho.len() {
let tok_chirho = &self.tokens_chirho[pos_chirho];
match tok_chirho.kind_chirho {
RawTokenKindChirho::LeftParenChirho | RawTokenKindChirho::LeftBracketChirho => {
depth_chirho += 1;
}
RawTokenKindChirho::RightParenChirho | RawTokenKindChirho::RightBracketChirho => {
depth_chirho -= 1;
if depth_chirho == 0 {
return false; }
}
RawTokenKindChirho::ColonColonChirho if depth_chirho == 1 => {
in_type_annotation_chirho = true;
}
RawTokenKindChirho::RightArrowChirho if depth_chirho == 1 => {
if !in_type_annotation_chirho {
return true;
}
}
RawTokenKindChirho::VarSymChirho if depth_chirho == 1 => {
let text_chirho = self.token_text_chirho(tok_chirho);
if text_chirho == "->" && !in_type_annotation_chirho {
return true;
}
}
_ => {}
}
pos_chirho += 1;
}
false
}
fn parse_list_pat_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ListPatChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
return;
}
self.parse_pat_chirho();
self.eat_trivia_chirho();
while self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_pat_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::RightBracketChirho) {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_record_pat_fields_chirho(&mut self) {
self.bump_chirho(); self.eat_trivia_chirho();
while !self.at_chirho(RawTokenKindChirho::RightBraceChirho)
&& !self.at_eof_chirho()
&& !self.at_decl_boundary_chirho()
{
let before_chirho = self.pos_chirho;
while !self.at_chirho(RawTokenKindChirho::CommaChirho)
&& !self.at_chirho(RawTokenKindChirho::RightBraceChirho)
&& !self.at_eof_chirho()
&& !self.at_decl_boundary_chirho()
{
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::CommaChirho) {
self.bump_chirho();
self.eat_trivia_chirho();
}
if self.pos_chirho == before_chirho {
break;
}
}
if self.at_chirho(RawTokenKindChirho::RightBraceChirho) {
self.bump_chirho();
}
}
fn parse_splice_expr_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::SpliceExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::LeftParenChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho(); }
} else if self.at_chirho(RawTokenKindChirho::VarIdChirho)
|| self.at_chirho(RawTokenKindChirho::ConIdChirho)
|| self.at_chirho(RawTokenKindChirho::QualifiedIdChirho)
{
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::NameExprChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_typed_splice_expr_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::TypedSpliceExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::LeftParenChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho(); }
} else if self.at_chirho(RawTokenKindChirho::VarIdChirho)
|| self.at_chirho(RawTokenKindChirho::ConIdChirho)
|| self.at_chirho(RawTokenKindChirho::QualifiedIdChirho)
{
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::NameExprChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_splice_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::SpliceDeclChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::LeftParenChirho) {
self.bump_chirho(); self.eat_trivia_chirho();
self.parse_expr_chirho();
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::RightParenChirho) {
self.bump_chirho(); }
} else if self.at_chirho(RawTokenKindChirho::VarIdChirho)
|| self.at_chirho(RawTokenKindChirho::ConIdChirho)
|| self.at_chirho(RawTokenKindChirho::QualifiedIdChirho)
{
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::NameExprChirho);
self.bump_chirho();
self.builder_chirho.finish_node_chirho();
}
self.builder_chirho.finish_node_chirho();
}
fn parse_quote_expr_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::QuoteExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::ThCloseQuoteChirho) && !self.at_eof_chirho() {
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::ThCloseQuoteChirho) {
self.bump_chirho(); }
self.builder_chirho.finish_node_chirho();
}
fn parse_quote_decl_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::QuoteDeclChirho);
self.bump_chirho(); self.eat_trivia_chirho();
while !self.at_chirho(RawTokenKindChirho::ThCloseQuoteChirho) && !self.at_eof_chirho() {
let before_chirho = self.pos_chirho;
self.eat_trivia_chirho();
if self.at_chirho(RawTokenKindChirho::VirtualSemicolonChirho)
|| self.at_chirho(RawTokenKindChirho::SemicolonChirho)
{
self.bump_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
break;
}
continue;
}
if self.at_chirho(RawTokenKindChirho::ThCloseQuoteChirho) || self.at_eof_chirho() {
break;
}
self.parse_decl_chirho();
self.eat_trivia_chirho();
if self.pos_chirho == before_chirho {
break;
}
}
if self.at_chirho(RawTokenKindChirho::ThCloseQuoteChirho) {
self.bump_chirho(); }
self.builder_chirho.finish_node_chirho();
}
fn parse_quote_type_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::QuoteTypeChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::ThCloseQuoteChirho) && !self.at_eof_chirho() {
self.parse_type_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::ThCloseQuoteChirho) {
self.bump_chirho(); }
self.builder_chirho.finish_node_chirho();
}
fn parse_quote_pat_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::QuotePatChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::ThCloseQuoteChirho) && !self.at_eof_chirho() {
self.parse_pat_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::ThCloseQuoteChirho) {
self.bump_chirho(); }
self.builder_chirho.finish_node_chirho();
}
fn parse_typed_quote_expr_chirho(&mut self) {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::TypedQuoteExprChirho);
self.bump_chirho(); self.eat_trivia_chirho();
if !self.at_chirho(RawTokenKindChirho::ThCloseTypedQuoteChirho) && !self.at_eof_chirho() {
self.parse_expr_chirho();
self.eat_trivia_chirho();
}
if self.at_chirho(RawTokenKindChirho::ThCloseTypedQuoteChirho) {
self.bump_chirho(); }
self.builder_chirho.finish_node_chirho();
}
fn can_start_atype_chirho(&self) -> bool {
matches!(
self.current_kind_chirho(),
Some(RawTokenKindChirho::VarIdChirho)
| Some(RawTokenKindChirho::ConIdChirho)
| Some(RawTokenKindChirho::QualifiedIdChirho)
| Some(RawTokenKindChirho::LeftParenChirho)
| Some(RawTokenKindChirho::LeftBracketChirho)
| Some(RawTokenKindChirho::TickChirho)
| Some(RawTokenKindChirho::UnderscoreChirho)
| Some(RawTokenKindChirho::IntLitChirho)
| Some(RawTokenKindChirho::StringLitChirho)
| Some(RawTokenKindChirho::CharLitChirho)
)
}
fn at_strict_prefix_chirho(&self) -> bool {
self.current_kind_chirho() == Some(RawTokenKindChirho::VarSymChirho)
&& self.current_text_chirho() == "!"
}
fn can_start_aexp_chirho(&self) -> bool {
matches!(
self.current_kind_chirho(),
Some(RawTokenKindChirho::VarIdChirho)
| Some(RawTokenKindChirho::ConIdChirho)
| Some(RawTokenKindChirho::QualifiedIdChirho)
| Some(RawTokenKindChirho::IntLitChirho)
| Some(RawTokenKindChirho::FloatLitChirho)
| Some(RawTokenKindChirho::CharLitChirho)
| Some(RawTokenKindChirho::StringLitChirho)
| Some(RawTokenKindChirho::LeftParenChirho)
| Some(RawTokenKindChirho::LeftBracketChirho)
| Some(RawTokenKindChirho::BackslashChirho)
| Some(RawTokenKindChirho::DoChirho)
| Some(RawTokenKindChirho::CaseChirho)
| Some(RawTokenKindChirho::IfChirho)
| Some(RawTokenKindChirho::LetChirho)
| Some(RawTokenKindChirho::ThSpliceChirho)
| Some(RawTokenKindChirho::ThTypedSpliceChirho)
| Some(RawTokenKindChirho::ThOpenExpQuoteChirho)
| Some(RawTokenKindChirho::ThOpenExpExplicitQuoteChirho)
| Some(RawTokenKindChirho::ThOpenDecQuoteChirho)
| Some(RawTokenKindChirho::ThOpenTypeQuoteChirho)
| Some(RawTokenKindChirho::ThOpenPatQuoteChirho)
| Some(RawTokenKindChirho::ThOpenTypedExpQuoteChirho)
| Some(RawTokenKindChirho::UnderscoreChirho)
)
}
fn can_start_apat_chirho(&self) -> bool {
matches!(
self.current_kind_chirho(),
Some(RawTokenKindChirho::VarIdChirho)
| Some(RawTokenKindChirho::ConIdChirho)
| Some(RawTokenKindChirho::QualifiedIdChirho)
| Some(RawTokenKindChirho::IntLitChirho)
| Some(RawTokenKindChirho::FloatLitChirho)
| Some(RawTokenKindChirho::CharLitChirho)
| Some(RawTokenKindChirho::StringLitChirho)
| Some(RawTokenKindChirho::UnderscoreChirho)
| Some(RawTokenKindChirho::LeftParenChirho)
| Some(RawTokenKindChirho::LeftBracketChirho)
| Some(RawTokenKindChirho::TildeChirho)
)
}
fn at_infix_op_chirho(&self) -> bool {
if self.at_decl_boundary_chirho() || self.at_expr_boundary_chirho() {
return false;
}
matches!(
self.current_kind_chirho(),
Some(RawTokenKindChirho::VarSymChirho)
| Some(RawTokenKindChirho::ConSymChirho)
| Some(RawTokenKindChirho::BacktickChirho)
)
}
fn at_decl_boundary_chirho(&self) -> bool {
self.at_eof_chirho()
|| matches!(
self.current_kind_chirho(),
Some(RawTokenKindChirho::VirtualSemicolonChirho)
| Some(RawTokenKindChirho::VirtualRightBraceChirho)
| Some(RawTokenKindChirho::SemicolonChirho)
| Some(RawTokenKindChirho::RightBraceChirho)
)
}
fn at_expr_boundary_chirho(&self) -> bool {
self.at_decl_boundary_chirho()
|| matches!(
self.current_kind_chirho(),
Some(RawTokenKindChirho::WhereChirho)
| Some(RawTokenKindChirho::InChirho)
| Some(RawTokenKindChirho::ThenChirho)
| Some(RawTokenKindChirho::ElseChirho)
| Some(RawTokenKindChirho::OfChirho)
)
}
fn current_chirho(&self) -> Option<&RawTokenChirho> {
self.tokens_chirho.get(self.pos_chirho)
}
fn current_kind_chirho(&self) -> Option<RawTokenKindChirho> {
self.current_chirho().map(|t_chirho| t_chirho.kind_chirho)
}
fn at_chirho(&self, kind_chirho: RawTokenKindChirho) -> bool {
self.current_kind_chirho() == Some(kind_chirho)
}
fn at_eof_chirho(&self) -> bool {
self.pos_chirho >= self.tokens_chirho.len() || self.at_chirho(RawTokenKindChirho::EofChirho)
}
fn at_dot_chirho(&self) -> bool {
self.at_chirho(RawTokenKindChirho::VarSymChirho) && self.current_text_chirho() == "."
}
fn at_varid_text_chirho(&self, text_chirho: &str) -> bool {
if !self.at_chirho(RawTokenKindChirho::VarIdChirho) {
return false;
}
self.current_text_chirho() == text_chirho
}
fn at_varsym_chirho(&self, text_chirho: &str) -> bool {
if !self.at_chirho(RawTokenKindChirho::VarSymChirho) {
return false;
}
self.current_text_chirho() == text_chirho
}
fn is_operator_section_chirho(&self) -> bool {
let is_op_chirho = matches!(
self.current_kind_chirho(),
Some(RawTokenKindChirho::VarSymChirho) | Some(RawTokenKindChirho::ConSymChirho)
);
if !is_op_chirho {
return false;
}
let mut look_chirho = self.pos_chirho + 1;
while look_chirho < self.tokens_chirho.len() {
if self.tokens_chirho[look_chirho]
.kind_chirho
.is_trivia_chirho()
{
look_chirho += 1;
} else {
break;
}
}
look_chirho < self.tokens_chirho.len()
&& self.tokens_chirho[look_chirho].kind_chirho == RawTokenKindChirho::RightParenChirho
}
fn current_text_chirho(&self) -> &str {
if let Some(tok_chirho) = self.current_chirho() {
self.token_text_chirho(tok_chirho)
} else {
""
}
}
fn bump_chirho(&mut self) {
if let Some(tok_chirho) = self.current_chirho().copied() {
let text_chirho = self.token_text_chirho(&tok_chirho);
let kind_chirho = map_token_kind_chirho(tok_chirho.kind_chirho, text_chirho);
self.builder_chirho.token_chirho(kind_chirho, text_chirho);
self.pos_chirho += 1;
}
}
fn token_text_chirho(&self, tok_chirho: &RawTokenChirho) -> &'src str {
let start_chirho = tok_chirho.span_chirho.start_chirho().as_usize_chirho();
let end_chirho = tok_chirho.span_chirho.end_chirho().as_usize_chirho();
self.source_chirho
.get(start_chirho..end_chirho)
.unwrap_or("")
}
fn eat_trivia_chirho(&mut self) {
while let Some(kind_chirho) = self.current_kind_chirho() {
if kind_chirho.is_trivia_chirho() {
self.bump_chirho();
} else {
break;
}
}
}
fn expect_chirho(&mut self, kind_chirho: RawTokenKindChirho) {
if self.at_chirho(kind_chirho) {
self.bump_chirho();
} else {
self.builder_chirho
.start_node_chirho(SyntaxKindChirho::ErrorNodeChirho);
if !self.at_eof_chirho() {
self.bump_chirho();
}
self.builder_chirho.finish_node_chirho();
}
}
fn eat_until_any_chirho(&mut self, stops_chirho: &[RawTokenKindChirho]) {
while let Some(kind_chirho) = self.current_kind_chirho() {
if stops_chirho.contains(&kind_chirho) || kind_chirho == RawTokenKindChirho::EofChirho {
break;
}
self.bump_chirho();
}
}
fn eat_until_decl_end_chirho(&mut self) {
self.eat_until_any_chirho(&[
RawTokenKindChirho::VirtualSemicolonChirho,
RawTokenKindChirho::VirtualRightBraceChirho,
RawTokenKindChirho::SemicolonChirho,
RawTokenKindChirho::RightBraceChirho,
]);
}
fn is_type_sig_chirho(&self) -> bool {
let mut i_chirho = self.pos_chirho;
if i_chirho < self.tokens_chirho.len() {
let k_chirho = self.tokens_chirho[i_chirho].kind_chirho;
if k_chirho == RawTokenKindChirho::VarIdChirho
|| k_chirho == RawTokenKindChirho::ConIdChirho
{
i_chirho += 1;
} else if k_chirho == RawTokenKindChirho::LeftParenChirho {
i_chirho += 1;
while i_chirho < self.tokens_chirho.len()
&& self.tokens_chirho[i_chirho].kind_chirho
!= RawTokenKindChirho::RightParenChirho
{
i_chirho += 1;
}
if i_chirho < self.tokens_chirho.len() {
i_chirho += 1; }
}
}
while i_chirho < self.tokens_chirho.len()
&& self.tokens_chirho[i_chirho].kind_chirho.is_trivia_chirho()
{
i_chirho += 1;
}
i_chirho < self.tokens_chirho.len()
&& self.tokens_chirho[i_chirho].kind_chirho == RawTokenKindChirho::ColonColonChirho
}
}
pub fn parse_to_cst_chirho(
source_chirho: &str,
file_id_chirho: FileIdChirho,
) -> Arc<GreenNodeChirho> {
let parser_chirho = ParserChirho::new_chirho(source_chirho, file_id_chirho);
parser_chirho.parse_chirho()
}
#[cfg(test)]
mod tests_chirho {
use super::*;
use haskelujah_syntax_chirho::green_chirho::GreenElementChirho;
fn parse_chirho(source_chirho: &str) -> Arc<GreenNodeChirho> {
parse_to_cst_chirho(source_chirho, FileIdChirho::SYNTHETIC_CHIRHO)
}
fn collect_node_kinds_chirho(root_chirho: &GreenNodeChirho) -> Vec<SyntaxKindChirho> {
let mut kinds_chirho = Vec::new();
for child_chirho in root_chirho.children_chirho() {
if let GreenElementChirho::NodeChirho(n_chirho) = child_chirho {
kinds_chirho.push(n_chirho.kind_chirho());
kinds_chirho.extend(collect_node_kinds_chirho(n_chirho));
}
}
kinds_chirho
}
#[test]
fn parse_simple_module_chirho() {
let root_chirho = parse_chirho("module Main where\nmain = putStrLn \"hi\"\n");
assert_eq!(
root_chirho.kind_chirho(),
SyntaxKindChirho::SourceFileChirho
);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::ModuleHeaderChirho),
"should have ModuleHeader: {:?}",
kinds_chirho
);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::FunBindChirho),
"should have FunBind: {:?}",
kinds_chirho
);
}
#[test]
fn parse_import_decl_chirho() {
let source_chirho = "module M where\nimport Data.List\nimport qualified Data.Map as Map\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
let import_count_chirho = kinds_chirho
.iter()
.filter(|k_chirho| **k_chirho == SyntaxKindChirho::ImportDeclChirho)
.count();
assert_eq!(import_count_chirho, 2, "should parse 2 imports");
}
#[test]
fn parse_data_decl_chirho() {
let source_chirho =
"module M where\ndata Color = Red | Green | Blue\n deriving (Show, Eq)\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::DataDeclChirho),
"should have DataDecl"
);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::DerivingClauseChirho),
"should have DerivingClause"
);
}
#[test]
fn parse_type_sig_with_types_chirho() {
let source_chirho = "module M where\nfoo :: Int -> String -> Bool\nfoo x y = True\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::TypeSigDeclChirho),
"should have TypeSigDecl"
);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::FunTypeChirho),
"should have FunType for -> : {:?}",
kinds_chirho
);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::FunBindChirho),
"should have FunBind"
);
}
#[test]
fn parse_class_with_where_chirho() {
let source_chirho =
"module M where\nclass Describable a where\n describe :: a -> String\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::ClassDeclChirho),
"should have ClassDecl"
);
}
#[test]
fn parse_script_without_module_chirho() {
let source_chirho = "main = putStrLn \"hello\"\n";
let root_chirho = parse_chirho(source_chirho);
assert_eq!(
root_chirho.kind_chirho(),
SyntaxKindChirho::SourceFileChirho
);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::FunBindChirho),
"should have FunBind even without module header"
);
}
#[test]
fn text_len_matches_source_chirho() {
let source_chirho = "module Main where\nmain = putStrLn \"hi\"\n";
let root_chirho = parse_chirho(source_chirho);
assert_eq!(
root_chirho.text_len_chirho(),
source_chirho.len(),
"green tree text length should match source length"
);
}
#[test]
fn parse_imports_with_specs_chirho() {
let source_chirho = "module M where\nimport Data.Maybe (fromMaybe, isJust)\nimport Prelude hiding (map, filter)\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
let import_count_chirho = kinds_chirho
.iter()
.filter(|k_chirho| **k_chirho == SyntaxKindChirho::ImportDeclChirho)
.count();
assert_eq!(import_count_chirho, 2);
}
#[test]
fn parse_expression_nodes_chirho() {
let source_chirho = "module M where\nresult = f x + g y\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::AppExprChirho)
|| kinds_chirho.contains(&SyntaxKindChirho::InfixExprChirho),
"should have application or infix expression nodes: {:?}",
kinds_chirho
);
}
#[test]
fn parse_if_expression_chirho() {
let source_chirho = "module M where\nx = if True then 1 else 2\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::IfExprChirho),
"should have IfExpr: {:?}",
kinds_chirho
);
}
#[test]
fn parse_lambda_expression_chirho() {
let source_chirho = "module M where\nf = \\x -> x + 1\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::LambdaExprChirho),
"should have LambdaExpr: {:?}",
kinds_chirho
);
}
#[test]
fn parse_do_expression_chirho() {
let source_chirho = "module M where\nmain = do\n putStrLn \"hello\"\n return ()\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::DoExprChirho),
"should have DoExpr: {:?}",
kinds_chirho
);
}
#[test]
fn parse_case_expression_chirho() {
let source_chirho = "module M where\nf x = case x of\n True -> 1\n False -> 0\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::CaseExprChirho),
"should have CaseExpr: {:?}",
kinds_chirho
);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::CaseAltChirho),
"should have CaseAlt: {:?}",
kinds_chirho
);
}
#[test]
fn parse_list_and_tuple_chirho() {
let source_chirho = "module M where\nxs = [1, 2, 3]\np = (1, True)\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::ListExprChirho),
"should have ListExpr: {:?}",
kinds_chirho
);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::ParenExprChirho),
"should have ParenExpr (tuple): {:?}",
kinds_chirho
);
}
#[test]
fn parse_type_alias_with_type_nodes_chirho() {
let source_chirho = "module M where\ntype Name = String\ntype Pair a b = (a, b)\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
let alias_count_chirho = kinds_chirho
.iter()
.filter(|k_chirho| **k_chirho == SyntaxKindChirho::TypeAliasDeclChirho)
.count();
assert_eq!(alias_count_chirho, 2, "should parse 2 type aliases");
}
#[test]
fn parse_where_clause_chirho() {
let source_chirho = "module M where\nf x = y + z\n where\n y = x + 1\n z = x * 2\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::WhereClauseChirho),
"should have WhereClause: {:?}",
kinds_chirho
);
}
#[test]
fn roundtrip_text_len_various_chirho() {
let sources_chirho = [
"main = putStrLn \"hello\"\n",
"module M where\nf :: Int -> Int\nf x = x + 1\n",
"module M where\nimport Data.List\ndata T = A | B\n",
"x = if True then 1 else 2\n",
"f = \\x y -> x + y\n",
"main = do\n putStrLn \"hi\"\n return 42\n",
];
for src_chirho in &sources_chirho {
let root_chirho = parse_chirho(src_chirho);
assert_eq!(
root_chirho.text_len_chirho(),
src_chirho.len(),
"text_len mismatch for: {}",
src_chirho.trim()
);
}
}
#[test]
fn parse_open_type_family_chirho() {
let source_chirho = "module M where\ntype family F a :: Type\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::TypeFamilyDeclChirho),
"should have TypeFamilyDecl: {:?}",
kinds_chirho
);
}
#[test]
fn parse_closed_type_family_chirho() {
let source_chirho =
"module M where\ntype family F a where\n F Int = Bool\n F Char = Int\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::TypeFamilyDeclChirho),
"should have TypeFamilyDecl: {:?}",
kinds_chirho
);
}
#[test]
fn parse_type_family_instance_chirho() {
let source_chirho = "module M where\ntype instance F Int = Bool\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::TypeFamilyInstanceDeclChirho),
"should have TypeFamilyInstanceDecl: {:?}",
kinds_chirho
);
}
#[test]
fn parse_th_splice_name_expr_chirho() {
let source_chirho = "module M where\nx = $foo\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::SpliceExprChirho),
"should have SpliceExpr for $foo: {:?}",
kinds_chirho
);
}
#[test]
fn parse_th_splice_parens_expr_chirho() {
let source_chirho = "module M where\nx = $(makeLenses foo)\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::SpliceExprChirho),
"should have SpliceExpr for $(makeLenses foo): {:?}",
kinds_chirho
);
}
#[test]
fn parse_th_typed_splice_expr_chirho() {
let source_chirho = "module M where\nx = $$foo\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::TypedSpliceExprChirho),
"should have TypedSpliceExpr for $$foo: {:?}",
kinds_chirho
);
}
#[test]
fn parse_th_splice_decl_chirho() {
let source_chirho = "module M where\n$(makeLenses foo)\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::SpliceDeclChirho),
"should have SpliceDecl for top-level $(makeLenses foo): {:?}",
kinds_chirho
);
}
#[test]
fn parse_th_expr_quote_chirho() {
let source_chirho = "module M where\nx = [| foo |]\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::QuoteExprChirho),
"should have QuoteExpr for [| foo |]: {:?}",
kinds_chirho
);
}
#[test]
fn parse_th_decl_quote_chirho() {
let source_chirho = "module M where\nx = [d| y = 1 |]\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::QuoteDeclChirho),
"should have QuoteDecl for [d| y = 1 |]: {:?}",
kinds_chirho
);
}
#[test]
fn parse_th_type_quote_chirho() {
let source_chirho = "module M where\nx = [t| Int |]\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::QuoteTypeChirho),
"should have QuoteType for [t| Int |]: {:?}",
kinds_chirho
);
}
#[test]
fn parse_th_pat_quote_chirho() {
let source_chirho = "module M where\nx = [p| y |]\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::QuotePatChirho),
"should have QuotePat for [p| y |]: {:?}",
kinds_chirho
);
}
#[test]
fn parse_th_splice_decl_make_lenses_chirho() {
let source_chirho = "module M where\ndata Foo = Foo\n$(makeLenses ''Foo)\n";
let root_chirho = parse_chirho(source_chirho);
let kinds_chirho = collect_node_kinds_chirho(&root_chirho);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::DataDeclChirho),
"should have DataDecl: {:?}",
kinds_chirho
);
assert!(
kinds_chirho.contains(&SyntaxKindChirho::SpliceDeclChirho),
"should have SpliceDecl for $(makeLenses ''Foo): {:?}",
kinds_chirho
);
}
#[test]
fn parse_th_text_len_matches_chirho() {
let source_chirho = "module M where\nx = $foo\n";
let root_chirho = parse_chirho(source_chirho);
assert_eq!(
root_chirho.text_len_chirho(),
source_chirho.len(),
"TH green tree text length should match source length"
);
}
}