SplitRS ๐ฆโ๏ธ
A production-ready Rust refactoring tool that intelligently splits large files into maintainable modules
SplitRS uses AST-based analysis to automatically refactor large Rust source files (>1000 lines) into well-organized, compilable modules. It handles complex generics, async functions, Arc/Mutex patterns, and automatically generates correct imports and visibility modifiers.
โจ Features
- ๐ฏ AST-Based Refactoring: Uses
syn
for accurate Rust parsing - ๐ง Intelligent Method Clustering: Groups related methods using call graph analysis
- ๐ฆ Auto-Generated Imports: Context-aware
use
statements with proper paths - ๐ Visibility Inference: Automatically applies
pub(super)
,pub(crate)
, orpub
- ๐ Complex Type Support: Handles generics, async, Arc/Mutex, nested types
- โก Fast: Processes 1600+ line files in <1 second
- โ Production-Tested: Successfully refactored 10,000+ lines of real code
๐ฆ Installation
Or build from source:
๐ Quick Start
Basic Usage
# Split a large file into modules
Recommended Usage (with impl block splitting)
๐ Examples
Example 1: Basic Refactoring
Input: connection_pool.rs
(1660 lines)
Command:
Output: 25 well-organized modules
connection_pool/
โโโ mod.rs # Module organization & re-exports
โโโ connectionpool_type.rs # Type definition with proper visibility
โโโ connectionpool_new_group.rs # Constructor methods
โโโ connectionpool_acquire_group.rs # Connection acquisition
โโโ connectionpool_release_group.rs # Connection release
โโโ ... (20 more focused modules)
Example 2: Complex Types
SplitRS correctly handles complex Rust patterns:
// Input
// Output (auto-generated)
// cache_type.rs
use HashMap;
use ;
// cache_insert_group.rs
use Cache;
use HashMap;
๐๏ธ Options
Option | Description | Default |
---|---|---|
--input |
Input Rust source file (required) | - |
--output |
Output directory for modules (required) | - |
--split-impl-blocks |
Split large impl blocks into method groups | false |
--max-impl-lines |
Maximum lines per impl group | 300 |
๐๏ธ How It Works
SplitRS uses a multi-stage analysis pipeline:
- AST Parsing: Parse input file with
syn
- Scope Analysis: Determine organization strategy and visibility
- Method Clustering: Build call graph and cluster related methods
- Type Extraction: Extract types from fields for import generation
- Module Generation: Generate well-organized modules with correct imports
- Code Formatting: Format output with
prettyplease
Organization Strategies
Inline - Keep impl blocks with type definition:
typename_module.rs
โโโ struct TypeName { ... }
โโโ impl TypeName { ... }
Submodule - Split type and impl blocks (recommended for large files):
typename_type.rs # Type definition
typename_new_group.rs # Constructor methods
typename_getters.rs # Getter methods
mod.rs # Module organization
Wrapper - Wrap in parent module:
typename/
โโโ type.rs
โโโ methods.rs
โโโ mod.rs
๐ Performance
Tested on real-world codebases:
File Size | Lines | Time | Modules Generated |
---|---|---|---|
Small | 500-1000 | <100ms | 3-5 |
Medium | 1000-1500 | <500ms | 5-12 |
Large | 1500-2000 | <1s | 10-25 |
Very Large | 2000+ | <2s | 25-40 |
๐งช Testing
SplitRS includes comprehensive tests:
# Run all tests
# Test on example files
๐ Use Cases
When to Use SplitRS
โ Perfect for:
- Files >1000 lines with large impl blocks
- Monolithic modules that need organization
- Legacy code refactoring
- Improving code maintainability
โ ๏ธ Consider Carefully:
- Files with circular dependencies (will generate modules but may need manual fixes)
- Files with heavy macro usage (basic support, may need manual review)
โ Not Recommended:
- Files <500 lines (probably already well-organized)
- Files with complex conditional compilation (
#[cfg]
)
๐ง Integration
CI/CD Pipeline
# .github/workflows/refactor.yml
name: Auto-refactor
on:
workflow_dispatch:
inputs:
file:
description: 'File to refactor'
required: true
jobs:
refactor:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
- run: cargo install splitrs
- run: |
splitrs --input ${{ github.event.inputs.file }} \
--output $(dirname ${{ github.event.inputs.file }})/refactored \
--split-impl-blocks
- uses: peter-evans/create-pull-request@v5
with:
title: "Refactor: Split ${{ github.event.inputs.file }}"
๐ค Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
Development Setup
Roadmap to 90-100%
Current status: 80% production-ready
Next features (14-20 hours):
- Type alias resolution
- Dependency graph visualization
- Circular dependency detection
- Configuration file support
Future enhancements (20-30 hours):
- Cross-crate analysis
- Refactoring preview mode
- Undo/rollback support
- Plugin system
๐ License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
๐ Acknowledgments
- Built with syn for Rust parsing
- Formatted with prettyplease
- Developed during the OxiRS refactoring project (32,398 lines refactored)
๐ Support
- ๐ Documentation
- ๐ Issue Tracker
- ๐ฌ Discussions
Made with โค๏ธ by the OxiRS team | Star โญ us on GitHub!