v/vlib/compiler/vfmt.v

174 lines
3.3 KiB
V
Raw Normal View History

2019-07-29 18:21:36 +02:00
// Copyright (c) 2019 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 compiler
2019-07-29 18:21:36 +02:00
2019-08-17 21:19:37 +02:00
import strings
2019-11-09 20:05:44 +01:00
import os
2019-07-29 18:21:36 +02:00
2019-10-27 10:16:33 +01:00
[if vfmt]
fn (scanner mut Scanner) fgen(s_ string) {
2019-08-17 21:19:37 +02:00
mut s := s_
2019-07-29 18:21:36 +02:00
if scanner.fmt_line_empty {
s = strings.repeat(`\t`, scanner.fmt_indent) + s
}
//scanner.fmt_out << s
2019-07-29 18:21:36 +02:00
scanner.fmt_out.write(s)
scanner.fmt_line_empty = false
}
2019-10-27 10:16:33 +01:00
[if vfmt]
fn (scanner mut Scanner) fgenln(s_ string) {
2019-08-17 21:19:37 +02:00
mut s := s_
2019-11-11 15:18:32 +01:00
if scanner.fmt_line_empty && scanner.fmt_indent > 0 {
2019-07-29 18:21:36 +02:00
s = strings.repeat(`\t`, scanner.fmt_indent) + s
}
//scanner.fmt_out << s
//scanner.fmt_out << '\n'
2019-07-29 18:21:36 +02:00
scanner.fmt_out.writeln(s)
scanner.fmt_line_empty = true
}
2019-11-09 17:13:26 +01:00
2019-10-27 10:16:33 +01:00
[if vfmt]
2019-07-29 18:21:36 +02:00
fn (p mut Parser) fgen(s string) {
2019-11-09 17:13:26 +01:00
if p.pass != .main {
return
}
2019-07-29 18:21:36 +02:00
p.scanner.fgen(s)
}
2019-10-27 10:16:33 +01:00
[if vfmt]
2019-07-29 18:21:36 +02:00
fn (p mut Parser) fspace() {
2019-11-09 17:13:26 +01:00
if p.first_pass() {
return
}
2019-11-10 01:08:53 +01:00
p.fgen(' ')
2019-07-29 18:21:36 +02:00
}
2019-11-09 17:13:26 +01:00
2019-10-27 10:16:33 +01:00
[if vfmt]
2019-07-29 18:21:36 +02:00
fn (p mut Parser) fgenln(s string) {
2019-11-09 17:13:26 +01:00
if p.pass != .main {
return
}
2019-07-29 18:21:36 +02:00
p.scanner.fgenln(s)
}
/*
fn (p mut Parser) peek() TokenKind {
2019-07-29 18:21:36 +02:00
for {
p.cgen.line = p.scanner.line_nr + 1
2019-07-29 18:21:36 +02:00
tok := p.scanner.peek()
if tok != .nl {
return tok
}
}
return .eof // TODO can never get here - v doesn't know that
2019-07-29 18:21:36 +02:00
}
*/
2019-07-29 18:21:36 +02:00
2019-10-27 10:16:33 +01:00
[if vfmt]
2019-07-29 18:21:36 +02:00
fn (p mut Parser) fmt_inc() {
2019-11-09 17:13:26 +01:00
if p.pass != .main {
return
}
2019-07-29 18:21:36 +02:00
p.scanner.fmt_indent++
}
2019-10-27 10:16:33 +01:00
[if vfmt]
2019-07-29 18:21:36 +02:00
fn (p mut Parser) fmt_dec() {
2019-11-09 17:13:26 +01:00
if p.pass != .main {
return
}
2019-07-29 18:21:36 +02:00
p.scanner.fmt_indent--
}
2019-11-11 06:58:50 +01:00
[if vfmt]
fn (p mut Scanner) init_fmt() {
2019-11-11 15:18:32 +01:00
// Right now we can't do `$if vfmt {`, so I'm using
// a conditional function init_fmt to set this flag.
// This function will only be called if `-d vfmt` is passed.
2019-11-11 06:58:50 +01:00
p.is_fmt = true
}
2019-11-09 17:13:26 +01:00
[if vfmt]
fn (p mut Parser) fnext() {
2019-11-11 15:18:32 +01:00
//if p.tok == .eof {
//println('eof ret')
//return
//}
2019-11-10 01:08:53 +01:00
if p.tok == .rcbr && !p.inside_if_expr && p.prev_tok != .lcbr {
2019-11-09 17:13:26 +01:00
p.fmt_dec()
}
2019-11-10 01:08:53 +01:00
mut s := p.strtok()
2019-11-11 15:18:32 +01:00
if p.tok != .eof {
2019-11-10 01:08:53 +01:00
p.fgen(s)
2019-11-11 15:18:32 +01:00
}
2019-11-09 17:13:26 +01:00
// vfmt: increase indentation on `{` unless it's `{}`
2019-11-10 01:08:53 +01:00
if p.tok == .lcbr && !p.inside_if_expr && p.peek() != .rcbr {
p.fgenln('')
2019-11-09 17:13:26 +01:00
p.fmt_inc()
}
2019-11-11 15:18:32 +01:00
// Skip comments and add them to vfmt output
if p.tokens[p.token_idx].tok in [.line_comment, .mline_comment] {
// Newline before the comment and after consts and closing }
if p.inside_const {
p.fgenln('\n')
}
if p.tok == .rcbr {
p.fgenln('')
}
for p.token_idx < p.tokens.len - 1 {
tok := p.tokens[p.token_idx].tok
if tok != .line_comment && tok != .mline_comment {
break
}
comment_token := p.tokens[p.token_idx]
comment := comment_token.lit
if p.token_idx > 0 && comment_token.line_nr > p.tokens[p.token_idx-1].line_nr {
//p.fgenln('')
}
if tok == .line_comment {
p.fgen('// ' + comment)
} else {
p.fgen(comment)
}
if p.token_idx > 0 &&
comment_token.line_nr < p.tokens[p.token_idx+1].line_nr
{
p.fgenln('')
}
p.token_idx++
}
}
2019-11-09 17:13:26 +01:00
}
2019-11-09 20:05:44 +01:00
[if vfmt]
fn (p mut Parser) gen_fmt() {
if p.pass != .main {
return
}
if p.file_name == '' {
return
}
2019-11-11 15:18:32 +01:00
//s := p.scanner.fmt_out.str().replace('\n\n\n', '\n').trim_space()
2019-11-09 20:05:44 +01:00
s := p.scanner.fmt_out.str().trim_space()
//s := p.scanner.fmt_out.join('').trim_space()
2019-11-09 20:05:44 +01:00
if s == '' {
return
}
println('GENERATING ${p.file_name}.V')
out := os.create('/var/tmp/fmt/' + p.file_name) or {
verror('failed to create fmt.v')
return
}
out.writeln(s)//p.scanner.fmt_out.str().trim_space())
2019-11-09 20:05:44 +01:00
out.close()
}