2020-02-21 18:13:34 +01:00
|
|
|
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
|
|
|
// Use of this source code is governed by an MIT license
|
|
|
|
// that can be found in the LICENSE file.
|
2020-02-19 16:12:39 +01:00
|
|
|
module ast
|
2020-02-21 18:13:34 +01:00
|
|
|
/*
|
|
|
|
These methods are used only by vfmt, vdoc, and for debugging.
|
|
|
|
*/
|
|
|
|
|
2020-02-19 16:12:39 +01:00
|
|
|
|
|
|
|
import (
|
|
|
|
v.table
|
|
|
|
strings
|
|
|
|
)
|
|
|
|
|
|
|
|
pub fn (node &FnDecl) str(t &table.Table) string {
|
|
|
|
mut f := strings.new_builder(30)
|
|
|
|
mut receiver := ''
|
|
|
|
if node.is_method {
|
|
|
|
sym := t.get_type_symbol(node.receiver.typ)
|
|
|
|
name := sym.name.after('.')
|
|
|
|
m := if node.rec_mut { 'mut ' } else { '' }
|
2020-02-29 15:04:07 +01:00
|
|
|
receiver = '($node.receiver.name $m$name) '
|
2020-02-19 16:12:39 +01:00
|
|
|
}
|
2020-02-22 16:59:50 +01:00
|
|
|
name := node.name.after('.')
|
|
|
|
f.write('fn ${receiver}${name}(')
|
2020-02-19 16:12:39 +01:00
|
|
|
for i, arg in node.args {
|
|
|
|
is_last_arg := i == node.args.len - 1
|
2020-02-29 15:04:07 +01:00
|
|
|
should_add_type := is_last_arg || node.args[i + 1].typ != arg.typ ||
|
|
|
|
(node.is_variadic && i == node.args.len - 2)
|
2020-02-19 16:12:39 +01:00
|
|
|
f.write(arg.name)
|
|
|
|
if should_add_type {
|
2020-02-29 15:04:07 +01:00
|
|
|
if node.is_variadic && is_last_arg {
|
|
|
|
f.write(' ...' + t.type_to_str(arg.typ))
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
f.write(' ' + t.type_to_str(arg.typ))
|
|
|
|
}
|
2020-02-19 16:12:39 +01:00
|
|
|
}
|
|
|
|
if !is_last_arg {
|
|
|
|
f.write(', ')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f.write(')')
|
|
|
|
if node.typ != table.void_type {
|
2020-02-28 17:21:20 +01:00
|
|
|
// typ := t.type_to_str(node.typ)
|
|
|
|
// if typ.starts_with('
|
2020-02-21 14:47:42 +01:00
|
|
|
f.write(' ' + t.type_to_str(node.typ))
|
2020-02-19 16:12:39 +01:00
|
|
|
}
|
|
|
|
return f.str()
|
|
|
|
}
|
2020-02-27 21:29:38 +01:00
|
|
|
|
|
|
|
// string representaiton of expr
|
|
|
|
pub fn (x Expr) str() string {
|
|
|
|
match x {
|
|
|
|
InfixExpr {
|
|
|
|
return '(${it.left.str()} $it.op.str() ${it.right.str()})'
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
PrefixExpr {
|
|
|
|
return it.left.str() + it.op.str()
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
IntegerLiteral {
|
|
|
|
return it.val.str()
|
|
|
|
}
|
|
|
|
IntegerLiteral {
|
|
|
|
return '"$it.val"'
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return ''
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn (node Stmt) str() string {
|
|
|
|
match node {
|
|
|
|
VarDecl {
|
|
|
|
return it.name + ' = ' + it.expr.str()
|
|
|
|
}
|
|
|
|
ExprStmt {
|
|
|
|
return it.expr.str()
|
|
|
|
}
|
|
|
|
FnDecl {
|
|
|
|
return 'fn ${it.name}() { $it.stmts.len stmts }'
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return '[unhandled stmt str]'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|