Phase 21.3 WIP: Hako Source Checker improvements - HC011/HC016/HC017 実装完了
主な変更: - ✅ HC011 (dead methods) 実装・テスト緑 - ✅ HC016 (unused alias) 実装・テスト緑 - ✅ HC017 (non-ascii quotes) 実装完了 - 🔧 tokenizer/parser_core 強化(AST優先ルート) - 🛡️ plugin_guard.rs 追加(stderr専用出力) - 📋 テストインフラ整備(run_tests.sh改善) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -55,75 +55,69 @@ impl ASTNode {
|
||||
}
|
||||
}
|
||||
|
||||
/// 🌟 AST分類 - ChatGPTアドバイス統合による革新的分類システム
|
||||
/// Structure/Expression/Statement の明確な分離
|
||||
/// Structure/Expression/Statement の分類
|
||||
pub fn classify(&self) -> ASTNodeType {
|
||||
use ASTNodeType::{Expression as E, Statement as S, Structure as St};
|
||||
match self {
|
||||
// Structure nodes - 言語の基本構造
|
||||
ASTNode::BoxDeclaration { .. } => ASTNodeType::Structure,
|
||||
ASTNode::FunctionDeclaration { .. } => ASTNodeType::Structure,
|
||||
ASTNode::If { .. } => ASTNodeType::Structure,
|
||||
ASTNode::Loop { .. } => ASTNodeType::Structure,
|
||||
ASTNode::While { .. } => ASTNodeType::Structure,
|
||||
ASTNode::ForRange { .. } => ASTNodeType::Structure,
|
||||
ASTNode::TryCatch { .. } => ASTNodeType::Structure,
|
||||
ASTNode::BoxDeclaration { .. } => St,
|
||||
ASTNode::FunctionDeclaration { .. } => St,
|
||||
ASTNode::If { .. } => St,
|
||||
ASTNode::Loop { .. } => St,
|
||||
ASTNode::While { .. } => St,
|
||||
ASTNode::ForRange { .. } => St,
|
||||
ASTNode::TryCatch { .. } => St,
|
||||
ASTNode::ScopeBox { .. } => St, // diagnostic wrapper
|
||||
|
||||
// Expression nodes - 値を生成する表現
|
||||
ASTNode::Literal { .. } => ASTNodeType::Expression,
|
||||
ASTNode::Variable { .. } => ASTNodeType::Expression,
|
||||
ASTNode::BinaryOp { .. } => ASTNodeType::Expression,
|
||||
ASTNode::UnaryOp { .. } => ASTNodeType::Expression,
|
||||
ASTNode::FunctionCall { .. } => ASTNodeType::Expression,
|
||||
ASTNode::Call { .. } => ASTNodeType::Expression,
|
||||
ASTNode::MethodCall { .. } => ASTNodeType::Expression,
|
||||
ASTNode::FieldAccess { .. } => ASTNodeType::Expression,
|
||||
ASTNode::New { .. } => ASTNodeType::Expression,
|
||||
ASTNode::This { .. } => ASTNodeType::Expression,
|
||||
ASTNode::Me { .. } => ASTNodeType::Expression,
|
||||
ASTNode::FromCall { .. } => ASTNodeType::Expression,
|
||||
ASTNode::ThisField { .. } => ASTNodeType::Expression,
|
||||
ASTNode::MeField { .. } => ASTNodeType::Expression,
|
||||
ASTNode::Index { .. } => ASTNodeType::Expression,
|
||||
ASTNode::MatchExpr { .. } => ASTNodeType::Expression,
|
||||
ASTNode::QMarkPropagate { .. } => ASTNodeType::Expression,
|
||||
ASTNode::Lambda { .. } => ASTNodeType::Expression,
|
||||
ASTNode::ArrayLiteral { .. } => ASTNodeType::Expression,
|
||||
ASTNode::MapLiteral { .. } => ASTNodeType::Expression,
|
||||
|
||||
// Diagnostic-only wrapper treated as structure
|
||||
ASTNode::ScopeBox { .. } => ASTNodeType::Structure,
|
||||
ASTNode::Literal { .. } => E,
|
||||
ASTNode::Variable { .. } => E,
|
||||
ASTNode::BinaryOp { .. } => E,
|
||||
ASTNode::UnaryOp { .. } => E,
|
||||
ASTNode::FunctionCall { .. } => E,
|
||||
ASTNode::Call { .. } => E,
|
||||
ASTNode::MethodCall { .. } => E,
|
||||
ASTNode::FieldAccess { .. } => E,
|
||||
ASTNode::New { .. } => E,
|
||||
ASTNode::This { .. } => E,
|
||||
ASTNode::Me { .. } => E,
|
||||
ASTNode::FromCall { .. } => E,
|
||||
ASTNode::ThisField { .. } => E,
|
||||
ASTNode::MeField { .. } => E,
|
||||
ASTNode::Index { .. } => E,
|
||||
ASTNode::MatchExpr { .. } => E,
|
||||
ASTNode::QMarkPropagate { .. } => E,
|
||||
ASTNode::Lambda { .. } => E,
|
||||
ASTNode::ArrayLiteral { .. } => E,
|
||||
ASTNode::MapLiteral { .. } => E,
|
||||
ASTNode::AwaitExpression { .. } => E,
|
||||
|
||||
// Statement nodes - 実行可能なアクション
|
||||
ASTNode::Program { .. } => ASTNodeType::Statement, // プログラム全体
|
||||
ASTNode::Assignment { .. } => ASTNodeType::Statement,
|
||||
ASTNode::Print { .. } => ASTNodeType::Statement,
|
||||
ASTNode::Return { .. } => ASTNodeType::Statement,
|
||||
ASTNode::Break { .. } => ASTNodeType::Statement,
|
||||
ASTNode::Continue { .. } => ASTNodeType::Statement,
|
||||
ASTNode::UsingStatement { .. } => ASTNodeType::Statement,
|
||||
ASTNode::ImportStatement { .. } => ASTNodeType::Statement,
|
||||
ASTNode::GlobalVar { .. } => ASTNodeType::Statement,
|
||||
|
||||
ASTNode::Local { .. } => ASTNodeType::Statement,
|
||||
ASTNode::Outbox { .. } => ASTNodeType::Statement,
|
||||
ASTNode::Nowait { .. } => ASTNodeType::Statement,
|
||||
ASTNode::Arrow { .. } => ASTNodeType::Statement,
|
||||
ASTNode::Throw { .. } => ASTNodeType::Statement,
|
||||
ASTNode::AwaitExpression { .. } => ASTNodeType::Expression,
|
||||
ASTNode::Program { .. } => S,
|
||||
ASTNode::Assignment { .. } => S,
|
||||
ASTNode::Print { .. } => S,
|
||||
ASTNode::Return { .. } => S,
|
||||
ASTNode::Break { .. } => S,
|
||||
ASTNode::Continue { .. } => S,
|
||||
ASTNode::UsingStatement { .. } => S,
|
||||
ASTNode::ImportStatement { .. } => S,
|
||||
ASTNode::GlobalVar { .. } => S,
|
||||
ASTNode::Local { .. } => S,
|
||||
ASTNode::Outbox { .. } => S,
|
||||
ASTNode::Nowait { .. } => S,
|
||||
ASTNode::Arrow { .. } => S,
|
||||
ASTNode::Throw { .. } => S,
|
||||
}
|
||||
}
|
||||
|
||||
/// 🎯 構造パターンチェック - 2段階パーサー用
|
||||
pub fn is_structure(&self) -> bool {
|
||||
matches!(self.classify(), ASTNodeType::Structure)
|
||||
}
|
||||
|
||||
/// ⚡ 式パターンチェック - 評価エンジン用
|
||||
pub fn is_expression(&self) -> bool {
|
||||
matches!(self.classify(), ASTNodeType::Expression)
|
||||
}
|
||||
|
||||
/// 📝 文パターンチェック - 実行エンジン用
|
||||
pub fn is_statement(&self) -> bool {
|
||||
matches!(self.classify(), ASTNodeType::Statement)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user