This is an archive of the discontinued LLVM Phabricator instance.

[clang-format] Stop comment disrupting indentation of Verilog ports
ClosedPublic

Authored by sstwcw on Apr 30 2023, 4:55 PM.

Details

Summary

Before:

module x
    #( //
        parameter x)
    ( //
        input y);
endmodule

After:

module x
    #(//
      parameter x)
    (//
     input y);
endmodule

If the first line in a port or parameter list is not a comment, the
following lines would be aligned to the first line as intended:

module x
    #(parameter x1,
      parameter x2)
    (input y,
     input y2);
endmodule

Previously, the indentation would be changed to an extra continuation
indentation relative to the start of the parenthesis or the hash if
the first token inside the parentheses is a comment. It is a feature
introduced in ddaa9be97839. The feature enabled one to insert a //
comment right after an opening parentheses to put the function
arguments on a new line with a small indentation regardless of how
long the function name is, like this:

someFunction(anotherFunction( // Force break.
    parameter));

People are unlikely to use this feature in a Verilog port list because
the formatter already puts the port list on its own lines. A comment
at the start of a port list is probably a comment for the port on the
next line.

We also removed the space before the comment so that its indentation
would be same as that for a line comment anywhere else in the port
list.

Diff Detail

Event Timeline

sstwcw created this revision.Apr 30 2023, 4:55 PM
Herald added projects: Restricted Project, Restricted Project, Restricted Project. · View Herald TranscriptApr 30 2023, 4:55 PM
Herald added a subscriber: cfe-commits. · View Herald Transcript
sstwcw requested review of this revision.Apr 30 2023, 4:55 PM
sstwcw edited the summary of this revision. (Show Details)Apr 30 2023, 4:59 PM
MyDeveloperDay added inline comments.May 1 2023, 7:40 AM
clang/include/clang/Format/Format.h
4027

This seems an odd corner case

I don't see the problem, could you elaborate a bit more? (Keep in mind, I have no idea about Verilog.)

sstwcw added a comment.May 2 2023, 8:30 AM

I don't see the problem, could you elaborate a bit more? (Keep in mind, I have no idea about Verilog.)

The current way the port list gets formatted is like this:

module x
    (input x1,
     input x2,
     input x3,
     input x4);
endmodule

One may want to add a comment for one of the ports like this:

module x
    (input x1,
     // second port
     input x2,
     // third port
     input x3,
     // forth port
     input x4);
endmodule

The port list thing and the comment thing work fine for now, except
when there is a comment for the first port. The comment on the first
line would cause the port list to be indented, like this:

module x
    ( // first port
        input x1,
        // second port
        input x2,
        // third port
        input x3,
        // forth port
        input x4);
endmodule

After this patch, a comment on the first line would not cause the
problem. Now the code gets formatted like this. The ports are
indented the same whether or not there is a comment on the first line.

module x
    (// first port
     input x1,
     // second port
     input x2,
     // third port
     input x3,
     // forth port
     input x4);
endmodule
clang/include/clang/Format/Format.h
4027

See the last block of code in the example I added. This is the only way I came up with to ensure that the comment for the first port is aligned with the comments for the rest of the ports and that whether the first comment exists does not affect how other lines are indented.

The port list thing and the comment thing work fine for now, except
when there is a comment for the first port. The comment on the first
line would cause the port list to be indented, like this:

module x
    ( // first port
        input x1,
        // second port
        input x2,
        // third port
        input x3,
        // forth port
        input x4);
endmodule

After this patch, a comment on the first line would not cause the
problem. Now the code gets formatted like this. The ports are
indented the same whether or not there is a comment on the first line.

module x
    (// first port
     input x1,
     // second port
     input x2,
     // third port
     input x3,
     // forth port
     input x4);
endmodule

See https://github.com/llvm/llvm-project/issues/55487#issuecomment-1321355199, which may be relevant.

IMO a trailing comment (empty or not) belongs to the code before it.

There is only a parenthesis before it. It doesn't usually need a comment. It is like in 5a61139. One doesn't tend to comment a single brace.

A comment about the code below it should start on a new line.

In this special case, the comment would be indented to the same column as the next line, so it should be clear it is for the next line. Like the case forbraced initializer lists, the first field will be on the same line as the brace if there isn't a comment, so the first comment is also on the same line as the brace when there is one.

foo foo{// first field
        a,
        // second field
        b};

IMO a trailing comment (empty or not) belongs to the code before it.

There is only a parenthesis before it. It doesn't usually need a comment. It is like in 5a61139. One doesn't tend to comment a single brace.

I agree if the brace doesn't start a block, but clang-format sometimes got it wrong and misannotates a block as a braced list. (See https://github.com/llvm/llvm-project/issues/33891 for an example.)

A comment about the code below it should start on a new line.

In this special case, the comment would be indented to the same column as the next line, so it should be clear it is for the next line. Like the case forbraced initializer lists, the first field will be on the same line as the brace if there isn't a comment, so the first comment is also on the same line as the brace when there is one.

foo foo{// first field
        a,
        // second field
        b};

I'll go along with other reviewers on this one.

I agree if the brace doesn't start a block, but clang-format sometimes got it wrong and misannotates a block as a braced list. (See https://github.com/llvm/llvm-project/issues/33891 for an example.)

This patch isn't affected by the problem. The Verilog port list is not as ambiguous as braced blocks.

I'll go along with other reviewers on this one.

So what do the other reviewers think about this patch? The braced initialization list thing was added a long time ago by DJasper, so that behavior probably has to stay.

I'll go along with other reviewers on this one.

So what do the other reviewers think about this patch? The braced initialization list thing was added a long time ago by DJasper, so that behavior probably has to stay.

I'm not particularly fond of that feature, but you are right, it has to stay. So making it consistent in verilog doesn't seem to be a problem to me.

This revision is now accepted and ready to land.May 12 2023, 1:07 PM
This revision was landed with ongoing or failed builds.May 15 2023, 7:58 PM
This revision was automatically updated to reflect the committed changes.