-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Not a spacing error: "<-chan <-chan" #655
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
Comments
Hi @fxkr, seem it's caused by the rule for showing errors of |
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. Not 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
Thanks! Unfortunately, it introduces a regression. This correct code is now hilighted:
Luckily
(Interestingly, the second ...and that fixes the problem and doesn't introduce any others as far as I can see. Here's the test file I've been using:
As you can see, there are some cases of incorrectly formatted code not being highlighted, but that was like that before your patch. |
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. Not 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
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
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 fatih#655
https://play.golang.org/p/CKUYB_PX5D
The space between the two "<-chan" is mistakenly shown as a spacing error.
The text was updated successfully, but these errors were encountered: