Skip to content

Commit fc65e0c

Browse files
authored
Always consider the range of the accessibility of properties. (#2907)
1 parent 702694e commit fc65e0c

File tree

3 files changed

+89
-35
lines changed

3 files changed

+89
-35
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## [6.0.7] - 2023-06-20
4+
5+
### Fixed
6+
* Private keyword is lost from getter with unit. [#2906](https://github.com/fsprojects/fantomas/issues/2906)
7+
38
## [6.0.6] - 2023-06-19
49

510
### Fixed

src/Fantomas.Core.Tests/ClassTests.fs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,3 +1293,40 @@ type MyClass(a: int, b: int) =
12931293
[<Obsolete("Do not use")>]
12941294
new(x: int) = MyClass(x, x)
12951295
"""
1296+
1297+
[<Test>]
1298+
let ``access modifier on get unit property gets simplified, 2906`` () =
1299+
formatSourceString
1300+
false
1301+
"""
1302+
type X() =
1303+
member private this.Y with get() = "meh"
1304+
member this.Z with private get() = "foo"
1305+
"""
1306+
config
1307+
|> prepend newline
1308+
|> should
1309+
equal
1310+
"""
1311+
type X() =
1312+
member private this.Y = "meh"
1313+
member private this.Z = "foo"
1314+
"""
1315+
1316+
[<Test>]
1317+
let ``access modifier on set property, 2906`` () =
1318+
formatSourceString
1319+
false
1320+
"""
1321+
type X() =
1322+
member private this.Y with set _ = ()
1323+
"""
1324+
config
1325+
|> prepend newline
1326+
|> should
1327+
equal
1328+
"""
1329+
type X() =
1330+
member private this.Y
1331+
with set _ = ()
1332+
"""

src/Fantomas.Core/ASTTransformer.fs

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2561,29 +2561,20 @@ let mkWithGetSet (withKeyword: range option) (getSet: GetSetKeywords option) =
25612561

25622562
let mkPropertyGetSetBinding
25632563
(creationAide: CreationAide)
2564+
(accessibility: SynAccess option)
25642565
(leadingKeyword: SingleTextNode)
25652566
(binding: SynBinding)
25662567
: PropertyGetSetBindingNode =
25672568
match binding with
25682569
| SynBinding(
2569-
headPat = SynPat.LongIdent(
2570-
longDotId = lid; extraId = Some extraIdent; accessibility = ao; argPats = SynArgPats.Pats ps)
2570+
headPat = SynPat.LongIdent(extraId = Some extraIdent; argPats = SynArgPats.Pats ps)
25712571
returnInfo = returnInfo
25722572
expr = expr
25732573
trivia = { EqualsRange = Some mEq
25742574
InlineKeyword = inlineKw }) ->
25752575
let e = parseExpressionInSynBinding returnInfo expr
25762576
let returnTypeNode = mkBindingReturnInfo creationAide returnInfo
25772577

2578-
// Only use the accessibility of the property binding if the keyword came after the member identifier.
2579-
let accessibility =
2580-
ao
2581-
|> Option.bind (fun vis ->
2582-
if rangeBeforePos lid.Range vis.Range.Start then
2583-
Some vis
2584-
else
2585-
None)
2586-
25872578
let pats =
25882579
match ps with
25892580
| [ SynPat.Tuple(false, [ p1; p2; p3 ], [ comma ], _) ] ->
@@ -2628,7 +2619,9 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
26282619
| SynMemberDefn.ImplicitInherit(t, e, _, StartRange 7 (mInherit, _)) ->
26292620
mkInheritConstructor creationAide t e mInherit memberDefinitionRange
26302621
|> MemberDefn.ImplicitInherit
2631-
| SynMemberDefn.GetSetMember(Some(SynBinding(ao,
2622+
2623+
// Transforms: `member this.Y with get() = "meh"` into `member this.Y = "meh"`
2624+
| SynMemberDefn.GetSetMember(Some(SynBinding(_,
26322625
kind,
26332626
isInline,
26342627
isMutable,
@@ -2638,10 +2631,10 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
26382631
SynPat.LongIdent(lid,
26392632
extraId,
26402633
typarDecls,
2641-
SynArgPats.Pats [ SynPat.Paren(SynPat.Const(SynConst.Unit,
2642-
_),
2643-
_) ],
2644-
None,
2634+
SynArgPats.Pats [ SynPat.Paren(
2635+
pat = SynPat.Const(
2636+
constant = SynConst.Unit)) ],
2637+
ao,
26452638
mPat),
26462639
ri,
26472640
e,
@@ -2652,12 +2645,11 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
26522645
_,
26532646
{ GetKeyword = Some _ }) ->
26542647

2655-
let pat =
2656-
SynPat.LongIdent(lid, extraId, typarDecls, SynArgPats.Pats([]), None, mPat)
2648+
let pat = SynPat.LongIdent(lid, extraId, typarDecls, SynArgPats.Pats([]), ao, mPat)
26572649

26582650
mkBinding
26592651
creationAide
2660-
(SynBinding(ao, kind, isInline, isMutable, ats, px, valData, pat, ri, e, bindingRange, dp, trivia))
2652+
(SynBinding(None, kind, isInline, isMutable, ats, px, valData, pat, ri, e, bindingRange, dp, trivia))
26612653
|> MemberDefn.Member
26622654
| SynMemberDefn.Member(
26632655
memberDefn = SynBinding(
@@ -2784,15 +2776,12 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
27842776
SetKeyword = Some setKeyword
27852777
WithKeyword = withKeyword
27862778
AndKeyword = andKeyword }) ->
2787-
let firstAccessibility, firstBinding, lastBinding =
2779+
2780+
let firstAccessibility, firstBinding, firstKeyword, lastBinding, lastKeyword =
27882781
if Position.posLt getKeyword.Start setKeyword.Start then
2789-
visGet,
2790-
mkPropertyGetSetBinding creationAide (stn "get" getKeyword) getBinding,
2791-
Some(mkPropertyGetSetBinding creationAide (stn "set" setKeyword) setBinding)
2782+
visGet, getBinding, (stn "get" getKeyword), setBinding, (stn "set" setKeyword)
27922783
else
2793-
visSet,
2794-
mkPropertyGetSetBinding creationAide (stn "set" setKeyword) setBinding,
2795-
Some(mkPropertyGetSetBinding creationAide (stn "get" getKeyword) getBinding)
2784+
visSet, setBinding, (stn "set" setKeyword), getBinding, (stn "get" getKeyword)
27962785

27972786
// Only use the accessibility of the first binding if the keyword came before the member identifier.
27982787
let accessibility =
@@ -2803,6 +2792,22 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
28032792
else
28042793
None)
28052794

2795+
let firstBinding =
2796+
match firstBinding with
2797+
| SynBinding(headPat = SynPat.LongIdent(accessibility = Some vis)) when
2798+
rangeBeforePos memberName.Range vis.Range.Start
2799+
->
2800+
mkPropertyGetSetBinding creationAide (Some vis) firstKeyword firstBinding
2801+
| _ -> mkPropertyGetSetBinding creationAide None firstKeyword firstBinding
2802+
2803+
let lastBinding =
2804+
match lastBinding with
2805+
| SynBinding(headPat = SynPat.LongIdent(accessibility = Some vis)) when
2806+
rangeBeforePos memberName.Range vis.Range.Start
2807+
->
2808+
mkPropertyGetSetBinding creationAide (Some vis) lastKeyword lastBinding
2809+
| _ -> mkPropertyGetSetBinding creationAide None lastKeyword lastBinding
2810+
28062811
MemberDefnPropertyGetSetNode(
28072812
mkXmlDoc px,
28082813
mkAttributes creationAide ats,
@@ -2813,27 +2818,25 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
28132818
stn "with" withKeyword,
28142819
firstBinding,
28152820
Option.map (stn "and") andKeyword,
2816-
lastBinding,
2821+
Some lastBinding,
28172822
memberDefinitionRange
28182823
)
28192824
|> MemberDefn.PropertyGetSet
28202825
| SynMemberDefn.GetSetMember(None,
28212826
Some(SynBinding(
2822-
accessibility = ao
28232827
attributes = ats
28242828
xmlDoc = px
2825-
headPat = SynPat.LongIdent(longDotId = memberName)
2829+
headPat = SynPat.LongIdent(longDotId = memberName; accessibility = ao)
28262830
trivia = { LeadingKeyword = lk
28272831
InlineKeyword = inlineKw }) as binding),
28282832
_,
28292833
{ WithKeyword = withKeyword
28302834
GetKeyword = getKeyword
28312835
SetKeyword = setKeyword })
28322836
| SynMemberDefn.GetSetMember(Some(SynBinding(
2833-
accessibility = ao
28342837
attributes = ats
28352838
xmlDoc = px
2836-
headPat = SynPat.LongIdent(longDotId = memberName)
2839+
headPat = SynPat.LongIdent(longDotId = memberName; accessibility = ao)
28372840
trivia = { LeadingKeyword = lk
28382841
InlineKeyword = inlineKw }) as binding),
28392842
None,
@@ -2842,17 +2845,26 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
28422845
GetKeyword = getKeyword
28432846
SetKeyword = setKeyword }) ->
28442847

2848+
let visMember, visProperty =
2849+
match ao with
2850+
| None -> None, None
2851+
| Some ao ->
2852+
if rangeBeforePos ao.Range memberName.Range.Start then
2853+
Some ao, None
2854+
else
2855+
None, Some ao
2856+
28452857
match getKeyword, setKeyword with
28462858
| Some getKeyword, None ->
28472859
let bindingNode =
2848-
mkPropertyGetSetBinding creationAide (stn "get" getKeyword) binding
2860+
mkPropertyGetSetBinding creationAide visProperty (stn "get" getKeyword) binding
28492861

28502862
MemberDefnPropertyGetSetNode(
28512863
mkXmlDoc px,
28522864
mkAttributes creationAide ats,
28532865
mkSynLeadingKeyword lk,
28542866
Option.map (stn "inline") inlineKw,
2855-
mkSynAccess ao,
2867+
mkSynAccess visMember,
28562868
mkSynLongIdent memberName,
28572869
stn "with" withKeyword,
28582870
bindingNode,
@@ -2863,14 +2875,14 @@ let mkMemberDefn (creationAide: CreationAide) (md: SynMemberDefn) =
28632875
|> MemberDefn.PropertyGetSet
28642876
| None, Some setKeyword ->
28652877
let bindingNode =
2866-
mkPropertyGetSetBinding creationAide (stn "set" setKeyword) binding
2878+
mkPropertyGetSetBinding creationAide visProperty (stn "set" setKeyword) binding
28672879

28682880
MemberDefnPropertyGetSetNode(
28692881
mkXmlDoc px,
28702882
mkAttributes creationAide ats,
28712883
mkSynLeadingKeyword lk,
28722884
Option.map (stn "inline") inlineKw,
2873-
mkSynAccess ao,
2885+
mkSynAccess visMember,
28742886
mkSynLongIdent memberName,
28752887
stn "with" withKeyword,
28762888
bindingNode,

0 commit comments

Comments
 (0)