Skip to content

Commit cf0cfd3

Browse files
committed
Type aliases
1 parent fb25987 commit cf0cfd3

File tree

2 files changed

+41
-25
lines changed

2 files changed

+41
-25
lines changed

scaladoc/src/dotty/tools/scaladoc/Inkuire.scala

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import scala.collection.mutable.{ Map => MMap}
55

66
object Inkuire {
77

8-
var db = InkuireDb(Seq.empty, Map.empty, Seq.empty)
8+
var db = InkuireDb(Seq.empty, Map.empty, Seq.empty, Map.empty)
99

1010
def beforeSave(): Unit = {
1111
db = db.copy(
@@ -23,7 +23,8 @@ object Inkuire {
2323
case class InkuireDb(
2424
functions: Seq[ExternalSignature],
2525
types: Map[ITID, (Type, Seq[Type])],
26-
implicitConversions: Seq[(ITID, Type)]
26+
implicitConversions: Seq[(ITID, Type)],
27+
typeAliases: Map[ITID, TypeLike]
2728
)
2829

2930
case class ITID(uuid: String, isParsed: Boolean)
@@ -143,7 +144,8 @@ object Inkuire {
143144
jsonObject(
144145
("types", serialize(db.types)),
145146
("functions", jsonList(db.functions.map(serialize))),
146-
("implicitConversions", jsonList(db.implicitConversions.map(serializeConversion)))
147+
("implicitConversions", jsonList(db.implicitConversions.map(serializeConversion))),
148+
("typeAliases", serializeTypeAliases(db.typeAliases))
147149
)
148150
}
149151

@@ -165,6 +167,15 @@ object Inkuire {
165167
)*)
166168
}
167169

170+
private def serializeTypeAliases(types: Map[ITID, TypeLike]): JSON = {
171+
jsonObject((
172+
types.toList.map {
173+
case (itid, v) =>
174+
(serializeAsKey(itid), serialize(v))
175+
}
176+
)*)
177+
}
178+
168179
private def serializeAsKey(itid: ITID): String = {
169180
s"""${itid.isParsed}=${itid.uuid}"""
170181
}

scaladoc/src/dotty/tools/scaladoc/tasty/ClassLikeSupport.scala

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -113,35 +113,40 @@ trait ClassLikeSupport:
113113

114114
if !isModule then Inkuire.db = Inkuire.db.copy(types = Inkuire.db.types.updated(classType.itid.get, (classType, parents)))
115115

116-
classDef.symbol.declaredTypes.foreach {
117-
case typeSymbol: Symbol if typeSymbol.flags.is(Flags.Opaque) =>
118-
val typ = typeSymbol.tree.asInkuire(variableNames)
119-
if typ.isInstanceOf[Inkuire.Type] then {
120-
val t = typ.asInstanceOf[Inkuire.Type]
121-
Inkuire.db = Inkuire.db.copy(types = Inkuire.db.types.updated(t.itid.get, (t, Seq.empty)))
122-
}
123-
case typeSymbol: Symbol =>
124-
val typeDef = typeSymbol.tree.asInstanceOf[TypeDef]
125-
if typeDef.rhs.symbol.flags.is(Flags.JavaDefined) then
126-
val typ = typeSymbol.tree.asInkuire(variableNames) // TODO [Inkuire] Hack until type aliases are supported
127-
val typJava = typeDef.rhs.symbol.tree.asInkuire(variableNames)
128-
if typ.isInstanceOf[Inkuire.Type] then { // TODO [Inkuire] Hack until type aliases are supported
116+
classDef.symbol.declaredTypes
117+
.filter(viableSymbol)
118+
.foreach {
119+
case typeSymbol: Symbol if typeSymbol.flags.is(Flags.Opaque) =>
120+
val typ = typeSymbol.tree.asInkuire(variableNames)
121+
if typ.isInstanceOf[Inkuire.Type] then {
129122
val t = typ.asInstanceOf[Inkuire.Type]
130123
Inkuire.db = Inkuire.db.copy(types = Inkuire.db.types.updated(t.itid.get, (t, Seq.empty)))
131124
}
132-
if typJava.isInstanceOf[Inkuire.Type] then {
133-
val tJava = typJava.asInstanceOf[Inkuire.Type]
134-
Inkuire.db = Inkuire.db.copy(types = Inkuire.db.types.updated(tJava.itid.get, (tJava, Seq.empty)))
125+
case typeSymbol: Symbol if !typeSymbol.isClassDef =>
126+
val typeDef = typeSymbol.tree.asInstanceOf[TypeDef]
127+
val typ = typeSymbol.tree.asInkuire(variableNames)
128+
if typ.isInstanceOf[Inkuire.Type] then {
129+
val t = typ.asInstanceOf[Inkuire.Type]
130+
val rhsTypeLike = typeDef.rhs.asInkuire(variableNames)
131+
Inkuire.db = Inkuire.db.copy(typeAliases = Inkuire.db.typeAliases.updated(t.itid.get, rhsTypeLike))
135132
}
133+
if typeDef.rhs.symbol.flags.is(Flags.JavaDefined) then
134+
val typJava = typeDef.rhs.asInkuire(variableNames)
135+
if typJava.isInstanceOf[Inkuire.Type] then {
136+
val tJava = typJava.asInstanceOf[Inkuire.Type]
137+
Inkuire.db = Inkuire.db.copy(types = Inkuire.db.types.updated(tJava.itid.get, (tJava, Seq.empty)))
138+
}
139+
case _ =>
136140
}
137141

142+
def viableSymbol(s: Symbol): Boolean =
143+
!s.flags.is(Flags.Private) &&
144+
!s.flags.is(Flags.Protected) &&
145+
!s.flags.is(Flags.Override) &&
146+
!s.flags.is(Flags.Synthetic)
147+
138148
classDef.symbol.declaredMethods
139-
.filter { (s: Symbol) =>
140-
!s.flags.is(Flags.Private) &&
141-
!s.flags.is(Flags.Protected) &&
142-
!s.flags.is(Flags.Override) &&
143-
!s.flags.is(Flags.Synthetic)
144-
}
149+
.filter(viableSymbol)
145150
.foreach {
146151
case implicitConversion: Symbol if implicitConversion.flags.is(Flags.Implicit)
147152
&& classDef.symbol.flags.is(Flags.Module)

0 commit comments

Comments
 (0)