indent: separate code for handling parentheses and brackets
Handling parentheses is more complicated than for brackets.
This commit is contained in:
parent
333a9a00e1
commit
5f827f27db
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: debug.c,v 1.25 2023/06/02 13:59:33 rillig Exp $ */
|
||||
/* $NetBSD: debug.c,v 1.26 2023/06/04 10:23:36 rillig Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2023 The NetBSD Foundation, Inc.
|
||||
|
@ -30,7 +30,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: debug.c,v 1.25 2023/06/02 13:59:33 rillig Exp $");
|
||||
__RCSID("$NetBSD: debug.c,v 1.26 2023/06/04 10:23:36 rillig Exp $");
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
|
@ -49,8 +49,10 @@ const char *const lsym_name[] = {
|
|||
"preprocessing",
|
||||
"newline",
|
||||
"comment",
|
||||
"lparen_or_lbracket",
|
||||
"rparen_or_rbracket",
|
||||
"lparen",
|
||||
"lbracket",
|
||||
"rparen",
|
||||
"rbracket",
|
||||
"lbrace",
|
||||
"rbrace",
|
||||
"period",
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: indent.c,v 1.317 2023/06/03 21:44:08 rillig Exp $ */
|
||||
/* $NetBSD: indent.c,v 1.318 2023/06/04 10:23:36 rillig Exp $ */
|
||||
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-4-Clause
|
||||
|
@ -38,7 +38,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: indent.c,v 1.317 2023/06/03 21:44:08 rillig Exp $");
|
||||
__RCSID("$NetBSD: indent.c,v 1.318 2023/06/04 10:23:36 rillig Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <err.h>
|
||||
|
@ -362,8 +362,7 @@ update_ps_decl_ptr(lexer_symbol lsym)
|
|||
case dp_other:
|
||||
if (lsym == lsym_semicolon || lsym == lsym_rbrace)
|
||||
ps.decl_ptr = dp_start;
|
||||
if (lsym == lsym_lparen_or_lbracket && token.st[0] == '('
|
||||
&& ps.prev_token != lsym_sizeof)
|
||||
if (lsym == lsym_lparen && ps.prev_token != lsym_sizeof)
|
||||
ps.decl_ptr = dp_start;
|
||||
if (lsym == lsym_comma && ps.in_decl)
|
||||
ps.decl_ptr = dp_start;
|
||||
|
@ -441,7 +440,7 @@ move_com_to_code(lexer_symbol lsym)
|
|||
if (ps.want_blank)
|
||||
buf_add_char(&code, ' ');
|
||||
buf_add_buf(&code, &com);
|
||||
if (lsym != lsym_rparen_or_rbracket)
|
||||
if (lsym != lsym_rparen && lsym != lsym_rbracket)
|
||||
buf_add_char(&code, ' ');
|
||||
com.len = 0;
|
||||
ps.want_blank = false;
|
||||
|
@ -470,8 +469,7 @@ stay_in_line:
|
|||
static bool
|
||||
is_function_pointer_declaration(void)
|
||||
{
|
||||
return token.st[0] == '('
|
||||
&& ps.in_decl
|
||||
return ps.in_decl
|
||||
&& !ps.block_init
|
||||
&& !ps.decl_indent_done
|
||||
&& !ps.is_function_definition
|
||||
|
@ -485,7 +483,7 @@ want_blank_before_lparen(void)
|
|||
return false;
|
||||
if (opt.proc_calls_space)
|
||||
return true;
|
||||
if (ps.prev_token == lsym_rparen_or_rbracket)
|
||||
if (ps.prev_token == lsym_rparen || ps.prev_token == lsym_rbracket)
|
||||
return false;
|
||||
if (ps.prev_token == lsym_offsetof)
|
||||
return false;
|
||||
|
@ -496,20 +494,8 @@ want_blank_before_lparen(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
want_blank_before_lbracket(void)
|
||||
{
|
||||
if (code.len == 0)
|
||||
return false;
|
||||
if (ps.prev_token == lsym_comma)
|
||||
return true;
|
||||
if (ps.prev_token == lsym_binary_op)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void
|
||||
process_lparen_or_lbracket(void)
|
||||
process_lparen(void)
|
||||
{
|
||||
if (++ps.nparen == array_length(ps.paren)) {
|
||||
diag(0, "Reached internal limit of %zu unclosed parentheses",
|
||||
|
@ -520,8 +506,7 @@ process_lparen_or_lbracket(void)
|
|||
if (is_function_pointer_declaration()) {
|
||||
code_add_decl_indent(ps.decl_ind, ps.tabs_to_var);
|
||||
ps.decl_indent_done = true;
|
||||
} else if (token.st[0] == '('
|
||||
? want_blank_before_lparen() : want_blank_before_lbracket())
|
||||
} else if (want_blank_before_lparen())
|
||||
buf_add_char(&code, ' ');
|
||||
ps.want_blank = false;
|
||||
buf_add_char(&code, token.st[0]);
|
||||
|
@ -531,7 +516,7 @@ process_lparen_or_lbracket(void)
|
|||
&& opt.continuation_indent == opt.indent_size)
|
||||
ps.extra_expr_indent = eei_yes;
|
||||
|
||||
if (ps.init_or_struct && *token.st == '(' && ps.tos <= 2) {
|
||||
if (ps.init_or_struct && ps.tos <= 2) {
|
||||
/* this is a kluge to make sure that declarations will be
|
||||
* aligned right if proc decl has an explicit type on it, i.e.
|
||||
* "int a(x) {..." */
|
||||
|
@ -555,8 +540,41 @@ process_lparen_or_lbracket(void)
|
|||
ps.nparen - 1, paren_level_cast_name[cast], indent);
|
||||
}
|
||||
|
||||
static bool
|
||||
want_blank_before_lbracket(void)
|
||||
{
|
||||
if (code.len == 0)
|
||||
return false;
|
||||
if (ps.prev_token == lsym_comma)
|
||||
return true;
|
||||
if (ps.prev_token == lsym_binary_op)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void
|
||||
process_rparen_or_rbracket(void)
|
||||
process_lbracket(void)
|
||||
{
|
||||
if (++ps.nparen == array_length(ps.paren)) {
|
||||
diag(0, "Reached internal limit of %zu unclosed parentheses",
|
||||
array_length(ps.paren));
|
||||
ps.nparen--;
|
||||
}
|
||||
|
||||
if (want_blank_before_lbracket())
|
||||
buf_add_char(&code, ' ');
|
||||
ps.want_blank = false;
|
||||
buf_add_char(&code, token.st[0]);
|
||||
|
||||
int indent = ind_add(0, code.st, code.len);
|
||||
|
||||
ps.paren[ps.nparen - 1].indent = indent;
|
||||
ps.paren[ps.nparen - 1].cast = cast_no;
|
||||
debug_println("paren_indents[%d] is now %d", ps.nparen - 1, indent);
|
||||
}
|
||||
|
||||
static void
|
||||
process_rparen(void)
|
||||
{
|
||||
if (ps.nparen == 0) {
|
||||
diag(0, "Extra '%c'", *token.st);
|
||||
|
@ -573,8 +591,8 @@ process_rparen_or_rbracket(void)
|
|||
} else
|
||||
ps.want_blank = true;
|
||||
|
||||
if (code.len == 0) /* if the paren starts the line */
|
||||
ps.line_start_nparen = ps.nparen; /* then indent it */
|
||||
if (code.len == 0)
|
||||
ps.line_start_nparen = ps.nparen;
|
||||
|
||||
unbalanced:
|
||||
buf_add_char(&code, token.st[0]);
|
||||
|
@ -592,6 +610,23 @@ unbalanced:
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
process_rbracket(void)
|
||||
{
|
||||
if (ps.nparen == 0) {
|
||||
diag(0, "Extra '%c'", *token.st);
|
||||
goto unbalanced;
|
||||
}
|
||||
--ps.nparen;
|
||||
|
||||
ps.want_blank = true;
|
||||
if (code.len == 0)
|
||||
ps.line_start_nparen = ps.nparen;
|
||||
|
||||
unbalanced:
|
||||
buf_add_char(&code, token.st[0]);
|
||||
}
|
||||
|
||||
static bool
|
||||
want_blank_before_unary_op(void)
|
||||
{
|
||||
|
@ -691,7 +726,7 @@ process_semicolon(void)
|
|||
ps.init_or_struct = false;
|
||||
ps.seen_case = false; /* only needs to be reset on error */
|
||||
ps.quest_level = 0; /* only needs to be reset on error */
|
||||
if (ps.prev_token == lsym_rparen_or_rbracket)
|
||||
if (ps.prev_token == lsym_rparen)
|
||||
ps.in_func_def_params = false;
|
||||
ps.block_init = false;
|
||||
ps.block_init_level = 0;
|
||||
|
@ -873,7 +908,7 @@ process_type(void)
|
|||
{
|
||||
parse(psym_decl); /* let the parser worry about indentation */
|
||||
|
||||
if (ps.prev_token == lsym_rparen_or_rbracket && ps.tos <= 1) {
|
||||
if (ps.prev_token == lsym_rparen && ps.tos <= 1) {
|
||||
if (code.len > 0)
|
||||
output_line();
|
||||
}
|
||||
|
@ -1068,12 +1103,20 @@ process_lsym(lexer_symbol lsym)
|
|||
process_newline();
|
||||
break;
|
||||
|
||||
case lsym_lparen_or_lbracket:
|
||||
process_lparen_or_lbracket();
|
||||
case lsym_lparen:
|
||||
process_lparen();
|
||||
break;
|
||||
|
||||
case lsym_rparen_or_rbracket:
|
||||
process_rparen_or_rbracket();
|
||||
case lsym_lbracket:
|
||||
process_lbracket();
|
||||
break;
|
||||
|
||||
case lsym_rparen:
|
||||
process_rparen();
|
||||
break;
|
||||
|
||||
case lsym_rbracket:
|
||||
process_rbracket();
|
||||
break;
|
||||
|
||||
case lsym_unary_op:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: indent.h,v 1.162 2023/06/02 14:21:55 rillig Exp $ */
|
||||
/* $NetBSD: indent.h,v 1.163 2023/06/04 10:23:36 rillig Exp $ */
|
||||
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
|
@ -73,8 +73,10 @@ typedef enum lexer_symbol {
|
|||
lsym_preprocessing, /* '#' */
|
||||
lsym_newline,
|
||||
lsym_comment, /* the initial '/ *' or '//' of a comment */
|
||||
lsym_lparen_or_lbracket,
|
||||
lsym_rparen_or_rbracket,
|
||||
lsym_lparen,
|
||||
lsym_lbracket,
|
||||
lsym_rparen,
|
||||
lsym_rbracket,
|
||||
lsym_lbrace,
|
||||
lsym_rbrace,
|
||||
lsym_period,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: lexi.c,v 1.206 2023/05/23 18:16:28 rillig Exp $ */
|
||||
/* $NetBSD: lexi.c,v 1.207 2023/06/04 10:23:36 rillig Exp $ */
|
||||
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-4-Clause
|
||||
|
@ -38,7 +38,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: lexi.c,v 1.206 2023/05/23 18:16:28 rillig Exp $");
|
||||
__RCSID("$NetBSD: lexi.c,v 1.207 2023/06/04 10:23:36 rillig Exp $");
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
@ -438,7 +438,8 @@ is_asterisk_unary(void)
|
|||
if (ps.next_unary || ps.in_func_def_params)
|
||||
return true;
|
||||
if (ps.prev_token == lsym_word ||
|
||||
ps.prev_token == lsym_rparen_or_rbracket)
|
||||
ps.prev_token == lsym_rparen ||
|
||||
ps.prev_token == lsym_rbracket)
|
||||
return false;
|
||||
return ps.in_decl && ps.nparen > 0;
|
||||
}
|
||||
|
@ -555,10 +556,10 @@ lexi(void)
|
|||
switch (token.mem[token.len - 1]) {
|
||||
|
||||
/* INDENT OFF */
|
||||
case '(':
|
||||
case '[': lsym = lsym_lparen_or_lbracket; next_unary = true; break;
|
||||
case ')':
|
||||
case ']': lsym = lsym_rparen_or_rbracket; next_unary = false; break;
|
||||
case '(': lsym = lsym_lparen; next_unary = true; break;
|
||||
case '[': lsym = lsym_lbracket; next_unary = true; break;
|
||||
case ')': lsym = lsym_rparen; next_unary = false; break;
|
||||
case ']': lsym = lsym_rbracket; next_unary = false; break;
|
||||
case '?': lsym = lsym_question; next_unary = true; break;
|
||||
case ':': lsym = lsym_colon; next_unary = true; break;
|
||||
case ';': lsym = lsym_semicolon; next_unary = true; break;
|
||||
|
@ -596,7 +597,8 @@ lexi(void)
|
|||
if (inp.st[0] == token.mem[token.len - 1]) {
|
||||
token_add_char(*inp.st++);
|
||||
if (ps.prev_token == lsym_word ||
|
||||
ps.prev_token == lsym_rparen_or_rbracket) {
|
||||
ps.prev_token == lsym_rparen ||
|
||||
ps.prev_token == lsym_rbracket) {
|
||||
lsym = ps.next_unary
|
||||
? lsym_unary_op : lsym_postfix_op;
|
||||
next_unary = false;
|
||||
|
|
Loading…
Reference in New Issue