aboutsummaryrefslogblamecommitdiff
path: root/doc-tool/src/dotty/tools/dottydoc/model/entities.scala
blob: a40666e0dc161189ed47fcb66b1c9a5a273c6c7f (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                            

                   
                                                         
 
                        

                    










                                             

                               





                                                                                   












                                                                            



                                          

                           




                                                                    




                             
                          
                                 
 
                            
                                   

 



                              
                   
                            

 




                                



                                         



                                            
                                           
                      
 
 



                                               

 
                                                                                                          
                    

 
                                                                                                              


                                  
                                                                                        
                                  


                             
                                                                         


                              
                                                                                                     
                  
                                 

 
                                                                                   
 

                                                                                                                          


                       
                    
                
                        










                                  





                                                
package dotty.tools.dottydoc
package model

import comment._
import references._
import dotty.tools.dotc.core.Symbols.{ Symbol, NoSymbol }

trait Entity { entity =>
  def symbol: Symbol

  def name: String

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

  def comment: Option[Comment]

  def kind: String

  def parent: Entity

  def annotations: List[String]

  def children: List[Entity with Members] = entity match {
    case e: Entity with Members =>
      e.members.collect { case e: Entity with Members if e.kind != "package" => e }
    case _ => Nil
  }

  /** All parents from package level i.e. Package to Object to Member etc */
  def parents: List[Entity] = parent match {
    case NonEntity => Nil
    case e => e :: e.parents
  }

  /** Applies `f` to entity if != `NonEntity` */
  def fold[A](nonEntity: A)(f: Entity => A) = this match {
    case NonEntity => nonEntity
    case x => f(x)
  }
}

trait SuperTypes {
  def superTypes: List[MaterializableLink]
}

trait Members {
  def members: List[Entity]

  def hasVisibleMembers: Boolean = members.exists {
    case e: Entity with Modifiers => !(e.isPrivate || e.isProtected)
    case e => true
  }
}

trait Modifiers {
  def modifiers: List[String]

  def isPrivate: Boolean =
    modifiers.contains("private")

  def isProtected: Boolean =
    modifiers.contains("protected")
}

trait TypeParams {
  def typeParams: List[String]
}

trait ReturnValue {
  def returnValue: Reference
}

trait ParamList {
  def list: List[NamedReference]
  def isImplicit: Boolean
}

trait Constructors {
  def constructors: List[List[ParamList]]
}

trait ImplicitlyAddedEntity extends Entity {
  def implicitlyAddedFrom: Option[Reference]
}

trait Package extends Entity with Members {
  val kind = "package"
}

trait TypeAlias extends Entity with Modifiers {
  val kind = "type"
  def alias: Option[Reference]
  def isAbstract: Boolean = !alias.isDefined
}

trait Class extends Entity with Modifiers with TypeParams with Constructors with SuperTypes with Members {
  val kind = "class"
}

trait CaseClass extends Entity with Modifiers with TypeParams with Constructors with SuperTypes with Members {
  override val kind = "case class"
}

trait Trait extends Entity with Modifiers with TypeParams with SuperTypes with Members {
  def traitParams: List[ParamList]
  override val kind = "trait"
}

trait Object extends Entity with Modifiers with SuperTypes with Members {
  override val kind = "object"
}

trait Def extends Entity with Modifiers with TypeParams with ReturnValue with ImplicitlyAddedEntity {
  val kind = "def"
  def paramLists: List[ParamList]
}

trait Val extends Entity with Modifiers with ReturnValue with ImplicitlyAddedEntity

sealed trait NonEntity extends Package with TypeAlias with Class with CaseClass with Trait with Object with Def with Val {
  override val kind = ""
  val annotations = Nil
  val name = ""
  val symbol = NoSymbol
  val comment = None
  val path = Nil
  val parent = NonEntity
  val constructors = Nil
  val paramLists = Nil
  val implicitlyAddedFrom = None
  val members = Nil
  val modifiers = Nil
  val reference = EmptyReference
  val returnValue = EmptyReference
  val superTypes = Nil
  val typeParams = Nil
  val traitParams = Nil
  val alias = None
}

final case object NonEntity extends NonEntity
final case object RootEntity extends NonEntity {
  override val name = "root"
}