aboutsummaryrefslogtreecommitdiff
path: root/dottydoc
diff options
context:
space:
mode:
authorFelix Mulder <felix.mulder@gmail.com>2016-08-06 20:53:15 +0200
committerFelix Mulder <felix.mulder@gmail.com>2016-08-19 15:37:33 +0200
commit922788ac39f7538b79b58c326bd22c641a8e2490 (patch)
treec24de6db3dc8536a7aadc72d569a3212fcafe9f2 /dottydoc
parent94dd0bccbb68618bc668c6005316d6930ae26069 (diff)
downloaddotty-922788ac39f7538b79b58c326bd22c641a8e2490.tar.gz
dotty-922788ac39f7538b79b58c326bd22c641a8e2490.tar.bz2
dotty-922788ac39f7538b79b58c326bd22c641a8e2490.zip
Add info on where implicitly added members originate from
Diffstat (limited to 'dottydoc')
-rw-r--r--dottydoc/js/src/html/Member.scala12
-rw-r--r--dottydoc/js/src/model/entities.scala22
-rw-r--r--dottydoc/jvm/resources/index.css4
-rw-r--r--dottydoc/jvm/src/dotty/tools/dottydoc/DottyDoc.scala1
-rw-r--r--dottydoc/jvm/src/dotty/tools/dottydoc/core/DocASTPhase.scala27
-rw-r--r--dottydoc/jvm/src/dotty/tools/dottydoc/core/MiniPhaseTransform.scala6
-rw-r--r--dottydoc/jvm/src/dotty/tools/dottydoc/core/TypeLinkingPhases.scala12
-rw-r--r--dottydoc/jvm/src/dotty/tools/dottydoc/model/entities.scala4
-rw-r--r--dottydoc/jvm/src/dotty/tools/dottydoc/model/factories.scala19
-rw-r--r--dottydoc/jvm/src/dotty/tools/dottydoc/model/internal.scala6
-rw-r--r--dottydoc/jvm/src/dotty/tools/dottydoc/model/json.scala4
11 files changed, 83 insertions, 34 deletions
diff --git a/dottydoc/js/src/html/Member.scala b/dottydoc/js/src/html/Member.scala
index a62a1ab34..dbd1883fa 100644
--- a/dottydoc/js/src/html/Member.scala
+++ b/dottydoc/js/src/html/Member.scala
@@ -9,6 +9,7 @@ import org.scalajs.dom.html.{Anchor, Div, Span}
trait MemberLayout {
import js.model._
+ import js.model.ops._
def member(m: Entity, parent: Entity) = {
def toggleBetween(short: Div, and: Div): Unit =
@@ -31,10 +32,10 @@ trait MemberLayout {
val fullComment = div(
cls := "mdl-cell mdl-cell--12-col full-comment",
style := "display: none;",
+ fromImplicitSpan(m),
raw(m.comment.fold("")(_.body))
).render
-
val hasLongerFullComment = m.comment.fold(false) { c =>
c.short.length + 5 < c.body.length
}
@@ -53,7 +54,7 @@ trait MemberLayout {
entity.modifiers.mkString(" ") + " " + m.kind
),
span(
- cls := "member-name",
+ cls := { if (m.addedImplicitly) "member-name implicitly-added" else "member-name" },
m.name
),
spanWith("member-type-params no-left-margin", typeParams(m)),
@@ -68,6 +69,13 @@ trait MemberLayout {
}
}
+ def fromImplicitSpan(m: Entity) = m.foldImplicitlyAdded { ref =>
+ span(
+ "Implicitly added from: ",
+ referenceToLinks(ref)
+ )
+ }.getOrElse(span())
+
def spanWith(clazz: String, contents: String) = contents match {
case "" => None
case _ => Some(span(cls := clazz, contents))
diff --git a/dottydoc/js/src/model/entities.scala b/dottydoc/js/src/model/entities.scala
index 4ae76c58c..49d0ec005 100644
--- a/dottydoc/js/src/model/entities.scala
+++ b/dottydoc/js/src/model/entities.scala
@@ -82,13 +82,23 @@ trait ParamList extends sjs.Object {
trait Def extends Entity with Modifiers with ReturnValue {
val typeParams: sjs.Array[String]
val paramLists: sjs.Array[ParamList]
+ val implicitlyAddedFrom: sjs.UndefOr[Reference]
}
@ScalaJSDefined
-trait Val extends Entity with Modifiers
+trait Val extends Entity with Modifiers {
+ val implicitlyAddedFrom: sjs.UndefOr[Reference]
+}
+
+@ScalaJSDefined
+trait Var extends Entity with Modifiers {
+ val implicitlyAddedFrom: sjs.UndefOr[Reference]
+}
@ScalaJSDefined
-trait Var extends Entity with Modifiers
+trait ImplicitlyAddedEntity extends Entity {
+ val implicitlyAddedFrom: sjs.UndefOr[Reference]
+}
object ops {
val EntitiesWithModifiers =
@@ -140,5 +150,13 @@ object ops {
def isPrivate: Boolean =
hasModifiers &&
ent.asInstanceOf[Modifiers].modifiers.contains("private")
+
+ def addedImplicitly: Boolean = (ent.kind == "def" || ent.kind == "val") && {
+ ent.asInstanceOf[ImplicitlyAddedEntity].implicitlyAddedFrom.isDefined
+ }
+
+ def foldImplicitlyAdded[B](f: Reference => B): sjs.UndefOr[B] =
+ if (ent.kind == "def" || ent.kind == "val") ent.asInstanceOf[ImplicitlyAddedEntity].implicitlyAddedFrom.map(f)
+ else sjs.undefined
}
}
diff --git a/dottydoc/jvm/resources/index.css b/dottydoc/jvm/resources/index.css
index 79eeaaee0..eaf26bbf7 100644
--- a/dottydoc/jvm/resources/index.css
+++ b/dottydoc/jvm/resources/index.css
@@ -134,6 +134,10 @@ div.member-definition > span.member-param-list span.is-implicit {
font-weight: 600;
}
+div.member-definition > span.member-name.implicitly-added {
+ color: #16A085;
+}
+
div.member {
min-height: 70px;
}
diff --git a/dottydoc/jvm/src/dotty/tools/dottydoc/DottyDoc.scala b/dottydoc/jvm/src/dotty/tools/dottydoc/DottyDoc.scala
index b5cdcf645..120b743b8 100644
--- a/dottydoc/jvm/src/dotty/tools/dottydoc/DottyDoc.scala
+++ b/dottydoc/jvm/src/dotty/tools/dottydoc/DottyDoc.scala
@@ -31,6 +31,7 @@ class DottyDocCompiler extends Compiler {
List(new DocASTPhase),
List(DocMiniTransformations(new LinkReturnTypes,
new LinkParamListTypes,
+ new LinkImplicitlyAddedTypes,
new SortMembers)),
List(new PrintPhase)
)
diff --git a/dottydoc/jvm/src/dotty/tools/dottydoc/core/DocASTPhase.scala b/dottydoc/jvm/src/dotty/tools/dottydoc/core/DocASTPhase.scala
index 40e778059..d9fb3bacc 100644
--- a/dottydoc/jvm/src/dotty/tools/dottydoc/core/DocASTPhase.scala
+++ b/dottydoc/jvm/src/dotty/tools/dottydoc/core/DocASTPhase.scala
@@ -55,15 +55,30 @@ class DocASTPhase extends Phase {
}
def membersFromSymbol(sym: Symbol): List[Entity] = {
- val defs = sym.info.bounds.hi.membersBasedOnFlags(Flags.Method, Flags.Synthetic | Flags.Private).map { meth =>
- track(meth.symbol, ctx, tree.symbol) {
- DefImpl(meth.symbol.name.decode.toString, Nil, path(meth.symbol), returnType(meth.info), typeParams(meth.symbol), paramLists(meth.info))
- }
- }.toList
+ val defs = sym.info.bounds.hi.membersBasedOnFlags(Flags.Method, Flags.Synthetic | Flags.Private)
+ .filterNot(_.symbol.owner.name.show == "Any")
+ .map { meth =>
+ track(meth.symbol, ctx, tree.symbol) {
+ DefImpl(
+ meth.symbol.name.show,
+ Nil,
+ path(meth.symbol),
+ returnType(meth.info),
+ typeParams(meth.symbol),
+ paramLists(meth.info),
+ implicitlyAddedFrom = Some(returnType(meth.symbol.owner.info))
+ )
+ }
+ }.toList
val vals = sym.info.fields.filterNot(_.symbol.is(Flags.Private | Flags.Synthetic)).map { value =>
track(value.symbol, ctx, tree.symbol) {
- ValImpl(value.symbol.name.decode.toString, Nil, path(value.symbol), returnType(value.info))
+ ValImpl(
+ value.symbol.name.show,
+ Nil, path(value.symbol),
+ returnType(value.info),
+ implicitlyAddedFrom = Some(returnType(value.symbol.owner.info))
+ )
}
}
diff --git a/dottydoc/jvm/src/dotty/tools/dottydoc/core/MiniPhaseTransform.scala b/dottydoc/jvm/src/dotty/tools/dottydoc/core/MiniPhaseTransform.scala
index 1da03583e..cd1fef52f 100644
--- a/dottydoc/jvm/src/dotty/tools/dottydoc/core/MiniPhaseTransform.scala
+++ b/dottydoc/jvm/src/dotty/tools/dottydoc/core/MiniPhaseTransform.scala
@@ -134,7 +134,8 @@ object transform {
df.returnValue,
df.typeParams,
df.paramLists,
- df.comment
+ df.comment,
+ df.implicitlyAddedFrom
)
}
case vl: Val => transformEntity(vl, _.valTransformation) { vl =>
@@ -143,7 +144,8 @@ object transform {
vl.modifiers,
vl.path,
vl.returnValue,
- vl.comment
+ vl.comment,
+ vl.implicitlyAddedFrom
)
}
}
diff --git a/dottydoc/jvm/src/dotty/tools/dottydoc/core/TypeLinkingPhases.scala b/dottydoc/jvm/src/dotty/tools/dottydoc/core/TypeLinkingPhases.scala
index e8c8790d9..7ce6b187b 100644
--- a/dottydoc/jvm/src/dotty/tools/dottydoc/core/TypeLinkingPhases.scala
+++ b/dottydoc/jvm/src/dotty/tools/dottydoc/core/TypeLinkingPhases.scala
@@ -37,6 +37,18 @@ class LinkParamListTypes extends DocMiniPhase with TypeLinker {
}
}
+class LinkImplicitlyAddedTypes extends DocMiniPhase with TypeLinker {
+ override def transformDef(implicit ctx: Context) = { case df: DefImpl if df.implicitlyAddedFrom.isDefined =>
+ val implicitlyAddedFrom = linkReference(df, df.implicitlyAddedFrom.get, ctx.docbase.packages[Package].toMap)
+ df.copy(implicitlyAddedFrom = Some(implicitlyAddedFrom))
+ }
+
+ override def transformVal(implicit ctx: Context) = { case vl: ValImpl if vl.implicitlyAddedFrom.isDefined =>
+ val implicitlyAddedFrom = linkReference(vl, vl.implicitlyAddedFrom.get, ctx.docbase.packages[Package].toMap)
+ vl.copy(implicitlyAddedFrom = Some(implicitlyAddedFrom))
+ }
+}
+
trait TypeLinker extends MemberLookup {
def linkReference(ent: Entity, ref: Reference, packs: Map[String, Package]): Reference = {
def linkRef(ref: Reference) = linkReference(ent, ref, packs)
diff --git a/dottydoc/jvm/src/dotty/tools/dottydoc/model/entities.scala b/dottydoc/jvm/src/dotty/tools/dottydoc/model/entities.scala
index 391bd514f..16d05306e 100644
--- a/dottydoc/jvm/src/dotty/tools/dottydoc/model/entities.scala
+++ b/dottydoc/jvm/src/dotty/tools/dottydoc/model/entities.scala
@@ -79,12 +79,14 @@ trait Object extends Entity with Modifiers with SuperTypes with Members {
}
trait Def extends Entity with Modifiers with TypeParams with ReturnValue {
- def paramLists: List[ParamList]
val kind = "def"
+ def paramLists: List[ParamList]
+ def implicitlyAddedFrom: Option[Reference]
}
trait Val extends Entity with Modifiers with ReturnValue {
val kind = "val"
+ def implicitlyAddedFrom: Option[Reference]
}
trait Var extends Entity with Modifiers with ReturnValue {
diff --git a/dottydoc/jvm/src/dotty/tools/dottydoc/model/factories.scala b/dottydoc/jvm/src/dotty/tools/dottydoc/model/factories.scala
index f0c78fa41..4d80c08a9 100644
--- a/dottydoc/jvm/src/dotty/tools/dottydoc/model/factories.scala
+++ b/dottydoc/jvm/src/dotty/tools/dottydoc/model/factories.scala
@@ -29,26 +29,11 @@ object factories {
def path(sym: Symbol)(implicit ctx: Context): List[String] = sym match {
case sym if sym.name.decode.toString == "<root>" => Nil
- case sym if sym is Flags.Module => path(sym.owner) :+ sym.name.decode.toString.dropRight(1)
- case sym => path(sym.owner) :+ sym.name.decode.toString
+ case sym => path(sym.owner) :+ sym.name.show
}
private val product = """Product[1-9][0-9]*""".r
- private def cleanTitle(title: String): String = title match {
- // matches Entity.this.Something
- case x if x matches "[^\\[]+\\.this\\..+" => x.split("\\.").last
- // Matches Entity[P, ...]
- case x if x matches "[^\\[]+\\[[^\\]]+\\]" =>
- val Array(tpe, params) = x.dropRight(1).split("\\[")
- s"""$tpe[${params.split(",").map(x => cleanTitle(x.trim)).mkString(", ")}]"""
- case _ => title
- }
-
- private def cleanQuery(query: String): String = query match {
- case x if x matches "[^\\[]+\\[[^\\]]+\\]" => x.takeWhile(_ != '[')
- case _ => query
- }
def returnType(t: Type)(implicit ctx: Context): Reference = {
val defn = ctx.definitions
@@ -107,7 +92,7 @@ object factories {
case tt: ThisType =>
expandTpe(tt.underlying)
case ci: ClassInfo =>
- typeRef(ci.cls.show)
+ typeRef(ci.cls.name.show)
case mt: MethodType =>
expandTpe(mt.resultType)
case pt: PolyType =>
diff --git a/dottydoc/jvm/src/dotty/tools/dottydoc/model/internal.scala b/dottydoc/jvm/src/dotty/tools/dottydoc/model/internal.scala
index ec1adfa88..a8756c82a 100644
--- a/dottydoc/jvm/src/dotty/tools/dottydoc/model/internal.scala
+++ b/dottydoc/jvm/src/dotty/tools/dottydoc/model/internal.scala
@@ -65,7 +65,8 @@ object internal {
var returnValue: Reference,
var typeParams: List[String] = Nil,
var paramLists: List[ParamList] = Nil,
- var comment: Option[Comment] = None
+ var comment: Option[Comment] = None,
+ implicitlyAddedFrom: Option[Reference] = None
) extends Def with Impl
final case class ValImpl(
@@ -73,7 +74,8 @@ object internal {
modifiers: List[String],
path: List[String],
var returnValue: Reference,
- var comment: Option[Comment] = None
+ var comment: Option[Comment] = None,
+ implicitlyAddedFrom: Option[Reference] = None
) extends Val with Impl
final case class ParamListImpl(
diff --git a/dottydoc/jvm/src/dotty/tools/dottydoc/model/json.scala b/dottydoc/jvm/src/dotty/tools/dottydoc/model/json.scala
index ea9658b5d..f83f43138 100644
--- a/dottydoc/jvm/src/dotty/tools/dottydoc/model/json.scala
+++ b/dottydoc/jvm/src/dotty/tools/dottydoc/model/json.scala
@@ -76,9 +76,9 @@ object json {
case ent: Object =>
s"""{"name":${ent.name.json},"members":${ent.members.map(_.json).mkString("[",",","]")},"modifiers":${ent.modifiers.map(_.json).mkString("[",",","]")},"path":${ent.path.map(_.json).mkString("[",",","]")},"superTypes":${ent.superTypes.map(_.json).mkString("[",",","]")},${ent.comment.map(_.json).fold("")(cmt => s""""comment":$cmt,""")}"kind":"object"}"""
case ent: Def =>
- s"""{"name":${ent.name.json},"modifiers":${ent.modifiers.map(_.json).mkString("[",",","]")},"path":${ent.path.map(_.json).mkString("[",",","]")},"returnValue":${ent.returnValue.json},"typeParams":${ent.typeParams.map(_.json).mkString("[",",","]")},"paramLists":${ent.paramLists.map(_.json).mkString("[",",","]")},${ent.comment.map(_.json).fold("")(cmt => s""""comment":$cmt,""")}"kind":"def"}"""
+ s"""{"name":${ent.name.json},"modifiers":${ent.modifiers.map(_.json).mkString("[",",","]")},"path":${ent.path.map(_.json).mkString("[",",","]")},"returnValue":${ent.returnValue.json},"typeParams":${ent.typeParams.map(_.json).mkString("[",",","]")},"paramLists":${ent.paramLists.map(_.json).mkString("[",",","]")},${ent.comment.map(_.json).fold("")(cmt => s""""comment":$cmt,""")}${ent.implicitlyAddedFrom.fold("")(ref => s""""implicitlyAddedFrom":${ref.json},""")}"kind":"def"}"""
case ent: Val =>
- s"""{"name":${ent.name.json},"modifiers":${ent.modifiers.map(_.json).mkString("[",",","]")},"path":${ent.path.map(_.json).mkString("[",",","]")},"returnValue":${ent.returnValue.json},${ent.comment.map(_.json).fold("")(cmt => s""""comment":$cmt,""")}"kind":"val"}"""
+ s"""{"name":${ent.name.json},"modifiers":${ent.modifiers.map(_.json).mkString("[",",","]")},"path":${ent.path.map(_.json).mkString("[",",","]")},"returnValue":${ent.returnValue.json},${ent.comment.map(_.json).fold("")(cmt => s""""comment":$cmt,""")}${ent.implicitlyAddedFrom.fold("")(ref => s""""implicitlyAddedFrom":${ref.json},""")}"kind":"val"}"""
}
implicit class EntityJson(val ent: Entity) extends AnyVal { def json: String = entToJson(ent) }
implicit class PackageJson(val pack: Package) extends AnyVal { def json: String = (pack: Entity).json }