Skip to content

Add auto-correction, indentation config, and multi-violation support to multiline_call_arguments#6745

Open
GandaLF2006 wants to merge 3 commits into
realm:mainfrom
GandaLF2006:gandalf2006/multiline_call_arguments/correctable
Open

Add auto-correction, indentation config, and multi-violation support to multiline_call_arguments#6745
GandaLF2006 wants to merge 3 commits into
realm:mainfrom
GandaLF2006:gandalf2006/multiline_call_arguments/correctable

Conversation

@GandaLF2006

Copy link
Copy Markdown
Contributor

Summary

Enhances the multiline_call_arguments opt-in rule with auto-correction, a new indentation configuration option, and multi-violation detection in a single pass.

Auto-correction (--fix)

  • Single-line calls are reformatted to place each argument on its own line with proper indentation; the closing ) moves to its own line at the call's base indent
  • Multi-line calls with duplicate-start-line or missing-newline-after-comma violations are corrected by inserting \n + indent in the appropriate range
  • Calls with comments in argument tokens are not auto-corrected (manual fix required); string literals containing comment-like text are correctly identified as non-comments
  • Nested single-line calls that would produce overlapping corrections: only the outer call's correction is applied; the inner call is corrected on a subsequent --fix pass

indentation configuration

  • New option: indentation (integer ≥ 1 for spaces, or the string "tab"; default: 4)
  • 0 and negative values are invalid and cause a configuration error
  • Indentation is calculated relative to the call's start line — one level of configured indentation from the call's base indent

Multi-violation support

  • Previously, duplicateArgumentStartLineViolation and newlineAfterCommaViolation returned at the first match, requiring repeated --fix passes for calls with multiple same-line argument pairs
  • Now collects all violations in a single pass (reasonedViolations returns [ReasonedRuleViolation])

Documentation

  • Split RuleDescription.description into concise description (what) + structured rationale (why/how) with markdown sections

@GandaLF2006 GandaLF2006 force-pushed the gandalf2006/multiline_call_arguments/correctable branch 2 times, most recently from b183a6a to 78a2da1 Compare June 1, 2026 09:19
@GandaLF2006

GandaLF2006 commented Jun 1, 2026

Copy link
Copy Markdown
Contributor Author

@SimplyDanny Let's add correctable for multiline_call_arguments :)

The CI failure on oss_scan is not related to this PR — it's a danger bot failing to post a comment due to the repository's interaction limits (422 - Interactions on this repository have been restricted to prior contributors only)

///
/// - `tab`: Use tab character for indentation
/// - `spaces(count:)`: Use the specified number of spaces
enum IndentationStyle: Hashable, Sendable {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is already a IndentationStyle that can be configured in configuration files and is supposed to apply globally. Can we use it in this rule as well?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point — done. The rule-local IndentationStyle has been replaced by the
shared IndentationStyle type from SwiftLintCore, which is the same type
used by the global indentation configuration. This required two changes:

  1. Moving the type to SwiftLintCore (the lowest common dependency) and adding
    AcceptableByConfigurationElement conformance + indentationString property
    so both the rule and Configuration.indentation can use it.
  2. Aligning the string value to "tabs" (matching the global config format)
    instead of the previous "tab".

@GandaLF2006 GandaLF2006 force-pushed the gandalf2006/multiline_call_arguments/correctable branch from f16bd4c to 8b5b043 Compare June 6, 2026 18:56
@SwiftLintBot

SwiftLintBot commented Jun 6, 2026

Copy link
Copy Markdown
4184 Warnings
⚠️ Big PR
⚠️ This PR introduced a violation in Aerial: /Aerial/Source/Views/Layers/ClockLayer.swift:80:27: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in Aerial: /Aerial/Source/Views/Layers/Weather/ForecastLayer.swift:65:53: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in Aerial: /Aerial/Source/Views/Layers/Weather/ForecastLayer.swift:66:87: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in Aerial: /Aerial/Source/Views/Layers/Weather/ForecastLayer.swift:93:53: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in Aerial: /Aerial/Source/Views/Layers/Weather/ForecastLayer.swift:94:70: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in Aerial: /Aerial/Source/Views/AerialView.swift:639:58: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/DataBrokerProtection-macOS/Sources/DataBrokerProtection-macOS/BackgroundAgent/DataBrokerProtectionAgentManager.swift:479:110: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:148:91: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:149:67: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:164:91: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:165:67: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:183:77: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:184:67: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:201:91: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:202:67: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:230:91: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:231:67: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:249:87: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:250:67: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:267:91: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:268:67: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:286:91: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:287:67: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:310:87: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:311:67: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:334:91: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:335:67: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:572:45: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:572:71: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:573:34: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/LocalPackages/NewTabPage/Tests/NewTabPageTests/NewTabPageOmnibarClientTests.swift:573:52: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1609:107: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1609:124: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1613:106: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1613:119: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1618:106: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1618:123: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1620:58: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1621:73: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1621:96: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1624:73: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1624:96: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1632:65: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1632:79: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1647:104: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1647:117: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1655:106: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1655:123: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1657:58: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1658:71: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1658:94: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1661:71: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1661:85: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1671:74: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1671:91: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1673:60: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1674:74: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1674:87: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1677:74: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1677:87: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1681:74: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1681:87: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1684:74: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1684:88: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1688:74: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/TabBar/View/TabBarViewItem.swift:1688:88: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/SecureVault/View/PasswordManagementViewController.swift:940:159: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/SecureVault/View/PasswordManagementViewController.swift:940:215: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/Tab/UserScripts/UserScripts.swift:291:144: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/Tab/TabExtensions/NavigationPixelNavigationResponder.swift:188:12: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/Tab/View/BrowserTabViewController.swift:1732:91: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/Tab/View/BrowserTabViewController.swift:1732:112: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/Tab/View/BrowserTabViewController.swift:1737:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/Permissions/Model/PermissionModel.swift:470:75: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/NavigationBar/View/MenuItemWithBadge.swift:124:55: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/NavigationBar/View/MenuItemWithBadge.swift:124:79: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/NavigationBar/View/MenuItemWithBadge.swift:132:63: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/NavigationBar/View/MenuItemWithBadge.swift:132:88: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/Model/InstructionsFormatParser.swift:80:63: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/ReportFeedbackView.swift:123:119: Warning: In multi-line calls, each argument must start on its own line (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/ReportFeedbackView.swift:144:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:37:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:66:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:81:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:97:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:112:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:125:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:138:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:151:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:166:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:187:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:201:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:214:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:227:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:240:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:256:18: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:265:18: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:276:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:286:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:303:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:318:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:331:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:344:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:357:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:397:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/NewFileImportView.swift:410:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:38:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:58:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:79:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:98:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:118:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:135:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:154:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:174:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:198:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:216:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:234:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:251:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:268:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:288:18: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:301:18: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:316:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:331:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:351:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:371:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ This PR introduced a violation in DuckDuckGo: /macOS/DuckDuckGo/DataImport/View/FileImportView.swift:389:14: Warning: In multi-line calls, a newline is required after each comma (multiline_call_arguments)
⚠️ Danger found 4184 violations with this PR. Due to GitHub's max issue comment size, the number shown has been truncated to 127.
19 Messages
📖 Building this branch resulted in a binary size of 28238.24 KiB vs 28200.24 KiB when built on main (0% larger).
📖 Linting Aerial with this PR took 0.66 s vs 0.65 s on main (1% slower).
📖 Linting Alamofire with this PR took 0.89 s vs 0.91 s on main (2% faster).
📖 Linting Brave with this PR took 5.9 s vs 5.93 s on main (0% faster).
📖 Linting DuckDuckGo with this PR took 25.28 s vs 25.22 s on main (0% slower).
📖 Linting Firefox with this PR took 10.16 s vs 10.25 s on main (0% faster).
📖 Linting Kickstarter with this PR took 7.2 s vs 7.2 s on main (0% slower).
📖 Linting Moya with this PR took 0.38 s vs 0.37 s on main (2% slower).
📖 Linting NetNewsWire with this PR took 2.32 s vs 2.32 s on main (0% slower).
📖 Linting Nimble with this PR took 0.53 s vs 0.57 s on main (7% faster).
📖 Linting PocketCasts with this PR took 6.84 s vs 6.82 s on main (0% slower).
📖 Linting Quick with this PR took 0.34 s vs 0.36 s on main (5% faster).
📖 Linting Realm with this PR took 2.46 s vs 2.44 s on main (0% slower).
📖 Linting Sourcery with this PR took 1.47 s vs 1.49 s on main (1% faster).
📖 Linting Swift with this PR took 4.19 s vs 4.22 s on main (0% faster).
📖 Linting SwiftLintPerformanceTests with this PR took 0.16 s vs 0.16 s on main (0% slower).
📖 Linting VLC with this PR took 1.08 s vs 1.1 s on main (1% faster).
📖 Linting Wire with this PR took 14.97 s vs 14.99 s on main (0% faster).
📖 Linting WordPress with this PR took 9.72 s vs 9.74 s on main (0% faster).

Generated by 🚫 Danger

@GandaLF2006 GandaLF2006 force-pushed the gandalf2006/multiline_call_arguments/correctable branch from 3c09c9b to c2b5aa8 Compare June 6, 2026 22:32
@GandaLF2006 GandaLF2006 requested a review from SimplyDanny June 7, 2026 15:38
@GandaLF2006 GandaLF2006 force-pushed the gandalf2006/multiline_call_arguments/correctable branch 2 times, most recently from 9510ef7 to 0cdc2a7 Compare June 15, 2026 07:10
@GandaLF2006 GandaLF2006 force-pushed the gandalf2006/multiline_call_arguments/correctable branch 4 times, most recently from 7b65161 to 9a91acd Compare June 24, 2026 11:28
@GandaLF2006

Copy link
Copy Markdown
Contributor Author

@SimplyDanny It would be great if you could review the PR :)

@GandaLF2006 GandaLF2006 force-pushed the gandalf2006/multiline_call_arguments/correctable branch from 9a91acd to 0bd454f Compare June 24, 2026 11:54

@SimplyDanny SimplyDanny left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have some findings. Please consider them and rebase your branch updating your tests to Swift Testing.

Pleas also check why there are so many OSS findings.

/// Indentation style for corrected lines.
/// Can be an integer (number of spaces) or the string "tabs".
@ConfigurationElement(key: "indentation")
private(set) var indentationStyle: IndentationStyle = .spaces(count: 4)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can the global option not be reused?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I looked into this, and unfortunately the global indentation is not currently accessible from rules. Here's what I found:

  • Linter stores the full Configuration (including indentation), but when invoking rules it only passes SwiftLintFile + per-rule config to validate(file:using:compilerArguments:).
  • Neither SwiftLintFile, ViolationsSyntaxVisitor, nor RuleStorage hold a reference to the global Configuration.
  • The global configuration.indentation is consumed only by --format in LintOrAnalyzeCommand.swift — a separate code path that reformats file text directly without invoking any rules.

Is there an existing mechanism for rules to access the global Configuration.indentation that I'm overlooking? If so, could you point me in the right direction?

If not, reusing it would require threading the global indentation through the rule execution path — e.g. by adding it to SwiftLintFile or ViolationsSyntaxVisitor. This is a framework-wide change that affects all rules. I'd suggest doing this as a separate PR (ideally before merging this one) — once the global indentation is available to rules, the per-rule option can be removed in favor of it. For now, the rule reuses the shared IndentationStyle type from SwiftLintCore (the same type the global config uses), so it's ready to switch over when the plumbing is in place

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I looked into this further and found a way to make it work without a separate PR.

The global indentation was indeed not accessible from rules — Linter stores the full Configuration, but validate(file:using:compilerArguments:) only receives SwiftLintFile + per-rule config. However, SwiftLint already has CurrentRule with @TaskLocal properties for exactly this kind of cross-cutting concern (used for identifier and allowSourceKitRequestWithoutRule).

I added @TaskLocal public static var indentation: IndentationStyle? to CurrentRule and set it at the three rule-execution chokepoints in Linter.swift (lint, collect, correct) from Configuration.indentation. The rule reads it via CurrentRule.indentation, falling back to IndentationStyle.default when not set (e.g., in unit tests outside a Linter context).

The per-rule indentation option has been removed — the rule now uses the global indentation setting from .swiftlint.yml. End-to-end tests confirm the full pipeline: Configuration(indentation: .tabs)Lintercorrect → tab-indented output.

/// ```yaml
/// multiline_call_arguments:
/// indentation: "tabs"
/// ```

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we need the examples here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed

}
}
}
typealias IndentationStyle = SwiftLintCore.IndentationStyle

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need this alias? I think the file can just be removed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed

@SwiftSyntaxRule(optIn: true)
@SwiftSyntaxRule(correctable: true, optIn: true)
struct MultilineCallArgumentsRule: Rule {
/// Configuration for the multiline_call_arguments rule.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't the docs here ...

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed

/// Configuration for the multiline_call_arguments rule.
var configuration = MultilineCallArgumentsConfiguration()

/// Reasons for violations reported by this rule.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same ...

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed

static let nonTriggeringExamples: [Example] = [
// MARK: - All configuration options shown
Example("""
# Configuration: allows_single_line: false, indentation: 4

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can be omitted. Configuration will be part of the example in the rendered docs anyway.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed

""",
configuration: ["allows_single_line": false, "indentation": "tabs"]
),
// MARK: - Comments between arguments (violation detected, no auto-correction)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Corrections are not checked here, are they? The example (plus the one below) might be useless then.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

MultilineCallArgumentsRule.Reason.eachArgumentMustStartOnOwnLine
)
let reason = MultilineCallArgumentsRule.Reason.eachArgumentMustStartOnOwnLine
let violations1 = try validate("foo(\n a: 1, b: 2,\n c: 3\n)")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like the block style for multiline examples more, actually.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

// MARK: - Auto-correction with comments

extension MultilineCallArgumentsRuleTests {
func testCorrection_withCommentBetweenArguments_doesNotAutoCorrect() throws {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Most of these examples could be part of the (documented) example's list. You may use excludeFromDocumentation: true if you'd just like to have them for testing purposes.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved the redundant correction cases (single-line correction, custom indent, multiline, nested suppression, open paren on new line, etc.) into MultilineCallArgumentsRuleExamples.corrections with excludeFromDocumentation: true


extension MultilineCallArgumentsRuleTests {
func testCorrection_withCRLFLineEndings_correctsIndentation() throws {
let contents = "foo(\n a: 1, b: 2,\n c: 3\n)".replacingOccurrences(of: "\n", with: "\r\n")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Either use a string block or put \r\n directly.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replaced replacingOccurrences(of: "\n", with: "\r\n") with a direct \r\n string literal.

@GandaLF2006 GandaLF2006 force-pushed the gandalf2006/multiline_call_arguments/correctable branch 3 times, most recently from ebc98ef to f694a41 Compare June 27, 2026 22:20
@GandaLF2006 GandaLF2006 requested a review from SimplyDanny June 27, 2026 22:43
Thread the global  into rules via a new
 on , set at the three rule-execution chokepoints
in  (lint, collect, correct). Remove the per-rule
 option from  in favor
of the global setting.
@GandaLF2006 GandaLF2006 force-pushed the gandalf2006/multiline_call_arguments/correctable branch from 8b03add to 1d6eaeb Compare June 28, 2026 19:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants