From 2f0bb11a960923fa443f9238c1ced13a2c05101e Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 10 Mar 2020 14:40:30 +0100 Subject: [PATCH] parser: handle operator methods and fix them in vdoc --- vlib/bignum/bignum.v | 6 +++--- vlib/v/gen/cgen.v | 25 +++++++++++++++++++++++++ vlib/v/parser/fn.v | 4 ++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/vlib/bignum/bignum.v b/vlib/bignum/bignum.v index 09576d29aa..060fc642cb 100644 --- a/vlib/bignum/bignum.v +++ b/vlib/bignum/bignum.v @@ -33,7 +33,7 @@ fn C.bignum_xor( a &Number, b &Number, c &Number) // c = a xor b fn C.bignum_lshift( a &Number, b &Number, nbits int) // b = a << nbits fn C.bignum_rshift( a &Number, b &Number, nbits int) // b = a >> nbits -fn C.bignum_cmp( a &Number, b &Number) int +fn C.bignum_cmp( a &Number, b &Number) int fn C.bignum_is_zero( a &Number) int fn C.bignum_inc(n &Number) fn C.bignum_dec(n &Number) @@ -176,7 +176,7 @@ pub fn (a Number) clone() Number { return b } //////////////////////////////////////////////////////////// -pub fn factorial(nn bignum.Number) bignum.Number { +pub fn factorial(nn Number) Number { mut n := nn.clone() mut a := nn.clone() n.dec() @@ -190,6 +190,6 @@ pub fn factorial(nn bignum.Number) bignum.Number { return a } -pub fn fact(n int) bignum.Number { +pub fn fact(n int) Number { return factorial( bignum.from_int(n) ) } diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 960fe713dc..2c8e8b61c8 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -350,6 +350,9 @@ fn (g mut Gen) gen_fn_decl(it ast.FnDecl) { name = g.table.get_type_symbol(it.receiver.typ).name + '_' + name } name = name.replace('.', '__') + if name.starts_with('_op_') { + name = op_to_fn_name(name) + } // type_name := g.table.type_to_str(it.typ) type_name := g.typ(it.typ) g.write('$type_name ${name}(') @@ -949,3 +952,25 @@ fn (g &Gen) sort_structs(types []table.TypeSymbol) []table.TypeSymbol { } return types_sorted } + +fn op_to_fn_name(name string) string { + return match name { + '+'{ + '_op_plus' + } + '-'{ + '_op_minus' + } + '*'{ + '_op_mul' + } + '/'{ + '_op_div' + } + '%'{ + '_op_mod' + } + else { + 'bad op $name'} + } +} diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index 9d07339ef3..1453aa6b29 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -99,6 +99,10 @@ fn (p mut Parser) fn_decl() ast.FnDecl { // TODO high name = p.check_name() } + if p.tok.kind in [.plus, .minus, .mul, .div, .mod] { + name = p.tok.kind.str() // op_to_fn_name() + p.next() + } // if p.tok.kind == .lt { p.next()