1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

js: support JS interfaces (#12426)

This commit is contained in:
playX
2021-11-11 15:36:32 +03:00
committed by GitHub
parent 015cfdb49f
commit a4c57ba56e
12 changed files with 245 additions and 205 deletions

View File

@ -147,7 +147,7 @@ pub fn (a array) repeat(count int) array {
}
}
#function makeEmptyArray() { return new array(new array_buffer({})); }
#function makeEmptyArray() { return new array(new array_buffer({ arr: [], len: new int(0), index_start: new int(0), cap: new int(0) })); }
#function makeEmtpyJSArray() { return new Array(); }
fn JS.makeEmptyArray() array

View File

@ -104,66 +104,3 @@ pub fn (f float_literal) str() string {
return res
}
pub fn tof64(n JS.Number) f64 {
res := f64(0.0)
#res.val = n;
return res
}
pub fn tof32(n JS.Number) f32 {
res := f32(0.0)
#res.val = n;
return res
}
pub fn toi(n JS.Number) int {
res := int(0)
#res.val = Math.floor(n);
return res
}
pub fn f64tonum(n f64) JS.Number {
mut res := JS.Number{}
#res = n.val;
return res
}
pub fn itonum(n int) JS.Number {
mut res := JS.Number{}
#res = n.val;
return res
}
pub fn i64tobigint(n i64) JS.BigInt {
mut res := JS.BigInt{}
#res = n.val;
return res
}
pub fn u64tobigint(n u64) JS.BigInt {
mut res := JS.BigInt{}
#res = n.val;
return res
}
pub fn tobool(b JS.Boolean) bool {
res := false
#res.val = b;
return res
}
pub fn booltojs(b bool) JS.Boolean {
mut res := JS.Boolean{}
#res = b.val;
return res
}

View File

@ -7,21 +7,62 @@
module builtin
pub struct JS.BigInt {}
pub interface JS.Object {}
pub struct JS.Number {}
pub interface JS.BigInt {
JS.Any
}
pub struct JS.String {
pub interface JS.Number {
JS.Any
}
pub interface JS.String {
JS.Any
length JS.Number
charAt(index JS.Number) JS.String
charCodeAt(index JS.Number) JS.Number
toUpperCase() JS.String
toLowerCase() JS.String
concat(a JS.String) JS.String
includes(substr JS.String) JS.Boolean
endsWith(substr JS.String) JS.Boolean
startsWith(substr JS.String) JS.Boolean
slice(a JS.Number, b JS.Number) JS.String
split(dot JS.String) JS.Array
indexOf(needle JS.String) JS.Number
lastIndexOf(needle JS.String) JS.Number
}
pub interface JS.Boolean {
JS.Any
}
pub interface JS.Map {
JS.Any
size JS.Number
clear()
delete(key JS.Any) JS.Boolean
get(key JS.Any) JS.Any
has(key JS.Any) JS.Any
set(key JS.Any, val JS.Any)
}
#function Any(val) { return val; }
pub interface JS.Any {}
pub interface JS.Array {
JS.Any // map(fn (JS.Any) JS.Any) JS.Array
map(JS.Any) JS.Array
push(JS.Any) JS.Any
pop() JS.Any
at(JS.Number) JS.Any
mut:
length JS.Number
}
pub struct JS.Boolean {}
pub struct JS.Array {
length JS.Number
}
pub struct JS.Map {}
pub fn JS.Array.prototype.constructor(...any) JS.Array
// browser: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Error
// node: https://nodejs.org/api/errors.html#errors_class_error
@ -110,18 +151,3 @@ fn JS.Math.tan(f64) f64
// JSON
fn JS.JSON.stringify(any) string
fn JS.JSON.parse(string) any
// String
fn (v JS.String) slice(a int, b int) JS.String
fn (v JS.String) split(dot JS.String) []JS.String
fn (s JS.String) indexOf(needle JS.String) int
fn (s JS.String) lastIndexOf(needle JS.String) int
fn (s JS.String) charAt(i int) JS.String
fn (s JS.String) charCodeAt(i int) byte
fn (s JS.String) toUpperCase() JS.String
fn (s JS.String) toLowerCase() JS.String
fn (s JS.String) concat(a JS.String) JS.String
fn (s JS.String) includes(substr JS.String) bool
fn (s JS.String) endsWith(substr JS.String) bool
fn (s JS.String) startsWith(substr JS.String) bool

View File

@ -25,7 +25,7 @@ pub fn (s string) substr(start int, end int) string {
}
pub fn (s string) after(dot string) string {
return string(s.str.slice(s.str.lastIndexOf(dot.str) + 1, int(s.str.length)))
return string(s.str.slice(JS.Number(int(s.str.lastIndexOf(dot.str)) + 1), s.str.length))
}
pub fn (s string) after_char(dot byte) string {
@ -34,7 +34,7 @@ pub fn (s string) after_char(dot byte) string {
}
pub fn (s string) all_after(dot string) string {
pos := if dot.len == 0 { -1 } else { s.str.indexOf(dot.str) }
pos := if dot.len == 0 { -1 } else { int(s.str.indexOf(dot.str)) }
if pos == -1 {
return s.clone()
}
@ -43,7 +43,7 @@ pub fn (s string) all_after(dot string) string {
// why does this exist?
pub fn (s string) all_after_last(dot string) string {
pos := if dot.len == 0 { -1 } else { s.str.lastIndexOf(dot.str) }
pos := if dot.len == 0 { -1 } else { int(s.str.lastIndexOf(dot.str)) }
if pos == -1 {
return s.clone()
}
@ -51,7 +51,7 @@ pub fn (s string) all_after_last(dot string) string {
}
pub fn (s string) all_before(dot string) string {
pos := if dot.len == 0 { -1 } else { s.str.indexOf(dot.str) }
pos := if dot.len == 0 { -1 } else { int(s.str.indexOf(dot.str)) }
if pos == -1 {
return s.clone()
}
@ -60,7 +60,7 @@ pub fn (s string) all_before(dot string) string {
}
pub fn (s string) all_before_last(dot string) string {
pos := if dot.len == 0 { -1 } else { s.str.lastIndexOf(dot.str) }
pos := if dot.len == 0 { -1 } else { int(s.str.lastIndexOf(dot.str)) }
if pos == -1 {
return s.clone()
}
@ -72,16 +72,27 @@ pub fn (s string) bool() bool {
}
pub fn (s string) split(dot string) []string {
mut arr := s.str.split(dot.str).map(string(it))
#arr = new array(new array_buffer({arr,index_start: new int(0),len: new int(arr.length)}))
tmparr := s.str.split(dot.str).map(fn (it JS.Any) JS.Any {
res := ''
#res.str = it
return res
})
_ := tmparr
mut arr := []string{}
#arr = new array(new array_buffer({arr: tmparr,index_start: new int(0),len: new int(tmparr.length)}))
return arr
}
pub fn (s string) bytes() []byte {
sep := ''
mut arr := s.str.split(sep.str).map(it.charCodeAt(0))
#arr = new array(new array_buffer({arr,index_start: new int(0),len: new int(arr.length)}))
tmparr := s.str.split(sep.str).map(fn (it JS.Any) JS.Any {
return JS.Any(byte(JS.String(it).charCodeAt(0)))
})
_ := tmparr
mut arr := []byte{}
#arr = new array(new array_buffer({arr: tmparr,index_start: new int(0),len: new int(tmparr.length)}))
return arr
}
@ -96,13 +107,14 @@ pub fn (s string) clone() string {
}
pub fn (s string) contains(substr string) bool {
return s.str.includes(substr.str)
return bool(s.str.includes(substr.str))
}
pub fn (s string) contains_any(chars string) bool {
sep := ''
for x in chars.str.split(sep.str) {
if s.str.includes(x) {
res := chars.str.split(sep.str)
for i in 0 .. int(res.length) {
if bool(s.str.includes(JS.String(res.at(JS.Number(i))))) {
return true
}
}
@ -114,7 +126,7 @@ pub fn (s string) contains_any_substr(chars []string) bool {
return true
}
for x in chars {
if s.str.includes(x.str) {
if bool(s.str.includes(x.str)) {
return true
}
}
@ -124,7 +136,12 @@ pub fn (s string) contains_any_substr(chars []string) bool {
pub fn (s string) count(substr string) int {
// TODO: "error: `[]JS.String` is not a struct" when returning arr.length or arr.len
arr := s.str.split(substr.str)
return native_str_arr_len(arr)
len := int(arr.length)
if len == 0 {
return 0
} else {
return len - 1
}
}
pub fn (s string) ends_with(p string) bool {
@ -135,7 +152,7 @@ pub fn (s string) ends_with(p string) bool {
}
pub fn (s string) starts_with(p string) bool {
return s.str.startsWith(p.str)
return bool(s.str.startsWith(p.str))
}
pub fn (s string) fields() []string {
@ -170,7 +187,7 @@ pub fn (s string) fields() []string {
}
pub fn (s string) find_between(start string, end string) string {
return string(s.str.slice(s.str.indexOf(start.str) + 1, s.str.indexOf(end.str)))
return string(s.str.slice(JS.Number(int(s.str.indexOf(start.str)) + 1), s.str.indexOf(end.str)))
}
// unnecessary in the JS backend, implemented for api parity.