scanner: improve @FN substitution for anon functions
parent
481f103dc9
commit
6ca53d7b39
|
@ -105,39 +105,57 @@ fn (mut s Scanner) ident_fn_name() string {
|
||||||
start := s.pos
|
start := s.pos
|
||||||
mut pos := s.pos
|
mut pos := s.pos
|
||||||
pos++
|
pos++
|
||||||
// Search for function scope start
|
|
||||||
for pos < s.text.len && s.text[pos] != `{` {
|
if s.current_column() - 2 != 0 {
|
||||||
|
return s.fn_name
|
||||||
|
}
|
||||||
|
|
||||||
|
has_struct_name := s.struct_name != ''
|
||||||
|
|
||||||
|
if has_struct_name {
|
||||||
|
for pos < s.text.len && s.text[pos] != `(` {
|
||||||
|
pos++
|
||||||
|
}
|
||||||
|
if pos >= s.text.len {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
pos++
|
||||||
|
}
|
||||||
|
|
||||||
|
for pos < s.text.len && s.text[pos] != `(` {
|
||||||
pos++
|
pos++
|
||||||
}
|
}
|
||||||
if pos >= s.text.len {
|
if pos >= s.text.len {
|
||||||
return ""
|
return ''
|
||||||
}
|
}
|
||||||
// Search backwards for "first" occurrence of function open paranthesis
|
pos--
|
||||||
for pos > start && s.text[pos] != `(` {
|
|
||||||
|
// Eat whitespaces
|
||||||
|
for pos > start && s.text[pos].is_space() {
|
||||||
pos--
|
pos--
|
||||||
}
|
}
|
||||||
if pos < start {
|
if pos < start {
|
||||||
return ""
|
return ''
|
||||||
}
|
|
||||||
// Search backwards for end position of function name
|
|
||||||
for pos > start && !util.is_func_char(s.text[pos]) {
|
|
||||||
pos--
|
|
||||||
}
|
}
|
||||||
|
|
||||||
end_pos := pos + 1
|
end_pos := pos + 1
|
||||||
if pos < start {
|
|
||||||
return ""
|
pos--
|
||||||
}
|
|
||||||
// Search for the start position
|
// Search for the start position
|
||||||
for pos > start && util.is_func_char(s.text[pos]) {
|
for pos > start && util.is_func_char(s.text[pos]) {
|
||||||
pos--
|
pos--
|
||||||
}
|
}
|
||||||
start_pos := pos + 1
|
pos++
|
||||||
if pos < start || pos >= s.text.len {
|
|
||||||
return ""
|
start_pos := pos
|
||||||
|
|
||||||
|
if pos <= start || pos >= s.text.len {
|
||||||
|
return ''
|
||||||
}
|
}
|
||||||
if s.text[start_pos].is_digit() || end_pos > s.text.len || end_pos <= start_pos || end_pos <= start || start_pos <= start {
|
if s.text[start_pos].is_digit() || end_pos > s.text.len || end_pos <= start_pos || end_pos <= start || start_pos < start {
|
||||||
return ""
|
return ''
|
||||||
}
|
}
|
||||||
|
|
||||||
fn_name := s.text[start_pos..end_pos]
|
fn_name := s.text[start_pos..end_pos]
|
||||||
return fn_name
|
return fn_name
|
||||||
}
|
}
|
||||||
|
@ -202,7 +220,7 @@ fn (mut s Scanner) ident_struct_name() string {
|
||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
|
|
||||||
// Search for closing paranthesis
|
// Search for closing parenthesis
|
||||||
for pos < s.text.len && s.text[pos] != `)` {
|
for pos < s.text.len && s.text[pos] != `)` {
|
||||||
pos++
|
pos++
|
||||||
}
|
}
|
||||||
|
@ -554,8 +572,8 @@ pub fn (mut s Scanner) scan() token.Token {
|
||||||
if token.is_key(name) {
|
if token.is_key(name) {
|
||||||
kind := token.key_to_token(name)
|
kind := token.key_to_token(name)
|
||||||
if kind == .key_fn {
|
if kind == .key_fn {
|
||||||
s.fn_name = s.ident_fn_name()
|
|
||||||
s.struct_name = s.ident_struct_name()
|
s.struct_name = s.ident_struct_name()
|
||||||
|
s.fn_name = s.ident_fn_name()
|
||||||
} else if kind == .key_module {
|
} else if kind == .key_module {
|
||||||
s.mod_name = s.ident_mod_name()
|
s.mod_name = s.ident_mod_name()
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,25 @@ fn (mut t TestStruct) test_struct_w_high_order(cb fn(int)string) string {
|
||||||
return 'test'+cb(2)
|
return 'test'+cb(2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct TestFn { }
|
||||||
|
|
||||||
|
fn (mut t TestFn) tst_1() {
|
||||||
|
assert @FN == 'tst_1'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut t TestFn) tst_2(cb fn(int)) {
|
||||||
|
assert @FN == 'tst_2'
|
||||||
|
cb(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fn_name_mod_level() {
|
||||||
|
assert @FN == 'fn_name_mod_level'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fn_name_mod_level_high_order(cb fn(int)) {
|
||||||
|
assert @FN == 'fn_name_mod_level_high_order'
|
||||||
|
cb(1)
|
||||||
|
}
|
||||||
|
|
||||||
fn test_scan() {
|
fn test_scan() {
|
||||||
text := 'println(2 + 3)'
|
text := 'println(2 + 3)'
|
||||||
|
@ -64,6 +83,19 @@ fn test_scan() {
|
||||||
// Test @FN
|
// Test @FN
|
||||||
assert @FN == 'test_scan'
|
assert @FN == 'test_scan'
|
||||||
|
|
||||||
|
fn_name_mod_level()
|
||||||
|
fn_name_mod_level_high_order(fn(i int){
|
||||||
|
t := i + 1
|
||||||
|
assert t == 2
|
||||||
|
})
|
||||||
|
|
||||||
|
tfn := TestFn{}
|
||||||
|
tfn.tst_1()
|
||||||
|
tfn.tst_2(fn(i int){
|
||||||
|
t := i + 1
|
||||||
|
assert t == 2
|
||||||
|
})
|
||||||
|
|
||||||
// Test @MOD
|
// Test @MOD
|
||||||
assert @MOD == 'scanner'
|
assert @MOD == 'scanner'
|
||||||
|
|
||||||
|
@ -80,7 +112,6 @@ fn test_scan() {
|
||||||
assert r1 == 'test'
|
assert r1 == 'test'
|
||||||
assert r2 == 'test2'
|
assert r2 == 'test2'
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_vmod_file() {
|
fn test_vmod_file() {
|
||||||
|
|
Loading…
Reference in New Issue