SwiftLint icon indicating copy to clipboard operation
SwiftLint copied to clipboard

Macro exclusion for line_length missing

Open Craz1k0ek opened this issue 1 year ago • 2 comments
trafficstars

New Issue Checklist

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 version to 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-rules to quickly test if your example is really demonstrating the issue. If your example is more complex, you can use swiftlint 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")

Craz1k0ek avatar Jun 30 '24 22:06 Craz1k0ek

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.

Craz1k0ek avatar Jul 02 '24 09:07 Craz1k0ek

This seems to be a SourceKit issue, see https://github.com/swiftlang/swift/issues/66666.

SimplyDanny avatar Jul 06 '24 12:07 SimplyDanny