From 451b724c40bc04e4a9c756b2fcd457cca3fd437c Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Mon, 2 Mar 2020 09:05:14 -0800 Subject: make genericParams support static[T] generic params (#13433) * make genericParams support static[T] generic params * WrapStatic => StaticParam --- lib/pure/typetraits.nim | 34 +++++++++++++++++++++++++------ tests/metatype/ttypetraits.nim | 45 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/lib/pure/typetraits.nim b/lib/pure/typetraits.nim index 04231db09..0335d5488 100644 --- a/lib/pure/typetraits.nim +++ b/lib/pure/typetraits.nim @@ -86,13 +86,13 @@ since (1, 1): # Note: `[]` currently gives: `Error: no generic parameters allowed for ...` type(default(T)[i]) + type StaticParam*[value] = object + ## used to wrap a static value in `genericParams` + import std/macros -macro genericParams*(T: typedesc): untyped {.since: (1, 1).} = - ## return tuple of generic params for generic `T` - runnableExamples: - type Foo[T1, T2]=object - doAssert genericParams(Foo[float, string]) is (float, string) +macro genericParamsImpl(T: typedesc): untyped = + # auxiliary macro needed, can't do it directly in `genericParams` result = newNimNode(nnkTupleConstr) var impl = getTypeImpl(T) expectKind(impl, nnkBracketExpr) @@ -107,11 +107,33 @@ macro genericParams*(T: typedesc): untyped {.since: (1, 1).} = continue of nnkBracketExpr: for i in 1..