Skip to content

Commit 14b1d11

Browse files
committed
Futher fix in trailing uparrow detection
Recognize as trailing in front of `->` or `?->`
1 parent 01e65fa commit 14b1d11

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1702,20 +1702,27 @@ object Parsers {
17021702

17031703
def refinedType() = refinedTypeRest(withType())
17041704

1705+
/** Disambiguation: a `^` is treated as a postfix operator meaning `^{any}`
1706+
* if followed by `{`, `->`, or `?->`,
1707+
* or followed by a new line (significant or not),
1708+
* or followed by a token that cannot start an infix type.
1709+
* Otherwise it is treated as an infix operator.
1710+
*/
1711+
private def isTrailingUpArrow =
1712+
val ahead = in.lookahead
1713+
ahead.token == LBRACE
1714+
|| ahead.isIdent(nme.PUREARROW)
1715+
|| ahead.isIdent(nme.PURECTXARROW)
1716+
|| !canStartInfixTypeTokens.contains(ahead.token)
1717+
|| ahead.lineOffset > 0
1718+
17051719
def refinedTypeRest(t: Tree): Tree = {
17061720
argumentStart()
17071721
if in.isNestedStart then
17081722
refinedTypeRest(atSpan(startOffset(t)) {
17091723
RefinedTypeTree(rejectWildcardType(t), refinement(indentOK = true))
17101724
})
1711-
else if in.isIdent(nme.UPARROW)
1712-
&& (in.lookahead.token == LBRACE
1713-
|| !canStartInfixTypeTokens.contains(in.lookahead.token)
1714-
|| in.lookahead.lineOffset > 0)
1715-
// Disambiguation: a `^` is treated as a postfix operator meaning `^{any}`
1716-
// if followed by `{` or a new line (significant or not), or a token that
1717-
// cannot start an infix type. Otherwise it is treated as an infix operator.
1718-
then
1725+
else if in.isIdent(nme.UPARROW) && isTrailingUpArrow then
17191726
val upArrowStart = in.offset
17201727
in.nextToken()
17211728
def cs =

0 commit comments

Comments
 (0)