Skip to content

Commit af4390a

Browse files
committed
Partial clenup of SymOps
1 parent 48f0078 commit af4390a

File tree

8 files changed

+90
-38
lines changed

8 files changed

+90
-38
lines changed

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@ import collection.JavaConverters._
55
import dotty.tools.scaladoc._
66
import scala.quoted._
77

8+
import SymOps._
9+
810
trait BasicSupport:
911
self: TastyParser =>
1012
import qctx.reflect._
11-
object SymOps extends SymOps[qctx.type](qctx)
12-
export SymOps._
13+
object SymOpsWithLinkCache extends SymOpsWithLinkCache
14+
export SymOpsWithLinkCache._
15+
16+
private given qctx.type = qctx
1317

1418
def parseAnnotation(annotTerm: Term): Annotation =
1519
import dotty.tools.dotc.ast.Trees.{SeqLiteral}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ import collection.JavaConverters._
44
import dotty.tools.scaladoc._
55
import dotty.tools.scaladoc.{Signature => DSignature}
66

7+
import SymOps._
8+
79
trait ClassLikeSupport:
810
self: TastyParser =>
911
import qctx.reflect._
1012

13+
private given qctx.type = qctx
14+
1115
private def bareClasslikeKind(symbol: Symbol): Kind =
1216
if symbol.flags.is(Flags.Module) then Kind.Object
1317
else if symbol.flags.is(Flags.Trait) then Kind.Trait(Nil, Nil)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@ import dotty.tools.scaladoc._
44
import dotty.tools.dotc.core.StdNames.nme.keywords
55
import dotty.tools.dotc.core.Names.termName
66

7+
import SymOps._
8+
79
trait NameNormalizer { self: TastyParser =>
810
import qctx.reflect._
11+
12+
private given qctx.type = qctx
13+
914
extension (s: Symbol) def normalizedName: String = {
1015
val withoutGivenPrefix = if s.isGiven then s.name.stripPrefix("given_") else s.name
1116
val withoutObjectSuffix = if s.flags.is(Flags.Module) then withoutGivenPrefix.stripSuffix("$") else withoutGivenPrefix

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ package tasty
33

44
import collection.JavaConverters._
55

6+
import SymOps._
7+
68
trait PackageSupport:
79
self: TastyParser =>
810
import qctx.reflect._
911

12+
private given qctx.type = qctx
13+
1014
def parsePackage(pck: PackageClause): (String, Member) =
1115
val name = pck.symbol.fullName
1216
(name, Member(name, pck.symbol.dri, Kind.Package))

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

Lines changed: 59 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,19 @@ import dotty.tools.io.AbstractFile
88
import Scaladoc2AnchorCreator.getScaladoc2Type
99
import JavadocAnchorCreator.getJavadocType
1010

11-
class SymOps[Q <: Quotes](val q: Q):
12-
import q.reflect._
11+
object SymOps:
1312

14-
given q.type = q
13+
extension (using Quotes)(sym: quotes.reflect.Symbol)
1514

16-
private val externalLinkCache: scala.collection.mutable.Map[AbstractFile, Option[ExternalDocLink]] = MMap()
17-
18-
extension (sym: Symbol)
19-
def packageName: String = (
15+
def packageName: String =
2016
if (sym.isPackageDef) sym.fullName
2117
else sym.maybeOwner.packageName
22-
)
2318

2419
def packageNameSplitted: Seq[String] =
2520
sym.packageName.split('.').toList
2621

2722
def className: Option[String] =
23+
import quotes.reflect._
2824
if (sym.isClassDef && !sym.flags.is(Flags.Package)) Some(
2925
Some(sym.maybeOwner).filter(s => s.exists).flatMap(_.className).fold("")(cn => cn + "$") + sym.name
3026
).filterNot(_.contains("package$"))
@@ -44,7 +40,9 @@ class SymOps[Q <: Quotes](val q: Q):
4440
else None
4541
//TODO: Retrieve string that will match scaladoc anchors
4642

43+
4744
def getVisibility(): Visibility =
45+
import quotes.reflect._
4846
import VisibilityScope._
4947

5048
def explicitScope(ownerType: TypeRepr): VisibilityScope =
@@ -71,7 +69,9 @@ class SymOps[Q <: Quotes](val q: Q):
7169

7270

7371
// Order here determines order in documenation
74-
def getExtraModifiers(): Seq[Modifier] = Seq(
72+
def getExtraModifiers(): Seq[Modifier] =
73+
import quotes.reflect._
74+
Seq(
7575
Flags.Final -> Modifier.Final,
7676
Flags.Sealed -> Modifier.Sealed,
7777
Flags.Erased -> Modifier.Erased,
@@ -83,54 +83,81 @@ class SymOps[Q <: Quotes](val q: Q):
8383
Flags.Open -> Modifier.Open,
8484
Flags.Override -> Modifier.Override,
8585
Flags.Case -> Modifier.Case,
86-
).collect { case (flag, mod) if sym.flags.is(flag) => mod }
86+
).collect { case (flag, mod) if sym.flags.is(flag) => mod }
8787

8888
def isHiddenByVisibility(using dctx: DocContext): Boolean =
8989
import VisibilityScope._
9090

91-
!summon[DocContext].args.includePrivateAPI && getVisibility().match
91+
!summon[DocContext].args.includePrivateAPI && sym.getVisibility().match
9292
case Visibility.Private(_) => true
9393
case Visibility.Protected(ThisScope | ImplicitModuleScope | _: ExplicitModuleScope) => true
9494
case _ => false
9595

96-
def shouldDocumentClasslike(using dctx: DocContext): Boolean = !isHiddenByVisibility
97-
&& !sym.flags.is(Flags.Synthetic)
98-
&& (!sym.flags.is(Flags.Case) || !sym.flags.is(Flags.Enum))
99-
&& !(sym.companionModule.flags.is(Flags.Given))
100-
96+
def shouldDocumentClasslike(using dctx: DocContext): Boolean =
97+
import quotes.reflect._
98+
!sym.isHiddenByVisibility
99+
&& !sym.flags.is(Flags.Synthetic)
100+
&& (!sym.flags.is(Flags.Case) || !sym.flags.is(Flags.Enum))
101+
&& !(sym.companionModule.flags.is(Flags.Given))
101102

102-
def getCompanionSymbol: Option[Symbol] = Some(sym.companionClass).filter(_.exists)
103+
def getCompanionSymbol: Option[quotes.reflect.Symbol] = Some(sym.companionClass).filter(_.exists)
103104

104-
def isCompanionObject: Boolean = sym.flags.is(Flags.Module) && sym.companionClass.exists
105+
def isCompanionObject: Boolean =
106+
import quotes.reflect._
107+
sym.flags.is(Flags.Module) && sym.companionClass.exists
105108

106-
def isGiven: Boolean = sym.flags.is(Flags.Given)
109+
def isGiven: Boolean =
110+
import quotes.reflect._
111+
sym.flags.is(Flags.Given)
107112

108-
def isExported: Boolean = sym.flags.is(Flags.Exported)
113+
def isExported: Boolean =
114+
import quotes.reflect._
115+
sym.flags.is(Flags.Exported)
109116

110-
def isOverridden: Boolean = sym.flags.is(Flags.Override)
117+
def isOverridden: Boolean =
118+
import quotes.reflect._
119+
sym.flags.is(Flags.Override)
111120

112-
def isExtensionMethod: Boolean = sym.flags.is(Flags.ExtensionMethod)
121+
def isExtensionMethod: Boolean =
122+
import quotes.reflect._
123+
sym.flags.is(Flags.ExtensionMethod)
113124

114-
def isArtifact: Boolean = sym.flags.is(Flags.Artifact)
125+
def isArtifact: Boolean =
126+
import quotes.reflect._
127+
sym.flags.is(Flags.Artifact)
115128

116-
def isLeftAssoc(d: Symbol): Boolean = !d.name.endsWith(":")
129+
def isLeftAssoc: Boolean = !sym.name.endsWith(":")
117130

118-
def extendedSymbol: Option[ValDef] =
131+
def extendedSymbol: Option[quotes.reflect.ValDef] =
132+
import quotes.reflect.*
119133
Option.when(sym.isExtensionMethod){
120134
val termParamss = sym.tree.asInstanceOf[DefDef].termParamss
121-
if isLeftAssoc(sym) || termParamss.size == 1 then termParamss(0).params(0)
135+
if sym.isLeftAssoc || termParamss.size == 1 then termParamss(0).params(0)
122136
else termParamss(1).params(0)
123137
}
124138

139+
end extension
140+
141+
end SymOps
142+
143+
// TODO find a better way to handle this cache and move the methods to SymOps
144+
class SymOpsWithLinkCache:
145+
import SymOps.*
146+
147+
private val externalLinkCache: scala.collection.mutable.Map[AbstractFile, Option[ExternalDocLink]] = MMap()
148+
149+
extension (using Quotes)(sym: quotes.reflect.Symbol)
150+
125151
private def constructPath(location: Seq[String], anchor: Option[String], link: ExternalDocLink): String =
152+
import quotes.reflect.*
126153
val extension = ".html"
127154
val docURL = link.documentationUrl.toString
128155
def constructPathForJavadoc: String =
129156
val l = "\\$+".r.replaceAllIn(location.mkString("/"), _ => ".")
130157
val javadocAnchor = if anchor.isDefined then {
131158
val paramSigs = sym.paramSymss.flatten.map(_.tree).collect {
132159
case v: ValDef => v.tpt.tpe
133-
}.map(getJavadocType(using q))
160+
}.map(getJavadocType)
134161
"#" + sym.name + paramSigs.mkString("-","-","-")
135162
} else ""
136163
docURL + l + extension + javadocAnchor
@@ -156,6 +183,7 @@ class SymOps[Q <: Quotes](val q: Q):
156183

157184
// TODO #22 make sure that DRIs are unique plus probably reuse semantic db code?
158185
def dri(using dctx: DocContext): DRI =
186+
import quotes.reflect.*
159187
if sym == Symbol.noSymbol then topLevelDri
160188
else if sym.isValDef && sym.moduleClass.exists then sym.moduleClass.dri
161189
else
@@ -172,9 +200,9 @@ class SymOps[Q <: Quotes](val q: Q):
172200
val location = sym.packageNameSplitted ++ className
173201

174202
val externalLink = {
175-
import q.reflect._
203+
import quotes.reflect._
176204
import dotty.tools.dotc
177-
given ctx: dotc.core.Contexts.Context = q.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx
205+
given ctx: dotc.core.Contexts.Context = quotes.asInstanceOf[scala.quoted.runtime.impl.QuotesImpl].ctx
178206
val csym = sym.asInstanceOf[dotc.core.Symbols.Symbol]
179207
val extLink = if externalLinkCache.contains(csym.associatedFile) then externalLinkCache(csym.associatedFile)
180208
else {
@@ -183,7 +211,7 @@ class SymOps[Q <: Quotes](val q: Q):
183211
externalLinkCache += (csym.associatedFile -> calculatedLink)
184212
calculatedLink
185213
}
186-
extLink.map(link => constructPath(location, anchor, link))
214+
extLink.map(link => sym.constructPath(location, anchor, link))
187215
}
188216

189217
DRI(
@@ -195,7 +223,7 @@ class SymOps[Q <: Quotes](val q: Q):
195223
s"${sym.name}${sym.fullName}/${sym.signature.resultSig}/[${sym.signature.paramSigs.mkString("/")}]"
196224
)
197225

198-
def driInContextOfInheritingParent(par: Symbol)(using dctx: DocContext): DRI = sym.dri.copy(
226+
def driInContextOfInheritingParent(par: quotes.reflect.Symbol)(using dctx: DocContext): DRI = sym.dri.copy(
199227
location = par.dri.location,
200228
externalLink = None
201229
)

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import dotty.tools.scaladoc.tasty.comments.Comment
1717
import java.nio.file.Paths
1818
import java.nio.file.Files
1919

20+
import SymOps._
21+
2022
/** Responsible for collectively inspecting all the Tasty files we're interested in.
2123
*
2224
* Delegates most of the work to [[TastyParser]] [[dotty.tools.scaladoc.tasty.TastyParser]].
@@ -78,7 +80,7 @@ case class ScaladocTastyInspector()(using ctx: DocContext) extends DocTastyInspe
7880

7981
val parser = new TastyParser(q, this)(isSkipped)
8082
def driFor(link: String): Option[DRI] =
81-
val symOps = new SymOps[q.type](q)
83+
val symOps = new SymOpsWithLinkCache
8284
import symOps._
8385
Try(QueryParser(link).readQuery()).toOption.flatMap(query =>
8486
MemberLookup.lookupOpt(query, None).map {
@@ -178,6 +180,8 @@ case class TastyParser(
178180
) extends ScaladocSupport with BasicSupport with TypesSupport with ClassLikeSupport with SyntheticsSupport with PackageSupport with NameNormalizer:
179181
import qctx.reflect._
180182

183+
private given qctx.type = qctx
184+
181185
def processTree[T](tree: Tree)(op: => T): Option[T] = try Option(op) catch
182186
case e: Exception =>
183187
report.warning(throwableToString(e), tree.pos)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import collection.JavaConverters._
66
trait TypesSupport:
77
self: TastyParser =>
88
import qctx.reflect._
9+
private given qctx.type = qctx
910

1011
type DocSignaturePart = String | Link
1112
type DocSignature = List[DocSignaturePart]

scaladoc/src/dotty/tools/scaladoc/tasty/comments/Comments.scala

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import com.vladsch.flexmark.util.options.MutableDataSet
1212
import scala.quoted._
1313
import dotty.tools.scaladoc.tasty.comments.wiki.Paragraph
1414
import dotty.tools.scaladoc.DocPart
15-
import dotty.tools.scaladoc.tasty.SymOps
15+
import dotty.tools.scaladoc.tasty.SymOpsWithLinkCache
16+
import collection.JavaConverters._
1617
import collection.JavaConverters._
1718

1819
class Repr(val qctx: Quotes)(val sym: qctx.reflect.Symbol)
@@ -80,10 +81,11 @@ abstract class MarkupConversion[T](val repr: Repr)(using DocContext) {
8081
val qctx: repr.qctx.type = if repr == null then null else repr.qctx // TODO why we do need null?
8182
val owner: qctx.reflect.Symbol =
8283
if repr == null then null.asInstanceOf[qctx.reflect.Symbol] else repr.sym
84+
private given qctx.type = qctx
8385

84-
object SymOps extends SymOps[qctx.type](qctx)
85-
export SymOps.dri
86-
export SymOps.driInContextOfInheritingParent
86+
object SymOpsWithLinkCache extends SymOpsWithLinkCache
87+
export SymOpsWithLinkCache.dri
88+
export SymOpsWithLinkCache.driInContextOfInheritingParent
8789

8890
def resolveLink(queryStr: String): DocLink =
8991
if SchemeUri.matches(queryStr) then DocLink.ToURL(queryStr)

0 commit comments

Comments
 (0)