diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2015-03-27 09:33:04 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2015-03-27 09:33:04 +0100 |
commit | 280d1d56e62fcc29f18598f037374c67f1a49432 (patch) | |
tree | dac85957112b363be2d1e533fedb7e60d4e08d85 | |
parent | e80840c40af5c9108e9aed1573cf4f048a2757b8 (diff) | |
parent | 8274639eaa0be75dd038cdba3010ab839a2bed6c (diff) | |
download | Nim-280d1d56e62fcc29f18598f037374c67f1a49432.tar.gz |
Merge pull request #2417 from fowlmouth/patch-2
Make the symbols returned from getType() usable for that type
-rw-r--r-- | compiler/vmdeps.nim | 1 | ||||
-rw-r--r-- | tests/macros/typesapi2.nim | 49 |
2 files changed, 50 insertions, 0 deletions
diff --git a/compiler/vmdeps.nim b/compiler/vmdeps.nim index 2b80f6aed..6148ed319 100644 --- a/compiler/vmdeps.nim +++ b/compiler/vmdeps.nim @@ -42,6 +42,7 @@ proc opSlurp*(file: string, info: TLineInfo, module: PSym): string = proc atomicTypeX(name: string; t: PType; info: TLineInfo): PNode = let sym = newSym(skType, getIdent(name), t.owner, info) + sym.typ = t result = newSymNode(sym) result.typ = t diff --git a/tests/macros/typesapi2.nim b/tests/macros/typesapi2.nim new file mode 100644 index 000000000..016295ba4 --- /dev/null +++ b/tests/macros/typesapi2.nim @@ -0,0 +1,49 @@ +# tests to see if a symbol returned from macros.getType() can +# be used as a type +import macros + +macro testTypesym (t:stmt): expr = + var ty = t.getType + if ty.typekind == ntyTypedesc: + # skip typedesc get to the real type + ty = ty[1].getType + + if ty.kind == nnkSym: return ty + assert ty.kind == nnkBracketExpr + assert ty[0].kind == nnkSym + result = ty[0] + return + +type TestFN = proc(a,b:int):int +var iii: testTypesym(TestFN) +static: assert iii is TestFN + +proc foo11 : testTypesym(void) = + echo "HI!" +static: assert foo11 is proc():void + +var sss: testTypesym(seq[int]) +static: assert sss is seq[int] +# very nice :> + +static: assert array[2,int] is testTypesym(array[2,int]) +static: assert(ref int is testTypesym(ref int)) +static: assert(void is testTypesym(void)) + + +macro tts2 (t:stmt, idx:int): expr = + var ty = t.getType + if ty.typekind == ntyTypedesc: + # skip typedesc get to the real type + ty = ty[1].getType + + if ty.kind == nnkSym: return ty + assert ty.kind == nnkBracketExpr + return ty[idx.intval.int] +type TestFN2 = proc(a:int,b:float):string +static: + assert(tts2(TestFN2, 0) is TestFN2) + assert(tts2(TestFN2, 1) is string) + assert(tts2(TestFN2, 2) is int) + assert(tts2(TestFN2, 3) is float) + |