Scala - how to print case classes like (pretty printed) tree

前端 未结 10 1874
情歌与酒
情歌与酒 2020-12-07 22:35

I\'m making a parser with Scala Combinators. It is awesome. What I end up with is a long list of entagled case classes, like: ClassDecl(Complex,List(VarDecl(Real,float

10条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-07 23:02

    Using reflection

    import scala.reflect.ClassTag
    import scala.reflect.runtime.universe._
    
    object CaseClassBeautifier  {
      def getCaseAccessors[T: TypeTag] = typeOf[T].members.collect {
        case m: MethodSymbol if m.isCaseAccessor => m
      }.toList
    
      def nice[T:TypeTag](x: T)(implicit classTag: ClassTag[T]) : String = {
        val instance = x.asInstanceOf[T]
        val mirror = runtimeMirror(instance.getClass.getClassLoader)
        val accessors = getCaseAccessors[T]
        var res = List.empty[String]
        accessors.foreach { z ⇒
          val instanceMirror = mirror.reflect(instance)
          val fieldMirror = instanceMirror.reflectField(z.asTerm)
          val s = s"${z.name} = ${fieldMirror.get}"
          res = s :: res
        }
        val beautified = x.getClass.getSimpleName + "(" + res.mkString(", ") + ")"
        beautified
      }
    }
    

提交回复
热议问题