RSLint – linter Java Script napisany w Rust
RSLint jest linterem dla JavaScript, napisanym w całości w języku Rust. Mimo wczesnej fazy rozwoju oferuje podstawową integrację z Visual Studio Code. Dlatego też parser wciąż może błędnie odzyskiwać po błędach, jednak w przyszłości ma to się poprawić. Celem lintera jest duża prędkość, konfigurowalność i łatwe użytkowanie.
Cel działania RSLint
Nowy linter napisany w Rust pomaga programistom we wdrażaniu dobrych praktyk i oznaczaniu wszelkich błędów – programistycznych, stylistycznych, a także podejrzanych konstrukcji. Z linterów korzysta się najczęściej w edytorze kodu, zapewniając zwrotne informacje w rzeczywistym czasie, już podczas edycji.
Przyczyny stworzenia RSLint
Riccardo D`Ambrosio opisał, dlaczego stworzył ten linter:
Projekt jest pełnoprawnym linterem JavaScript, jednak napisanym od zera w Rust. Czułem, że istniejące lintery są zbyt ograniczające i powolne, więc postanowiłem zbudować go samodzielnie. Miałem jednak na uwadze kilka kluczowych punktów:
- Prędkość – ładowanie plików, linting plików i uruchamianie reguł są równoległe.
- Rustc-like i przyjazne błędy (w tym etykiety, notatki).
- Usuwanie błędów – kod źródłowy może być zlintowany bez względu na to, jak bardzo jest błędny.
- Wydajniejsze dyrektywy.
Odzyskiwanie błędów
Odzyskiwanie błędów przez RSLint polega na tym, że parser pobiera nieprawidłowy kod źródłowy i nadal analizuje z niego w większości poprawne AST. Inne lintery, jak espree, czy swc_ecmascript nie próbują nawet takiego podejścia, nie podejmują próby odzyskania. Napotykając błąd, parser zwraca wynik Err i kończy analizę.
Przykład analizy kodu przez RSLint
if true { /* */ } else { /* */ }
Lintowanie powyższego kodu wygląda natomiast tak:
error[SyntaxError]: Expected token `L_PAREN` but instead found `TRUE_KW` ┌─ tests\main.js:1:4 │ 1 │ if true { │ ^^^^ Unexpected error[SyntaxError]: Expected token `R_PAREN` but instead found `L_CURLY` ┌─ tests\main.js:1:9 │ 1 │ if true { │ ^ Unexpected error[no-constant-condition]: Unexpected constant condition ┌─ tests\main.js:1:4 │ 1 │ if true { │ ^^^^ this condition is always truthy... 2 │ /* */ 3 │ } else { │ ┌────────' 4 │ │ /* */ 5 │ │ } │ └─' ...which makes this unreachable
Zalety lintera
RSLint osiąga swoją prędkość na przykład dzięki napisaniu go w Rust. Pomaga w tym także równoległe wykonywanie zadań oraz oparcie na określonej strukturze danych. Biblioteka Rowan Rust, na której parser jest oparty, modeluje drzewa jako niezmienne drzewa składniowe. RSLint zapewnia także kilka dyrektyw, dzięki którym programiści ignorują całe pliki lub określone reguły podczas lintingu.
Podsumowanie
Pojawienie się RSLint jest przede wszystkim częścią trendu polegającego na pisaniu narzędzi JavaScript w innych językach, kompilowanych do kodu natywnego. Jednak pisanie kodu w językach kompilowanych do rodzimych nie jest jedynym sposobem na zwiększenie przepustowości.
Harmonogram RSLint obejmuje testy porównawcze, analizę zakresu, obsługę JSX i TypeScript, a także wtyczki JavaScript. RSLint jest open source na licencji MIT. Więcej informacji można znaleźć na repozytorium GitHub projektu.
Źródło: InfoQ