From ddec89f9ee44a85b593b8caa8f833470139ce386 Mon Sep 17 00:00:00 2001 From: playX Date: Mon, 29 Nov 2021 16:32:29 +0300 Subject: [PATCH] js,vfmt: fix formatting for JS types; add fetch API (#12608) --- vlib/js/dom/dom.js.v | 5 +++++ vlib/js/js.js.v | 33 +++++++++++++++++++++++++++++++ vlib/js/promise/promise.js.v | 6 ++++-- vlib/js/promise/promise_test.js.v | 4 +++- vlib/v/fmt/fmt.v | 11 +++++++++-- vlib/v/gen/js/js.v | 25 +++++++---------------- 6 files changed, 61 insertions(+), 23 deletions(-) create mode 100644 vlib/js/js.js.v diff --git a/vlib/js/dom/dom.js.v b/vlib/js/dom/dom.js.v index 59c6b88e7f..2ae042c092 100644 --- a/vlib/js/dom/dom.js.v +++ b/vlib/js/dom/dom.js.v @@ -271,6 +271,11 @@ pub interface JS.Document { queryCommandState(commandId JS.String) JS.String write(text ...JS.Any) writeln(text ...JS.Any) + exitFullscreen() JS.Promise + exitPictureInPicture() JS.Promise + exitPointerLock() + requestPointerLock() + requestFullScreen() JS.Promise mut: bgColor JS.String fgColor JS.String diff --git a/vlib/js/js.js.v b/vlib/js/js.js.v new file mode 100644 index 0000000000..c7e429648c --- /dev/null +++ b/vlib/js/js.js.v @@ -0,0 +1,33 @@ +module js + +import js.promise + +pub fn JS.fetch(input JS.String, init JS.Object) JS.Promise + +pub interface JS.Body { + body JS.Uint8Array + bodyUse JS.Boolean + blob() JS.Promise + json() JS.Promise + text() JS.Promise +} + +pub interface JS.Response { + JS.Body + ok JS.Boolean + redirected JS.Boolean + status JS.Number + statusText JS.String + url JS.String + clone() JS.Response +} + +pub fn fetch(input string, init map[string]JS.Any) promise.Promise { + p_init := JS.Any(voidptr(0)) + p := promise.Promise{p_init} + + #let obj = {}; for (let [key,val] of init.map) { obj[key] = val; } + #p.promise = fetch(input.str,obj); + + return p +} diff --git a/vlib/js/promise/promise.js.v b/vlib/js/promise/promise.js.v index 2ca539fc9d..fc1f95efbb 100644 --- a/vlib/js/promise/promise.js.v +++ b/vlib/js/promise/promise.js.v @@ -68,12 +68,14 @@ pub fn JS.Promise.all(JS.Array) JS.Promise pub fn JS.Promise.allSettled(JS.Array) JS.Promise /* +pub type JsAny = JS.Any + // all takes an iterable of promises as an input, and returns a single Promise that resolves to an array of // the results of the input promises -pub fn all(array []JS.Promise) Promise { +pub fn all(array []JS.Promise) Promise { mut promise := JS.Promise(JS.Any(voidptr(0))) #promise = Promise.all(array.arr.arr); - return Promise{promise} + return Promise{promise} } */ diff --git a/vlib/js/promise/promise_test.js.v b/vlib/js/promise/promise_test.js.v index 8f9449ddf0..a9b52b972c 100644 --- a/vlib/js/promise/promise_test.js.v +++ b/vlib/js/promise/promise_test.js.v @@ -1,7 +1,9 @@ +module promise + fn test_promise() { // TODO: For some reason compiler errors: "error: unknown function: js.promise.new", fix this /* - p := promise.new(fn (resolve_ fn (x int), reject_ fn (x f64)) { + p := new(fn (resolve_ fn (x int), reject_ fn (x f64)) { println('Promise code') assert true resolve_(42) diff --git a/vlib/v/fmt/fmt.v b/vlib/v/fmt/fmt.v index 168361f0c9..c4ffa13718 100644 --- a/vlib/v/fmt/fmt.v +++ b/vlib/v/fmt/fmt.v @@ -203,7 +203,7 @@ pub fn (mut f Fmt) no_cur_mod(typename string) string { // foo.bar.fn() => bar.fn() pub fn (mut f Fmt) short_module(name string) string { - if !name.contains('.') { + if !name.contains('.') || name.starts_with('JS.') { return name } if name in f.mod2alias { @@ -1613,7 +1613,14 @@ fn (mut f Fmt) write_generic_call_if_require(node ast.CallExpr) { if node.concrete_types.len > 0 { f.write('<') for i, concrete_type in node.concrete_types { - f.write(f.short_module(f.table.type_to_str_using_aliases(concrete_type, f.mod2alias))) + mut name := f.table.type_to_str_using_aliases(concrete_type, f.mod2alias) + tsym := f.table.get_type_symbol(concrete_type) + if tsym.language != .js && !tsym.name.starts_with('JS.') { + name = f.short_module(name) + } else if tsym.language == .js && !tsym.name.starts_with('JS.') { + name = 'JS.' + name + } + f.write(name) if i != node.concrete_types.len - 1 { f.write(', ') } diff --git a/vlib/v/gen/js/js.v b/vlib/v/gen/js/js.v index 2966f9f8c8..9f8ec2ff9c 100644 --- a/vlib/v/gen/js/js.v +++ b/vlib/v/gen/js/js.v @@ -1678,25 +1678,11 @@ fn (mut g JsGen) gen_for_stmt(it ast.ForStmt) { } fn (mut g JsGen) gen_go_expr(node ast.GoExpr) { - // TODO Handle joinable expressions - // node.is_expr - mut name := g.js_name(node.call_expr.name) - if node.call_expr.is_method { - receiver_sym := g.table.get_type_symbol(node.call_expr.receiver_type) - name = receiver_sym.name + '.' + name - } - g.writeln('await new Promise(function(resolve){') g.inc_indent() - g.write('${name}(') - for i, arg in node.call_expr.args { - g.expr(arg.expr) - if i < node.call_expr.args.len - 1 { - g.write(', ') - } - } - g.writeln(');') - g.writeln('resolve();') + g.write('resolve(') + g.expr(node.call_expr) + g.write(');') g.dec_indent() g.writeln('});') } @@ -3207,7 +3193,10 @@ fn (mut g JsGen) gen_string_literal(it ast.StringLiteral) { fn (mut g JsGen) gen_struct_init(it ast.StructInit) { type_sym := g.table.get_type_symbol(it.typ) - name := type_sym.name + mut name := type_sym.name + if name.contains('<') { + name = name[0..name.index('<') or { name.len }] + } if it.fields.len == 0 && type_sym.kind != .interface_ { if type_sym.kind == .struct_ && type_sym.language == .js { g.write('{}')