Expand description
§SearchProvider (Environment)
Implements the SearchProvider trait for MountainEnvironment, providing
text search capabilities across files and content within the workspace.
§RESPONSIBILITIES
§1. Search Execution
- Search for text patterns in files using glob patterns
- Support regular expression search
- Search file contents and/or file names
- Handle large result sets efficiently
§2. Search Results
- Return structured search results with matches
- Include file URI, line number, column, and matching text
- Support paging and result limiting
- Sort results by relevance or file order
§3. Search Configuration
- Respect workspace file exclusion patterns (.gitignore)
- Honor file size limits for search
- Support case-sensitive and whole-word matching
- Handle symbolic links appropriately
§4. Search Cancellation
- Support cancellation of long-running searches
- Clean up resources on cancellation
- Provide progress feedback (optional)
§ARCHITECTURAL ROLE
SearchProvider is the workspace search engine:
Search Request ──► SearchProvider ──► FileSystem Scan ──► Results§Position in Mountain
Environmentmodule: Search capability provider- Implements
CommonLibrary::Search::SearchProvidertrait - Accessible via
Environment.Require<dyn SearchProvider>()
§Search Types Supported
- Text search: Find files containing text pattern
- File search: Find files by name/glob pattern
- Replace: (Future) Search and replace operations
- Context search: (Future) Search with surrounding context
§Dependencies
FileSystemReader: Read file contents for searchingWorkspaceProvider: Get workspace folders to searchLog: Search progress and errors
§Dependents
- Search UI panel: User-initiated searches
- Find/Replace dialogs: In-editor search
- Grep-like command-line operations
- Code navigation (symbol search)
§SEARCH PROCESS
- File Discovery: Walk workspace directories, respecting exclusions
- File Filtering: Match filenames against include/exclude patterns
- Content Search: For each file, search for pattern in content
- Match Collection: Record matches with position information
- Result Formatting: Return structured search results
§PERFORMANCE CONSIDERATIONS
- Search is I/O bound; consider async and parallel processing
- Large workspaces may have thousands of files
- Use file size limits to prevent memory exhaustion
- Implement result paging for UI responsiveness
- Consider background search indexing for faster repeated searches
§ERROR HANDLING
- Permission denied: Skip file, log warning
- File not found: Skip file (may have been deleted)
- Encoding errors: Try default encoding, skip on failure
- Search cancelled: Stop immediately, return partial results
§VS CODE REFERENCE
Patterns from VS Code:
vs/workbench/contrib/search/browser/searchWidget.ts- Search UIvs/platform/search/common/search.ts- Search service APIvs/platform/search/common/fileSearch.ts- File system search
§TODO
- Implement file content indexing for faster searches
- Add regular expression support with PCRE or regex engine
- Support search result paging and streaming
- Add search cancellation with proper cleanup
- Implement search result highlighting in UI
- Support search in compressed/archive files
- Add search across multiple workspaces
- Implement search history and persistence
- Add search filters (by language, by file size, etc.)
- Support search templates and saved searches
- Implement search result grouping (by folder, by file)
- Add search performance metrics and logging
- Support search result export (to file, clipboard)
§MODULE CONTENTS
SearchProvider: Main struct implementing the trait- Search execution methods
- File walking and filtering logic
- Match extraction and formatting
- Search cancellation support
§SearchProvider Implementation
Implements the SearchProvider trait using the grep-searcher crate, which
is a library for the ripgrep search tool.
§Search Architecture
The search implementation uses a multi-threaded approach:
- Pattern Compilation: Regex pattern is compiled with modifiers
- Parallel Walking: Files in workspace are walked in parallel
- Per-File Search: Each file is searched individually using a sink pattern
- Result Aggregation: Matches are collected in a shared thread-safe vector
§Search Features
- Case Sensitivity: Controlled by
is_case_sensitiveoption - Word Matching: Controlled by
is_word_matchoption - Regex Support: Full regex pattern matching via
grep-regex - Ignore Files: Respects
.gitignore,.ignore, and other ignore files - Parallel Search: Uses
WalkBuilder::build_parallel()for performance - Memory Efficient: Streams results to avoid loading entire files
§Search Result Format
Each match includes:
- File URI: Valid URL pointing to the file
- Line Number: Zero-indexed line number of the match
- Preview: The matched text line
Results are grouped by file, with each file containing multiple matches.
Structs§
- File
Match 🔒 - PerFile
Sink 🔒 - Text
Match 🔒 - Text
Search 🔒Query