@@ -1193,19 +1193,20 @@ let genExpr (e: Expr) =
11931193 else
11941194 indentSepNlnUnindent f ctx
11951195
1196- let genFuncExpr =
1197- match node.FunctionExpr with
1198- | Expr.TypeApp node -> genTypeApp true node
1199- | _ -> genExpr node.FunctionExpr
1200-
1201- ( genFuncExpr
1196+ ( genExpr node.FunctionExpr
12021197 +> ensureArgumentsAreNotAlignedWithFunctionName ( col sepNln node.Arguments genExpr))
12031198 ctx
12041199
12051200 expressionFitsOnRestOfLine shortExpression longExpression ctx
12061201
12071202 |> genNode node
1208- | Expr.TypeApp node -> expressionFitsOnRestOfLine ( genTypeApp false node) ( genTypeApp true node)
1203+ | Expr.TypeApp node ->
1204+ genPrefixApp
1205+ ( genExpr node.Identifier)
1206+ node.LessThan
1207+ ( colGenericTypeParameters node.TypeParameters)
1208+ node.GreaterThan
1209+ |> genNode node
12091210 | Expr.TryWithSingleClause node ->
12101211 let genClause =
12111212 let clauseNode = node.Clause
@@ -2093,26 +2094,6 @@ let genAppSingleParenArgExpr (addSpace: Context -> Context) (node: ExprAppSingle
20932094
20942095 expressionFitsOnRestOfLine short long |> genNode node
20952096
2096- /// When called from ` SynExpr.App ` we need to ensure the node.GreaterThan is placed one space further than the start column.
2097- /// This is to ensure the application remains an application.
2098- let genTypeApp ( addAdditionalColumnOffset : bool ) ( node : ExprTypeAppNode ) ( ctx : Context ) : Context =
2099- genNode
2100- node
2101- ( fun ctx ->
2102- // Capture startColumn inside genNode (after leading trivia/newlines are written),
2103- // so we get the column on the actual line, not a stale column from a previous line. See #3179.
2104- let startColumn = ctx.Column + ( if addAdditionalColumnOffset then 1 else 0 )
2105-
2106- ( genExpr node.Identifier
2107- +> genSingleTextNode node.LessThan
2108- +> colGenericTypeParameters node.TypeParameters
2109- // we need to make sure each expression in the function application has offset at least greater than
2110- // See: https://github.com/fsprojects/fantomas/issues/1611
2111- +> addFixedSpaces startColumn
2112- +> genSingleTextNode node.GreaterThan)
2113- ctx)
2114- ctx
2115-
21162097let genClauses ( clauses : MatchClauseNode list ) =
21172098 let lastIndex = clauses.Length - 1
21182099
@@ -2377,6 +2358,24 @@ let colGenericTypeParameters typeParameters =
23772358 | [ Type.StaticConstant( Constant.FromText textNode) ] when textNode.Text.Contains( " \n " ) -> short
23782359 | _ -> expressionFitsOnRestOfLine short long
23792360
2361+ /// In F#, a closing ` > ` on a new line is ambiguous with the comparison operator.
2362+ /// Formats ` identifier< typeParameters > ` while ensuring the closing ` > ` satisfies F#'s offside rule.
2363+ let genPrefixApp
2364+ ( identifier : Context -> Context )
2365+ ( lessThan : SingleTextNode )
2366+ ( typeParameters : Context -> Context )
2367+ ( greaterThan : SingleTextNode )
2368+ ( ctx : Context )
2369+ : Context =
2370+ let startColumn = ctx.Column
2371+
2372+ ( identifier
2373+ +> genSingleTextNode lessThan
2374+ +> typeParameters
2375+ +> addFixedSpaces ( startColumn + 1 )
2376+ +> genSingleTextNode greaterThan)
2377+ ctx
2378+
23802379let genFunctionNameWithMultilineLids ( trailing : Context -> Context ) ( longIdent : IdentListNode ) =
23812380 match longIdent.Content with
23822381 | IdentifierOrDot.Ident identNode :: t ->
@@ -3254,15 +3253,11 @@ let genType (t: Type) =
32543253 | Type.Var node :: _ when String.startsWithOrdinal " ^" node.Text -> sepSpace
32553254 | t :: _ -> addSpaceIfSynTypeStaticConstantHasAtSignBeforeString t
32563255
3257- genType node.Identifier
3258- +> optSingle genIdentListNodeWithDot node.PostIdentifier
3259- +> genSingleTextNode node.LessThen
3260- +> addExtraSpace
3261- +> leadingExpressionIsMultiline ( colGenericTypeParameters node.Arguments) ( fun isMultiline ->
3262- onlyIf isMultiline (!- " " ))
3263- +> addExtraSpace
3264- // TODO: I think we need to add a space here
3265- +> genSingleTextNode node.GreaterThan
3256+ genPrefixApp
3257+ ( genType node.Identifier +> optSingle genIdentListNodeWithDot node.PostIdentifier)
3258+ node.LessThen
3259+ ( addExtraSpace +> colGenericTypeParameters node.Arguments +> addExtraSpace)
3260+ node.GreaterThan
32663261 |> genNode node
32673262 | Type.StructTuple node ->
32683263 genSingleTextNode node.Keyword
0 commit comments