SwiftLint
SwiftLint copied to clipboard
Macro exclusion for line_length missing
trafficstars
New Issue Checklist
- [X] Updated SwiftLint to the latest version
- [X] I searched for existing GitHub issues
Describe the bug
I have a specific setting in my .swiftlint.yml to exclude function declarations
line_length:
warning: 120
error: 200
ignores_function_declarations: true
However, this ignores the macro definitions
// Line Length Violation: Line should be 120 characters or less; currently it has 126 characters (line_length)
@freestanding(expression)
public macro obfuscate(_ value: String) -> String = #externalMacro(module: "ObfuscatedStringMacros", type: "ObfuscationMacro")
Complete output when running SwiftLint, including the stack trace and command used
$ swiftlint lint
Gives me
Line Length Violation: Line should be 120 characters or less; currently it has 126 characters (line_length)
Environment
- SwiftLint version (run
swiftlint versionto be sure)? 0.55.1 - Installation method used (Homebrew, CocoaPods, building from source, etc)? Homebrew
- Paste your configuration file:
disabled_rules:
- todo
- trailing_comma
- trailing_whitespace
opt_in_rules:
- empty_count
line_length:
warning: 120
error: 200
ignores_comments: true
ignores_function_declarations: true
ignores_interpolated_strings: true
ignores_urls: true
- Are you using nested configurations? If so, paste their relative paths and respective contents. No
- Which Xcode version are you using (check
xcodebuild -version)? Xcode 15.4 - Do you have a sample that shows the issue? Run
echo "[string here]" | swiftlint lint --no-cache --use-stdin --enable-all-rulesto quickly test if your example is really demonstrating the issue. If your example is more complex, you can useswiftlint lint --path [file here] --no-cache --enable-all-rules. Create a macro using Xcode and run the linter to recreate the issue
// This triggers a violation:
@freestanding(expression)
public macro obfuscate(_ value: String) -> String = #externalMacro(module: "ObfuscatedStringMacros", type: "ObfuscationMacro")
I tried fixing this issue myself, but it appears the macro is not correctly parsed, but I can't figure out why. Parts of the code I added
if configuration.ignoresMacroDeclarations {
print("Configuration set to ignore macros")
if lineHasKinds(line: line, kinds: macroKinds, kindsByLine: swiftDeclarationKindsByLine.value) {
print("Ignoring line \(line.index) due to macro declaration: \(line.content)")
return nil
} else {
print("""
Something went wrong, debug info
================================
Checking line \(line.index): \(line.content)
swiftDeclarationKindsByLine.value: \(swiftDeclarationKindsByLine.value)
""")
}
}
Outputs the following
Configuration set to ignore macros
Something went wrong, debug info
================================
Checking line 19: public macro obfuscate(_ value: String) -> String = #externalMacro(module: "ObfuscatedStringMacros", type: "ObfuscationMacro")
swiftDeclarationKindsByLine.value: [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [SourceKittenFramework.SwiftDeclarationKind.varParameter]]
This appears to be a SourceKitten issue. I've added an issue there.
This seems to be a SourceKit issue, see https://github.com/swiftlang/swift/issues/66666.