Thread
Commits
-
Phase 2 pgindent run for v12.
- 8255c7a5eeba 12.0 landed
-
ANSI-ify a few straggler K&R-style function definitions.
- da71f98efba9 12.0 landed
-
Emacs vs pg_indent's weird indentation for function declarations
Thomas Munro <thomas.munro@enterprisedb.com> — 2019-01-27T22:10:33Z
Hello, Using either the .dir-locals.el settings or the "more complete" src/tools/editors/emacs.samples, I have never convinced Emacs to produce multi-line function declarations in .h files that satisfy pg_indent. For example, latch.c has the following definition: int WaitEventSetWait(WaitEventSet *set, long timeout, WaitEvent *occurred_events, int nevents, uint32 wait_event_info) And now let's see the declaration in latch.h: extern int WaitEventSetWait(WaitEventSet *set, long timeout, WaitEvent *occurred_events, int nevents, uint32 wait_event_info); (I replaced all tabs with four space here; if you're reading in a monospace font, you'll see that the first arguments off all lines begin in the same column in the definition by not in the declaration.) For a while I've been baffled by that: the first arguments of later lines don't line up with that of the first line, but they're also not in a constant column (it varies from function to function), and it's also not caused by 8-space vs 4-space confusion. It was only when I put those two things next to each other just now in this email that I finally spotted the logic it's using: if you remove "extern int " then the later lines line up with the first argument of the top line. This works for other examples I looked at too. Huh. That's ... annoying. I wish indent wouldn't do that, because it means that my declarations get moved around every time I write code. But if it's not possible to change that for whatever technical or political reason, I wonder if it's possible to teach Emacs to understand that weird rule... -- Thomas Munro http://www.enterprisedb.com -
Re: Emacs vs pg_indent's weird indentation for function declarations
Tom Lane <tgl@sss.pgh.pa.us> — 2019-01-28T05:28:30Z
Thomas Munro <thomas.munro@enterprisedb.com> writes: > For a while I've been baffled by that: the first arguments of later > lines don't line up with that of the first line, but they're also not > in a constant column (it varies from function to function), and it's > also not caused by 8-space vs 4-space confusion. It was only when I > put those two things next to each other just now in this email that I > finally spotted the logic it's using: if you remove "extern int " then > the later lines line up with the first argument of the top line. This > works for other examples I looked at too. Huh. Yeah. I suspect that the underlying cause is that pgindent doesn't really distinguish function declarations from definitions, at least not when it comes time to indent the lines after the first one. > That's ... annoying. I wish indent wouldn't do that, because it means > that my declarations get moved around every time I write code. If you can fix it, I'd vote for accepting the patch. I don't personally have the desire to dig into the indent code that much ... regards, tom lane
-
Re: Emacs vs pg_indent's weird indentation for function declarations
Michael Paquier <michael@paquier.xyz> — 2019-01-28T07:08:42Z
On Mon, Jan 28, 2019 at 12:28:30AM -0500, Tom Lane wrote: > Thomas Munro <thomas.munro@enterprisedb.com> writes: >> That's ... annoying. I wish indent wouldn't do that, because it means >> that my declarations get moved around every time I write code. > > If you can fix it, I'd vote for accepting the patch. I don't personally > have the desire to dig into the indent code that much ... If you could get pgindent smarter in this area, it would be really nice.. -- Michael
-
Re: Emacs vs pg_indent's weird indentation for function declarations
Thomas Munro <thomas.munro@enterprisedb.com> — 2019-01-28T08:47:14Z
On Mon, Jan 28, 2019 at 8:08 PM Michael Paquier <michael@paquier.xyz> wrote: > On Mon, Jan 28, 2019 at 12:28:30AM -0500, Tom Lane wrote: > > Thomas Munro <thomas.munro@enterprisedb.com> writes: > >> That's ... annoying. I wish indent wouldn't do that, because it means > >> that my declarations get moved around every time I write code. > > > > If you can fix it, I'd vote for accepting the patch. I don't personally > > have the desire to dig into the indent code that much ... > > If you could get pgindent smarter in this area, it would be really > nice.. Ah, it's not indent doing it, it's pgindent's post_indent subroutine trying to correct the effects of the (implied) -psl option, but not doing a complete job of it (it should adjust the indentation lines of later lines if it changes the first line). One idea I had was to tell indent not to do that by using -npsl when processing headers, like in the attached. That fixes all the headers I looked at, though of course it doesn't fix the static function declarations that appear in .c files, so it's not quite the right answer. -- Thomas Munro http://www.enterprisedb.com
-
Re: Emacs vs pg_indent's weird indentation for function declarations
Thomas Munro <thomas.munro@gmail.com> — 2019-04-07T23:36:25Z
On Mon, Jan 28, 2019 at 9:48 PM Thomas Munro <thomas.munro@enterprisedb.com> wrote: > On Mon, Jan 28, 2019 at 8:08 PM Michael Paquier <michael@paquier.xyz> wrote: > > If you could get pgindent smarter in this area, it would be really > > nice.. > > Ah, it's not indent doing it, it's pgindent's post_indent subroutine > trying to correct the effects of the (implied) -psl option, but not > doing a complete job of it (it should adjust the indentation lines of > later lines if it changes the first line). > > One idea I had was to tell indent not to do that by using -npsl when > processing headers, like in the attached. That fixes all the headers > I looked at, though of course it doesn't fix the static function > declarations that appear in .c files, so it's not quite the right > answer. I tried teaching pgindent's post_indent subroutine to unmangle the multi-line declarations it mangles. That produces correct indentation! But can also produce lines that exceed the column limit we would normally wrap at (of course, because pg_bsd_indent had less whitespace on the left when it made wrapping decisions). Doh. Attached for posterity, but it's useless. So I think pg_bsd_indent itself needs to be fixed. I think I know where the problem is. lexi.c isn't looking far ahead enough to recognise multi-line function declarations: if (*buf_ptr == '(' && state->tos <= 1 && state->ind_level == 0 && state->in_parameter_declaration == 0 && state->block_init == 0) { char *tp = buf_ptr; while (tp < buf_end) if (*tp++ == ')' && (*tp == ';' || *tp == ',')) goto not_proc; strncpy(state->procname, token, sizeof state->procname - 1); if (state->in_decl) state->in_parameter_declaration = 1; return (funcname); not_proc:; } That loop that looks for ')' followed by ';' is what causes the lexer to conclude that the "foo" is an "ident" rather than a "funcname", given the following input: extern void foo(int i); But if because buf_end ends at the newline, it can't see the semi-colon and concludes that "foo" is a "funcname" here: extern void foo(int i, int j); That determination causes indent.c's procnames_start_line (-psl) mode to put "extern void" on its own line here and stop thinking of it as a declaration: case funcname: case ident: /* got an identifier or constant */ if (ps.in_decl) { if (type_code == funcname) { ps.in_decl = false; if (procnames_start_line && s_code != e_code) { *e_code = '\0'; dump_line(); } I guess it'd need something smarter than fill_buffer() to see far enough, but simply loading N lines at once wouldn't be enough because you could still happen to be looking at the final line in the buffer; you'd probably need a sliding window. I'm not planning on trying to fix that myself in the short term, but since it annoys me every time I commit anything, I couldn't resist figuring out where it's coming from at least... -- Thomas Munro https://enterprisedb.com -
Re: Emacs vs pg_indent's weird indentation for function declarations
Tom Lane <tgl@sss.pgh.pa.us> — 2019-05-15T04:43:10Z
Thomas Munro <thomas.munro@gmail.com> writes: > I tried teaching pgindent's post_indent subroutine to unmangle the > multi-line declarations it mangles. That produces correct > indentation! But can also produce lines that exceed the column limit > we would normally wrap at (of course, because pg_bsd_indent had less > whitespace on the left when it made wrapping decisions). Doh. > Attached for posterity, but it's useless. > So I think pg_bsd_indent itself needs to be fixed. I think I know > where the problem is. lexi.c isn't looking far ahead enough to > recognise multi-line function declarations: I experimented with fixing this. I was able to get pg_bsd_indent to distinguish multi-line function declarations from definitions, but it turns out that it doesn't help your concern about the lines being too long after re-indenting. Contrary to what you imagine above, it seems pg_bsd_indent will not reflow argument lists, regardless of whether it thinks there needs to be more or less leading whitespace. I'm a bit surprised that -bc doesn't cause that to happen, but it doesn't (and I'm not sure we'd really want to force one-parameter-per-line, anyway). Anyway, the attached hasty-and-undercommented change to pg_bsd_indent allows removal of the "Move prototype names to the same line as return type" hack in pgindent, and we then get prototypes with properly lined-up arguments, but we'll have a lot of places with over-length lines needing manual fixing. Unless somebody wants to find where to fix that in pg_bsd_indent, but I've had my fill of looking at that spaghetti code for today. regards, tom lane
-
Re: Emacs vs pg_indent's weird indentation for function declarations
Tom Lane <tgl@sss.pgh.pa.us> — 2019-05-15T21:17:01Z
I wrote: > I experimented with fixing this. I was able to get pg_bsd_indent to > distinguish multi-line function declarations from definitions, but it > turns out that it doesn't help your concern about the lines being too > long after re-indenting. Contrary to what you imagine above, it seems > pg_bsd_indent will not reflow argument lists, regardless of whether it > thinks there needs to be more or less leading whitespace. Actually, now that I think about it, pgindent seldom revisits line-break decisions in code anyway; it's only aggressive about reflowing comments. So maybe we shouldn't be expecting it to fix this. Also, looking at sample results (attached), it seems like we don't have such a large problem as one might guess. It looks like people have mostly formatted declarations to work with this indentation already, either because their editors did it automatically, or because they were thinking that this might get fixed someday. (I know I've often had that in the back of my mind.) There are some places in the attached diff that I might take the trouble to clean up manually, but not that many. I found out that my initial draft of a multi-line lookahead function was not nearly smart enough to survive contact with the PG source corpus, but after rejiggering it to cope with comments and attributes, it seems to do quite well. A small problem with the "rejiggering" is that it now makes the wrong choice for K&R-style function definitions, causing them to be weirdly indented. For our purposes, that's a non-problem so I'm not excited about trying to make it smart enough to recognize those. We do have a couple of amazingly old and crufty K&R-style functions in src/port/, though, so probably we'd wish to fix those. Attached is working draft of pg_bsd_indent changes (still sans comments) as well as a patch showing the difference between current pgindent results on HEAD and the results of this version. I think there's no question that this is an improvement. regards, tom lane
-
Re: Emacs vs pg_indent's weird indentation for function declarations
Thomas Munro <thomas.munro@gmail.com> — 2019-05-15T21:26:47Z
On Thu, May 16, 2019 at 9:17 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: > I wrote: > > I experimented with fixing this. I was able to get pg_bsd_indent to > > distinguish multi-line function declarations from definitions, but it > > turns out that it doesn't help your concern about the lines being too > > long after re-indenting. Contrary to what you imagine above, it seems > > pg_bsd_indent will not reflow argument lists, regardless of whether it > > thinks there needs to be more or less leading whitespace. > > Actually, now that I think about it, pgindent seldom revisits line-break > decisions in code anyway; it's only aggressive about reflowing comments. > So maybe we shouldn't be expecting it to fix this. Ahh, so my quick and dirty perl change was probably OK then. Sorry I didn't realise that before, but this certainly a better way, fixing the right thing. > A small problem with the "rejiggering" is that it now makes the wrong > choice for K&R-style function definitions, causing them to be weirdly > indented. For our purposes, that's a non-problem so I'm not excited > about trying to make it smart enough to recognize those. We do have > a couple of amazingly old and crufty K&R-style functions in src/port/, > though, so probably we'd wish to fix those. What kid of fork is pg_bsd_indent... do we care about upstreaming changes? I guess someone would need to deal with that case eventually if so. > Attached is working draft of pg_bsd_indent changes (still sans comments) > as well as a patch showing the difference between current pgindent > results on HEAD and the results of this version. I think there's no > question that this is an improvement. +1 Thanks for looking into it! -- Thomas Munro https://enterprisedb.com
-
Re: Emacs vs pg_indent's weird indentation for function declarations
Tom Lane <tgl@sss.pgh.pa.us> — 2019-05-15T21:30:42Z
Thomas Munro <thomas.munro@gmail.com> writes: > On Thu, May 16, 2019 at 9:17 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: >> A small problem with the "rejiggering" is that it now makes the wrong >> choice for K&R-style function definitions, causing them to be weirdly >> indented. For our purposes, that's a non-problem so I'm not excited >> about trying to make it smart enough to recognize those. We do have >> a couple of amazingly old and crufty K&R-style functions in src/port/, >> though, so probably we'd wish to fix those. > What kid of fork is pg_bsd_indent... do we care about upstreaming > changes? I guess someone would need to deal with that case eventually > if so. We regard the FreeBSD copy as upstream, and I think we're mostly in sync with that but only mostly. So it would come down to whether the FreeBSD maintainer is worried about K&R mode and what he wants to do about that. Piotr, that's still you isn't it? regards, tom lane
-
Re: Emacs vs pg_indent's weird indentation for function declarations
Tom Lane <tgl@sss.pgh.pa.us> — 2019-05-17T14:48:03Z
I wrote: >>> A small problem with the "rejiggering" is that it now makes the wrong >>> choice for K&R-style function definitions, causing them to be weirdly >>> indented. For our purposes, that's a non-problem so I'm not excited >>> about trying to make it smart enough to recognize those. We do have >>> a couple of amazingly old and crufty K&R-style functions in src/port/, >>> though, so probably we'd wish to fix those. To be concrete about that: the existing behavior when trying to decide whether "foo(" starts a function declaration or a function definition is to scan to the matching right paren[1] and then, if the immediately next character is ';' or ',', it's a declaration; else it's a definition. This fails on decls with attributes, such as extern void pg_re_throw(void) __attribute__((noreturn)); My patch changes the rule to be "scan until we see a ';' ',' or '{' that's not within parens; then it's a definition if that character is '{', otherwise a declaration". So it gets the right answer for the above, but the wrong answer for int isinf(x) double x; { It doesn't really seem practical to me to make the lookahead function smart enough to tell the difference between attributes and K&R-style parameter declarations. What I'm thinking of doing to have an upstreamable patch is to invent a new switch, perhaps '-kr'/'-nkr', to indicate whether the user is more worried about K&R function declarations than she is about function attributes. The default for this switch could be debated perhaps, but I'd just stick an explicit -nkr into pgindent's invocation, so we wouldn't care too much. (This would also ensure that pgindent would fail if you try to use a too-old copy of pg_bsd_indent...) regards, tom lane [1] Um, well, actually the existing behavior is to scan to the *first* right paren. But upgrading it to count parens correctly seems like an unobjectionable improvement in any case. -
Re: Emacs vs pg_indent's weird indentation for function declarations
Piotr Stefaniak <postgres@piotr-stefaniak.me> — 2019-05-19T17:25:05Z
On 17/05/2019 16.48, Tom Lane wrote: > I wrote: >>>> A small problem with the "rejiggering" is that it now makes the wrong >>>> choice for K&R-style function definitions, causing them to be weirdly >>>> indented. For our purposes, that's a non-problem so I'm not excited >>>> about trying to make it smart enough to recognize those. We do have >>>> a couple of amazingly old and crufty K&R-style functions in src/port/, >>>> though, so probably we'd wish to fix those. > It doesn't really seem practical to me to make the lookahead function > smart enough to tell the difference between attributes and K&R-style > parameter declarations. What I'm thinking of doing to have an > upstreamable patch is to invent a new switch, perhaps '-kr'/'-nkr', > to indicate whether the user is more worried about K&R function > declarations than she is about function attributes. I think it's safe to assume that upstream can drop support for K&R-style parameters altogether.
-
Re: Emacs vs pg_indent's weird indentation for function declarations
Tom Lane <tgl@sss.pgh.pa.us> — 2019-05-19T17:27:21Z
Piotr Stefaniak <postgres@piotr-stefaniak.me> writes: > On 17/05/2019 16.48, Tom Lane wrote: >> It doesn't really seem practical to me to make the lookahead function >> smart enough to tell the difference between attributes and K&R-style >> parameter declarations. What I'm thinking of doing to have an >> upstreamable patch is to invent a new switch, perhaps '-kr'/'-nkr', >> to indicate whether the user is more worried about K&R function >> declarations than she is about function attributes. > I think it's safe to assume that upstream can drop support for K&R-style > parameters altogether. Cool. I already created the switch, but maybe we could have it default to -nkr? regards, tom lane
-
Re: Emacs vs pg_indent's weird indentation for function declarations
Piotr Stefaniak <postgres@piotr-stefaniak.me> — 2019-05-19T17:50:50Z
On 19/05/2019 19.27, Tom Lane wrote: > Piotr Stefaniak <postgres@piotr-stefaniak.me> writes: >> On 17/05/2019 16.48, Tom Lane wrote: >>> It doesn't really seem practical to me to make the lookahead function >>> smart enough to tell the difference between attributes and K&R-style >>> parameter declarations. What I'm thinking of doing to have an >>> upstreamable patch is to invent a new switch, perhaps '-kr'/'-nkr', >>> to indicate whether the user is more worried about K&R function >>> declarations than she is about function attributes. > >> I think it's safe to assume that upstream can drop support for K&R-style >> parameters altogether. > > Cool. I already created the switch, but maybe we could have it > default to -nkr? Sorry, but GNU indent already uses -kr for something else and I would like FreeBSD indent have something like that under the same name. Besides, indent has too many options and this one doesn't look like particularly desired by anyone. It's possible that someone will complain some day, but I don't think we should assume that they'll do or that they're more important than the other users who benefit from your change being the default behavior and no additional options.
-
Re: Emacs vs pg_indent's weird indentation for function declarations
Tom Lane <tgl@sss.pgh.pa.us> — 2019-05-19T18:13:09Z
Piotr Stefaniak <postgres@piotr-stefaniak.me> writes: > On 19/05/2019 19.27, Tom Lane wrote: >> Piotr Stefaniak <postgres@piotr-stefaniak.me> writes: >>> I think it's safe to assume that upstream can drop support for K&R-style >>> parameters altogether. >> Cool. I already created the switch, but maybe we could have it >> default to -nkr? > Sorry, but GNU indent already uses -kr for something else and I would > like FreeBSD indent have something like that under the same name. > Besides, indent has too many options and this one doesn't look like > particularly desired by anyone. It's possible that someone will complain > some day, but I don't think we should assume that they'll do or that > they're more important than the other users who benefit from your change > being the default behavior and no additional options. Huh. OK, I'll rip the switch back out again. regards, tom lane
-
Re: Emacs vs pg_indent's weird indentation for function declarations
Tom Lane <tgl@sss.pgh.pa.us> — 2019-05-19T19:48:02Z
I wrote: > Piotr Stefaniak <postgres@piotr-stefaniak.me> writes: >> Sorry, but GNU indent already uses -kr for something else and I would >> like FreeBSD indent have something like that under the same name. >> Besides, indent has too many options and this one doesn't look like >> particularly desired by anyone. It's possible that someone will complain >> some day, but I don't think we should assume that they'll do or that >> they're more important than the other users who benefit from your change >> being the default behavior and no additional options. > Huh. OK, I'll rip the switch back out again. Here's a proposed patch for you. regards, tom lane