Skip to content

Commit 3cc68a1

Browse files
committed
Fix rendering of context function types
1 parent e0e1b94 commit 3cc68a1

File tree

2 files changed

+28
-15
lines changed

2 files changed

+28
-15
lines changed

local/project/dummy/arrows.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,9 @@ trait Arrows:
4545
def pathDependent2(n: Nested^)(g: AnyRef^{n.next.c} => Any): Any
4646
def pathDependent3(n: Nested^)(g: AnyRef^{n.c} => AnyRef^{n.next.c} ->{n.c} Any): Any
4747
def pathDependent4(n: Nested^)(g: AnyRef^{n.c} => AnyRef^{n.next.c} ->{n.c} Any): AnyRef^{n.next.next.c}
48-
def pathDependent5(n: Nested^)(g: AnyRef^{n.c} => AnyRef^{n.next.c} ->{n.c} Any): AnyRef^{n.next.next.c*, n.c}
48+
def pathDependent5(n: Nested^)(g: AnyRef^{n.c} => AnyRef^{n.next.c} ->{n.c} Any): AnyRef^{n.next.next.c*, n.c}
49+
50+
def contextPure(f: AnyRef^{a} ?-> Int): Int
51+
def contextImpure(f: AnyRef^{a} ?=> Int): Int
52+
def contextImpure2(f: AnyRef^{a} ?->{b,c} Int): Int
53+
def contextImpure3(f: AnyRef^{a} ?->{b,c} Int => AnyRef^{a} ?=> Int): Int

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

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ trait TypesSupport:
9191

9292
// TODO #23 add support for all types signatures that make sense
9393
private def inner(
94-
using Quotes,
94+
using qctx: Quotes,
9595
)(
9696
tp: reflect.TypeRepr,
9797
)(using
@@ -115,8 +115,10 @@ trait TypesSupport:
115115
++ keyword(" & ").l
116116
++ inParens(inner(right), shouldWrapInParens(right, tp, false))
117117
case ByNameType(CapturingType(tpe, refs)) =>
118-
renderCaptureArrow(refs) ++ (plain(" ") :: inner(tpe))
119-
case ByNameType(tpe) => keyword("=>!! ") :: inner(tpe) // FIXME: does it need change for CC?
118+
renderCaptureArrow(using qctx)(refs, false) ++ (plain(" ") :: inner(tpe))
119+
case ByNameType(tpe) =>
120+
tpe.typeSymbol.pos.map(p => report.warning(s"Pure ByNameType at ${p}"))
121+
keyword("-> ") :: inner(tpe) // FIXME need to check if cc is enabled in current file first!!!
120122
case ConstantType(constant) =>
121123
plain(constant.show).l
122124
case ThisType(tpe) =>
@@ -332,16 +334,20 @@ trait TypesSupport:
332334
s"${tpe.show(using Printer.TypeReprStructure)}"
333335
throw MatchError(msg)
334336

335-
private def functionType(using Quotes)(t: reflect.TypeRepr, tpe: reflect.TypeRepr, args: List[reflect.TypeRepr])(using
337+
private def functionType(using qctx: Quotes)(t: reflect.TypeRepr, tpe: reflect.TypeRepr, args: List[reflect.TypeRepr])(using
336338
elideThis: reflect.ClassDef,
337339
indent: Int,
338340
skipTypeSuffix: Boolean,
339341
inCC: Option[List[reflect.TypeRepr]],
340342
): SSignature =
341343
import reflect._
342-
val arrow = if t.isContextFunctionType then keyword(" ?=> ").l // FIXME: can we have contextual functions with capture sets?
343-
else plain(" ") :: (renderCaptureArrow(inCC) ++ plain(" ").l)
344-
given Option[List[TypeRepr]] = None
344+
val refs = if !inCC.isDefined && t.isContextFunctionType then
345+
// This'll ensure that an impure context function type is rendered correctly
346+
Some(List(CaptureDefs.captureRoot.termRef))
347+
else
348+
inCC
349+
val arrow = plain(" ") :: (renderCaptureArrow(using qctx)(refs, t.isContextFunctionType) ++ plain(" ").l)
350+
given Option[List[TypeRepr]] = None // FIXME: this is ugly
345351
args match
346352
case Nil => Nil
347353
case List(rtpe) => plain("()").l ++ arrow ++ inner(rtpe)
@@ -479,15 +485,17 @@ trait TypesSupport:
479485
import reflect._
480486
Keyword("^") :: renderCaptureSet(refs)
481487

482-
private def renderCaptureArrow(using Quotes)(refs: List[reflect.TypeRepr])(using elideThis: reflect.ClassDef): SSignature =
488+
private def renderCaptureArrow(using Quotes)(refs: List[reflect.TypeRepr], isImplicitFun: Boolean)(using elideThis: reflect.ClassDef): SSignature =
483489
import reflect._
490+
val prefix = if isImplicitFun then "?" else ""
484491
refs match
485-
case Nil => List(Keyword("->"))
486-
case List(ref) if ref.isCaptureRoot => List(Keyword("=>"))
487-
case refs => Keyword("->") :: renderCaptureSet(refs)
492+
case Nil => List(Keyword(prefix + "->")) // FIXME need to check if cc is enabled in current file first!!!
493+
case List(ref) if ref.isCaptureRoot => List(Keyword(prefix + "=>"))
494+
case refs => Keyword(prefix + "->") :: renderCaptureSet(refs)
488495

489-
private def renderCaptureArrow(using Quotes)(refs: Option[List[reflect.TypeRepr]])(using elideThis: reflect.ClassDef): SSignature =
496+
private def renderCaptureArrow(using qctx: Quotes)(refs: Option[List[reflect.TypeRepr]], isImplicitFun: Boolean)(using elideThis: reflect.ClassDef): SSignature =
490497
import reflect._
498+
val prefix = if isImplicitFun then "?" else ""
491499
refs match
492-
case None => List(Keyword("=>")) // FIXME: is this correct? or should it be `->` by default?
493-
case Some(refs) => renderCaptureArrow(refs)
500+
case None => List(Keyword(prefix + "->")) // FIXME need to check if cc is enabled in current file first!!!
501+
case Some(refs) => renderCaptureArrow(using qctx)(refs, isImplicitFun)

0 commit comments

Comments
 (0)