fmt: avoid breaking lines with <= 100 characters
parent
7efb3ecb34
commit
000eaca6be
|
@ -12,7 +12,7 @@ const (
|
|||
'\t\t\t\t\t\t\t\t'
|
||||
]
|
||||
// when to break a line dependant on penalty
|
||||
max_len = [0, 30, 85, 100]
|
||||
max_len = [0, 30, 85, 95, 100]
|
||||
)
|
||||
|
||||
pub struct Fmt {
|
||||
|
@ -21,9 +21,13 @@ pub:
|
|||
pub mut:
|
||||
out_imports strings.Builder
|
||||
out strings.Builder
|
||||
out_save strings.Builder
|
||||
indent int
|
||||
empty_line bool
|
||||
line_len int
|
||||
expr_recursion int
|
||||
expr_bufs []string
|
||||
penalties []int
|
||||
single_line_if bool
|
||||
cur_mod string
|
||||
file ast.File
|
||||
|
@ -80,33 +84,69 @@ fn (mut f Fmt) find_comment(line_nr int) {
|
|||
}
|
||||
}
|
||||
*/
|
||||
|
||||
pub fn (mut f Fmt) write(s string) {
|
||||
if f.indent > 0 && f.empty_line {
|
||||
if f.indent < tabs.len {
|
||||
f.out.write(tabs[f.indent])
|
||||
} else {
|
||||
// too many indents, do it the slow way:
|
||||
for _ in 0 .. f.indent {
|
||||
f.out.write('\t')
|
||||
if f.expr_recursion == 0 || f.is_inside_interp {
|
||||
if f.indent > 0 && f.empty_line {
|
||||
if f.indent < tabs.len {
|
||||
f.out.write(tabs[f.indent])
|
||||
} else {
|
||||
// too many indents, do it the slow way:
|
||||
for _ in 0 .. f.indent {
|
||||
f.out.write('\t')
|
||||
}
|
||||
}
|
||||
f.line_len += f.indent * 4
|
||||
}
|
||||
f.line_len += f.indent * 4
|
||||
f.out.write(s)
|
||||
f.line_len += s.len
|
||||
f.empty_line = false
|
||||
} else {
|
||||
f.out.write(s)
|
||||
}
|
||||
f.out.write(s)
|
||||
f.line_len += s.len
|
||||
f.empty_line = false
|
||||
}
|
||||
|
||||
pub fn (mut f Fmt) writeln(s string) {
|
||||
empty_fifo := f.expr_recursion > 0
|
||||
if empty_fifo {
|
||||
f.write(s)
|
||||
f.expr_bufs << f.out.str()
|
||||
f.out = f.out_save
|
||||
f.adjust_complete_line()
|
||||
f.expr_recursion = 0
|
||||
for i, p in f.penalties {
|
||||
f.write(f.expr_bufs[i])
|
||||
f.wrap_long_line(p, true)
|
||||
}
|
||||
f.write(f.expr_bufs[f.expr_bufs.len-1])
|
||||
f.expr_bufs = []string{}
|
||||
f.penalties = []int{}
|
||||
f.expr_recursion = 0
|
||||
}
|
||||
if f.indent > 0 && f.empty_line {
|
||||
// println(f.indent.str() + s)
|
||||
f.out.write(tabs[f.indent])
|
||||
}
|
||||
f.out.writeln(s)
|
||||
f.out.writeln(if empty_fifo {''} else {s})
|
||||
f.empty_line = true
|
||||
f.line_len = 0
|
||||
}
|
||||
|
||||
// adjustments that can only be done after full line is processed. For now
|
||||
// only prevents line breaks if everything fits in max_len[last] by increasing
|
||||
// penalties to maximum
|
||||
fn (mut f Fmt) adjust_complete_line() {
|
||||
mut l := 0
|
||||
for _, s in f.expr_bufs {
|
||||
l += s.len
|
||||
}
|
||||
if f.line_len + l <= max_len[max_len.len-1] {
|
||||
for i, _ in f.penalties {
|
||||
f.penalties[i] = max_len.len-1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn (mut f Fmt) mod(mod ast.Module) {
|
||||
f.cur_mod = mod.name
|
||||
if mod.is_skipped {
|
||||
|
@ -625,11 +665,20 @@ pub fn (mut f Fmt) expr(node ast.Expr) {
|
|||
f.expr(node.expr)
|
||||
}
|
||||
ast.InfixExpr {
|
||||
f.expr(node.left)
|
||||
if f.is_inside_interp {
|
||||
f.expr(node.left)
|
||||
f.write('$node.op.str()')
|
||||
f.expr(node.right)
|
||||
} else {
|
||||
rec_save := f.expr_recursion
|
||||
if f.expr_recursion == 0 {
|
||||
f.out_save = f.out
|
||||
f.out = strings.new_builder(60)
|
||||
f.expr_recursion++
|
||||
}
|
||||
f.expr(node.left)
|
||||
f.write(' $node.op.str() ')
|
||||
f.expr_bufs << f.out.str()
|
||||
mut penalty := 3
|
||||
if node.left is ast.InfixExpr || node.left is ast.ParExpr {
|
||||
penalty--
|
||||
|
@ -637,9 +686,24 @@ pub fn (mut f Fmt) expr(node ast.Expr) {
|
|||
if node.right is ast.InfixExpr || node.right is ast.ParExpr {
|
||||
penalty--
|
||||
}
|
||||
f.wrap_long_line(penalty, true)
|
||||
f.penalties << penalty
|
||||
f.out = strings.new_builder(60)
|
||||
f.expr_recursion++
|
||||
f.expr(node.right)
|
||||
if rec_save == 0 && f.expr_recursion > 0 { // now decide if and where to break
|
||||
f.expr_bufs << f.out.str()
|
||||
f.out = f.out_save
|
||||
f.expr_recursion = 0
|
||||
f.adjust_complete_line()
|
||||
for i, p in f.penalties {
|
||||
f.write(f.expr_bufs[i])
|
||||
f.wrap_long_line(p, true)
|
||||
}
|
||||
f.write(f.expr_bufs[f.expr_bufs.len-1])
|
||||
f.expr_bufs = []string{}
|
||||
f.penalties = []int{}
|
||||
}
|
||||
}
|
||||
f.expr(node.right)
|
||||
}
|
||||
ast.IndexExpr {
|
||||
f.expr(node.left)
|
||||
|
|
|
@ -39,3 +39,10 @@ fn get_some_val(a_test, b_test, c_test, d_test, e_test, f_test f64) {
|
|||
e_test * f_test * a_test * d_test +
|
||||
a_test * b_test * c_test
|
||||
}
|
||||
|
||||
fn main() {
|
||||
a, b, r, d := 5.3, 7.5, 4.4, 6.6
|
||||
if a + b + r * d + a + b + r * d > a + b + r * d + a * b + r {
|
||||
println('ok')
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,3 +45,13 @@ fn get_some_val(a_test, b_test, c_test, d_test, e_test, f_test f64) {
|
|||
d_test+e_test*f_test*a_test*d_test+a_test*
|
||||
b_test*c_test
|
||||
}
|
||||
|
||||
fn main() {
|
||||
a, b, r, d := 5.3, 7.5, 4.4, 6.6
|
||||
if a+b+
|
||||
r*d+a+b+r*
|
||||
d > a+b+r*d+
|
||||
a*b+r {
|
||||
println('ok')
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue