diff --git a/vlib/builtin/js/array.js.v b/vlib/builtin/js/array.js.v index 4a342d5272..651e366b92 100644 --- a/vlib/builtin/js/array.js.v +++ b/vlib/builtin/js/array.js.v @@ -149,3 +149,14 @@ pub fn (mut a array) delete(i int) { pub fn (mut a array) delete_many(i int, size int) { #a.arr.splice(i.valueOf(),size.valueOf()) } + +// prepend prepends one value to the array. +pub fn (mut a array) prepend(val voidptr) { + a.insert(0, val) +} + +// prepend_many prepends another array to this array. +[unsafe] +pub fn (mut a array) prepend_many(val voidptr, size int) { + unsafe { a.insert_many(0, val, size) } +} diff --git a/vlib/v/gen/js/js.v b/vlib/v/gen/js/js.v index d6b029767a..0119224e71 100644 --- a/vlib/v/gen/js/js.v +++ b/vlib/v/gen/js/js.v @@ -1444,6 +1444,26 @@ fn (mut g JsGen) gen_call_expr(it ast.CallExpr) { g.write(')') return } + 'prepend' { + arg_sym := g.table.get_type_symbol(node.args[0].typ) + is_arg_array := arg_sym.kind == .array && node.args[0].typ == node.left_type + if is_arg_array { + g.write('prepend_many(') + } else { + g.write('prepend(') + } + + if is_arg_array { + g.expr(node.args[0].expr) + g.write('.arr, ') + g.expr(node.args[0].expr) + g.write('.len') + } else { + g.expr(node.args[0].expr) + } + g.write(')') + return + } else {} } } @@ -1975,7 +1995,7 @@ fn (mut g JsGen) gen_integer_literal_expr(it ast.IntegerLiteral) { // Skip cast if type is the same as the parrent caster if g.cast_stack.len > 0 { if g.cast_stack[g.cast_stack.len - 1] in ast.integer_type_idxs { - g.write('$it.val') + g.write('new int($it.val)') return } } @@ -2013,7 +2033,7 @@ fn (mut g JsGen) gen_float_literal_expr(it ast.FloatLiteral) { // Skip cast if type is the same as the parrent caster if g.cast_stack.len > 0 { if g.cast_stack[g.cast_stack.len - 1] in ast.float_type_idxs { - g.write('$it.val') + g.write('new f32($it.val)') return } else if g.cast_stack[g.cast_stack.len - 1] in ast.integer_type_idxs { g.write(int(it.val.f64()).str()) diff --git a/vlib/v/gen/js/tests/testdata/array.out b/vlib/v/gen/js/tests/testdata/array.out index 134a2cfeb3..ffeaeacc6a 100644 --- a/vlib/v/gen/js/tests/testdata/array.out +++ b/vlib/v/gen/js/tests/testdata/array.out @@ -61,4 +61,51 @@ true 1 1.1 [1,2,3,4] -[1,5,6,2,3,4] \ No newline at end of file +[1,5,6,2,3,4] +0 +1 +1 +0 +1 +1.1 +[1,2,3,4] +[5,6,1,2,3,4] +5 +true +1.1 +1.1 +1.1 +-123 +-123 +-123 +123 +123 +123 +1.1 +1.1 +1.1 +1 +2 +1 +2 +1 +abc +1 +abc +0 +abc +2 +3 +2 +3 +1 +2 +1 +2 +2 +1 +4 +6 +1 +4 +6 \ No newline at end of file diff --git a/vlib/v/gen/js/tests/testdata/array.v b/vlib/v/gen/js/tests/testdata/array.v index bc23e9264f..3278bd46ce 100644 --- a/vlib/v/gen/js/tests/testdata/array.v +++ b/vlib/v/gen/js/tests/testdata/array.v @@ -183,4 +183,140 @@ fn main() { a.insert(1, b) println(a) } + { + // test prepend + mut a := []int{} + println(a.len) + a.prepend(1) + println(a.len) + println(a[0]) + mut b := []f64{} + + println(b.len) + + b.prepend(f64(1.1)) + + println(b.len) + + println(b[0]) + } + { + // test prepend many + mut a := [3, 4] + a.prepend([1, 2]) + println(a) + b := [5, 6] + a.prepend(b) + println(a) + } + { + // test repeat + { + a := [0].repeat(5) + println(a.len) + println(a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0 && a[4] == 0) + } + { + a := [1.1].repeat(10) + println(a[0]) + println(a[5]) + println(a[9]) + } + { + a := [i64(-123)].repeat(10) + println(a[0]) + println(a[5]) + println(a[9]) + } + { + a := [u64(123)].repeat(10) + println(a[0]) + println(a[5]) + println(a[9]) + } + { + a := [1.1].repeat(10) + println(a[0]) + println(a[5]) + println(a[9]) + } + { + a := [1, 2].repeat(2) + println(a[0]) + println(a[1]) + println(a[2]) + println(a[3]) + } + { + a := ['1', 'abc'].repeat(2) + println(a[0]) + println(a[1]) + println(a[2]) + println(a[3]) + } + { + mut a := ['1', 'abc'].repeat(0) + println(a.len) + a << 'abc' + println(a[0]) + } + } + { + /* + // test deep repeat + mut a3 := [[[1, 1], [2, 2], [3, 3]], [[4, 4], [5, 5], [6, 6]]] + r := a3.repeat(3) + a3[1][1][0] = 17 + print(r) + assert r == [ + [[1, 1], [2, 2], [3, 3]], + [[4, 4], [5, 5], [6, 6]], + [[1, 1], [2, 2], [3, 3]], + [[4, 4], [5, 5], [6, 6]], + [[1, 1], [2, 2], [3, 3]], + [[4, 4], [5, 5], [6, 6]], + ] + assert a3 == [[[1, 1], [2, 2], [3, 3]], [[4, 4], [17, 5], + [6, 6], + ]] + */ + } + { + // test right + a := [1, 2, 3, 4] + c := a[1..a.len] + d := a[1..] + println(c[0]) + println(c[1]) + println(d[0]) + println(d[1]) + } + { + // test left + a := [1, 2, 3] + c := a[0..2] + d := a[..2] + println(c[0]) + println(c[1]) + println(d[0]) + println(d[1]) + } + { + // test slice + a := [1, 2, 3, 4] + b := a[2..4] + println(b.len) + println(a[1..2].len) + println(a.len) + } + { + // test push many + mut a := [1, 2, 3] + b := [4, 5, 6] + a << b + println(a.len) + println(a[0]) + println(a[3]) + println(a[5]) + } }