aboutsummaryrefslogtreecommitdiff
path: root/dottydoc/shared/src/main/scala/dotty/tools/dottydoc/model/Entity.scala
blob: 675bc8319fd219c15bb155f3729bd7a894a86491 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package dotty.tools.dottydoc
package model

import comment.Comment

object Entities {
  import prickle._

  type PackageMember = Entity with Members with Modifiers

  sealed trait Entity {
    def name: String

    /** Path from root, i.e. `scala.Option$` */
    def path: List[String]

    def comment: Option[Comment]

    def sourceUrl: String = "#"

    def kind: String

    def parent: Option[Entity]

    /** All parents from package level i.e. Package to Object to Member etc */
    def parents: List[Entity] =
      parent.map(p => p :: p.parents).getOrElse(Nil)
  }

  sealed trait Members {
    def members: List[Entity]
  }

  sealed trait Modifiers {
    def modifiers: List[String]

    val isPrivate: Boolean =
      modifiers.contains("private")
  }

  final case class Package(
    name: String,
    members: List[Entity],
    path: List[String],
    var comment: Option[Comment] = None
  ) extends Entity with Members {
    override val kind = "package"

    var parent: Option[Entity] = None
    val children: List[PackageMember] =
      members.collect { case x: PackageMember => x }
  }

  final case class Class(
    name: String,
    members: List[Entity],
    modifiers: List[String],
    path: List[String],
    var comment: Option[Comment] = None
  ) extends Entity with Members with Modifiers {
    override val kind = "class"
    var parent: Option[Entity] = None
  }

  final case class CaseClass(
    name: String,
    members: List[Entity],
    modifiers: List[String],
    path: List[String],
    var comment: Option[Comment] = None
  ) extends Entity with Members with Modifiers {
    override val kind = "case class"
    var parent: Option[Entity] = None
  }

  final case class Trait(
    name: String,
    members: List[Entity],
    modifiers: List[String],
    path: List[String],
    var comment: Option[Comment] = None
  ) extends Entity with Members with Modifiers {
    override val kind = "trait"
    var parent: Option[Entity] = None
  }

  final case class Object(
    name: String,
    members: List[Entity],
    modifiers: List[String],
    path: List[String],
    var comment: Option[Comment] = None
  ) extends Entity with Members with Modifiers {
    override val kind = "object"
    var parent: Option[Entity] = None
  }

  final case class Def(
    name: String,
    modifiers: List[String],
    path: List[String],
    var comment: Option[Comment] = None
  ) extends Entity with Modifiers {
    override val kind = "def"
    var parent: Option[Entity] = None
  }

  final case class Val(
    name: String,
    modifiers: List[String],
    path: List[String],
    var comment: Option[Comment] = None
  ) extends Entity with Modifiers {
    override val kind = "val"
    var parent: Option[Entity] = None
  }

  /** This object is used to represent entities that are to be filtered out */
  final case object NonEntity extends Entity {
    override val name = ""
    override val comment = None
    override val path = Nil
    override val kind = ""
    override val parent = None
  }

  final case object RootEntity extends Entity {
    override val name = "root"
    override val comment = None
    override val path = Nil
    override val kind = ""
    override val parent = None
  }

  //implicit val pMPickler: PicklerPair[PackageMember] = CompositePickler[PackageMember]
  //  .concreteType[Class]
  //  .concreteType[CaseClass]
  //  .concreteType[Object]
  //  .concreteType[Trait]

  implicit val entityPickler: PicklerPair[Entity] = CompositePickler[Entity]
    .concreteType[Val]
    .concreteType[Def]
    .concreteType[Class]
    .concreteType[CaseClass]
    .concreteType[Object]
    .concreteType[Trait]
    .concreteType[Package]
}