nicklockwood / SwiftFormat

A command-line tool and Xcode Extension for formatting Swift code
MIT License
7.86k stars 638 forks source link

Issue with the rule `redundantInit` not playing nicely with preprocessor #1624

Open Nirma opened 7 months ago

Nirma commented 7 months ago

I love swiftformat and use it often, but unfortunately I came across an issue with the rule redundantInit.

I had a struct that was defined something like this:

struct Item {
    let name: String

    init(name: String) {
        self.name = name
    }

    #if SOMETHING
    init(customType: CustomType) {
        ...
    }
    #endif
}

The issue is that when SOMETHING evaluates to true the special initializer init(customType: CustomType) is defined but that causes the swift compiler to no longer provide a synthesized initializer if redundantInit deletes the normal initializer which was provided explicitly so that it is accessible even when compiling with the flag SOMETHING set to true.

I know another way that would work with the current implementation of redundantInit would be to provide the initializer init(customType: CustomType) via an extension that is defined conditionally by the flag SOMETHING.

struct Item {
    let name: String
}

#if SOMETHING
extension Item {
    init(customType: CustomType) {
        ...
    }
}
#endif

...come to think of it this is cleaner perhaps but I still wanted to confirm if this is expected behavior or not.

Thanks!

nicklockwood commented 7 months ago

@Nirma this is a bug. I'll try to get it fixed, but your proposed workaround seems reasonable in the meantime.

nicklockwood commented 7 months ago

@Nirma I've not been able to reproduce the actual bug here. I think maybe your code sample was too simplified to reproduce it? What did SwiftFormat actually do to mangle your original code?

Nirma commented 7 months ago

@nicklockwood Yes, I am guilty as charged with oversimplifying the example code too much!

Will try to recreate the issue with the offending code later and remove any specifics to the project.