Skip to content

Commit

Permalink
Don't consider attribute above field a proper candidate for trivia af…
Browse files Browse the repository at this point in the history
…ter. Fixes #910 (#912)
  • Loading branch information
nojaf committed Jun 12, 2020
1 parent 5453abd commit 09c842e
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 3 deletions.
23 changes: 22 additions & 1 deletion src/Fantomas.Tests/TypeDeclarationTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1306,4 +1306,25 @@ type VersionMismatchDuringDeserializationException(message: string, innerExcepti
type VersionMismatchDuringDeserializationException(message : string,
innerException : System.Exception) =
inherit System.Exception(message, innerException)
"""
"""

[<Test>]
let ``type record declaration with attributes, 910`` () =
formatSourceString false """type Commenter =
{ [<JsonProperty("display_name")>]
DisplayName: string }
type Message =
{ [<JsonProperty("body")>]
Body: string }
""" config
|> prepend newline
|> should equal """
type Commenter =
{ [<JsonProperty("display_name")>]
DisplayName: string }
type Message =
{ [<JsonProperty("body")>]
Body: string }
"""
10 changes: 8 additions & 2 deletions src/Fantomas/Trivia.fs
Original file line number Diff line number Diff line change
Expand Up @@ -204,19 +204,25 @@ let private triviaBetweenAttributeAndParentBinding (triviaNodes: TriviaNodeAssig
| MainNode("SynModuleSigDecl.NestedModule")
| MainNode("ValSpfn")
| MainNode("SynMemberDefn.Member")
| MainNode("SynMemberDefn.LetBindings") -> true
| MainNode("SynMemberDefn.LetBindings")
| MainNode("Field") -> true
| _ -> false
)
|> List.pairwise

filteredNodes |> List.tryFind (function
| f, a when (f.Type = MainNode("Field")
&& a.Type = MainNode("SynAttributeList")
&& f.Range.StartLine = a.Range.StartLine
&& a.Range.StartLine + 1 = f.Range.EndLine) -> true
| a, p when (a.Type = MainNode("SynAttributeList") && a.Range.StartLine < line && a.Range.StartLine = a.Range.EndLine) ->
match p.Type with
| MainNode("SynModuleDecl.Let") when (p.Range.StartLine > line) -> true
| MainNode("SynAttributeList") when (p.Range.StartLine > line) -> true
| MainNode("SynModuleDecl.Types") when (p.Range.StartLine > line) -> true
| _ -> false
| _ -> false)
|> Option.map fst
|> Option.bind (fun (a,_) -> if a.Type = MainNode("SynAttributeList") then Some a else None)

let private findASTNodeOfTypeThatContains (nodes: TriviaNodeAssigner list) typeName range =
nodes
Expand Down

0 comments on commit 09c842e

Please sign in to comment.