parser,checker: support @METHOD, replaced by 'ReceiverType.MethodName'
parent
d30f94507c
commit
25a3873019
|
@ -3516,6 +3516,7 @@ V also gives your code access to a set of pseudo string variables,
|
|||
that are substituted at compile time:
|
||||
|
||||
- `@FN` => replaced with the name of the current V function
|
||||
- `@METHOD` => replaced with ReceiverType.MethodName
|
||||
- `@MOD` => replaced with the name of the current V module
|
||||
- `@STRUCT` => replaced with the name of the current V struct
|
||||
- `@FILE` => replaced with the path of the V source file
|
||||
|
|
|
@ -3911,6 +3911,15 @@ fn (mut c Checker) at_expr(mut node ast.AtExpr) table.Type {
|
|||
.fn_name {
|
||||
node.val = c.cur_fn.name.all_after_last('.')
|
||||
}
|
||||
.method_name {
|
||||
fname := c.cur_fn.name.all_after_last('.')
|
||||
if c.cur_fn.is_method {
|
||||
node.val = c.table.type_to_str(c.cur_fn.receiver.typ).all_after_last('.') + '.' +
|
||||
fname
|
||||
} else {
|
||||
node.val = fname
|
||||
}
|
||||
}
|
||||
.mod_name {
|
||||
node.val = c.cur_fn.mod
|
||||
}
|
||||
|
|
|
@ -255,6 +255,7 @@ fn (mut p Parser) at() ast.AtExpr {
|
|||
name := p.tok.lit
|
||||
kind := match name {
|
||||
'@FN' { token.AtKind.fn_name }
|
||||
'@METHOD' { token.AtKind.method_name }
|
||||
'@MOD' { token.AtKind.mod_name }
|
||||
'@STRUCT' { token.AtKind.struct_name }
|
||||
'@VEXE' { token.AtKind.vexe_path }
|
||||
|
|
|
@ -51,11 +51,13 @@ fn (mut t TestFn) tst_1() {
|
|||
|
||||
fn (mut t TestFn) tst_2(cb fn (int)) {
|
||||
assert @FN == 'tst_2'
|
||||
assert @METHOD == 'TestFn.tst_2'
|
||||
cb(1)
|
||||
}
|
||||
|
||||
fn fn_name_mod_level() {
|
||||
assert @FN == 'fn_name_mod_level'
|
||||
assert @METHOD == 'fn_name_mod_level'
|
||||
}
|
||||
|
||||
fn fn_name_mod_level_high_order(cb fn (int)) {
|
||||
|
|
|
@ -136,6 +136,7 @@ const (
|
|||
)
|
||||
|
||||
// @FN => will be substituted with the name of the current V function
|
||||
// @METHOD => will be substituted with ReceiverType.MethodName
|
||||
// @MOD => will be substituted with the name of the current V module
|
||||
// @STRUCT => will be substituted with the name of the current V struct
|
||||
// @VEXE => will be substituted with the path to the V compiler
|
||||
|
@ -153,6 +154,7 @@ const (
|
|||
pub enum AtKind {
|
||||
unknown
|
||||
fn_name
|
||||
method_name
|
||||
mod_name
|
||||
struct_name
|
||||
vexe_path
|
||||
|
@ -164,9 +166,8 @@ pub enum AtKind {
|
|||
}
|
||||
|
||||
pub const (
|
||||
valid_at_tokens = ['@FN', '@MOD', '@STRUCT', '@VEXE', '@FILE', '@LINE', '@COLUMN', '@VHASH',
|
||||
'@VMOD_FILE',
|
||||
]
|
||||
valid_at_tokens = ['@FN', '@METHOD', '@MOD', '@STRUCT', '@VEXE', '@FILE', '@LINE', '@COLUMN',
|
||||
'@VHASH', '@VMOD_FILE']
|
||||
)
|
||||
|
||||
// build_keys genereates a map with keywords' string values:
|
||||
|
|
Loading…
Reference in New Issue