@@ -59,19 +59,18 @@ private object JsonMapperMacroFactory {
5959 .. $implicitWriters
6060 ${mapperFilter.mainExpressionFrom(context)(domainTypeTag.tpe)}
6161 """
62- // println( code)
62+ // context.warning(context.enclosingPosition, code.toString() )
6363 context.Expr [Format [E ]](code)
6464 }
6565
6666
6767 private def extractTypes (context : blackbox.Context )
6868 (rootType : context.universe.Type ): org.nullvector.tree.Tree [context.universe.Type ] = {
6969 import context .universe ._
70+ val enumType = context.typeOf[Enumeration ]
7071
7172 def extractAll (caseType : context.universe.Type ): org.nullvector.tree.Tree [context.universe.Type ] = {
72-
7373 def isSupprtedTrait (aTypeClass : ClassSymbol ) = aTypeClass.isTrait && aTypeClass.isSealed && ! aTypeClass.fullName.startsWith(" scala" )
74-
7574 def extaracCaseClassesFromTypeArgs (classType : Type ): List [Type ] = {
7675 classType.typeArgs.collect {
7776 case argType if argType.typeSymbol.asClass.isCaseClass => List (classType, argType)
@@ -80,25 +79,27 @@ private object JsonMapperMacroFactory {
8079 }
8180
8281 val caseTypeAsClass = caseType.typeSymbol.asClass
83- caseTypeAsClass.toString
84- // println(s"$caseTypeAsClass -- is case class --> ${caseTypeAsClass.isCaseClass}")
8582 if (caseTypeAsClass.isCaseClass) {
8683 Tree (caseType,
87- caseType.decls.collect { case method : MethodSymbol if method.isCaseAccessor =>
88- val returnType = method.returnType
89- returnType.toString // This is needed to materialize the type (WTF!!)
90- returnType
91- }
84+ caseType.decls
85+ .collect { case method : MethodSymbol if method.isCaseAccessor =>
86+ val returnType = method.returnType
87+ returnType.toString // This is needed to materialize the type (WTF!!)
88+ returnType
89+ }
9290 .collect {
91+ case aType if aType.typeSymbol.owner.isType &&
92+ aType.typeSymbol.owner.asType.toType =:= enumType =>
93+ List (Tree (aType))
9394 case aType if aType.typeSymbol.asClass.isCaseClass || isSupprtedTrait(aType.typeSymbol.asClass) => List (extractAll(aType))
9495 case aType => extaracCaseClassesFromTypeArgs(aType).map(arg => extractAll(arg))
95- }.flatten.toList
96+ }
97+ .flatten.toList
9698
9799 )
98100 }
99101 else if (isSupprtedTrait(caseTypeAsClass)) {
100102 val subclasses = caseTypeAsClass.knownDirectSubclasses
101- // println(s"$caseType -- subclasses --> $subclasses")
102103 Tree (caseType, subclasses.map(aType => extractAll(aType.asClass.toType)).toList)
103104 }
104105 else Tree .empty
@@ -110,6 +111,12 @@ private object JsonMapperMacroFactory {
110111
111112 sealed trait ExpressionFactory {
112113
114+ def enumTypeName (context : blackbox.Context )(aType : context.Type ): Option [String ] = {
115+ val enumType = context.typeOf[Enumeration ]
116+ if (aType.typeSymbol.owner.asType.toType =:= enumType) Some (aType.toString.split(" \\ ." ).dropRight(1 ).mkString(" ." ))
117+ else None
118+ }
119+
113120 def typeNotImplicitDeclared (context : blackbox.Context )(aType : context.Type , ignore : context.Type ): Boolean
114121
115122 def implicitExpressionsFrom (context : blackbox.Context )(types : List [context.Type ]): List [context.Tree ]
@@ -120,11 +127,17 @@ private object JsonMapperMacroFactory {
120127 private object FormatExpressionFactory extends ExpressionFactory {
121128
122129 override def implicitExpressionsFrom (context : blackbox.Context )(types : List [context.Type ]): List [context.Tree ] = {
123- types.map(aType => context.parse(s """ private implicit val ${context.freshName()}: Format[ $aType] = format[ $aType] """ ))
130+ types.map(aType => enumTypeName(context)(aType) match {
131+ case Some (enumName) =>
132+ context.parse(s """ private implicit val ${context.freshName()}: Format[ $aType] = formatEnum( $enumName) """ )
133+ case None =>
134+ context.parse(s """ private implicit val ${context.freshName()}: Format[ $aType] = format[ $aType] """ )
135+ })
124136 }
125137
126138 override def mainExpressionFrom (context : blackbox.Context )(tpe : context.Type ): context.Tree = {
127- context.parse(s " format[ $tpe] " )
139+ import context .universe ._
140+ (q " format[ $tpe] " )
128141 }
129142
130143 override def typeNotImplicitDeclared (context : blackbox.Context )(aType : context.Type , ignore : context.Type ): Boolean = {
@@ -140,11 +153,17 @@ private object JsonMapperMacroFactory {
140153 private object WritesExpressionFactory extends ExpressionFactory {
141154
142155 override def implicitExpressionsFrom (context : blackbox.Context )(types : List [context.Type ]): List [context.Tree ] = {
143- types.map(aType => context.parse(s """ private implicit val ${context.freshName()}: Writes[ $aType] = writes[ $aType] """ ))
156+ types.map(aType => enumTypeName(context)(aType) match {
157+ case Some (enumName) =>
158+ context.parse(s """ private implicit val ${context.freshName()}: Writes[ $aType] = Writes.enumNameWrites[ $enumName] """ )
159+ case None =>
160+ context.parse(s """ private implicit val ${context.freshName()}: Writes[ $aType] = writes[ $aType] """ )
161+ })
144162 }
145163
146164 override def mainExpressionFrom (context : blackbox.Context )(tpe : context.Type ): context.Tree = {
147- context.parse(s " writes[ $tpe] " )
165+ import context .universe ._
166+ (q " writes[ $tpe] " )
148167 }
149168
150169 override def typeNotImplicitDeclared (context : blackbox.Context )(aType : context.Type , ignore : context.Type ): Boolean = {
@@ -160,11 +179,17 @@ private object JsonMapperMacroFactory {
160179 private object ReadsExpressionFactory extends ExpressionFactory {
161180
162181 override def implicitExpressionsFrom (context : blackbox.Context )(types : List [context.Type ]): List [context.Tree ] = {
163- types.map(aType => context.parse(s """ private implicit val ${context.freshName()}: Reads[ $aType] = reads[ $aType] """ ))
182+ types.map(aType => enumTypeName(context)(aType) match {
183+ case Some (enumName) =>
184+ context.parse(s """ private implicit val ${context.freshName()}: Reads[ $aType] = Reads.enumNameReads( $enumName) """ )
185+ case None =>
186+ context.parse(s """ private implicit val ${context.freshName()}: Reads[ $aType] = reads[ $aType] """ )
187+ })
164188 }
165189
166190 override def mainExpressionFrom (context : blackbox.Context )(tpe : context.Type ): context.Tree = {
167- context.parse(s " reads[ $tpe] " )
191+ import context .universe ._
192+ (q " reads[ $tpe] " )
168193 }
169194
170195 override def typeNotImplicitDeclared (context : blackbox.Context )(aType : context.Type , ignore : context.Type ): Boolean = {
0 commit comments