mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
scanner: add support for '@MOD'
This commit is contained in:
parent
bf92a8b80e
commit
09dc2eed82
@ -30,6 +30,7 @@ pub mut:
|
||||
// prev_tok TokenKind
|
||||
is_started bool
|
||||
fn_name string // needed for @FN
|
||||
mod_name string // needed for @MOD
|
||||
is_print_line_on_error bool
|
||||
is_print_colored_error bool
|
||||
is_print_rel_paths_on_error bool
|
||||
@ -138,6 +139,41 @@ fn (mut s Scanner) ident_fn_name() string {
|
||||
return fn_name
|
||||
}
|
||||
|
||||
// ident_mod_name look ahead and return name of module this file belongs to if possible, otherwise empty string
|
||||
fn (mut s Scanner) ident_mod_name() string {
|
||||
|
||||
start := s.pos
|
||||
mut pos := s.pos
|
||||
pos++
|
||||
|
||||
// Eat whitespaces
|
||||
for pos < s.text.len && s.text[pos].is_space() {
|
||||
pos++
|
||||
}
|
||||
if pos >= s.text.len {
|
||||
return ''
|
||||
}
|
||||
|
||||
start_pos := pos
|
||||
|
||||
// Search for next occurrence of a whitespace or newline
|
||||
for pos < s.text.len && !s.text[pos].is_space() && !util.is_nl(s.text[pos]) {
|
||||
pos++
|
||||
}
|
||||
if pos >= s.text.len {
|
||||
return ''
|
||||
}
|
||||
|
||||
end_pos := pos
|
||||
|
||||
if end_pos > s.text.len || end_pos <= start_pos || end_pos <= start || start_pos <= start {
|
||||
return ''
|
||||
}
|
||||
|
||||
mod_name := s.text[start_pos..end_pos]
|
||||
return mod_name
|
||||
}
|
||||
|
||||
fn filter_num_sep(txt byteptr, start int, end int) string {
|
||||
unsafe{
|
||||
mut b := malloc(end - start + 1) // add a byte for the endstring 0
|
||||
@ -455,6 +491,8 @@ pub fn (mut s Scanner) scan() token.Token {
|
||||
kind := token.key_to_token(name)
|
||||
if kind == .key_fn {
|
||||
s.fn_name = s.ident_fn_name()
|
||||
} else if kind == .key_module {
|
||||
s.mod_name = s.ident_mod_name()
|
||||
}
|
||||
return s.new_token(kind, name, name.len)
|
||||
}
|
||||
@ -637,17 +675,21 @@ pub fn (mut s Scanner) scan() token.Token {
|
||||
s.pos++
|
||||
name := s.ident_name()
|
||||
// @FN => will be substituted with the name of the current V function
|
||||
// @MOD => will be substituted with the name of the current V module
|
||||
// @VEXE => will be substituted with the path to the V compiler
|
||||
// @FILE => will be substituted with the path of the V source file
|
||||
// @LINE => will be substituted with the V line number where it appears (as a string).
|
||||
// @COLUMN => will be substituted with the column where it appears (as a string).
|
||||
// @VHASH => will be substituted with the shortened commit hash of the V compiler (as a string).
|
||||
// This allows things like this:
|
||||
// println( 'file: ' + @FILE + ' | line: ' + @LINE + ' | fn: ' + @FN)
|
||||
// println( 'file: ' + @FILE + ' | line: ' + @LINE + ' | fn: ' + @MOD + '.' + @FN)
|
||||
// ... which is useful while debugging/tracing
|
||||
if name == 'FN' {
|
||||
return s.new_token(.string, s.fn_name, 3)
|
||||
}
|
||||
if name == 'MOD' {
|
||||
return s.new_token(.string, s.mod_name, 4)
|
||||
}
|
||||
if name == 'VEXE' {
|
||||
vexe := pref.vexe_path()
|
||||
return s.new_token(.string, util.cescaped_path(vexe), 5)
|
||||
|
@ -40,6 +40,10 @@ fn test_scan() {
|
||||
assert 1.23e+10 == 1.23e10
|
||||
assert 1.23e+10 == 1.23e0010
|
||||
assert (-1.23e+10) == (1.23e0010 * -1.0)
|
||||
|
||||
// test @MOD
|
||||
assert @MOD == 'scanner'
|
||||
|
||||
// test @FN
|
||||
assert @FN == 'test_scan'
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user