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:
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
Reference in New Issue
Block a user