diff --git a/src/FsAutoComplete/CodeFixes/AddPrivateAccessModifier.fs b/src/FsAutoComplete/CodeFixes/AddPrivateAccessModifier.fs index 08a75cfdb..9724d1993 100644 --- a/src/FsAutoComplete/CodeFixes/AddPrivateAccessModifier.fs +++ b/src/FsAutoComplete/CodeFixes/AddPrivateAccessModifier.fs @@ -111,7 +111,6 @@ let private getRangesAndPlacement input pos = members |> List.tryPick (fun m -> match m with - // TODO: Need to handle setting get or set accessibility separately | SynMemberDefn.AutoProperty( accessibility = SynValSigAccess.GetSet(None, None, None); ident = ident; trivia = trivia) as a when rangeContainsPos ident.idRange pos @@ -124,6 +123,25 @@ let private getRangesAndPlacement input pos = match tryGetDeclContainingRange path pos with | Some r -> Some(editRange, r, After) | _ -> None + | SynMemberDefn.AutoProperty( + accessibility = SynValSigAccess.GetSet(None, getAcc, setAcc) + trivia = { GetSetKeywords = Some getSetTrivia }) as a when rangeContainsPos getSetTrivia.Range pos -> + + let editRange = + match (getAcc, setAcc, getSetTrivia) with + | (None, _, GetSetKeywords.Get getRange) + | (None, _, GetSetKeywords.GetSet(getRange, _)) when rangeContainsPos getRange pos -> + Some getRange.StartRange + | (_, None, GetSetKeywords.Set setRange) + | (_, None, GetSetKeywords.GetSet(_, setRange)) when rangeContainsPos setRange pos -> + Some setRange.StartRange + | _ -> None + + let path = SyntaxNode.SynMemberDefn a :: path + + match (editRange, tryGetDeclContainingRange path pos) with + | (Some editRange, Some r) -> Some(editRange, r, Before) + | _ -> None | _ -> None) // Type Abbreviation | SynTypeDefn( diff --git a/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs b/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs index 2b9300be9..c7d4779a0 100644 --- a/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs +++ b/test/FsAutoComplete.Tests.Lsp/CodeFixTests/Tests.fs @@ -1066,6 +1066,54 @@ let private addPrivateAccessModifierTests state = Diagnostics.acceptAll selectCodeFix + testCaseAsync "add private works for autoproperty getter" + <| CodeFix.check + server + """ + type MyClass() = + member val Name = "" with $0get, set + """ + Diagnostics.acceptAll + selectCodeFix + """ + type MyClass() = + member val Name = "" with private get, set + """ + + testCaseAsync "add private works for autoproperty setter" + <| CodeFix.check + server + """ + type MyClass() = + member val Name = "" with get, s$0et + """ + Diagnostics.acceptAll + selectCodeFix + """ + type MyClass() = + member val Name = "" with get, private set + """ + + testCaseAsync "add private is not offered for autoproperty getter if member access is already there" + <| CodeFix.checkNotApplicable + server + """ + type MyClass() = + member val private Name = "" with g$0et, set + """ + Diagnostics.acceptAll + selectCodeFix + + testCaseAsync "add private is not offered for autoproperty setter if member access is already there" + <| CodeFix.checkNotApplicable + server + """ + type MyClass() = + member val private Name = "" with get, set$0 + """ + Diagnostics.acceptAll + selectCodeFix + testCaseAsync "add private is not offered for DU type definition" // ref finding might not show us type inferred usages <| CodeFix.checkNotApplicable server