@@ -461,23 +461,99 @@ let genExpr (e: Expr) =
461461 isSmallExpression size smallExpression multilineExpression ctx
462462 |> genNode node
463463 | Expr.Record node ->
464- let smallRecordExpr = genSmallCopyableRecordNode node
465- let genCrampedFields = genMultilineStandardRecordExprCrampedFields node
464+ let smallRecordExpr = genSmallRecordNode node
465+
466+ let genCrampedFields targetColumn =
467+ match node.CopyInfo with
468+ | Some we -> genRecordCopyExpr ( genMultilineRecordFieldsExpr node) we
469+ | None ->
470+ fun ( ctx : Context ) ->
471+ col
472+ sepNln
473+ node.Fields
474+ ( fun e ->
475+ // Add spaces to ensure the record field (incl trivia) starts at the right column.
476+ addFixedSpaces targetColumn
477+ // Lock the start of the record field, however keep potential indentations in relation to the opening curly brace
478+ +> atCurrentColumn ( genRecordFieldName e))
479+ ctx
480+
466481 let multilineRecordExpr = genMultilineRecord genCrampedFields node
467482 genRecord smallRecordExpr multilineRecordExpr node
468483 | Expr.AnonRecord node ->
469484 let genStructPrefix = onlyIf node.IsStruct !- " struct "
470- let smallRecordExpr = genStructPrefix +> genSmallCopyableRecordNode node
471- let genCrampedFields = genMultilineAnonRecordCrampedFields node
485+ let smallRecordExpr = genStructPrefix +> genSmallRecordNode node
486+
487+ let genMultilineAnonCrampedFields targetColumn =
488+ match node.CopyInfo with
489+ | Some we ->
490+ atCurrentColumn (
491+ genExpr we
492+ +> (!- " with" +> indentSepNlnUnindent ( genMultilineRecordFieldsExpr node))
493+ )
494+ | None ->
495+ fun ( ctx : Context ) ->
496+ col
497+ sepNln
498+ node.Fields
499+ ( fun fieldNode ->
500+ let genNode =
501+ if ctx.Config.IndentSize < 3 then
502+ sepSpaceOrDoubleIndentAndNlnIfExpressionExceedsPageWidth
503+ else
504+ sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth
505+
506+ // Add spaces to ensure the record field (incl trivia) starts at the right column.
507+ addFixedSpaces targetColumn
508+ +> atCurrentColumn ( enterNode fieldNode +> genIdentListNode fieldNode.FieldName)
509+ +> sepSpace
510+ +> genSingleTextNode fieldNode.Equals
511+ +> genNode ( genExpr fieldNode.Expr)
512+ +> leaveNode fieldNode)
513+ ctx
472514
473515 let multilineRecordExpr =
474- genStructPrefix +> genMultilineRecord genCrampedFields node
516+ genStructPrefix +> genMultilineRecord genMultilineAnonCrampedFields node
475517
476518 genRecord smallRecordExpr multilineRecordExpr node
477519 | Expr.InheritRecord node ->
478- let smallRecordExpr = genSmallInheritRecordExpr node
479- let multilineRecordExpr = genMultilineInheritRecordInstance node
480- genRecord smallRecordExpr multilineRecordExpr node
520+ let genSmallInheritRecordExpr =
521+ genSmallRecordBaseExpr
522+ (( genSingleTextNode node.InheritConstructor.InheritKeyword
523+ +> sepSpace
524+ +> genInheritConstructor node.InheritConstructor
525+ |> genNode ( InheritConstructor.Node node.InheritConstructor))
526+ +> onlyIf node.HasFields sepSemi)
527+ node
528+
529+ let genMultilineInheritRecordExpr =
530+ let fieldsExpr = genMultilineRecordFieldsExpr node
531+
532+ let genInheritInfo =
533+ ( genSingleTextNode node.InheritConstructor.InheritKeyword
534+ +> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth ( genInheritConstructor node.InheritConstructor)
535+ |> genNode ( InheritConstructor.Node node.InheritConstructor))
536+ +> onlyIf node.HasFields sepNln
537+
538+ let genMultilineAlignBrackets =
539+ genSingleTextNode node.OpeningBrace
540+ +> indentSepNlnUnindent ( genInheritInfo +> fieldsExpr)
541+ +> sepNln
542+ +> genSingleTextNode node.ClosingBrace
543+
544+ let genMultilineCramped =
545+ genSingleTextNode node.OpeningBrace
546+ +> addSpaceIfSpaceAroundDelimiter
547+ +> atCurrentColumn (
548+ genInheritInfo
549+ +> fieldsExpr
550+ +> addSpaceIfSpaceAroundDelimiter
551+ +> genSingleTextNode node.ClosingBrace
552+ )
553+
554+ ifAlignOrStroustrupBrackets genMultilineAlignBrackets genMultilineCramped
555+
556+ genRecord genSmallInheritRecordExpr genMultilineInheritRecordExpr node
481557 | Expr.ObjExpr node ->
482558 let param = optSingle genExpr node.Expr
483559
@@ -1530,7 +1606,15 @@ let genExpr (e: Expr) =
15301606 | Expr.IndexFromEnd node -> !- " ^" +> genExpr node.Expr |> genNode node
15311607 | Expr.Typar node -> genSingleTextNode node
15321608
1533- let genCopyExpr fieldsExpr ci =
1609+ let genQuoteExpr ( node : ExprQuoteNode ) =
1610+ genSingleTextNode node.OpenToken
1611+ +> sepSpace
1612+ +> expressionFitsOnRestOfLine ( genExpr node.Expr) ( indent +> sepNln +> genExpr node.Expr +> unindent +> sepNln)
1613+ +> sepSpace
1614+ +> genSingleTextNode node.CloseToken
1615+ |> genNode node
1616+
1617+ let genRecordCopyExpr fieldsExpr ci =
15341618 atCurrentColumnIndent ( genExpr ci)
15351619 +> !- " with"
15361620 +> indent
@@ -1547,131 +1631,24 @@ let genRecordFieldName (node: RecordFieldNode) =
15471631 +> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidthUnlessStroustrup genExpr node.Expr
15481632 |> genNode node
15491633
1550- let genQuoteExpr ( node : ExprQuoteNode ) =
1551- genSingleTextNode node.OpenToken
1552- +> sepSpace
1553- +> expressionFitsOnRestOfLine ( genExpr node.Expr) ( indent +> sepNln +> genExpr node.Expr +> unindent +> sepNln)
1554- +> sepSpace
1555- +> genSingleTextNode node.CloseToken
1556- |> genNode node
1557-
1558- let genFieldsExpr ( node : ExprRecordBaseNode ) =
1634+ let genMultilineRecordFieldsExpr ( node : ExprRecordBaseNode ) =
15591635 col sepNln node.Fields genRecordFieldName
15601636
1561- let private genSmallRecordExpr genExtra ( node : ExprRecordBaseNode ) =
1637+ let genSmallRecordBaseExpr genExtra ( node : ExprRecordBaseNode ) =
15621638 genSingleTextNode node.OpeningBrace
15631639 +> addSpaceIfSpaceAroundDelimiter
15641640 +> genExtra
15651641 +> col sepSemi node.Fields genRecordFieldName
15661642 +> addSpaceIfSpaceAroundDelimiter
15671643 +> genSingleTextNode node.ClosingBrace
15681644
1569- let genSmallCopyableRecordNode ( node : ExprRecordNode ) =
1570- genSmallRecordExpr
1645+ let genSmallRecordNode ( node : ExprRecordNode ) =
1646+ genSmallRecordBaseExpr
15711647 ( match node.CopyInfo with
15721648 | Some we -> genExpr we +> !- " with "
15731649 | None -> sepNone)
15741650 node
15751651
1576- let genSmallInheritRecordExpr ( node : ExprInheritRecordNode ) =
1577- genSmallRecordExpr
1578- (( genSingleTextNode node.InheritConstructor.InheritKeyword
1579- +> sepSpace
1580- +> genInheritConstructor node.InheritConstructor
1581- |> genNode ( InheritConstructor.Node node.InheritConstructor))
1582- +> onlyIf node.HasFields sepSemi)
1583- node
1584-
1585- let genMultilineInheritRecordInstance ( node : ExprInheritRecordNode ) =
1586- let fieldsExpr = genFieldsExpr node
1587-
1588- let genInheritInfo =
1589- ( genSingleTextNode node.InheritConstructor.InheritKeyword
1590- +> sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth ( genInheritConstructor node.InheritConstructor)
1591- |> genNode ( InheritConstructor.Node node.InheritConstructor))
1592- +> onlyIf node.HasFields sepNln
1593-
1594- let genMultilineAlignBrackets =
1595- genSingleTextNode node.OpeningBrace
1596- +> indentSepNlnUnindent ( genInheritInfo +> fieldsExpr)
1597- +> sepNln
1598- +> genSingleTextNode node.ClosingBrace
1599-
1600- let genMultilineCramped =
1601- genSingleTextNode node.OpeningBrace
1602- +> addSpaceIfSpaceAroundDelimiter
1603- +> atCurrentColumn (
1604- genInheritInfo
1605- +> fieldsExpr
1606- +> addSpaceIfSpaceAroundDelimiter
1607- +> genSingleTextNode node.ClosingBrace
1608- )
1609-
1610- ifAlignOrStroustrupBrackets genMultilineAlignBrackets genMultilineCramped
1611-
1612- let genMultilineRecordAlignBrackets ( node : ExprRecordNode ) =
1613- let fieldsExpr = genFieldsExpr node
1614-
1615- match node.CopyInfo with
1616- | Some ci ->
1617- genSingleTextNodeSuffixDelimiter node.OpeningBrace
1618- +> ifElseCtx
1619- ( fun ctx -> ctx.Config.IsStroustrupStyle)
1620- ( indent +> sepNln)
1621- sepNlnWhenWriteBeforeNewlineNotEmpty // comment after curly brace
1622- +> genCopyExpr fieldsExpr ci
1623- +> onlyIfCtx ( fun ctx -> ctx.Config.IsStroustrupStyle) unindent
1624- +> sepNln
1625- +> genSingleTextNode node.ClosingBrace
1626- // genSingleTextNode node.OpeningBrace
1627- // +> sepNlnWhenWriteBeforeNewlineNotEmptyOr addSpaceIfSpaceAroundDelimiter // comment after curly brace
1628- // +> genCopyExpr fieldsExpr we
1629- // +> sepNln
1630- // +> genSingleTextNode node.ClosingBrace
1631- | None ->
1632- genSingleTextNode node.OpeningBrace
1633- +> indentSepNlnUnindent fieldsExpr
1634- +> ifElseCtx lastWriteEventIsNewline sepNone sepNln
1635- +> genSingleTextNode node.ClosingBrace
1636-
1637- let genMultilineAnonRecordCrampedFields ( node : ExprAnonRecordNode ) targetColumn =
1638- match node.CopyInfo with
1639- | Some we -> atCurrentColumn ( genExpr we +> (!- " with" +> indentSepNlnUnindent ( genFieldsExpr node)))
1640- | None ->
1641- fun ( ctx : Context ) ->
1642- col
1643- sepNln
1644- node.Fields
1645- ( fun fieldNode ->
1646- let genNode =
1647- if ctx.Config.IndentSize < 3 then
1648- sepSpaceOrDoubleIndentAndNlnIfExpressionExceedsPageWidth
1649- else
1650- sepSpaceOrIndentAndNlnIfExpressionExceedsPageWidth
1651-
1652- // Add spaces to ensure the record field (incl trivia) starts at the right column.
1653- addFixedSpaces targetColumn
1654- +> atCurrentColumn ( enterNode fieldNode +> genIdentListNode fieldNode.FieldName)
1655- +> sepSpace
1656- +> genSingleTextNode fieldNode.Equals
1657- +> genNode ( genExpr fieldNode.Expr)
1658- +> leaveNode fieldNode)
1659- ctx
1660-
1661- let genMultilineStandardRecordExprCrampedFields ( node : ExprRecordNode ) targetColumn =
1662- match node.CopyInfo with
1663- | Some we -> genCopyExpr ( genFieldsExpr node) we
1664- | None ->
1665- fun ( ctx : Context ) ->
1666- col
1667- sepNln
1668- node.Fields
1669- ( fun e ->
1670- // Add spaces to ensure the record field (incl trivia) starts at the right column.
1671- addFixedSpaces targetColumn
1672- // Lock the start of the record field, however keep potential indentations in relation to the opening curly brace
1673- +> atCurrentColumn ( genRecordFieldName e))
1674- ctx
16751652
16761653let genMultilineRecord genCrampedFields ( node : ExprRecordNode ) ( ctx : Context ) =
16771654 let expressionStartColumn = ctx.Column
@@ -1685,6 +1662,26 @@ let genMultilineRecord genCrampedFields (node: ExprRecordNode) (ctx: Context) =
16851662 else
16861663 openBracketLength)
16871664
1665+ let genMultilineAlignBrackets =
1666+ let fieldsExpr = genMultilineRecordFieldsExpr node
1667+
1668+ match node.CopyInfo with
1669+ | Some ci ->
1670+ genSingleTextNodeSuffixDelimiter node.OpeningBrace
1671+ +> ifElseCtx
1672+ ( fun ctx -> ctx.Config.IsStroustrupStyle)
1673+ ( indent +> sepNln)
1674+ sepNlnWhenWriteBeforeNewlineNotEmpty // comment after curly brace
1675+ +> genRecordCopyExpr fieldsExpr ci
1676+ +> onlyIfCtx ( fun ctx -> ctx.Config.IsStroustrupStyle) unindent
1677+ +> sepNln
1678+ +> genSingleTextNode node.ClosingBrace
1679+ | None ->
1680+ genSingleTextNode node.OpeningBrace
1681+ +> indentSepNlnUnindent fieldsExpr
1682+ +> ifElseCtx lastWriteEventIsNewline sepNone sepNln
1683+ +> genSingleTextNode node.ClosingBrace
1684+
16881685 let genMultilineCramped =
16891686 match node.CopyInfo with
16901687 | Some _ ->
@@ -1708,12 +1705,11 @@ let genMultilineRecord genCrampedFields (node: ExprRecordNode) (ctx: Context) =
17081705 ifElseCtx lastWriteEventIsNewline brace ( addSpaceIfSpaceAroundDelimiter +> brace) ctx)
17091706 )
17101707
1711- ifAlignOrStroustrupBrackets ( genMultilineRecordAlignBrackets node ) genMultilineCramped ctx
1708+ ifAlignOrStroustrupBrackets genMultilineAlignBrackets genMultilineCramped ctx
17121709
1713- let genRecord smallRecordExpr multilineRecordExpr ( node : ExprRecordBaseNode ) =
1714- fun ctx ->
1715- let size = getRecordSize ctx node.Fields
1716- genNode node ( isSmallExpression size smallRecordExpr multilineRecordExpr) ctx
1710+ let genRecord smallRecordExpr multilineRecordExpr ( node : ExprRecordBaseNode ) ctx =
1711+ let size = getRecordSize ctx node.Fields
1712+ genNode node ( isSmallExpression size smallRecordExpr multilineRecordExpr) ctx
17171713
17181714let genMultilineFunctionApplicationArguments ( argExpr : Expr ) =
17191715 let argsInsideParenthesis ( parenNode : ExprParenNode ) f =
0 commit comments