Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Have a custom rule where if we have a call to a method, we should expect another one #5529

Open
2 tasks done
ipodishima opened this issue Apr 11, 2024 · 3 comments
Open
2 tasks done
Labels

Comments

@ipodishima
Copy link

ipodishima commented Apr 11, 2024

New Issue Checklist

New rule request

Hi there

I might be missing something, but basically, I have places in the code where I have a call to subscribeToNotifications()
And I need a way to assert that unsubscribeFromNotifications is called when subscribeToNotifications is.
This is to prevent developers from misusing our internal APIs.

I can't find a way using custom rules to do so...
And I'm not sure the swiftlint yaml syntax could be adapted for it?

Thanks

Triggering example

    func viewWillAppear() {
        super.viewWillAppear()
        subscribeToNotifications()
    }

    func viewDidDisappear() {
        super.viewDidDisappear()
    }

Non triggering example

    func viewWillAppear() {
        super.viewWillAppear()
        subscribeToNotifications()
    }

    func viewDidDisappear() {
        super.viewDidDisappear()
        unsubscribeFromNotifications()
    }
@SimplyDanny
Copy link
Collaborator

I admittedly can't make heads or tails of your examples. addScrubberFeatureTip isn't called at all and so isn't observeTip. viewWillDisappear calls or doesn't call cancelTipObservations. Where is the connection to observeTip?

But generally multiline matches work. So finding cases where observeTip is not immediately followed by cancelTipObservations should be possible. For more complex cases, custom rules might not be sufficient.

@ipodishima
Copy link
Author

Hi

I changed the description of my issue to remove personal context from our app and make it more generic.

@SimplyDanny
Copy link
Collaborator

I changed the description of my issue to remove personal context from our app and make it more generic.

That makes it much clearer.

So I think that your use case is impossible to achieve with a custom rule, at least not in its full generality. But there are so called Swift Custom Rules (as opposed to the default Regex Custom Rules) which would allow you to implement this check based on SwiftSyntax.

However, this requires you to build SwiftLint yourself with Bazel.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants