Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions src/Compiler/Checking/NicePrint.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1255,7 +1255,7 @@ module PrintTastMemberOrVals =

let mkInlineL denv (v: Val) nameL =
if v.MustInline && not denv.suppressInlineKeyword then
wordL (tagKeyword "inline") ++ nameL
WordL.keywordInline ++ nameL
else
nameL

Expand Down Expand Up @@ -1326,6 +1326,7 @@ module PrintTastMemberOrVals =
// use error recovery because intellisense on an incomplete file will show this
errorR(Error(FSComp.SR.tastInvalidFormForPropertyGetter(), vref.Id.idRange))
let nameL = layoutMemberName denv vref [] argInfos tagProperty vref.DisplayNameCoreMangled
let nameL = if short then nameL else mkInlineL denv vref.Deref nameL
let resL =
if short then nameL --- (WordL.keywordWith ^^ WordL.keywordGet)
else stat --- nameL --- (WordL.keywordWith ^^ WordL.keywordGet)
Expand All @@ -1342,6 +1343,7 @@ module PrintTastMemberOrVals =
else tauL --- (WordL.keywordWith ^^ WordL.keywordGet)
else
let nameL = layoutMemberName denv vref niceMethodTypars argInfos tagProperty vref.DisplayNameCoreMangled
let nameL = if short then nameL else mkInlineL denv vref.Deref nameL
stat --- ((nameL |> addColonL) ^^ (if isNil argInfos then tauL else tauL --- (WordL.keywordWith ^^ WordL.keywordGet)))
prettyTyparInst, resL

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

Expand Down Expand Up @@ -1817,22 +1821,26 @@ module TastDefinitionPrinting =
| Some gRef, Some sRef -> isPublicAccess gRef.Accessibility && isPublicAccess sRef.Accessibility
| _ -> false

let (|MixedAccessibilityGetterAndSetter|_|) (pinfo: PropInfo) =
let (|DifferentGetterAndSetter|_|) (pinfo: PropInfo) =
if not (pinfo.HasGetter && pinfo.HasSetter) then
None
else
match pinfo.GetterMethod.ArbitraryValRef, pinfo.SetterMethod.ArbitraryValRef with
| Some getValRef, Some setValRef ->
if getValRef.Accessibility = setValRef.Accessibility then
None
else
if getValRef.Accessibility <> setValRef.Accessibility then
Some (getValRef, setValRef)
else
match getValRef.ValReprInfo with
| Some getValReprInfo when
// Getter has an index parameter
getValReprInfo.TotalArgCount > 1 -> Some (getValRef, setValRef)
| _ -> None
| _ -> None

match pinfo.ArbitraryValRef with
| Some vref ->
match pinfo with
| MixedAccessibilityGetterAndSetter(getValRef, setValRef) ->
| DifferentGetterAndSetter(getValRef, setValRef) ->
let getSuffix = if pinfo.IsIndexer then emptyL else wordL (tagKeyword "with") ^^ wordL (tagText "get")
[
PrintTastMemberOrVals.prettyLayoutOfValOrMemberNoInst denv infoReader getValRef ^^ getSuffix
Expand Down
1 change: 1 addition & 0 deletions src/Compiler/Facilities/TextLayoutRender.fs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ module WordL =
let keywordAbstract = wordL TaggedText.keywordAbstract
let keywordOverride = wordL TaggedText.keywordOverride
let keywordEnum = wordL TaggedText.keywordEnum
let keywordInline = wordL TaggedText.keywordInline

module LeftL =
let leftParen = leftL TaggedText.leftParen
Expand Down
1 change: 1 addition & 0 deletions src/Compiler/Facilities/TextLayoutRender.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ module internal WordL =
val keywordAbstract: Layout
val keywordOverride: Layout
val keywordEnum: Layout
val keywordInline: Layout

module internal LeftL =
val leftParen: Layout
Expand Down
1 change: 1 addition & 0 deletions src/Compiler/Utilities/sformat.fs
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ module TaggedText =
let rightBracketAngle = tagPunctuation ">]"
let star = tagOperator "*"
let keywordNew = tagKeyword "new"
let keywordInline = tagKeyword "inline"
#endif

[<AutoOpen>]
Expand Down
1 change: 1 addition & 0 deletions src/Compiler/Utilities/sformat.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ module internal TaggedText =
val internal rightBracketAngle: TaggedText
val internal star: TaggedText
val internal keywordNew: TaggedText
val internal keywordInline: TaggedText

type internal IEnvironment =
/// Return to the layout-generation
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module Meh

type Foo() =
member inline this.Item
with get (i:int,j: char) : string = ""
and set (i:int,j: char) (x:string) = printfn "%i %c" i j
36 changes: 36 additions & 0 deletions tests/FSharp.Compiler.ComponentTests/Signatures/TypeTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -184,3 +184,39 @@ type EConverter () =
let valText = mfv.GetValSignatureText(canReadSymbolUse.DisplayContext, canReadSymbolUse.Range).Value
Assert.Equal("override CanRead: bool", valText)
| _ -> ()

[<Fact>]
let ``Property with unit getter and regular setter`` () =
FSharp """
module Lib

type Foo =
member x.Bar with get () = 5 and set v = ignore<int> v
"""
|> printSignatures
|> should equal
"""
module Lib

type Foo =

member Bar: int with get, set"""

[<Fact>]
let ``Property with indexed getter and regular setter`` () =
FSharp """
module Lib

type Foo =
member x.Bar with get (a:int) = 5 and set (a:int) v = ignore<int> v
"""
|> printSignatures
|> should equal
"""
module Lib

type Foo =

member Bar: a: int -> int with get

member Bar: a: int -> int with set"""