Commit Graph

374 Commits

Author SHA1 Message Date
Danny Mösch 25ef2ea69b Remove trailing comma (#6297) 2025-10-13 22:56:24 +02:00
Nandhini Subramani a23e4c98bc Exclude integer generic parameters from generic_type_name and handle them in identifier_name (#6289) 2025-10-10 23:07:41 +02:00
Kirti Verma 9a61f48c7a Add prefer_asset_symbols rule (#6261)
Co-authored-by: Danny Mösch <danny.moesch@icloud.com>
2025-10-10 15:28:16 -04:00
Nandhini Subramani a0414c919d Ignore @concurrent functions in async_without_await rule (#6284) 2025-10-08 19:06:56 +02:00
Danny Mösch 4065fc8437 Enable upcoming feature MemberImportVisibility (#6286) 2025-10-08 08:12:05 +02:00
Danny Mösch a6247c24e4 Rewrite sorted_imports rule with SwiftSyntax (#6280) 2025-10-05 17:00:27 +02:00
Danny Mösch e9718145cb Rewrite modifier_order rule with SwiftSyntax (#6279) 2025-10-04 16:39:17 +02:00
Danny Mösch 530bf9d0c5 Let legacy function rules adhere to @SwiftSyntaxRule (#6271) 2025-10-03 08:03:59 -04:00
Danny Mösch 7348cf0f4a Use SwiftSyntax 6.3 pre-release 2025-09-15 (#6206) 2025-09-29 14:59:47 +02:00
Danny Mösch aa67f5ac13 Adopt typed throws where possible (#5922) 2025-09-27 19:11:46 +02:00
Danny Mösch 0e2198d086 Exclude function types from async_without_await rule analysis (#6258) 2025-09-27 19:10:30 +02:00
Danny Mösch 74e6c3625f Ignore redundant_discardable_let in nested SwiftUI scopes (#6257) 2025-09-25 11:35:28 -04:00
Danny Mösch dcbdcc92d1 Ignore function, initializer and subscript declarations alike (#6242) 2025-09-07 11:53:32 +02:00
Danny Mösch 5e6e59f212 Rewrite quick_discouraged_call rule with SwiftSyntax (#6237) 2025-09-06 14:10:38 +02:00
Danny Mösch 4859fa8e82 Ensure that headers matched against always end in a newline (#6234) 2025-09-04 23:09:35 +02:00
Danny Mösch b58b8401a0 Improve detection of comment-only lines in file_length rule (#6231) 2025-09-04 10:27:26 +02:00
Danny Mösch b97f63a89d Properly detect comment-only lines (#6230) 2025-09-03 23:42:04 +02:00
Danny Mösch 233908e28c Treat strings with opening and closing quotes in the same line as single-line strings (#6229) 2025-09-03 22:29:33 +02:00
Danny Mösch 6946309f9b Consider other expression types before function calls (#6226) 2025-09-03 14:33:10 +02:00
Danny Mösch 57d6752a2a Merge function_name_whitespace and operator_whitespace rules (#6217) 2025-09-03 00:34:22 +02:00
Rodion Ivashkov 91b26549c4 Add function_name_whitespace rule to validate and autocorrect spacing around function names (#6156)
Co-authored-by: Danny Mösch <danny.moesch@icloud.com>
2025-08-30 10:40:44 -04:00
Danny Mösch 77050e8c40 Enable a fully statically linked Linux executable (#6211)
If SwiftLint is built from this state using the Swift SDK, we'll get a
large self-contained Linux executable that runs without loading SourceKit.
It can do that by disabling any rule that requires SourceKit.

With `SWIFTLINT_DISABLE_SOURCEKIT` set on a normally (dynamically linked)
binary, the behavior is the same. That's different from the previously
reported more serious warnings.
2025-08-30 10:02:38 -04:00
Danny Mösch 8ada387884 Ignore locally defined count identifiers in empty_count rule (#6202) 2025-08-24 14:08:40 -04:00
Danny Mösch 61507218f7 Exclude explicit system modules from duplicate_imports analysis (#6203) 2025-08-24 09:40:44 +02:00
Matt Thompson 2cfb4c2068 Apply private_swiftui_state rule to ViewModifier types (#6200) 2025-08-23 12:05:49 +02:00
André Pacheco Neves fe099492f2 Allow prefer_key_paths to ignore identity closures ({ $0 }) (#6068)
Co-authored-by: Danny Mösch <danny.moesch@icloud.com>
2025-08-15 00:30:10 +03:00
Leopold Lemmermann 2677d5ee6e Add new implicit_optional_initialization replacing redundant_optional_initialization (#6165)
The new rule covers both cases, initialization with `= nil` and without, consistently.

Co-authored-by: Danny Mösch <danny.moesch@icloud.com>
2025-08-13 10:08:49 +00:00
Copilot 90820fcda3 Extend xct_specific_matcher rule to cover === and !== (#6184)
Co-authored-by: Danny Mösch <danny.moesch@icloud.com>
2025-08-09 09:03:13 -04:00
Copilot 8cda6c66e9 Fix no_extension_access_modifier rule triggering on nonisolated modifier (#6174)
Co-authored-by: Danny Mösch <danny.moesch@icloud.com>
2025-08-04 13:12:37 -04:00
Copilot 8bb69b064a Add include_variables option to non_optional_string_data_conversion rule (#6172)
Co-authored-by: Danny Mösch <danny.moesch@icloud.com>
2025-08-02 17:49:58 -04:00
Danny Mösch c1ffdfe891 Enable prefer_condition_list rule (#6163) 2025-07-12 09:41:00 -04:00
Danny Mösch cb214d51fa Add new prefer_condition_list rule (#6157) 2025-07-12 07:52:50 -04:00
Danny Mösch a321566c05 Support protocols and extensions in type body length checking (#6143) 2025-07-11 22:27:47 +02:00
Danny Mösch 4efdcc7b25 Base visitors on rule configuration (#6159) 2025-07-10 18:13:06 -04:00
Danny Mösch df96466163 Support deinitializers and subscripts in function body length checking (#6142) 2025-07-09 16:33:49 -04:00
Danny Mösch 6af2aed49d Ensure that closure_end_indentation doesn't drop comments (#6158) 2025-07-09 15:54:59 -04:00
Chris Brakebill c97cf24797 Add ignore_codingkeys parameter in nesting rule (#5650)
Co-authored-by: Danny Mösch <danny.moesch@icloud.com>
2025-07-09 15:09:38 -04:00
Danny Mösch 599e51a5a2 Format code (#6151) 2025-07-02 17:50:53 -04:00
Rodion Ivashkov 097bef27ef Fix configuration handling in multiline_parameters for stricter validation (#6148) 2025-07-02 17:04:45 -04:00
Danny Mösch de613ba8b7 Prepare rule for SwiftSyntax 6.2 (#6144) 2025-06-29 12:40:11 -04:00
Danny Mösch 546f71bb2d Add additional newline to first token in file (#6141)
For all first tokens in a line the newline character causing the new
line is part of the leading trivia. The only exception is the very first
token in a file because at the beginning of a file, there is no previous
line that needs to be broken.
2025-06-27 10:28:24 +02:00
Koichiro Ueki e65767baf8 Add new excluded_paths option to file_name rule (#6092)
Co-authored-by: Danny Mösch <danny.moesch@icloud.com>
2025-06-25 21:30:32 +02:00
JP Simard f7f3caa50e Migrate TrailingWhitespaceRule from SourceKit to SwiftSyntax (#6117)
## Summary

Convert TrailingWhitespaceRule to use SwiftSyntax instead of SourceKit
for improved performance and better handling of trailing whitespace
detection, especially within block comments.

## Key Technical Improvements

- **Enhanced block comment detection** distinguishing between lines fully
  covered by block comments vs lines containing block comments with code
- **Accurate whitespace detection** using CharacterSet.whitespaces for
  all Unicode whitespace characters, not just space and tab
- **Improved comment handling** with proper detection of line-ending
  comments and multi-line block comment structures
- **Better correction mechanism** using ViolationCorrection ranges
  instead of manual string reconstruction
- **Line-based analysis** maintaining efficiency while providing precise
  violation positions

## Migration Details

- Replaced `CorrectableRule` with `@SwiftSyntaxRule(correctable: true)`
- Implemented `ViolationsSyntaxVisitor` pattern for line-based validation
- Added `collectLinesFullyCoveredByBlockComments` to properly handle
  test framework comment wrapping scenarios
- Distinguished between three comment scenarios: lines fully within block
  comments, full-line comments, and lines ending with comments
- Maintained all configuration options (ignores_empty_lines, ignores_comments)
- Preserved exact violation position reporting with UTF-8 offset calculations
2025-06-24 21:12:32 -04:00
JP Simard ab7d117030 Migrate FileHeaderRule from SourceKit to SwiftSyntax (#6112)
## Summary

Convert FileHeaderRule to use SwiftSyntax instead of SourceKit for
improved performance and better handling of file header comments,
shebangs, and doc comments.

## Key Technical Improvements

- **Enhanced shebang support** properly skipping past `#!/usr/bin/env swift` lines
- **Better comment type discrimination** excluding doc comments from header analysis
- **Accurate position calculation** converting between UTF-8 and UTF-16 offsets for regex matching
- **Improved trivia traversal** for comprehensive header comment collection
- **SwiftLint command filtering** to exclude directive comments from header content

## Migration Details

- Replaced `OptInRule` with `@SwiftSyntaxRule(optIn: true)` annotation
- Implemented `ViolationsSyntaxVisitor` pattern for file-level analysis
- Added logic to start header collection after shebang.endPosition if present
- Distinguished between regular comments and doc comments (///, /** */)
- Maintained UTF-16 offset calculations for NSRegularExpression compatibility
- Added `skipDisableCommandTests: true` for SwiftSyntax disable command behavior
- Removed unnecessary SourceKittenFramework import
2025-06-24 09:48:25 -04:00
Danny Mösch 4b9208a37b Ignore various assignment operators in void_function_in_ternary (#6133) 2025-06-24 09:47:40 +02:00
JP Simard 388d45246e Migrate ExpiringTodoRule from SourceKit to SwiftSyntax (#6113) 2025-06-23 07:43:04 -04:00
Kent Kaseda c22de52b9b Respect ignore_swiftui_view_bodies option in view builders and preview macros/providers (#6075)
Co-authored-by: Danny Mösch <danny.moesch@icloud.com>
2025-06-22 01:32:48 +02:00
JP Simard 5a2cf4b1fe Remove dead code (#6125)
In particular lots of stuff that used to be needed with SourceKit that
we no longer need to keep around.

Identified using Periphery: https://github.com/peripheryapp/periphery
2025-06-21 15:19:37 -04:00
JP Simard 4ecae5b252 Migrate LineLengthRule from SourceKit to SwiftSyntax (#6111)
Convert LineLengthRule to use SwiftSyntax instead of SourceKit for
improved performance and better detection accuracy.

The SwiftSyntax implementation:
- Uses ViolationsSyntaxVisitor pattern with line-based validation
- Pre-computes ignored lines using helper visitors for efficiency
- Implements pure SwiftSyntax comment detection without SourceKit
- Correctly handles function declarations, multiline strings
- Maintains all configuration options including URL stripping
- Preserves exact line position reporting for violations
2025-06-21 14:47:19 -04:00
JP Simard 45c4766a02 Migrate AccessibilityLabelForImageRule from SourceKit to SwiftSyntax (#6101)
* Migrate AccessibilityLabelForImageRule from SourceKit to SwiftSyntax

\## Summary

Fix `.accessibilityElement(children:)` exemption logic where the
previous implementation incorrectly exempted images with `.combine`
when only `.ignore` should exempt children.

\## Improvements Based on OSSCheck Results

\### New Violations (Legitimately Detected)
- `Image(uiImage:)` and `Image(nsImage:)` calls providing contextual
  content
- Previously missed by SourceKit's pattern matching limitations
- These represent real accessibility issues requiring labels

\### Fixed Violations (False Positives Removed)
- Images inside Button/NavigationLink labels (containers handle
  accessibility)
- Images in custom components with proper accessibility context
- System icons incorrectly flagged when already accessible

\## Key Technical Improvements

- **Comprehensive detection** of all Image initializer types
- **Better context awareness** through syntax tree traversal
- **Accurate `.accessibilityElement(children:)` behavior**
  (`.ignore` exempts, `.combine`/`.contain` do not)
- **Reduced false positives** while catching real accessibility issues

\## Regression Test Examples

Added comprehensive examples demonstrating the migration benefits:

\### Non-Triggering (Reduced False Positives)
- Images in `Button`/`NavigationLink` labels with accessibility context
- Images in containers with `.accessibilityElement(children: .ignore)`
- Complex hierarchies where container accessibility handles children
- Various Image initializer types in proper accessible contexts

\### Triggering (Improved Detection)
- `Image(uiImage:)` and `Image(nsImage:)` providing contextual content
- Images in containers with `.combine`/`.contain` that don't exempt
- Status icons, favicons, and background images needing labels

* Update changelog
2025-06-21 11:34:06 -04:00