-
Notifications
You must be signed in to change notification settings - Fork 17.7k
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
cmd/gofmt: reformats block comments #5128
Comments
Comment 1 by [email protected]: Another indentation fail with /* */: Start with: /* This is a comment It is indented with 8 spaces. And has several lines */ Gofmt changes this to: /* This is a comment It is indented with 8 spaces. And has several lines */ It has changed my 8 spaces into 3. |
Owner changed to @griesemer. |
The first issue you reported seems a expected output for issue #1835. |
There is a tension between gofmt leaving comments alone and "adjusting" them to match surrounding code. There is a know bug where formatting of /* comments is not idempotent (as witnessed in the first example above), and where formatting doesn't change anymore after two applications of gofmt (as is also the case in the first example above). Being completely idempotent is a very hard problem (short of simply running gofmt twice internally). Independent of idempotency, the question is what gofmt should be doing with /* comments. You are suggesting that it should leave it alone if the first line is indented correctly. Perhaps that is the right answer. But I suspect there are counter examples. Leaving alone for now. Status changed to Thinking. |
Another use for leaving /* comments */ completely untouched is for example output with whitespace: https://golang.org/issue/6416 |
I ran into this issue recently, with an even simpler reproduce case: http://play.golang.org/p/Pwn4cOHtMN |
I've done some investigating here.
That particular issue is due to an unhandled edge case in It happens when a comment block consists of a first line with Handling it correctly will fix that particular sample I provided (http://play.golang.org/p/Pwn4cOHtMN), but it seems like it's not the same issue as what's described in the original post. Should I break http://play.golang.org/p/Pwn4cOHtMN out into a separate issue then? Or just consider this current issue to be it? |
Okay, I've created failing test cases in shurcooL/play@bfc69a3 and a simple fix for the issue in shurcooL/play@f416cec. I didn't try to refactor it in any way. I can submit a CL for review as soon as I'm sure if I should say "fixes #5128" or create a separate issue... |
After re-reading the original issue and the responses it received, I feel that I should move http://play.golang.org/p/Pwn4cOHtMN into a separate, much smaller issue. That way I can proceed to make a CL that completely fixes and closes it. So, I've created #9751. It has a simple and direct fix. I've made a CL for it. |
I have an Example test case: func ExampleDecode() {
call-my-test-case it print some output
// Output:
/*
here is the output in a block comment
in multi lines with different indentation
*/
} The test case is passing, it's no problem but when I run go fmt, it constantly change the block comment to this style /*
here is the output in a block comment
in multi lines with different indentation
*/ and causing test case to FAIL; wonder is it the same case here, is there any way to let go fmt not touching my block comment? |
@c0b There's no way to let A future |
It is a real pain to work with multi-line
Currently I have to paste expected content, add I would appreciate that |
how about to change there might be other keywords should be recognized as well, if
@griesemer are you aware of any ongoing effort of this future gofmt? can connect related PR to here? |
I just spent 1 hour trying to get gofmt to leave alone the I feel like gofmt re-formatting block comments in the specific case of |
It seems impossible, at least for me, to get the following reproducer test to pass; if you run package main
import (
"fmt"
)
func Hello() {
fmt.Printf("Hello \n\nWorld")
}
// 1. https://golang.org/pkg/testing/#hdr-Examples
// 2. https://blog.golang.org/examples
func ExampleHello() {
Hello()
// Output:
// Hello
//
// World
} |
What: - Add example test. That test example is kind of blocked on; 1. golang/go#41980 2. golang/go#5128 (comment)
This may nor may not be a new example. Using the GoLand IDE it is possible to recognize and color various types of comment lines, e.g.
This example is formatted to:
If the object referenced by the comment (in this case I realize that this is peculiar to a specific IDE and therefore of the lowest priority. I just thought that I would mention it as this ticket appears to still be open. |
@madkins23 What you are seeing there is intentional. See the "Doc Comments" section in the 1.19 release notes (https://go.dev/doc/go1.19). |
This issue is specific to block comments written with |
It happens with
becomes:
I'm aware of the (IMHO) odd ways that comments are processed by Too bad we can't have markdown in comments. Just saying. |
In case you haven't, see the discussion at https://go.googlesource.com/proposal/+/refs/heads/master/design/51082-godocfmt.md#rationale . |
Is it possible to just make go fmt completely ignore block comments with eg two
It is quite annoying since I run go fmt as a save hook and recently it started introducing useless reformat changes to copyright blocks particularly ones with indents |
//nolint:reformat Works like a charm. EDIT:
|
The formatter should not run on block comments, especially when a block comment communicates useful information that, by necessity, should be grouped with the referenced symbol. For example, the following is changed by the formatter: package constants
/*
How many dirs the root dir is
above the current file
*/
const parentLvls = 4 The formatter can be subverted by adding an empty line between the end of the block comment and the package constants
/*
How many dirs the root dir is
above the current file
*/
const parentLvls = 4 However, this has semantically significant implications - keeping the end of a block comment directly adjacent to the associated code is important to communicate relevance and adds a step for human developers who, given the extra whitespace, may necessarily fail to read the comment and add a new variable declaration like so: package constants
/*
How many dirs the root dir is
above the current file
*/
const myJrDevsUnrelatedConstant = "etc"
const parentLvls = 4 The necessity of pressing enter on the keyboard is the point - a millisecond pause to communicate to the editor, "hey, this might be important." Is there any reason that the formatter changes block comments in the first place? Is there some standard meta typing system like JSDoc that I am not privy to? Edit: Note that in the case I'm describing, the double asterisk style does not work either - it breaks the extra asterisks into newlines |
@EagleLizard As mentioned above, the rationale is at https://go.googlesource.com/proposal/+/refs/heads/master/design/51082-godocfmt.md#rationale. |
I very much appreciate it if this issue can be implemented, I have carefully formatted my long block comment nicely, and gofmt just ruins my intended formatting. |
@obs-gh-zuozhiwang The goal of the formatting is to ensure that the documentation looks right in both |
by [email protected]:
The text was updated successfully, but these errors were encountered: