This is a very weird error. We want to show an error if the chan
statement is in form of:
<- chan
chan <-
The correct form should be of course:
<-chan
chan<-
But for example, if we have a channel of channels (like below), the
selected piece of whitespace is also highlighted as an error
chan<- chan<-
^
Because it's the part of `<- chan`, whereas we should not treat as an
error because we have two `chan<-` and `chan<-` statements.
To fix this, we add a `negative lookbehind` regex statement. It will not
match a text if it's preceded with other text.
First let assemble the current regex for the case: `<- chan`
(receive-only annotation), which is:
\(<-\)\@<=\s\+\(chan\>\)\@=
The first part is:
\(<-\)\@<=\s\+\
Here the pattern \@<= matches with zero width if the preceding atom
matches just before what follows. `\s\+` means white space of at least
one character. So it matches **whitespaces** which precedes the
statement `<-`
Now the second part is only useful with the first part. I've added the
placeholder to make it more readable:
PLACEHOLDER(chan\>\)\@="
First the pattern `\@=` means to match the preceding atom with zero
width. So it will match the **PLACEHOLDER** till it finds a `chan`
statement. Once it finds it, it doesn't proceed anymore. So we only
highlight the whitespaces between `<-` and `chan` only if we have a
white space of at least one character
Finally we can introduce our fix now. We're going to pick the `<-`
statemetn if it doesn't follow a `chan`. So `chan<-` should NOT trigger
an error anymore, because we're not going to pick arrows in that form.
To match an arrow which doesn't follow a chan statement can be done via
a `negative lookbehind`, which is in the form of:
\(\<chan\>\)\@<!<-
This literally means: "Match `<-` only if it doesn't follow `chan`.
We're going to use this pattern for the plain `<-` pattern. We also fix
the issue of only matching `chan` and not words like `mychan`. Aslo note
we're just going to replace this into our current regex:
This original regex:
\(<-\)\@<=\s\+\(\<chan\>\)\@=
will be changed into:
\(\(\<chan\>\)\@<!<-\)\@<=\s\+\(\<chan\>\)\@=
Fixes #655