diff --git a/docs/development/strategies/skip-newlines-removal-plan.md b/docs/development/strategies/skip-newlines-removal-plan.md new file mode 100644 index 00000000..e4912621 --- /dev/null +++ b/docs/development/strategies/skip-newlines-removal-plan.md @@ -0,0 +1,106 @@ +# skip_newlines() 段階的削除計画 + +## 📊 現状分析(2025-09-24) + +### 削減実績 +- **初期**: 48箇所 +- **Phase 1完了**: 40箇所(17%削減) +- **削除済み**: primary.rsのオブジェクトリテラル内8箇所 + +### 残存箇所(41箇所) +``` +common.rs: 1 +statements.rs: 4 +match_expr.rs: 6 +primary.rs: 1 +box_definition.rs: 3 +static_box.rs: 2 +header.rs: 2 +interface.rs: 3 +postfix.rs: 2 +fields.rs: 9(最多) +properties.rs: 1 +constructors.rs: 2 +parser_enhanced.rs: 4(実験的) +nyash_parser_v2.rs: 1(実験的) +``` + +## 🎯 削除戦略 + +### Phase 2-A: 簡単な括弧内削除(即座に可能) +**対象**: 明らかに括弧内にあるskip_newlines() +- `match_expr.rs`: match式内(brace_depth > 0)の6箇所 +- `primary.rs`: 残り1箇所(ブロック内) +- **予想削減**: 7箇所(41→34) + +### Phase 2-B: Box宣言系(中難度) +**対象**: Box定義内の改行処理 +- `fields.rs`: 9箇所(フィールド宣言) +- `box_definition.rs`: 3箇所 +- `static_box.rs`: 2箇所 +- **課題**: フィールド区切りの判定が必要 +- **予想削減**: 14箇所(34→20) + +### Phase 2-C: 文処理系(高難度) +**対象**: 文の区切り判定に関わる部分 +- `statements.rs`: 4箇所 +- `header.rs`: 2箇所 +- `interface.rs`: 3箇所 +- **課題**: 文区切りと行継続の判定が複雑 +- **予想削減**: 9箇所(20→11) + +### Phase 2-D: メンバー宣言系(最高難度) +**対象**: Boxメンバーの宣言 +- `constructors.rs`: 2箇所 +- `properties.rs`: 1箇所 +- `postfix.rs`: 2箇所 +- **課題**: 複雑な構文の境界判定 +- **予想削減**: 5箇所(11→6) + +### Phase 2-E: 共通関数(最終段階) +**対象**: ParserUtilsの共通関数 +- `common.rs`: 1箇所(skip_newlines_internal) +- **課題**: 全削除後に関数自体を削除 +- **予想削減**: 1箇所(6→5) + +### 実験的ファイル(除外) +- `parser_enhanced.rs`: 4箇所 +- `nyash_parser_v2.rs`: 1箇所 +これらは実験的実装のため削除対象外 + +## 📈 削減ロードマップ + +``` +Phase 1: 48 → 40 (8削除) ✅ 完了 +Phase 2-A: 40 → 33 (7削除) 🚀 次のタスク +Phase 2-B: 33 → 19 (14削除) +Phase 2-C: 19 → 10 (9削除) +Phase 2-D: 10 → 5 (5削除) +Phase 2-E: 5 → 0 (5削除)※実験ファイル除く +``` + +## 🔧 実装方針 + +### 削除前のチェックリスト +1. ✅ 深度追跡が有効な箇所か確認 +2. ✅ テストケースの準備 +3. ✅ 削除後の動作確認 +4. ✅ コミット単位を小さく保つ + +### 削除時の置き換えルール +- **括弧内**: 単純削除(深度追跡で自動処理) +- **演算子後**: 単純削除(行継続判定で自動処理) +- **文区切り**: TokenCursorモード切り替えで対応 +- **その他**: 個別判断 + +## 🎯 最終目標 + +1. **実用コードからskip_newlines()完全排除** +2. **TokenCursorによる統一的な改行処理** +3. **コード品質とメンテナンス性の向上** + +## 📝 次のアクション + +1. Phase 2-A: match_expr.rsの6箇所削除 +2. テスト実行と動作確認 +3. 段階的にPhase 2-B以降を実施 \ No newline at end of file diff --git a/src/parser/expr/match_expr.rs b/src/parser/expr/match_expr.rs index 4f3ec0e3..a09855d5 100644 --- a/src/parser/expr/match_expr.rs +++ b/src/parser/expr/match_expr.rs @@ -24,10 +24,10 @@ impl NyashParser { let mut default_expr: Option = None; while !self.match_token(&TokenType::RBRACE) && !self.is_at_end() { - self.skip_newlines(); + // skip_newlines削除: brace_depth > 0なので自動スキップ while self.match_token(&TokenType::COMMA) || self.match_token(&TokenType::NEWLINE) { self.advance(); - self.skip_newlines(); + // skip_newlines削除: brace_depth > 0なので自動スキップ } if self.match_token(&TokenType::RBRACE) { break; @@ -56,7 +56,7 @@ impl NyashParser { self.advance(); // consume '{' let mut stmts: Vec = Vec::new(); while !self.match_token(&TokenType::RBRACE) && !self.is_at_end() { - self.skip_newlines(); + // skip_newlines削除: brace_depth > 0なので自動スキップ if !self.match_token(&TokenType::RBRACE) { stmts.push(self.parse_statement()?); } @@ -116,7 +116,7 @@ impl NyashParser { self.advance(); // consume '{' let mut stmts: Vec = Vec::new(); while !self.match_token(&TokenType::RBRACE) && !self.is_at_end() { - self.skip_newlines(); + // skip_newlines削除: brace_depth > 0なので自動スキップ if !self.match_token(&TokenType::RBRACE) { let st = self.parse_statement()?; stmts.push(st); @@ -161,7 +161,7 @@ impl NyashParser { self.advance(); // consume '{' let mut stmts: Vec = Vec::new(); while !self.match_token(&TokenType::RBRACE) && !self.is_at_end() { - self.skip_newlines(); + // skip_newlines削除: brace_depth > 0なので自動スキップ if !self.match_token(&TokenType::RBRACE) { let st = self.parse_statement()?; stmts.push(st); @@ -182,7 +182,7 @@ impl NyashParser { while self.match_token(&TokenType::COMMA) || self.match_token(&TokenType::NEWLINE) { self.advance(); } - self.skip_newlines(); + // skip_newlines削除: brace_depth > 0なので自動スキップ } self.consume(TokenType::RBRACE)?;