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