diff --git a/vlib/v/fmt/comments.v b/vlib/v/fmt/comments.v new file mode 100644 index 0000000000..67d5b93236 --- /dev/null +++ b/vlib/v/fmt/comments.v @@ -0,0 +1,96 @@ +// Copyright (c) 2019-2021 Alexander Medvednikov. All rights reserved. +// Use of this source code is governed by an MIT license +// that can be found in the LICENSE file. +module fmt + +import v.ast + +enum CommentsLevel { + keep + indent +} + +// CommentsOptions defines the way comments are going to be written +// - has_nl: adds an newline at the end of the list of comments +// - 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) +struct CommentsOptions { + has_nl bool = true + inline bool + level CommentsLevel + iembed bool +} + +pub fn (mut f Fmt) comment(node ast.Comment, options CommentsOptions) { + if node.text.starts_with('#!') { + f.writeln(node.text) + return + } + if options.iembed { + x := node.text.trim_left('\x01') + if x.contains('\n') { + f.writeln('/*') + f.writeln(x.trim_space()) + f.write('*/') + } else { + f.write('/* ${x.trim(' ')} */') + } + return + } + if !node.text.contains('\n') { + is_separate_line := !options.inline || node.text.starts_with('\x01') + mut s := node.text.trim_left('\x01') + mut out_s := '//' + if s != '' { + match s[0] { + `a`...`z`, `A`...`Z`, `0`...`9` { out_s += ' ' } + else {} + } + out_s += s + } + if !is_separate_line && f.indent > 0 { + f.remove_new_line() // delete the generated \n + f.write(' ') + } + f.write(out_s) + return + } + lines := node.text.trim_space().split_into_lines() + f.writeln('/*') + for line in lines { + f.writeln(line) + f.empty_line = false + } + f.empty_line = true + f.write('*/') +} + +pub fn (mut f Fmt) comments(comments []ast.Comment, options CommentsOptions) { + for i, c in comments { + if !f.out.last_n(1)[0].is_space() { + f.write(' ') + } + if options.level == .indent { + f.indent++ + } + f.comment(c, options) + if i < comments.len - 1 || options.has_nl { + f.writeln('') + } + if options.level == .indent { + f.indent-- + } + } +} + +pub fn (mut f Fmt) comments_after_last_field(comments []ast.Comment) { + // Handle comments after last field + for comment in comments { + f.indent++ + f.empty_line = true + f.comment(comment, inline: true) + f.writeln('') + f.indent-- + } +} diff --git a/vlib/v/fmt/fmt.v b/vlib/v/fmt/fmt.v index ab77dd7607..f034f531cc 100644 --- a/vlib/v/fmt/fmt.v +++ b/vlib/v/fmt/fmt.v @@ -819,17 +819,6 @@ pub fn (mut f Fmt) struct_decl(node ast.StructDecl) { f.writeln('}\n') } -pub fn (mut f Fmt) comments_after_last_field(comments []ast.Comment) { - // Handle comments after last field - for comment in comments { - f.indent++ - f.empty_line = true - f.comment(comment, inline: true) - f.writeln('') - f.indent-- - } -} - pub fn (mut f Fmt) interface_decl(node ast.InterfaceDecl) { if node.is_pub { f.write('pub ') @@ -1393,85 +1382,6 @@ fn inline_attrs_len(attrs []table.Attr) int { return n } -enum CommentsLevel { - keep - indent -} - -// CommentsOptions defines the way comments are going to be written -// - has_nl: adds an newline at the end of the list of comments -// - 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) -struct CommentsOptions { - has_nl bool = true - inline bool - level CommentsLevel - iembed bool -} - -pub fn (mut f Fmt) comment(node ast.Comment, options CommentsOptions) { - if node.text.starts_with('#!') { - f.writeln(node.text) - return - } - if options.iembed { - x := node.text.trim_left('\x01') - if x.contains('\n') { - f.writeln('/*') - f.writeln(x.trim_space()) - f.write('*/') - } else { - f.write('/* ${x.trim(' ')} */') - } - return - } - if !node.text.contains('\n') { - is_separate_line := !options.inline || node.text.starts_with('\x01') - mut s := node.text.trim_left('\x01') - mut out_s := '//' - if s != '' { - match s[0] { - `a`...`z`, `A`...`Z`, `0`...`9` { out_s += ' ' } - else {} - } - out_s += s - } - if !is_separate_line && f.indent > 0 { - f.remove_new_line() // delete the generated \n - f.write(' ') - } - f.write(out_s) - return - } - lines := node.text.trim_space().split_into_lines() - f.writeln('/*') - for line in lines { - f.writeln(line) - f.empty_line = false - } - f.empty_line = true - f.write('*/') -} - -pub fn (mut f Fmt) comments(comments []ast.Comment, options CommentsOptions) { - for i, c in comments { - if !f.out.last_n(1)[0].is_space() { - f.write(' ') - } - if options.level == .indent { - f.indent++ - } - f.comment(c, options) - if i < comments.len - 1 || options.has_nl { - f.writeln('') - } - if options.level == .indent { - f.indent-- - } - } -} - pub fn (mut f Fmt) fn_decl(node ast.FnDecl) { // println('$it.name find_comment($it.pos.line_nr)') // f.find_comment(it.pos.line_nr)