fmt: keep empty line between if statement and comment (#8846)
							parent
							
								
									901aa83e65
								
							
						
					
					
						commit
						a86bf3254a
					
				| 
						 | 
				
			
			@ -15,11 +15,13 @@ enum CommentsLevel {
 | 
			
		|||
// - inline: single-line comments will be on the same line as the last statement
 | 
			
		||||
// - iembed: a /* ... */ embedded comment; used in expressions; // comments the whole line
 | 
			
		||||
// - level:  either .keep (don't indent), or .indent (increment indentation)
 | 
			
		||||
// - prev_line: the line number of the previous token
 | 
			
		||||
struct CommentsOptions {
 | 
			
		||||
	has_nl bool = true
 | 
			
		||||
	inline bool
 | 
			
		||||
	level  CommentsLevel
 | 
			
		||||
	iembed bool
 | 
			
		||||
	has_nl    bool = true
 | 
			
		||||
	inline    bool
 | 
			
		||||
	level     CommentsLevel
 | 
			
		||||
	iembed    bool
 | 
			
		||||
	prev_line int = -1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn (mut f Fmt) comment(node ast.Comment, options CommentsOptions) {
 | 
			
		||||
| 
						 | 
				
			
			@ -79,14 +81,19 @@ pub fn (mut f Fmt) comment(node ast.Comment, options CommentsOptions) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
pub fn (mut f Fmt) comments(comments []ast.Comment, options CommentsOptions) {
 | 
			
		||||
	mut prev_line := options.prev_line
 | 
			
		||||
	for i, c in comments {
 | 
			
		||||
		if !f.out.last_n(1)[0].is_space() {
 | 
			
		||||
			f.write(' ')
 | 
			
		||||
		}
 | 
			
		||||
		if options.prev_line > -1 && c.pos.line_nr > prev_line + 1 {
 | 
			
		||||
			f.writeln('')
 | 
			
		||||
		}
 | 
			
		||||
		f.comment(c, options)
 | 
			
		||||
		if !options.iembed && (i < comments.len - 1 || options.has_nl) {
 | 
			
		||||
			f.writeln('')
 | 
			
		||||
		}
 | 
			
		||||
		prev_line = c.pos.last_line
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -102,7 +102,7 @@ pub fn (mut f Fmt) write(s string) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
pub fn (mut f Fmt) writeln(s string) {
 | 
			
		||||
	if f.indent > 0 && f.empty_line {
 | 
			
		||||
	if f.indent > 0 && f.empty_line && s.len > 0 {
 | 
			
		||||
		f.write_indent()
 | 
			
		||||
	}
 | 
			
		||||
	f.out.writeln(s)
 | 
			
		||||
| 
						 | 
				
			
			@ -1657,10 +1657,10 @@ pub fn (mut f Fmt) wrap_infix(start_pos int, start_len int, ignore_paren bool) {
 | 
			
		|||
 | 
			
		||||
pub fn (mut f Fmt) if_expr(node ast.IfExpr) {
 | 
			
		||||
	dollar := if node.is_comptime { '$' } else { '' }
 | 
			
		||||
	mut single_line := node.branches.len == 2 && node.has_else
 | 
			
		||||
	mut is_ternary := node.branches.len == 2 && node.has_else
 | 
			
		||||
		&& branch_is_single_line(node.branches[0]) && branch_is_single_line(node.branches[1])
 | 
			
		||||
		&& (node.is_expr || f.is_assign || f.is_struct_init || f.single_line_fields)
 | 
			
		||||
	f.single_line_if = single_line
 | 
			
		||||
	f.single_line_if = is_ternary
 | 
			
		||||
	start_pos := f.out.len
 | 
			
		||||
	start_len := f.line_len
 | 
			
		||||
	for {
 | 
			
		||||
| 
						 | 
				
			
			@ -1693,20 +1693,20 @@ pub fn (mut f Fmt) if_expr(node ast.IfExpr) {
 | 
			
		|||
				}
 | 
			
		||||
			}
 | 
			
		||||
			f.write('{')
 | 
			
		||||
			if single_line {
 | 
			
		||||
			if is_ternary {
 | 
			
		||||
				f.write(' ')
 | 
			
		||||
			} else {
 | 
			
		||||
				f.writeln('')
 | 
			
		||||
			}
 | 
			
		||||
			f.stmts(branch.stmts)
 | 
			
		||||
			if single_line {
 | 
			
		||||
			if is_ternary {
 | 
			
		||||
				f.write(' ')
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		// When a single line if is really long, write it again as multiline,
 | 
			
		||||
		// except it is part of an InfixExpr.
 | 
			
		||||
		if single_line && f.line_len > fmt.max_len.last() && !f.buffering {
 | 
			
		||||
			single_line = false
 | 
			
		||||
		if is_ternary && f.line_len > fmt.max_len.last() && !f.buffering {
 | 
			
		||||
			is_ternary = false
 | 
			
		||||
			f.single_line_if = false
 | 
			
		||||
			f.out.go_back_to(start_pos)
 | 
			
		||||
			f.line_len = start_len
 | 
			
		||||
| 
						 | 
				
			
			@ -1719,7 +1719,10 @@ pub fn (mut f Fmt) if_expr(node ast.IfExpr) {
 | 
			
		|||
	f.single_line_if = false
 | 
			
		||||
	if node.post_comments.len > 0 {
 | 
			
		||||
		f.writeln('')
 | 
			
		||||
		f.comments(node.post_comments, has_nl: false)
 | 
			
		||||
		f.comments(node.post_comments, 
 | 
			
		||||
			has_nl: false
 | 
			
		||||
			prev_line: node.branches.last().body_pos.last_line
 | 
			
		||||
		)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -82,3 +82,17 @@ fn linebreaks_in_block_comments() {
 | 
			
		|||
	eggs
 | 
			
		||||
	*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn between_if_branches() {
 | 
			
		||||
	if spam {
 | 
			
		||||
	}
 | 
			
		||||
	// remove the empty line above
 | 
			
		||||
	else if eggs {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if spam2 {
 | 
			
		||||
	}
 | 
			
		||||
	// remove the empty line below
 | 
			
		||||
	else {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,3 +65,19 @@ fn linebreaks_in_block_comments() {
 | 
			
		|||
	spaces make no difference there
 | 
			
		||||
	eggs */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn between_if_branches() {
 | 
			
		||||
	if spam {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// remove the empty line above
 | 
			
		||||
	else if eggs {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if spam2 {
 | 
			
		||||
	}
 | 
			
		||||
	// remove the empty line below
 | 
			
		||||
 | 
			
		||||
	else {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,9 +20,6 @@ fn main() {
 | 
			
		|||
	u := User{
 | 
			
		||||
		name: 'Peter'
 | 
			
		||||
	}
 | 
			
		||||
	if true {
 | 
			
		||||
	}
 | 
			
		||||
	// some comment after an if without else
 | 
			
		||||
	n := sizeof(User)
 | 
			
		||||
	// else
 | 
			
		||||
	// else {
 | 
			
		||||
| 
						 | 
				
			
			@ -60,3 +57,15 @@ fn linebreaks_in_block_comments() {
 | 
			
		|||
	no problem
 | 
			
		||||
	*****/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn ifs_comments_and_empty_lines() {
 | 
			
		||||
	if true {
 | 
			
		||||
	}
 | 
			
		||||
	// some comment after an if without else
 | 
			
		||||
	if false {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// this is parsed as post_comment of the if but does not really belong there
 | 
			
		||||
	// thereore keep the empty line
 | 
			
		||||
	something_else()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue