parser(match): add MVP type patterns (IntegerBox(x)/StringBox(s)) via AST If-chain; keep literal-only path using PeekExpr; add smoke app (apps/tests/match_type_pattern_basic.nyash); build + stage-2 smokes green

This commit is contained in:
Selfhosting Dev
2025-09-19 08:34:29 +09:00
parent f4e340da08
commit 9142476484
348 changed files with 2539 additions and 281 deletions

View File

@ -0,0 +1,57 @@
//! Shared helpers for members parsing (scaffold)
use crate::parser::{NyashParser, ParseError};
use crate::parser::common::ParserUtils;
use crate::tokenizer::TokenType;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MemberKind {
Field,
Method,
Constructor,
PropertyComputed,
PropertyOnce,
PropertyBirthOnce,
}
/// Decide member kind via simple lookahead (scaffold placeholder)
pub fn classify_member(p: &mut NyashParser) -> Result<MemberKind, ParseError> {
// block-first: { body } as (once|birth_once)? name : Type
if crate::config::env::unified_members() && p.match_any_token(&[TokenType::LBRACE]) {
return Ok(MemberKind::PropertyComputed);
}
// Constructors by keyword or name
match &p.current_token().token_type {
TokenType::PACK | TokenType::BIRTH => {
if p.peek_token() == &TokenType::LPAREN { return Ok(MemberKind::Constructor); }
}
TokenType::IDENTIFIER(name) if (name == "init" || name == "birth" || name == "pack")
&& p.peek_token() == &TokenType::LPAREN => {
return Ok(MemberKind::Constructor);
}
_ => {}
}
// Method: ident '(' ...
if matches!(&p.current_token().token_type, TokenType::IDENTIFIER(_))
&& p.peek_token() == &TokenType::LPAREN
{
return Ok(MemberKind::Method);
}
// Field: [weak] ident ':' Type
if p.match_any_token(&[TokenType::WEAK]) {
// weak IDENT ':'
// do not consume; use peek via offset: current is WEAK, next should be IDENT, then ':'
// We only classify; the main parser will handle errors.
return Ok(MemberKind::Field);
}
if matches!(&p.current_token().token_type, TokenType::IDENTIFIER(_))
&& p.peek_token() == &TokenType::COLON
{
return Ok(MemberKind::Field);
}
// Default: treat as method for graceful recovery
Ok(MemberKind::Method)
}