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:
nyash-codex
2025-11-08 00:46:34 +09:00
parent 647e15d12e
commit 58a6471883
39 changed files with 1435 additions and 283 deletions

View File

@ -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)
}