fmt: respect user choice of newlines between functions without body (#8838)
							parent
							
								
									783cee98d9
								
							
						
					
					
						commit
						329e3938d9
					
				|  | @ -304,18 +304,29 @@ pub fn (f Fmt) imp_stmt_str(imp ast.Import) string { | |||
| 
 | ||||
| fn (mut f Fmt) should_insert_newline_before_stmt(stmt ast.Stmt, prev_stmt ast.Stmt) bool { | ||||
| 	prev_line_nr := prev_stmt.position().last_line | ||||
| 	// No need to insert a newline if there is already one
 | ||||
| 	if f.out.last_n(2) == '\n\n' { | ||||
| 		return false | ||||
| 	} | ||||
| 	// Force a newline after a block of HashStmts
 | ||||
| 	if prev_stmt is ast.HashStmt && stmt !is ast.HashStmt && stmt !is ast.ExprStmt { | ||||
| 		return true | ||||
| 	} | ||||
| 	// The stmt either has or shouldn't have a newline before
 | ||||
| 	if stmt.position().line_nr - prev_line_nr <= 1 || f.out.last_n(2) == '\n\n' { | ||||
| 	// Force a newline after a block of function declarations
 | ||||
| 	if prev_stmt is ast.FnDecl { | ||||
| 		if prev_stmt.no_body && stmt !is ast.FnDecl { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	// The stmt shouldn't have a newline before
 | ||||
| 	if stmt.position().line_nr - prev_line_nr <= 1 { | ||||
| 		return false | ||||
| 	} | ||||
| 	// Imports are handled special hence they are ignored here
 | ||||
| 	if stmt is ast.Import || prev_stmt is ast.Import { | ||||
| 		return false | ||||
| 	} | ||||
| 	// Attributes are not respected in the stmts position, so we have to check it manually
 | ||||
| 	// Attributes are not respected in the stmts position, so this requires a manual check
 | ||||
| 	if stmt is ast.StructDecl { | ||||
| 		if stmt.attrs.len > 0 && stmt.attrs[0].pos.line_nr - prev_line_nr <= 1 { | ||||
| 			return false | ||||
|  | @ -640,7 +651,7 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) { | |||
| 		f.write('>') | ||||
| 	} | ||||
| 	if node.fields.len == 0 && node.embeds.len == 0 && node.pos.line_nr == node.pos.last_line { | ||||
| 		f.writeln(' {}\n') | ||||
| 		f.writeln(' {}') | ||||
| 		return | ||||
| 	} | ||||
| 	f.writeln(' {') | ||||
|  | @ -1120,10 +1131,10 @@ pub fn (mut f Fmt) fn_decl(node ast.FnDecl) { | |||
| 			f.write('}') | ||||
| 		} | ||||
| 		if !node.is_anon { | ||||
| 			f.writeln('\n') | ||||
| 			f.writeln('') | ||||
| 		} | ||||
| 	} else { | ||||
| 		f.writeln('\n') | ||||
| 		f.writeln('') | ||||
| 	} | ||||
| 	// Mark all function's used type so that they are not removed from imports
 | ||||
| 	for arg in node.params { | ||||
|  |  | |||
|  | @ -2,6 +2,11 @@ | |||
| [manualfree] | ||||
| module websocket | ||||
| 
 | ||||
| fn C.no_body_function() | ||||
| fn C.another_one(x int) | ||||
| 
 | ||||
| fn C.separated_from_my_body_and_the_above() | ||||
| 
 | ||||
| fn main() {} | ||||
| 
 | ||||
| // This should stay between both functions
 | ||||
|  | @ -15,5 +20,5 @@ fn y_with_attr() { | |||
| 
 | ||||
| // doc comment above an attributed struct
 | ||||
| [typedef] | ||||
| struct Foo { | ||||
| struct FooWithAttr { | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue