SwiftFormat icon indicating copy to clipboard operation
SwiftFormat copied to clipboard

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

Open Nirma opened this issue 2 years ago • 3 comments

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!

Nirma avatar Feb 09 '24 07:02 Nirma

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

nicklockwood avatar Feb 12 '24 19:02 nicklockwood

@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?

nicklockwood avatar Feb 16 '24 19:02 nicklockwood

@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.

Nirma avatar Feb 24 '24 03:02 Nirma