提交 83a835c8 编写于 作者: 梦境迷离's avatar 梦境迷离

refactor

上级 011e058b
......@@ -22,6 +22,8 @@
package io.github.dreamylost.macros
import scala.reflect.macros.whitebox
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
/**
*
......@@ -85,7 +87,7 @@ abstract class AbstractMacroProcessor(val c: whitebox.Context) {
def printTree(force: Boolean, resTree: Tree): Unit = {
c.info(
c.enclosingPosition,
"\n###### Expanded macro ######\n" + resTree.toString() + "\n###### Expanded macro ######\n",
s"\n###### Time: ${ZonedDateTime.now().format(DateTimeFormatter.ISO_ZONED_DATE_TIME)} Expanded macro start ######\n" + resTree.toString() + "\n###### Expanded macro end ######\n",
force = force
)
}
......@@ -201,32 +203,23 @@ abstract class AbstractMacroProcessor(val c: whitebox.Context) {
}
/**
* Modify companion objects.
* Modify companion object or object.
*
* @param compDeclOpt
* @param codeBlock
* @param codeBlocks
* @param className
* @return
*/
def modifiedCompanion(
def appendModuleBody(
compDeclOpt: Option[ModuleDef],
codeBlock: Tree, className: TypeName): Tree = {
compDeclOpt map { compDecl =>
val q"$mods object $obj extends ..$bases { ..$body }" = compDecl
val o =
q"""
$mods object $obj extends ..$bases {
..$body
..$codeBlock
}
"""
c.info(c.enclosingPosition, s"modifiedCompanion className: $className, exists obj: $o", force = true)
o
} getOrElse {
// Create a companion object with the builder
val o = q"object ${className.toTermName} { ..$codeBlock }"
c.info(c.enclosingPosition, s"modifiedCompanion className: $className, new obj: $o", force = true)
o
codeBlocks: List[Tree], className: TypeName): Tree = {
compDeclOpt.fold(q"object ${className.toTermName} { ..$codeBlocks }") {
compDecl =>
c.info(c.enclosingPosition, s"appendModuleBody className: $className, exists obj: $compDecl", force = true)
val ModuleDef(mods, name, impl) = compDecl
val Template(parents, self, body) = impl
val newImpl = Template(parents, self, body ++ codeBlocks)
ModuleDef(mods, name, newImpl)
}
}
......
......@@ -46,7 +46,7 @@ object applyMacro {
override def createCustomExpr(classDecl: ClassDef, compDeclOpt: Option[ModuleDef] = None): Any = {
val classDefinition = mapToClassDeclInfo(classDecl)
val apply = getApplyMethodWithCurrying(classDefinition.className, classDefinition.classParamss, classDefinition.classTypeParams)
val compDecl = modifiedCompanion(compDeclOpt, apply, classDefinition.className)
val compDecl = appendModuleBody(compDeclOpt, List(apply), classDefinition.className)
c.Expr(
q"""
$classDecl
......
......@@ -58,31 +58,32 @@ object builderMacro {
valDefMapTo(field.asInstanceOf[ValDef])
}
private def getBuilderClassAndMethod(typeName: TypeName, fieldss: List[List[Tree]], classTypeParams: List[Tree], isCase: Boolean): Tree = {
private def getBuilderClassAndMethod(typeName: TypeName, fieldss: List[List[Tree]], classTypeParams: List[Tree], isCase: Boolean): List[Tree] = {
val fields = fieldss.flatten
val builderClassName = getBuilderClassName(typeName)
val builderFieldMethods = fields.map(f => getFieldSetMethod(typeName, f, classTypeParams))
val builderFieldDefinitions = fields.map(f => getFieldDefinition(f))
val returnTypeParams = extractClassTypeParamsTypeName(classTypeParams)
q"""
def builder[..$classTypeParams](): $builderClassName[..$returnTypeParams] = new $builderClassName()
class $builderClassName[..$classTypeParams] {
val builderMethod = q"def builder[..$classTypeParams](): $builderClassName[..$returnTypeParams] = new $builderClassName()"
val buulderClass =
q"""
class $builderClassName[..$classTypeParams] {
..$builderFieldDefinitions
..$builderFieldMethods
def build(): $typeName[..$returnTypeParams] = ${getConstructorWithCurrying(typeName, fieldss, isCase)}
}
"""
}
"""
List(builderMethod, buulderClass)
}
override def createCustomExpr(classDecl: ClassDef, compDeclOpt: Option[ModuleDef] = None): Any = {
val classDefinition = mapToClassDeclInfo(classDecl)
val builder = getBuilderClassAndMethod(classDefinition.className, classDefinition.classParamss,
classDefinition.classTypeParams, isCaseClass(classDecl))
val compDecl = modifiedCompanion(compDeclOpt, builder, classDefinition.className)
val compDecl = appendModuleBody(compDeclOpt, builder, classDefinition.className)
// Return both the class and companion object declarations
c.Expr(
q"""
......
......@@ -56,7 +56,7 @@ object jsonMacro {
override def createCustomExpr(classDecl: c.universe.ClassDef, compDeclOpt: Option[c.universe.ModuleDef]): Any = {
val classDefinition = mapToClassDeclInfo(classDecl)
val format = jsonFormatter(classDefinition.className, classDefinition.classParamss.flatten)
val compDecl = modifiedCompanion(compDeclOpt, format, classDefinition.className)
val compDecl = appendModuleBody(compDeclOpt, List(format), classDefinition.className)
// Return both the class and companion object declarations
c.Expr(
q"""
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册