Skip to content

Commit 924b58e

Browse files
Merge pull request #14892 from dotty-staging/scaladoc/internal-api-usage
Reduce internal API usage from Scaladoc
2 parents fcf62e1 + 1af2f94 commit 924b58e

File tree

3 files changed

+51
-93
lines changed

3 files changed

+51
-93
lines changed

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

+8-5
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@ trait ClassLikeSupport:
9696
getSupertypesGraph(LinkToType(selfSignature, classDef.symbol.dri, bareClasslikeKind(classDef.symbol)), unpackTreeToClassDef(classDef).parents)
9797
)
9898

99-
val baseMember = mkMember(classDef.symbol, kindForClasslike(classDef), selfSignature)(
99+
val kind = if intrinsicClassDefs.contains(classDef.symbol) then Kind.Class(Nil, Nil) else kindForClasslike(classDef)
100+
101+
val baseMember = mkMember(classDef.symbol, kind, selfSignature)(
100102
modifiers = modifiers,
101103
graph = graph,
102104
deprecated = classDef.symbol.isDeprecated(),
@@ -253,8 +255,9 @@ trait ClassLikeSupport:
253255
}
254256

255257
def getParentsAsTreeSymbolTuples: List[(Tree, Symbol)] =
256-
for
257-
parentTree <- c.parents if isValidPos(parentTree.pos) // We assume here that order is correct
258+
if noPosClassDefs.contains(c.symbol) then Nil
259+
else for
260+
parentTree <- c.parents if parentTree.pos.start != parentTree.pos.end // We assume here that order is correct
258261
parentSymbol = parentTree match
259262
case t: TypeTree => t.tpe.typeSymbol
260263
case tree if tree.symbol.isClassConstructor => tree.symbol.owner
@@ -482,7 +485,7 @@ trait ClassLikeSupport:
482485

483486

484487
def unwrapMemberInfo(c: ClassDef, symbol: Symbol): MemberInfo =
485-
val baseTypeRepr = memberInfo(c, symbol)
488+
val baseTypeRepr = typeForClass(c).memberType(symbol)
486489

487490
def isSyntheticEvidence(name: String) =
488491
if !name.startsWith(NameKinds.EvidenceParamName.separator) then false else
@@ -551,4 +554,4 @@ trait ClassLikeSupport:
551554
if parameters(0).symbol.flags.is(Flags.Given) then "using "
552555
else if parameters(0).symbol.flags.is(Flags.Implicit) then "implicit "
553556
else ""
554-
else ""
557+
else ""

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

+10-65
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,6 @@ import scala.quoted._
55

66
object SyntheticsSupport:
77

8-
extension (using Quotes)(t: reflect.TypeRepr)
9-
10-
def isCompiletimeAppliedType: Boolean = t.hackIsCompiletimeAppliedType(t)
11-
12-
private def hackIsCompiletimeAppliedType(rtpe: reflect.TypeRepr): Boolean =
13-
import dotty.tools.dotc
14-
given ctx: dotc.core.Contexts.Context = quotes.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx
15-
val tpe = rtpe.asInstanceOf[dotc.core.Types.Type]
16-
ctx.definitions.isCompiletimeAppliedType(tpe.typeSymbol)
17-
end extension
18-
198
extension (using Quotes)(s: reflect.Symbol)
209
def isSyntheticFunc: Boolean =
2110
import reflect._
@@ -29,39 +18,32 @@ object SyntheticsSupport:
2918
import reflect._
3019
s.flags.is(Flags.Opaque)
3120

32-
def isInfix: Boolean = hackIsInfix(s)
33-
3421
def getmembers: List[reflect.Symbol] = hackGetmembers(s)
3522

3623
end extension
3724

38-
def isValidPos(using Quotes)(pos: reflect.Position) =
39-
if hackExists(pos) then pos.start != pos.end else false
40-
4125
def isSyntheticField(using Quotes)(c: reflect.Symbol) =
4226
import reflect._
4327
c.flags.is(Flags.CaseAccessor) || (c.flags.is(Flags.Module) && !c.flags.is(Flags.Given))
4428

4529
def constructorWithoutParamLists(using Quotes)(c: reflect.ClassDef): Boolean =
46-
!isValidPos(c.constructor.pos) || {
30+
c.constructor.pos.start == c.constructor.pos.end || {
4731
val end = c.constructor.pos.end
4832
val typesEnd = c.constructor.leadingTypeParams.lastOption.fold(end - 1)(_.pos.end)
4933
val classDefTree = c.constructor.show
5034
c.constructor.leadingTypeParams.nonEmpty && end <= typesEnd + 1
5135
}
5236

53-
// TODO: #49 Remove it after TASTY-Reflect release with published flag Extension
54-
private def hackIsInfix(using Quotes)(rsym: reflect.Symbol): Boolean = {
55-
import reflect._
56-
import dotty.tools.dotc
57-
given ctx: dotc.core.Contexts.Context = quotes.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx
58-
val sym = rsym.asInstanceOf[dotc.core.Symbols.Symbol]
59-
ctx.definitions.isInfix(sym)
60-
}
37+
def getSupertypes(using Quotes)(c: reflect.ClassDef) =
38+
c.symbol.typeRef.baseClasses.map(b => b -> c.symbol.typeRef.baseType(b)).tail
39+
40+
def typeForClass(using Quotes)(c: reflect.ClassDef): reflect.TypeRepr =
41+
c.symbol.typeRef.appliedTo(c.symbol.typeMembers.filter(_.isTypeParam).map(_.typeRef))
42+
6143
/* We need there to filter out symbols with certain flagsets, because these symbols come from compiler and TASTY can't handle them well.
62-
They are valdefs that describe case companion objects and cases from enum.
63-
TASTY crashed when calling _.tree on them.
64-
*/
44+
They are valdefs that describe case companion objects and cases from enum.
45+
TASTY crashed when calling _.tree on them.
46+
*/
6547
private def hackGetmembers(using Quotes)(rsym: reflect.Symbol): List[reflect.Symbol] = {
6648
import reflect._
6749
import dotty.tools.dotc
@@ -75,40 +57,3 @@ object SyntheticsSupport:
7557
sym.asInstanceOf[Symbol]
7658
}.toList
7759
}
78-
79-
private def hackGetSupertypes(using Quotes)(rdef: reflect.ClassDef) = {
80-
import reflect._
81-
import dotty.tools.dotc
82-
given dotc.core.Contexts.Context = quotes.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx
83-
val classdef = rdef.asInstanceOf[dotc.ast.tpd.TypeDef]
84-
val ref = classdef.symbol.info.asInstanceOf[dotc.core.Types.ClassInfo].appliedRef
85-
val baseTypes: List[(dotc.core.Symbols.Symbol, dotc.core.Types.Type)] =
86-
ref.baseClasses.map(b => b -> ref.baseType(b))
87-
baseTypes.asInstanceOf[List[(Symbol, TypeRepr)]]
88-
}
89-
90-
private def hackExists(using Quotes)(rpos: reflect.Position) = {
91-
import reflect._
92-
import dotty.tools.dotc
93-
import dotty.tools.dotc.util.Spans._
94-
given dotc.core.Contexts.Context = quotes.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx
95-
val pos = rpos.asInstanceOf[dotc.util.SourcePosition]
96-
pos.exists
97-
}
98-
99-
def getSupertypes(using Quotes)(c: reflect.ClassDef) = hackGetSupertypes(c).tail
100-
101-
def typeForClass(using Quotes)(c: reflect.ClassDef): reflect.TypeRepr =
102-
import reflect._
103-
import dotty.tools.dotc
104-
given dotc.core.Contexts.Context = quotes.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx
105-
val cSym = c.symbol.asInstanceOf[dotc.core.Symbols.Symbol]
106-
cSym.typeRef.appliedTo(cSym.typeParams.map(_.typeRef)).asInstanceOf[TypeRepr]
107-
108-
def memberInfo(using Quotes)(c: reflect.ClassDef, symbol: reflect.Symbol): reflect.TypeRepr =
109-
import reflect._
110-
import dotty.tools.dotc
111-
given dotc.core.Contexts.Context = quotes.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx
112-
typeForClass(c).asInstanceOf[dotc.core.Types.Type]
113-
.memberInfo(symbol.asInstanceOf[dotc.core.Symbols.Symbol])
114-
.asInstanceOf[TypeRepr]

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

+33-23
Original file line numberDiff line numberDiff line change
@@ -123,27 +123,17 @@ case class ScaladocTastyInspector()(using ctx: DocContext) extends DocTastyInspe
123123
topLevels ++= parser.parseRootTree(treeRoot)
124124
}
125125

126-
val defn = ctx.compilerContext.definitions
127-
128126
if ctx.args.documentSyntheticTypes then
129-
val intrinsicClassDefs = Seq(
130-
defn.AnyClass,
131-
defn.MatchableClass,
132-
defn.AnyKindClass,
133-
defn.AnyValClass,
134-
defn.NullClass,
135-
defn.NothingClass,
136-
defn.SingletonClass,
137-
defn.andType,
138-
defn.orType,
139-
).map { s =>
140-
"scala" -> s.asInstanceOf[parser.qctx.reflect.Symbol].tree.match {
141-
case cd: parser.qctx.reflect.ClassDef => parser.parseClasslike(cd)
142-
case td: parser.qctx.reflect.TypeDef => parser.parseTypeDef(td)
143-
}
127+
import parser.qctx.reflect._
128+
val intrinsicTypeDefs = parser.intrinsicTypeDefs.toSeq.map { s =>
129+
"scala" -> parser.parseTypeDef(s.tree.asInstanceOf[TypeDef])
130+
}
131+
val intrinsicClassDefs = parser.intrinsicClassDefs.toSeq.map { s =>
132+
"scala" -> parser.parseClasslike(s.tree.asInstanceOf[ClassDef])
144133
}
145134
topLevels ++= intrinsicClassDefs
146-
val scalaPckg = defn.ScalaPackageVal.asInstanceOf[parser.qctx.reflect.Symbol]
135+
topLevels ++= intrinsicTypeDefs
136+
val scalaPckg = defn.ScalaPackage
147137
given parser.qctx.type = parser.qctx
148138
topLevels += "scala" -> Member(scalaPckg.fullName, scalaPckg.dri, Kind.Package)
149139
topLevels += mergeAnyRefAliasAndObject(parser)
@@ -167,12 +157,13 @@ case class ScaladocTastyInspector()(using ctx: DocContext) extends DocTastyInspe
167157
}.toList -> rootDoc
168158

169159
def mergeAnyRefAliasAndObject(parser: TastyParser) =
170-
val defn = ctx.compilerContext.definitions
171-
val oM = parser.parseClasslike(defn.ObjectClass.asInstanceOf[parser.qctx.reflect.Symbol].tree.asInstanceOf[parser.qctx.reflect.ClassDef])
172-
val aM = parser.parseTypeDef(defn.AnyRefAlias.asInstanceOf[parser.qctx.reflect.Symbol].tree.asInstanceOf[parser.qctx.reflect.TypeDef])
160+
import parser.qctx.reflect._
161+
val javaLangObjectDef = defn.ObjectClass.tree.asInstanceOf[ClassDef]
162+
val objectMembers = parser.extractPatchedMembers(javaLangObjectDef)
163+
val aM = parser.parseTypeDef(defn.AnyRefClass.tree.asInstanceOf[TypeDef])
173164
"scala" -> aM.copy(
174-
kind = oM.kind,
175-
members = oM.members
165+
kind = Kind.Class(Nil, Nil),
166+
members = objectMembers
176167
)
177168
/** Parses a single Tasty compilation unit. */
178169
case class TastyParser(
@@ -187,6 +178,25 @@ case class TastyParser(
187178

188179
private given qctx.type = qctx
189180

181+
val intrinsicClassDefs = Set(
182+
defn.AnyClass,
183+
defn.MatchableClass,
184+
defn.ScalaPackage.typeMember("AnyKind"),
185+
defn.AnyValClass,
186+
defn.NullClass,
187+
defn.NothingClass,
188+
defn.ScalaPackage.typeMember("Singleton"),
189+
)
190+
191+
val noPosClassDefs = intrinsicClassDefs ++ Set(
192+
defn.ObjectClass,
193+
defn.AnyRefClass
194+
)
195+
196+
val intrinsicTypeDefs = Set(
197+
defn.ScalaPackage.typeMember("&"),
198+
defn.ScalaPackage.typeMember("|"),
199+
)
190200
def processTree[T](tree: Tree)(op: => T): Option[T] = try Option(op) catch
191201
case e: Exception =>
192202
report.warning(throwableToString(e), tree.pos)

0 commit comments

Comments
 (0)