Skip to content

Commit 0be8228

Browse files
authored
Merge PR #760 from webwarrior-ws/fix-755
SuggestUseAutoProperty: fix structs false positive.
2 parents c304232 + 1d71bab commit 0be8228

File tree

2 files changed

+41
-15
lines changed

2 files changed

+41
-15
lines changed

src/FSharpLint.Core/Rules/Conventions/SuggestUseAutoProperty.fs

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ and isImmutableSequentialExpression args expression =
4444
|| isImmutableValueExpression args expr2)
4545
| _ -> false
4646

47+
let private hasStructAttribute node =
48+
match node with
49+
| AstNode.TypeDefinition(SynTypeDefn(SynComponentInfo(attributes, _, _, _, _, _, _, _), _, _, _, _, _)) ->
50+
attributes
51+
|> extractAttributes
52+
|> List.exists
53+
(fun attribute ->
54+
match List.tryLast attribute.TypeName.LongIdent with
55+
| Some(ident) -> ident.idText = "Struct" || ident.idText = "StructAttribute"
56+
| None -> false)
57+
| _ -> false
58+
4759
let private runner (args: AstNodeRuleParams) =
4860
match args.AstNode with
4961
| MemberDefinition
@@ -73,21 +85,25 @@ let private runner (args: AstNodeRuleParams) =
7385
| _, SynArgPats.Pats pats when pats.Length > 0 -> // non-property member
7486
Array.empty
7587
| expression, _ when isImmutableValueExpression args expression ->
76-
let suggestedFix =
77-
lazy
78-
(match memberIdentifier.LongIdent with
79-
| [ _; memberName ] ->
80-
Some
81-
{ FromText = args.FileContent
82-
FromRange = memberIdentifier.Range
83-
ToText = $"val {memberName.idText}" }
84-
| _ -> None)
85-
86-
{ Range = memberRange
87-
Message = Resources.GetString "RulesSuggestUseAutoProperty"
88-
SuggestedFix = Some suggestedFix
89-
TypeChecks = List.Empty }
90-
|> Array.singleton
88+
match args.GetParents args.NodeIndex with
89+
| parentNode :: _ when hasStructAttribute parentNode ->
90+
Array.empty
91+
| _ ->
92+
let suggestedFix =
93+
lazy
94+
(match memberIdentifier.LongIdent with
95+
| [ _; memberName ] ->
96+
Some
97+
{ FromText = args.FileContent
98+
FromRange = memberIdentifier.Range
99+
ToText = $"val {memberName.idText}" }
100+
| _ -> None)
101+
102+
{ Range = memberRange
103+
Message = Resources.GetString "RulesSuggestUseAutoProperty"
104+
SuggestedFix = Some suggestedFix
105+
TypeChecks = List.Empty }
106+
|> Array.singleton
91107
| _ -> Array.empty
92108
| _ -> Array.empty
93109

tests/FSharpLint.Core.Tests/Rules/Conventions/SuggestUseAutoProperty.fs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,13 @@ type Foo(content: int) =
106106

107107
this.Parse source
108108
Assert.AreEqual(expected, this.ApplyQuickFix source)
109+
110+
[<Test>]
111+
member this.``Should not suggest using auto-property for types with [<Struct>] attribute`` () =
112+
this.Parse """
113+
[<Struct>]
114+
type Foo(content: int) =
115+
member self.Content = content
116+
"""
117+
118+
Assert.IsTrue this.NoErrorsExist

0 commit comments

Comments
 (0)