From e7ed073be31c03879ed4bd33d07510033d4ebbd2 Mon Sep 17 00:00:00 2001 From: Turiiya <34311583+ttytm@users.noreply.github.com> Date: Mon, 25 Mar 2024 12:09:52 +0100 Subject: [PATCH] parser, fmt: parse methods on JS interfaces, write JS method bodies (#21088) --- vlib/v/fmt/fmt.v | 2 +- vlib/v/fmt/tests/interface_js_interop_method_keep.vv | 11 +++++++++++ vlib/v/parser/fn.v | 2 +- vlib/v/parser/tests/interop_js_func_body_err.out | 3 +++ vlib/v/parser/tests/interop_js_func_body_err.vv | 1 + 5 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 vlib/v/fmt/tests/interface_js_interop_method_keep.vv create mode 100644 vlib/v/parser/tests/interop_js_func_body_err.out create mode 100644 vlib/v/parser/tests/interop_js_func_body_err.vv diff --git a/vlib/v/fmt/fmt.v b/vlib/v/fmt/fmt.v index e4167a07d..93713ebcb 100644 --- a/vlib/v/fmt/fmt.v +++ b/vlib/v/fmt/fmt.v @@ -1104,7 +1104,7 @@ fn (mut f Fmt) fn_body(node ast.FnDecl) { defer { f.fn_scope = prev_fn_scope } - if node.language == .v { + if node.language == .v || (node.is_method && node.language == .js) { if !node.no_body { f.write(' {') pre_comments := node.comments.filter(it.pos.pos < node.name_pos.pos) diff --git a/vlib/v/fmt/tests/interface_js_interop_method_keep.vv b/vlib/v/fmt/tests/interface_js_interop_method_keep.vv new file mode 100644 index 000000000..0cb900dba --- /dev/null +++ b/vlib/v/fmt/tests/interface_js_interop_method_keep.vv @@ -0,0 +1,11 @@ +pub interface JS.CanvasRenderingContext2D { + setLineDash(JS.Array) +} + +pub fn (ctx JS.CanvasRenderingContext2D) set_line_dash(arr []f64) { + tmp := JS.Array.prototype.constructor() + for x in arr { + tmp.push(JS.Number(x)) + } + ctx.setLineDash(tmp) +} diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index 84abac495..680383b70 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -577,7 +577,7 @@ run them via `v file.v` instead', mut stmts := []ast.Stmt{} body_start_pos := p.tok.pos() if p.tok.kind == .lcbr { - if language != .v { + if language != .v && !(language == .js && type_sym.info is ast.Interface) { p.error_with_pos('interop functions cannot have a body', body_start_pos) } p.inside_fn = true diff --git a/vlib/v/parser/tests/interop_js_func_body_err.out b/vlib/v/parser/tests/interop_js_func_body_err.out new file mode 100644 index 000000000..9c871b7ed --- /dev/null +++ b/vlib/v/parser/tests/interop_js_func_body_err.out @@ -0,0 +1,3 @@ +vlib/v/parser/tests/interop_js_func_body_err.vv:1:43: error: interop functions cannot have a body + 1 | fn JS.state_is_ready_on_leave(retval int) {} + | ^ diff --git a/vlib/v/parser/tests/interop_js_func_body_err.vv b/vlib/v/parser/tests/interop_js_func_body_err.vv new file mode 100644 index 000000000..205c9a5f3 --- /dev/null +++ b/vlib/v/parser/tests/interop_js_func_body_err.vv @@ -0,0 +1 @@ +fn JS.state_is_ready_on_leave(retval int) {} -- 2.39.5