I want to get a type of name, as a string, without runtime reflection.
Using a macro, and with an example of type, I can do it like this:
def typeNameFromInstance [A] (example: A): string = macro typeNameFromInstanceImplementation [A] Def typeNameFromInstanceImplementation [A] (c: context) (Example: c.Expr [a]): c.Expr [string] = {import c.universe. _Value name = instance.actualType.toString c. XPR [String] (Little (Constant (name))} How can I do without this type of example? I like the signature of a function:
DF type name [A]: string I can not use class tags because they do not have full type of name I just can not use a typewriter.
Edit: It appears that This is not possible in full generality (for example, nested function calls). This comment has been given in the acceptable answer given below.
You can use a tree that represents the macro app: c.macroApplication def typeName [T]: string = macro typeName_impl [t] def typeName_impl [T] (c: context): c.Expr [string] = {import c.universe._ Val TypeApply (_, list (typeTree)) = c.macroApplication c.literal ( TypeTree.toString () } Edit: There is another way to get one, but maybe a little better:
def typeName [T]: string = macro typeName_impl [t] def typeName_impl [t: c .WeakTypeTag] (c: context): c.Expr [string] = {import c.universe._ c .literal (weakTypeOf [T] .toString ())}
No comments:
Post a Comment