UNPKG

@sun-asterisk/sunlint

Version:

☀️ SunLint - Multi-language static analysis tool for code quality and security | Sun* Engineering Standards

246 lines (189 loc) 8.14 kB
# Dart Language Support - Implementation Summary ## Overview This document describes the implementation of Dart language support in SunLint. The implementation follows the plan outlined in `DART_SUPPORT_PLAN.md` and maintains full backward compatibility with TypeScript/JavaScript analysis. ## Architecture ``` ┌─────────────────────────────────────────────────────────────────┐ │ SunLint CLI (TypeScript) │ │ - Config Management │ │ - File Targeting │ │ - Analysis Orchestration │ │ - Report Generation │ └────────┬────────────────────────────────────────────────────────┘ │ ├─► SemanticEngineManager (NEW) │ ├── TypeScriptAnalyzer (wrapper around SemanticEngine) │ │ └─ For .ts, .tsx, .js, .jsx files │ │ │ └── DartAnalyzer (NEW) │ └─ For .dart files │ └─ JSON-RPC subprocess (when binary available) │ └─ Regex fallback mode (when binary not available) │ └─► HeuristicEngine ├── Uses SemanticEngineManager for multi-language support └── Falls back to legacy SemanticEngine for TypeScript ``` ## Implemented Components ### 1. Core Interfaces #### `core/interfaces/language-analyzer.interface.js` - `ILanguageAnalyzer` - Abstract base class for all language analyzers - `LanguageAnalyzerRegistry` - Manages registration and lookup of analyzers - `getRegistry()` - Singleton accessor for the registry Key methods: - `initialize(config)` - Initialize the analyzer - `analyzeFile(filePath, rules, options)` - Analyze a single file - `getSymbolTable(filePath)` - Get symbol table for semantic analysis - `supportsFile(filePath)` - Check if file is supported ### 2. Semantic Engine Manager #### `core/semantic-engine-manager.js` - `SemanticEngineManager` - Coordinates multiple language analyzers - `getManager(options)` - Singleton accessor - `resetManager()` - Reset singleton (for testing) Key methods: - `registerAnalyzer(analyzer)` - Register a language analyzer - `initialize(projectPath, targetFiles)` - Initialize all analyzers - `getSymbolTable(filePath)` - Route to appropriate analyzer - `analyzeFile/analyzeFiles()` - Analyze files with correct analyzer - `groupFilesByAnalyzer(files)` - Group files by their analyzer ### 3. Language Analyzers #### `core/adapters/typescript-analyzer.js` - Wraps existing `SemanticEngine` (ts-morph) - Supports: `.ts`, `.tsx`, `.js`, `.jsx`, `.mts`, `.cts`, `.mjs`, `.cjs` - Full backward compatibility with existing semantic rules #### `core/adapters/dart-analyzer.js` - New Dart language analyzer - Supports: `.dart` - Two operation modes: 1. **Binary mode**: Communicates with Dart analyzer binary via JSON-RPC 2. **Fallback mode**: Uses regex-based analysis when binary not available Binary resolution priority: 1. Bundled binary: `bin/sunlint-dart-{platform}` 2. Cached binary: `~/.sunlint/bin/sunlint-dart-{platform}` 3. Dart SDK: `dart pub global run` (future) 4. Fallback: Regex-based analysis Built-in Dart patterns: - `N001` - Naming conventions (UpperCamelCase for classes, lowerCamelCase for variables) - `E001` - Empty catch blocks - `S003` - Sensitive data in print statements - `S022` - String interpolation (potential XSS) ### 4. Analyzer Registration #### `core/adapters/index.js` - `registerBuiltInAnalyzers(options)` - Register all built-in analyzers - `getSupportedLanguages()` - Get list of supported languages - `getAnalyzerClass(language)` - Get analyzer class for a language ### 5. Heuristic Engine Updates #### `engines/heuristic-engine.js` Updated to support multi-language analysis: ```javascript // Constructor additions this.semanticEngineManager = null; // initializeSymbolTable() changes - Register built-in analyzers - Initialize SemanticEngineManager - Keep legacy SemanticEngine for backward compatibility // New methods getSemanticEngineManager() - Get the manager instance getLanguageAnalyzer(language) - Get specific analyzer getSymbolTableForFile(filePath) - Route to correct analyzer // Cleanup - Cleanup SemanticEngineManager - Cleanup legacy SemanticEngine ``` ## File Targeting The `FileTargetingService` already supports Dart files: - Extension: `.dart` - Excluded patterns: `*.g.dart`, `*.freezed.dart`, `*.mocks.dart` (generated files) ## Usage ### CLI Usage ```bash # Analyze Dart files sunlint --input="lib/" --include="**/*.dart" # Analyze mixed project (TypeScript + Dart) sunlint --input="src/" --include="**/*.{ts,tsx,dart}" # With verbose output sunlint --input="lib/" --include="**/*.dart" --verbose ``` ### Programmatic Usage ```javascript const { getManager } = require('sunlint/core/semantic-engine-manager'); const { registerBuiltInAnalyzers } = require('sunlint/core/adapters'); // Register analyzers registerBuiltInAnalyzers({ verbose: true }); // Get manager const manager = getManager(); // Initialize await manager.initialize('/path/to/project', targetFiles); // Get symbol table for any file type const symbolTable = await manager.getSymbolTable('/path/to/file.dart'); // Analyze files const violations = await manager.analyzeFile(filePath, rules, options); ``` ## Testing Run unit tests: ```bash node test/unit/dart-support.test.js ``` Test coverage: - ✅ ILanguageAnalyzer interface abstraction - ✅ TypeScriptAnalyzer creation and file support - ✅ DartAnalyzer creation and file support - ✅ LanguageAnalyzerRegistry registration and lookup - ✅ SemanticEngineManager initialization - ✅ File grouping by analyzer - ✅ DartAnalyzer regex patterns - ✅ DartAnalyzer basic symbol table extraction ## Backward Compatibility All existing functionality is preserved: - ✅ TypeScript/JavaScript analysis works unchanged - ✅ Existing semantic rules work unchanged - ✅ Configuration format unchanged - ✅ CLI options unchanged - ✅ Report format unchanged ## Future Work (Phase 2-6) ### Phase 2: Dart Analyzer Binary - Create Dart project with JSON-RPC server - Implement full AST analysis - Cross-compile for Linux, macOS, Windows ### Phase 3-4: Build & Distribution - GitHub Actions for binary compilation - npm package with embedded binaries - Post-install verification ### Phase 5: Dart Rules Priority rules to port: - C001 - High Cyclomatic Complexity - C002 - Duplicate Code Detection - C008 - Deep Nesting - N001 - Naming Convention Violations - E001 - Missing Error Handling ### Phase 6: Documentation - Dart-specific user guide - Flutter project examples - CI/CD integration examples ## Files Created/Modified ### New Files - `core/interfaces/language-analyzer.interface.js` - `core/semantic-engine-manager.js` - `core/adapters/typescript-analyzer.js` - `core/adapters/dart-analyzer.js` - `core/adapters/index.js` - `test/unit/dart-support.test.js` - `test/dart-fixtures/sample.dart` - `docs/DART_SUPPORT_IMPLEMENTATION.md` ### Modified Files - `engines/heuristic-engine.js` - Added imports for multi-language support - Added `semanticEngineManager` property - Updated `initializeSymbolTable()` to use SemanticEngineManager - Added helper methods: `getSemanticEngineManager()`, `getLanguageAnalyzer()`, `getSymbolTableForFile()` - Updated `cleanup()` to dispose managers ## Verification ```bash # Verify TypeScript still works node cli.js --rule=S003 --input="./core" --include="**/*.js" --engine=heuristic --max-files=5 # Verify Dart support node cli.js --rule=N001 --input="./test/dart-fixtures" --include="**/*.dart" --verbose # Run unit tests node test/unit/dart-support.test.js ``` All verifications pass successfully.