Skip to content

Commit

Permalink
Update FCS to 'Parser: parse primary ctor params as normal patterns' (#…
Browse files Browse the repository at this point in the history
…3034)

* Update FCS to 'Parser: parse primary ctor params as normal patterns', commit e2496896c128ccfde33c92f45bbe0d2aa738873a

* Add changelog entry.
  • Loading branch information
nojaf authored Jan 10, 2024
1 parent 3a10e88 commit e24e503
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 113 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Changelog

## Unreleased

### Changed
* Update FCS to 'Parser: parse primary ctor params as normal patterns', commit e2496896c128ccfde33c92f45bbe0d2aa738873a [#3034](https://github.com/fsprojects/fantomas/pull/3034)

## 6.3.0-alpha-006 - 2024-01-09

### Changed
Expand Down
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ Some common use cases include:

<!-- Versions -->
<PropertyGroup>
<FCSCommitHash>ee4a810ffe9e984e2ec8c55a9cb6d1c6631dd0b3</FCSCommitHash>
<FCSCommitHash>e2496896c128ccfde33c92f45bbe0d2aa738873a</FCSCommitHash>
</PropertyGroup>

<PropertyGroup>
Expand Down
4 changes: 1 addition & 3 deletions src/Fantomas.Core.Tests/TypeDeclarationTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3411,9 +3411,7 @@ type SingleAppParenLambda
type SingleAppParenLambda
(
// Expr could be a single identifier or TypeApp
functionName: Expr,
parenLambda: ExprParenLambdaNode,
range
functionName: Expr, parenLambda: ExprParenLambdaNode, range
) =
inherit NodeBase(range)
override this.Children = [| yield Expr.Node functionName; yield parenLambda |]
Expand Down
63 changes: 7 additions & 56 deletions src/Fantomas.Core/ASTTransformer.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2398,71 +2398,24 @@ let mkSynUnionCase
fullRange
)

let mkSynSimplePat creationAide (pat: SynSimplePat) =
match pat with
| SynSimplePat.Attrib(SynSimplePat.Typed(SynSimplePat.Id(ident = ident; isOptional = isOptional), t, _),
attributes,
m) ->
Some(
SimplePatNode(
mkAttributes creationAide attributes,
isOptional,
mkIdent ident,
Some(mkType creationAide t),
m
)
)
| SynSimplePat.Typed(SynSimplePat.Id(ident = ident; isOptional = isOptional), t, m) ->
Some(SimplePatNode(mkAttributes creationAide [], isOptional, mkIdent ident, Some(mkType creationAide t), m))
| SynSimplePat.Attrib(SynSimplePat.Id(ident = ident; isOptional = isOptional), attributes, m) ->
Some(SimplePatNode(mkAttributes creationAide attributes, isOptional, mkIdent ident, None, m))
| SynSimplePat.Id(ident = ident; isOptional = isOptional; range = m) ->
Some(SimplePatNode(mkAttributes creationAide [], isOptional, mkIdent ident, None, m))
| _ -> None

let mkImplicitCtor
creationAide
vis
(creationAide: CreationAide)
(vis: SynAccess option)
(attrs: SynAttributeList list)
pats
(pat: SynPat)
(self: (range * Ident) option)
(xmlDoc: PreXmlDoc)
=
let openNode, pats, commas, closeNode =
match pats with
| SynSimplePats.SimplePats(pats = pats; commaRanges = commas; range = StartEndRange 1 (mOpen, _, mClose)) ->
stn "(" mOpen, pats, commas, stn ")" mClose

let pats =
match pats with
| [] ->
// Unit pattern
[]
| head :: tail ->
let rest =
assert (tail.Length = commas.Length)

List.zip commas tail
|> List.collect (fun (c, p) ->
match mkSynSimplePat creationAide p with
| None -> []
| Some simplePat -> [ Choice2Of2(stn "," c); Choice1Of2 simplePat ])

[ match mkSynSimplePat creationAide head with
| None -> ()
| Some simplePat -> yield Choice1Of2 simplePat
yield! rest ]

: ImplicitConstructorNode =
let range =
let startRange =
if not xmlDoc.IsEmpty then xmlDoc.Range
else if not attrs.IsEmpty then attrs.[0].Range
else openNode.Range
else pat.Range

let endRange =
match self with
| Some(_, self) -> self.idRange
| None -> closeNode.Range
| None -> pat.Range

unionRanges startRange endRange

Expand All @@ -2477,9 +2430,7 @@ let mkImplicitCtor
mkXmlDoc xmlDoc,
mkAttributes creationAide attrs,
mkSynAccess vis,
openNode,
pats,
closeNode,
mkPat creationAide pat,
asSelfNode,
range
)
Expand Down
36 changes: 10 additions & 26 deletions src/Fantomas.Core/CodePrinter.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3261,41 +3261,25 @@ let sepNlnBetweenTypeAndMembers (node: ITypeDefn) (ctx: Context) : Context =
ctx

let genImplicitConstructor (node: ImplicitConstructorNode) =
let genSimplePat (node: SimplePatNode) =
genOnelinerAttributes node.Attributes
+> onlyIf node.IsOptional (!- "?")
+> genSingleTextNode node.Identifier
+> optSingle (fun t -> sepColon +> autoIndentAndNlnIfExpressionExceedsPageWidth (genType t)) node.Type
|> genNode node

let shortPats =
col sepNone node.Items (function
| Choice1Of2 p -> genSimplePat p
| Choice2Of2 comma -> genSingleTextNode comma +> addSpaceIfSpaceAfterComma)

let longPats =
let genPats =
col sepNone node.Items (function
| Choice1Of2 p -> genSimplePat p
| Choice2Of2 comma -> genSingleTextNode comma +> sepNln)

indentSepNlnUnindent genPats +> sepNln

let short =
genXml node.XmlDoc
+> onlyIf node.Attributes.IsSome sepSpace
+> genOnelinerAttributes node.Attributes
+> onlyIf node.Accessibility.IsSome sepSpace
+> genAccessOpt node.Accessibility
+> genSingleTextNode node.OpeningParen
+> shortPats
+> genSingleTextNode node.ClosingParen
+> genPat node.Pattern

let long =
let genPats =
genSingleTextNode node.OpeningParen
+> expressionFitsOnRestOfLine shortPats longPats
+> genSingleTextNode node.ClosingParen
match node.Pattern with
| Pattern.Paren patParen ->
genSingleTextNode patParen.OpeningParen
+> expressionFitsOnRestOfLine
(genPat patParen.Pattern)
(indentSepNlnUnindent (genPat patParen.Pattern) +> sepNln)
+> genSingleTextNode patParen.ClosingParen
|> genNode patParen
| _ -> genPat node.Pattern

indentSepNlnUnindent (
genXml node.XmlDoc
Expand Down
30 changes: 3 additions & 27 deletions src/Fantomas.Core/SyntaxOak.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2259,21 +2259,6 @@ type TypeDefnAbbrevNode(typeNameNode, t: Type, members, range) =
member val TypeName = typeNameNode
member val Members = members

type SimplePatNode
(attributes: MultipleAttributeListNode option, isOptional: bool, identifier: SingleTextNode, t: Type option, range)
=
inherit NodeBase(range)

override val Children: Node array =
[| yield! noa attributes
yield identifier
yield! noa (Option.map Type.Node t) |]

member val Attributes = attributes
member val IsOptional = isOptional
member val Identifier = identifier
member val Type = t

type AsSelfIdentifierNode(asNode: SingleTextNode, self: SingleTextNode, range) =
inherit NodeBase(range)
override val Children = [| yield (asNode :> Node); yield self |]
Expand All @@ -2285,9 +2270,7 @@ type ImplicitConstructorNode
xmlDoc: XmlDocNode option,
attributes: MultipleAttributeListNode option,
accessibility: SingleTextNode option,
openingParen: SingleTextNode,
items: Choice<SimplePatNode, SingleTextNode> list,
closingParen: SingleTextNode,
pat: Pattern,
self: AsSelfIdentifierNode option,
range
) =
Expand All @@ -2297,20 +2280,13 @@ type ImplicitConstructorNode
[| yield! noa xmlDoc
yield! noa attributes
yield! noa accessibility
yield openingParen
for item in items do
match item with
| Choice1Of2 node -> yield node
| Choice2Of2 comma -> yield comma
yield closingParen
yield Pattern.Node pat
yield! noa self |]

member val XmlDoc = xmlDoc
member val Attributes = attributes
member val Accessibility = accessibility
member val OpeningParen = openingParen
member val Items = items
member val ClosingParen = closingParen
member val Pattern = pat
member val Self = self

type TypeDefnExplicitBodyNode(kind: SingleTextNode, members: MemberDefn list, endNode: SingleTextNode, range) =
Expand Down

0 comments on commit e24e503

Please sign in to comment.