From 9d4c943d648fc5624f752a3a3dcffd08eea4646a Mon Sep 17 00:00:00 2001 From: Nicolas Sauzede Date: Wed, 5 Feb 2020 06:12:33 +0100 Subject: [PATCH] compiler: add very simple nameof token to get type name as string --- vlib/compiler/expression.v | 9 +++++++++ vlib/compiler/tests/nameof_test.v | 16 ++++++++++++++++ vlib/compiler/token.v | 2 ++ 3 files changed, 27 insertions(+) create mode 100644 vlib/compiler/tests/nameof_test.v diff --git a/vlib/compiler/expression.v b/vlib/compiler/expression.v index c32c4d1f6e..20c48a9be8 100644 --- a/vlib/compiler/expression.v +++ b/vlib/compiler/expression.v @@ -813,6 +813,15 @@ fn (p mut Parser) factor() string { // p.fgen('$sizeof_typ)') return 'int' } + .key_nameof { + p.next() + p.check(.lpar) + mut nameof_typ := p.get_type() + p.check(.rpar) + p.gen('tos3("$nameof_typ")') +// return 'byteptr' + return 'string' + } .key_offsetof { p.next() p.check(.lpar) diff --git a/vlib/compiler/tests/nameof_test.v b/vlib/compiler/tests/nameof_test.v new file mode 100644 index 0000000000..9006181898 --- /dev/null +++ b/vlib/compiler/tests/nameof_test.v @@ -0,0 +1,16 @@ + +fn simple(p T) string { + tname := nameof(T) + println("Hello generic, I'm an [$tname]") + return tname +} + +struct FunkyStruct{ } + +fn test_nameof_on_various_types_in_generic() { + assert simple(42) == "int" + assert simple(3.14) == "f32" + assert simple("FuBar") == "string" + assert simple(FunkyStruct{}) == "FunkyStruct" + assert simple(test_nameof_on_various_types_in_generic) == "fn ()" +} diff --git a/vlib/compiler/token.v b/vlib/compiler/token.v index 60ed2b1c52..e0a4bce0f8 100644 --- a/vlib/compiler/token.v +++ b/vlib/compiler/token.v @@ -110,6 +110,7 @@ enum TokenKind { key_select key_sizeof key_offsetof + key_nameof key_struct key_switch key_true @@ -240,6 +241,7 @@ fn build_token_str() []string { s[TokenKind.key_select] = 'select' s[TokenKind.key_none] = 'none' s[TokenKind.key_offsetof] = '__offsetof' + s[TokenKind.key_nameof] = 'nameof' return s }