switch.vim
switch.vim copied to clipboard
Invert logical expression, using De Morgan Law
It would be nice if I could transform an Boolean expression using De Morgan's Theorems. It's useful when you want to convert an 'if' expression into an 'else', or simply switch the form of your expression.

Examples:
Selecting first OR term (!(A && B)) in the next expression and switching:
!(A && B) || C
wold give:
(A && B) || C
Anywhere in the expression:
A || B && (C || D)
transforms the whole expression into:
!(A || B) || !(C || D)
Simplifying further:
(!A && !B) || (!C && !D)
I think you get the idea... Maybe the language servers have some functions that could help with the tokenization.
As you say, the only way that I can see to do this reliably for arbitrary expressions is by getting an AST of this particular area of the buffer. Currently, the plugin has no general-purpose way of communicating with a language server. I have been considering some form of optional support (though mostly for some of my other plugins), but it's just a vague idea with no actionable steps other than "learn more about LSP stuff".
Even if I build some integration, I think it will have to be very language-specific. It's very likely that different language servers would produce subtly different trees (with different tags for nodes, different types for nodes, etc), so I find it highly unlikely that there would be any generic solution to the problem. I might start by exploring Rust, since I know that rust-analyzer has support for this particular transformation.
I'll keep the issue open, since it's theoretically possible, but I'm afraid I probably won't be able to do anything about it for a long time.