Skip to content

Commit edbbecc

Browse files
authored
Print inline keyword for member (#15543)
* Add inline keyword to get member. * Consider two members when TotalArgCount differ for getter and setter. * Reuse existing inline helper. * Slightly better detection of indexed getter.
1 parent 256c7b2 commit edbbecc

File tree

7 files changed

+60
-6
lines changed

7 files changed

+60
-6
lines changed

src/Compiler/Checking/NicePrint.fs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,7 +1255,7 @@ module PrintTastMemberOrVals =
12551255

12561256
let mkInlineL denv (v: Val) nameL =
12571257
if v.MustInline && not denv.suppressInlineKeyword then
1258-
wordL (tagKeyword "inline") ++ nameL
1258+
WordL.keywordInline ++ nameL
12591259
else
12601260
nameL
12611261

@@ -1326,6 +1326,7 @@ module PrintTastMemberOrVals =
13261326
// use error recovery because intellisense on an incomplete file will show this
13271327
errorR(Error(FSComp.SR.tastInvalidFormForPropertyGetter(), vref.Id.idRange))
13281328
let nameL = layoutMemberName denv vref [] argInfos tagProperty vref.DisplayNameCoreMangled
1329+
let nameL = if short then nameL else mkInlineL denv vref.Deref nameL
13291330
let resL =
13301331
if short then nameL --- (WordL.keywordWith ^^ WordL.keywordGet)
13311332
else stat --- nameL --- (WordL.keywordWith ^^ WordL.keywordGet)
@@ -1342,6 +1343,7 @@ module PrintTastMemberOrVals =
13421343
else tauL --- (WordL.keywordWith ^^ WordL.keywordGet)
13431344
else
13441345
let nameL = layoutMemberName denv vref niceMethodTypars argInfos tagProperty vref.DisplayNameCoreMangled
1346+
let nameL = if short then nameL else mkInlineL denv vref.Deref nameL
13451347
stat --- ((nameL |> addColonL) ^^ (if isNil argInfos then tauL else tauL --- (WordL.keywordWith ^^ WordL.keywordGet)))
13461348
prettyTyparInst, resL
13471349

@@ -1350,6 +1352,7 @@ module PrintTastMemberOrVals =
13501352
// use error recovery because intellisense on an incomplete file will show this
13511353
errorR(Error(FSComp.SR.tastInvalidFormForPropertySetter(), vref.Id.idRange))
13521354
let nameL = layoutMemberName denv vref [] argInfos tagProperty vref.DisplayNameCoreMangled
1355+
let nameL = if short then nameL else mkInlineL denv vref.Deref nameL
13531356
let resL = stat --- nameL --- (WordL.keywordWith ^^ WordL.keywordSet)
13541357
emptyTyparInst, resL
13551358
else
@@ -1361,6 +1364,7 @@ module PrintTastMemberOrVals =
13611364
(tauL --- (WordL.keywordWith ^^ WordL.keywordSet))
13621365
else
13631366
let nameL = layoutMemberName denv vref niceMethodTypars curriedArgInfos tagProperty vref.DisplayNameCoreMangled
1367+
let nameL = if short then nameL else mkInlineL denv vref.Deref nameL
13641368
stat --- ((nameL |> addColonL) ^^ (tauL --- (WordL.keywordWith ^^ WordL.keywordSet)))
13651369
prettyTyparInst, resL
13661370

@@ -1817,22 +1821,26 @@ module TastDefinitionPrinting =
18171821
| Some gRef, Some sRef -> isPublicAccess gRef.Accessibility && isPublicAccess sRef.Accessibility
18181822
| _ -> false
18191823

1820-
let (|MixedAccessibilityGetterAndSetter|_|) (pinfo: PropInfo) =
1824+
let (|DifferentGetterAndSetter|_|) (pinfo: PropInfo) =
18211825
if not (pinfo.HasGetter && pinfo.HasSetter) then
18221826
None
18231827
else
18241828
match pinfo.GetterMethod.ArbitraryValRef, pinfo.SetterMethod.ArbitraryValRef with
18251829
| Some getValRef, Some setValRef ->
1826-
if getValRef.Accessibility = setValRef.Accessibility then
1827-
None
1828-
else
1830+
if getValRef.Accessibility <> setValRef.Accessibility then
18291831
Some (getValRef, setValRef)
1832+
else
1833+
match getValRef.ValReprInfo with
1834+
| Some getValReprInfo when
1835+
// Getter has an index parameter
1836+
getValReprInfo.TotalArgCount > 1 -> Some (getValRef, setValRef)
1837+
| _ -> None
18301838
| _ -> None
18311839

18321840
match pinfo.ArbitraryValRef with
18331841
| Some vref ->
18341842
match pinfo with
1835-
| MixedAccessibilityGetterAndSetter(getValRef, setValRef) ->
1843+
| DifferentGetterAndSetter(getValRef, setValRef) ->
18361844
let getSuffix = if pinfo.IsIndexer then emptyL else wordL (tagKeyword "with") ^^ wordL (tagText "get")
18371845
[
18381846
PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader getValRef ^^ getSuffix

src/Compiler/Facilities/TextLayoutRender.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ module WordL =
5959
let keywordAbstract = wordL TaggedText.keywordAbstract
6060
let keywordOverride = wordL TaggedText.keywordOverride
6161
let keywordEnum = wordL TaggedText.keywordEnum
62+
let keywordInline = wordL TaggedText.keywordInline
6263

6364
module LeftL =
6465
let leftParen = leftL TaggedText.leftParen

src/Compiler/Facilities/TextLayoutRender.fsi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ module internal WordL =
9898
val keywordAbstract: Layout
9999
val keywordOverride: Layout
100100
val keywordEnum: Layout
101+
val keywordInline: Layout
101102

102103
module internal LeftL =
103104
val leftParen: Layout

src/Compiler/Utilities/sformat.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ module TaggedText =
252252
let rightBracketAngle = tagPunctuation ">]"
253253
let star = tagOperator "*"
254254
let keywordNew = tagKeyword "new"
255+
let keywordInline = tagKeyword "inline"
255256
#endif
256257

257258
[<AutoOpen>]

src/Compiler/Utilities/sformat.fsi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ module internal TaggedText =
210210
val internal rightBracketAngle: TaggedText
211211
val internal star: TaggedText
212212
val internal keywordNew: TaggedText
213+
val internal keywordInline: TaggedText
213214

214215
type internal IEnvironment =
215216
/// Return to the layout-generation
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Meh
2+
3+
type Foo() =
4+
member inline this.Item
5+
with get (i:int,j: char) : string = ""
6+
and set (i:int,j: char) (x:string) = printfn "%i %c" i j

tests/FSharp.Compiler.ComponentTests/Signatures/TypeTests.fs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,39 @@ type EConverter () =
184184
let valText = mfv.GetValSignatureText(canReadSymbolUse.DisplayContext, canReadSymbolUse.Range).Value
185185
Assert.Equal("override CanRead: bool", valText)
186186
| _ -> ()
187+
188+
[<Fact>]
189+
let ``Property with unit getter and regular setter`` () =
190+
FSharp """
191+
module Lib
192+
193+
type Foo =
194+
member x.Bar with get () = 5 and set v = ignore<int> v
195+
"""
196+
|> printSignatures
197+
|> should equal
198+
"""
199+
module Lib
200+
201+
type Foo =
202+
203+
member Bar: int with get, set"""
204+
205+
[<Fact>]
206+
let ``Property with indexed getter and regular setter`` () =
207+
FSharp """
208+
module Lib
209+
210+
type Foo =
211+
member x.Bar with get (a:int) = 5 and set (a:int) v = ignore<int> v
212+
"""
213+
|> printSignatures
214+
|> should equal
215+
"""
216+
module Lib
217+
218+
type Foo =
219+
220+
member Bar: a: int -> int with get
221+
222+
member Bar: a: int -> int with set"""

0 commit comments

Comments
 (0)