fix a string interpolation bug
parent
89d40566f4
commit
66f271f100
|
@ -555,6 +555,13 @@ fn test_c_r() {
|
|||
println('$c')
|
||||
r := 50
|
||||
println('$r')
|
||||
|
||||
}
|
||||
|
||||
fn test_inter_before_comp_if() {
|
||||
s := '123'
|
||||
// This used to break ('123 $....')
|
||||
$if linux {
|
||||
println(s)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -167,7 +167,7 @@ fn (p mut Parser) name_expr() string {
|
|||
}
|
||||
|
||||
// Raw string (`s := r'hello \n ')
|
||||
if (name == 'r' || name == 'c') && p.peek() == .str && p.prev_tok != .dollar {
|
||||
if (name == 'r' || name == 'c') && p.peek() == .str && p.prev_tok != .str_dollar {
|
||||
p.string_expr()
|
||||
return 'string'
|
||||
}
|
||||
|
|
|
@ -2265,7 +2265,7 @@ fn (p mut Parser) string_expr() {
|
|||
}
|
||||
str := p.lit
|
||||
// No ${}, just return a simple string
|
||||
if p.peek() != .dollar || is_raw {
|
||||
if p.peek() != .str_dollar || is_raw {
|
||||
f := if is_raw { cescaped_path(str) } else { format_str(str) }
|
||||
// `C.puts('hi')` => `puts("hi");`
|
||||
/*
|
||||
|
@ -2299,11 +2299,11 @@ fn (p mut Parser) string_expr() {
|
|||
p.lit = p.lit.replace('%', '%%')
|
||||
format += format_str(p.lit)
|
||||
p.next()// skip $
|
||||
if p.tok != .dollar {
|
||||
if p.tok != .str_dollar {
|
||||
continue
|
||||
}
|
||||
// Handle .dollar
|
||||
p.check(.dollar)
|
||||
p.check(.str_dollar)
|
||||
// If there's no string after current token, it means we are in
|
||||
// a complex expression (`${...}`)
|
||||
if p.peek() != .str {
|
||||
|
|
|
@ -390,7 +390,12 @@ fn (s mut Scanner) scan() ScanRes {
|
|||
return scan_res(.lcbr, '')
|
||||
}
|
||||
`$` {
|
||||
return scan_res(.dollar, '')
|
||||
// if s.inter_start {
|
||||
if s.inside_string {// || s.inter_start {
|
||||
return scan_res(.str_dollar, '')
|
||||
} else {
|
||||
return scan_res(.dollar, '')
|
||||
}
|
||||
}
|
||||
`}` {
|
||||
// s = `hello $name !`
|
||||
|
|
|
@ -318,7 +318,7 @@ fn (p mut Parser) struct_init(typ string) string {
|
|||
}
|
||||
field_typ := field.typ
|
||||
if !p.builtin_mod && field_typ.ends_with('*') && p.mod != 'os' { //&&
|
||||
p.warn('pointer field `${typ}.${field.name}` must be initialized')
|
||||
p.warn('reference field `${typ}.${field.name}` must be initialized')
|
||||
}
|
||||
// init map fields
|
||||
if field_typ.starts_with('map_') {
|
||||
|
|
|
@ -41,6 +41,7 @@ enum TokenKind {
|
|||
amp
|
||||
hash
|
||||
dollar
|
||||
str_dollar
|
||||
left_shift
|
||||
righ_shift
|
||||
//at // @
|
||||
|
@ -197,6 +198,7 @@ fn build_token_str() []string {
|
|||
s[TokenKind.mline_comment] = '/* mline comment */'
|
||||
s[TokenKind.nl] = 'NLL'
|
||||
s[TokenKind.dollar] = '$'
|
||||
s[TokenKind.str_dollar] = '$2'
|
||||
s[TokenKind.key_assert] = 'assert'
|
||||
s[TokenKind.key_struct] = 'struct'
|
||||
s[TokenKind.key_if] = 'if'
|
||||
|
|
|
@ -13,16 +13,20 @@ pub:
|
|||
|
||||
pub const (
|
||||
Blue = Color { r: 0, g: 0, b: 255 }
|
||||
blue = Color { r: 0, g: 0, b: 255 }
|
||||
Red = Color { r: 255, g: 0, b: 0 }
|
||||
Green = Color { r: 0, g: 255, b: 0 }
|
||||
green = Color { r: 0, g: 255, b: 0 }
|
||||
Yellow = Color { r: 255, g: 255, b: 0 }
|
||||
|
||||
Orange = Color { r: 255, g: 165, b: 0 }
|
||||
orange = Color { r: 255, g: 165, b: 0 }
|
||||
Purple = Color { r: 128, g: 0, b: 128 }
|
||||
|
||||
Black = Color { r: 0, g: 0, b: 0 }
|
||||
black = Color { r: 0, g: 0, b: 0 }
|
||||
Gray = Color { r: 128, g: 128, b: 128 }
|
||||
gray = Color { r: 128, g: 128, b: 128 }
|
||||
Indigo = Color { r: 75, g: 0, b: 130 }
|
||||
Pink = Color { r: 255, g: 192, b: 203 }
|
||||
Violet = Color { r: 238, g: 130, b: 238 }
|
||||
|
@ -32,9 +36,11 @@ pub const (
|
|||
// Shades
|
||||
DarkBlue = Color { r: 0, g: 0, b: 139 }
|
||||
DarkGray = Color { r: 169, g: 169, b: 169 }
|
||||
dark_gray = Color { r: 169, g: 169, b: 169 }
|
||||
DarkGreen = Color { r: 0, g: 100, b: 0 }
|
||||
DarkRed = Color { r: 139, g: 0, b: 0 }
|
||||
LightBlue = Color { r: 173, g: 216, b: 230 }
|
||||
light_blue = Color { r: 173, g: 216, b: 230 }
|
||||
LightGray = Color { r: 211, g: 211, b: 211 }
|
||||
LightGreen = Color { r: 144, g: 238, b: 144 }
|
||||
LightRed = Color { r: 255, g: 204, b: 203 }
|
||||
|
|
|
@ -6,7 +6,7 @@ module http
|
|||
|
||||
import os
|
||||
|
||||
fn download_file(url, out string) bool {
|
||||
pub fn download_file(url, out string) bool {
|
||||
s := http.get(url) or { return false }
|
||||
os.write_file(out, s.text)
|
||||
return true
|
||||
|
|
|
@ -27,7 +27,7 @@ fn download_cb(ptr voidptr, size, nmemb size_t, userp voidptr) {
|
|||
*/
|
||||
}
|
||||
|
||||
fn download_file_with_progress(url, out string, cb downloadfn, cb_finished fn()) {
|
||||
pub fn download_file_with_progress(url, out string, cb downloadfn, cb_finished fn()) {
|
||||
/*
|
||||
curl := C.curl_easy_init()
|
||||
if isnil(curl) {
|
||||
|
|
|
@ -21,10 +21,11 @@ pub:
|
|||
typ string // GET POST
|
||||
data string
|
||||
url string
|
||||
ws_func voidptr
|
||||
user_ptr voidptr
|
||||
verbose bool
|
||||
user_agent string
|
||||
mut:
|
||||
user_ptr voidptr
|
||||
ws_func voidptr
|
||||
}
|
||||
|
||||
pub struct Response {
|
||||
|
|
|
@ -738,7 +738,7 @@ pub fn clear() {
|
|||
}
|
||||
}
|
||||
|
||||
fn on_segfault(f voidptr) {
|
||||
pub fn on_segfault(f voidptr) {
|
||||
$if windows {
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue