Skip to content

Commit 4afc522

Browse files
committed
Move Inkuire from ClassLikeSupport
1 parent 0dcbe93 commit 4afc522

File tree

2 files changed

+131
-130
lines changed

2 files changed

+131
-130
lines changed

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

Lines changed: 1 addition & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import dotty.tools.scaladoc.{Signature => DSignature}
66
import dotty.tools.scaladoc.Inkuire
77

88
import scala.quoted._
9-
import scala.util.chaining._
109

1110
import SymOps._
1211
import NameNormalizer._
@@ -101,135 +100,7 @@ trait ClassLikeSupport:
101100
deprecated = classDef.symbol.isDeprecated()
102101
)
103102

104-
if summon[DocContext].args.generateInkuire then {
105-
106-
val classType: Inkuire.Type = classDef.asInkuire(Set.empty).asInstanceOf[Inkuire.Type]
107-
108-
def varName(t: Inkuire.TypeLike): Option[String] = t match {
109-
case tpe: Inkuire.Type => Some(tpe.name.name)
110-
case tl: Inkuire.TypeLambda => varName(tl.result)
111-
case _ => None
112-
}
113-
114-
val variableNames: Set[String] = classType.params.map(_.typ)
115-
.flatMap(varName(_).toList).toSet
116-
117-
val parents: Seq[Inkuire.Type] = classDef.parents.map(_.asInkuire(variableNames).asInstanceOf[Inkuire.Type])
118-
119-
val isModule = classDef.symbol.flags.is(Flags.Module)
120-
121-
if !isModule then Inkuire.db = Inkuire.db.copy(types = Inkuire.db.types.updated(classType.itid.get, (classType, parents)))
122-
123-
classDef.symbol.declaredTypes
124-
.filter(viableSymbol)
125-
.foreach {
126-
case typeSymbol: Symbol if typeSymbol.flags.is(Flags.Opaque) =>
127-
val typ = typeSymbol.tree.asInkuire(variableNames)
128-
if typ.isInstanceOf[Inkuire.Type] then {
129-
val t = typ.asInstanceOf[Inkuire.Type]
130-
Inkuire.db = Inkuire.db.copy(types = Inkuire.db.types.updated(t.itid.get, (t, Seq.empty)))
131-
}
132-
case typeSymbol: Symbol if !typeSymbol.isClassDef =>
133-
val typeDef = typeSymbol.tree.asInstanceOf[TypeDef]
134-
val typ = typeSymbol.tree.asInkuire(variableNames)
135-
if typ.isInstanceOf[Inkuire.Type] then {
136-
val t = typ.asInstanceOf[Inkuire.Type]
137-
val rhsTypeLike = typeDef.rhs.asInkuire(variableNames)
138-
Inkuire.db = Inkuire.db.copy(
139-
typeAliases = Inkuire.db.typeAliases.updated(t.itid.get, rhsTypeLike),
140-
types = Inkuire.db.types.updated(t.itid.get, (t, Seq.empty))
141-
)
142-
}
143-
if typeDef.rhs.symbol.flags.is(Flags.JavaDefined) then
144-
val typJava = typeDef.rhs.asInkuire(variableNames)
145-
if typJava.isInstanceOf[Inkuire.Type] then {
146-
val tJava = typJava.asInstanceOf[Inkuire.Type]
147-
Inkuire.db = Inkuire.db.copy(types = Inkuire.db.types.updated(tJava.itid.get, (tJava, Seq.empty)))
148-
}
149-
case _ =>
150-
}
151-
152-
def viableSymbol(s: Symbol): Boolean =
153-
!s.flags.is(Flags.Private) &&
154-
!s.flags.is(Flags.Protected) &&
155-
!s.flags.is(Flags.Override) &&
156-
!s.flags.is(Flags.Synthetic)
157-
158-
classDef.symbol.declaredMethods
159-
.filter(viableSymbol)
160-
.tap { _.foreach { // Loop for implicit conversions
161-
case implicitConversion: Symbol if implicitConversion.flags.is(Flags.Implicit)
162-
&& classDef.symbol.flags.is(Flags.Module)
163-
&& implicitConversion.owner.fullName == ("scala.Predef$") =>
164-
val defdef = implicitConversion.tree.asInstanceOf[DefDef]
165-
val to = defdef.returnTpt.asInkuire(variableNames)
166-
val from = defdef.paramss.flatMap(_.params).collectFirst {
167-
case v: ValDef => v.tpt.asInkuire(variableNames)
168-
}
169-
(from, to) match
170-
case (Some(from: Inkuire.Type), to: Inkuire.Type) => Inkuire.db = Inkuire.db.copy(implicitConversions = Inkuire.db.implicitConversions :+ (from.itid.get -> to))
171-
case _ =>
172-
case _ =>
173-
}}
174-
.tap { _.foreach { // Loop for functions and vals
175-
case methodSymbol: Symbol =>
176-
val defdef = methodSymbol.tree.asInstanceOf[DefDef]
177-
val methodVars = defdef.paramss.flatMap(_.params).collect {
178-
case TypeDef(name, _) => name
179-
}
180-
val vars = variableNames ++ methodVars
181-
val receiver: Option[Inkuire.TypeLike] =
182-
Some(classType)
183-
.filter(_ => !isModule)
184-
.orElse(methodSymbol.extendedSymbol.flatMap(s => partialAsInkuire(vars).lift(s.tpt)))
185-
val sgn = Inkuire.ExternalSignature(
186-
signature = Inkuire.Signature(
187-
receiver = receiver,
188-
arguments = methodSymbol.nonExtensionTermParamLists.collect {
189-
case tpc@TermParamClause(params) if !tpc.isImplicit && !tpc.isGiven => params //TODO [Inkuire] Implicit parameters
190-
}.flatten.map(_.tpt.asInkuire(vars)),
191-
result = defdef.returnTpt.asInkuire(vars),
192-
context = Inkuire.SignatureContext(
193-
vars = vars.toSet,
194-
constraints = Map.empty //TODO [Inkuire] Type bounds
195-
)
196-
),
197-
name = methodSymbol.name,
198-
packageName = methodSymbol.dri.location,
199-
uri = methodSymbol.dri.externalLink.getOrElse(""),
200-
entryType = "def"
201-
)
202-
val curriedSgn = sgn.copy(signature = Inkuire.curry(sgn.signature))
203-
Inkuire.db = Inkuire.db.copy(functions = Inkuire.db.functions :+ curriedSgn)
204-
}}
205-
206-
classDef.symbol.declaredFields
207-
.filter(viableSymbol)
208-
.foreach {
209-
case valSymbol: Symbol =>
210-
val valdef = valSymbol.tree.asInstanceOf[ValDef]
211-
val receiver: Option[Inkuire.TypeLike] =
212-
Some(classType)
213-
.filter(_ => !isModule)
214-
val sgn = Inkuire.ExternalSignature(
215-
signature = Inkuire.Signature(
216-
receiver = receiver,
217-
arguments = Seq.empty,
218-
result = valdef.tpt.asInkuire(variableNames),
219-
context = Inkuire.SignatureContext(
220-
vars = variableNames.toSet,
221-
constraints = Map.empty //TODO [Inkuire] Type bounds
222-
)
223-
),
224-
name = valSymbol.name,
225-
packageName = valSymbol.dri.location,
226-
uri = valSymbol.dri.externalLink.getOrElse(""),
227-
entryType = "val"
228-
)
229-
val curriedSgn = sgn.copy(signature = Inkuire.curry(sgn.signature))
230-
Inkuire.db = Inkuire.db.copy(functions = Inkuire.db.functions :+ curriedSgn)
231-
}
232-
}
103+
if summon[DocContext].args.generateInkuire then doInkuireStuff(classDef)
233104

234105
if signatureOnly then baseMember else baseMember.copy(
235106
members = classDef.extractPatchedMembers.sortBy(m => (m.name, m.kind.name)),

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

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import dotty.tools.scaladoc.Inkuire
77

88
import scala.util.Random
99
import scala.quoted._
10+
import scala.util.chaining._
1011

1112
import SymOps._
1213
import NameNormalizer._
@@ -18,6 +19,135 @@ trait InkuireSupport:
1819

1920
private given qctx.type = qctx
2021

22+
def doInkuireStuff(classDef: ClassDef): Unit = {
23+
val classType: Inkuire.Type = classDef.asInkuire(Set.empty).asInstanceOf[Inkuire.Type]
24+
25+
def varName(t: Inkuire.TypeLike): Option[String] = t match {
26+
case tpe: Inkuire.Type => Some(tpe.name.name)
27+
case tl: Inkuire.TypeLambda => varName(tl.result)
28+
case _ => None
29+
}
30+
31+
val variableNames: Set[String] = classType.params.map(_.typ)
32+
.flatMap(varName(_).toList).toSet
33+
34+
val parents: Seq[Inkuire.Type] = classDef.parents.map(_.asInkuire(variableNames).asInstanceOf[Inkuire.Type])
35+
36+
val isModule = classDef.symbol.flags.is(Flags.Module)
37+
38+
if !isModule then Inkuire.db = Inkuire.db.copy(types = Inkuire.db.types.updated(classType.itid.get, (classType, parents)))
39+
40+
classDef.symbol.declaredTypes
41+
.filter(viableSymbol)
42+
.foreach {
43+
case typeSymbol: Symbol if typeSymbol.flags.is(Flags.Opaque) =>
44+
val typ = typeSymbol.tree.asInkuire(variableNames)
45+
if typ.isInstanceOf[Inkuire.Type] then {
46+
val t = typ.asInstanceOf[Inkuire.Type]
47+
Inkuire.db = Inkuire.db.copy(types = Inkuire.db.types.updated(t.itid.get, (t, Seq.empty)))
48+
}
49+
case typeSymbol: Symbol if !typeSymbol.isClassDef =>
50+
val typeDef = typeSymbol.tree.asInstanceOf[TypeDef]
51+
val typ = typeSymbol.tree.asInkuire(variableNames)
52+
if typ.isInstanceOf[Inkuire.Type] then {
53+
val t = typ.asInstanceOf[Inkuire.Type]
54+
val rhsTypeLike = typeDef.rhs.asInkuire(variableNames)
55+
Inkuire.db = Inkuire.db.copy(
56+
typeAliases = Inkuire.db.typeAliases.updated(t.itid.get, rhsTypeLike),
57+
types = Inkuire.db.types.updated(t.itid.get, (t, Seq.empty))
58+
)
59+
}
60+
if typeDef.rhs.symbol.flags.is(Flags.JavaDefined) then
61+
val typJava = typeDef.rhs.asInkuire(variableNames)
62+
if typJava.isInstanceOf[Inkuire.Type] then {
63+
val tJava = typJava.asInstanceOf[Inkuire.Type]
64+
Inkuire.db = Inkuire.db.copy(types = Inkuire.db.types.updated(tJava.itid.get, (tJava, Seq.empty)))
65+
}
66+
case _ =>
67+
}
68+
69+
def viableSymbol(s: Symbol): Boolean =
70+
!s.flags.is(Flags.Private) &&
71+
!s.flags.is(Flags.Protected) &&
72+
!s.flags.is(Flags.Override) &&
73+
!s.flags.is(Flags.Synthetic)
74+
75+
classDef.symbol.declaredMethods
76+
.filter(viableSymbol)
77+
.tap { _.foreach { // Loop for implicit conversions
78+
case implicitConversion: Symbol if implicitConversion.flags.is(Flags.Implicit)
79+
&& classDef.symbol.flags.is(Flags.Module)
80+
&& implicitConversion.owner.fullName == ("scala.Predef$") =>
81+
val defdef = implicitConversion.tree.asInstanceOf[DefDef]
82+
val to = defdef.returnTpt.asInkuire(variableNames)
83+
val from = defdef.paramss.flatMap(_.params).collectFirst {
84+
case v: ValDef => v.tpt.asInkuire(variableNames)
85+
}
86+
(from, to) match
87+
case (Some(from: Inkuire.Type), to: Inkuire.Type) => Inkuire.db = Inkuire.db.copy(implicitConversions = Inkuire.db.implicitConversions :+ (from.itid.get -> to))
88+
case _ =>
89+
case _ =>
90+
}}
91+
.tap { _.foreach { // Loop for functions and vals
92+
case methodSymbol: Symbol =>
93+
val defdef = methodSymbol.tree.asInstanceOf[DefDef]
94+
val methodVars = defdef.paramss.flatMap(_.params).collect {
95+
case TypeDef(name, _) => name
96+
}
97+
val vars = variableNames ++ methodVars
98+
val receiver: Option[Inkuire.TypeLike] =
99+
Some(classType)
100+
.filter(_ => !isModule)
101+
.orElse(methodSymbol.extendedSymbol.flatMap(s => partialAsInkuire(vars).lift(s.tpt)))
102+
val sgn = Inkuire.ExternalSignature(
103+
signature = Inkuire.Signature(
104+
receiver = receiver,
105+
arguments = methodSymbol.nonExtensionTermParamLists.collect {
106+
case tpc@TermParamClause(params) if !tpc.isImplicit && !tpc.isGiven => params //TODO [Inkuire] Implicit parameters
107+
}.flatten.map(_.tpt.asInkuire(vars)),
108+
result = defdef.returnTpt.asInkuire(vars),
109+
context = Inkuire.SignatureContext(
110+
vars = vars.toSet,
111+
constraints = Map.empty //TODO [Inkuire] Type bounds
112+
)
113+
),
114+
name = methodSymbol.name,
115+
packageName = methodSymbol.dri.location,
116+
uri = methodSymbol.dri.externalLink.getOrElse(""),
117+
entryType = "def"
118+
)
119+
val curriedSgn = sgn.copy(signature = Inkuire.curry(sgn.signature))
120+
Inkuire.db = Inkuire.db.copy(functions = Inkuire.db.functions :+ curriedSgn)
121+
}}
122+
123+
classDef.symbol.declaredFields
124+
.filter(viableSymbol)
125+
.foreach {
126+
case valSymbol: Symbol =>
127+
val valdef = valSymbol.tree.asInstanceOf[ValDef]
128+
val receiver: Option[Inkuire.TypeLike] =
129+
Some(classType)
130+
.filter(_ => !isModule)
131+
val sgn = Inkuire.ExternalSignature(
132+
signature = Inkuire.Signature(
133+
receiver = receiver,
134+
arguments = Seq.empty,
135+
result = valdef.tpt.asInkuire(variableNames),
136+
context = Inkuire.SignatureContext(
137+
vars = variableNames.toSet,
138+
constraints = Map.empty //TODO [Inkuire] Type bounds
139+
)
140+
),
141+
name = valSymbol.name,
142+
packageName = valSymbol.dri.location,
143+
uri = valSymbol.dri.externalLink.getOrElse(""),
144+
entryType = "val"
145+
)
146+
val curriedSgn = sgn.copy(signature = Inkuire.curry(sgn.signature))
147+
Inkuire.db = Inkuire.db.copy(functions = Inkuire.db.functions :+ curriedSgn)
148+
}
149+
}
150+
21151
private def paramsForClass(classDef: ClassDef, vars: Set[String]): Seq[Inkuire.Variance] =
22152
classDef.getTypeParams.map(mkTypeArgumentInkuire)
23153

0 commit comments

Comments
 (0)