Skip to content

Commit 1defbf4

Browse files
committed
refactor to not add whitespace before node to indent
1 parent 2bf881c commit 1defbf4

File tree

1 file changed

+47
-18
lines changed

1 file changed

+47
-18
lines changed

ReSharper.FSharp/src/FSharp.Psi.Services/src/Generate/GenerateSignatureProvider.fs

+47-18
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ type FSharpGenerateSignatureBuilder() =
7979
if not attributeLists.IsEmpty then
8080
let nodesToAdd = [
8181
for attributeList in attributeLists do
82-
Whitespace(indentation) :> ITreeNode
82+
Whitespace(indentation) :> ITreeNode // Todo: refactor to not add whitespace before anchor
8383
attributeList :> ITreeNode
8484
let last =
8585
attributeList.NextTokens()
@@ -95,6 +95,22 @@ type FSharpGenerateSignatureBuilder() =
9595
addNodesBefore anchor nodesToAdd |> ignore
9696
else ()
9797

98+
let genAttributes (attributeLists: TreeNodeCollection<IAttributeList>) =
99+
seq {
100+
for attributeList in attributeLists do
101+
attributeList :> ITreeNode
102+
let last =
103+
attributeList.NextTokens()
104+
|> Seq.takeWhile (fun x -> isNewLine x || isWhitespaceOrComment x)
105+
|> Seq.tryLast
106+
match last with
107+
| Some l ->
108+
let treeRange = TreeRange(getNextSibling attributeList, l)
109+
if treeRange.ToTreeNodeCollection().Any(isNewLine) then
110+
NewLine(lineEnding) :> ITreeNode else Whitespace(1) :> ITreeNode
111+
| _ -> ()
112+
}
113+
98114
let rec createModuleMemberSig (indentation: int) (moduleDecl: IModuleLikeDeclaration) (moduleMember: IModuleMember) : IFSharpTreeNode =
99115
match moduleMember with
100116
| :? ITypeDeclarationGroup as typeGroup ->
@@ -132,7 +148,8 @@ type FSharpGenerateSignatureBuilder() =
132148
let indentForMembers = sigTypeDecl.Indent + moduleDecl.GetIndentSize()
133149
let sigMembers =
134150
typeDecl.TypeMembers
135-
|> Seq.choose (createMemberDeclaration indentForMembers >> Option.ofObj)
151+
|> Seq.map(createMemberDeclaration indentForMembers)
152+
|> Seq.filter(Seq.isEmpty >> not)
136153

137154
addXmlDocBlock sigTypeDecl.Indent sigTypeDecl typeDecl.XmlDocBlock
138155
addAttributes sigTypeDecl.Indent typeDecl.AttributeLists sigTypeDecl.TypeKeyword
@@ -150,19 +167,19 @@ type FSharpGenerateSignatureBuilder() =
150167
NewLine(lineEnding)
151168
Whitespace(indentation + moduleDecl.GetIndentSize())
152169
repr
153-
for sigMember in sigMembers do
170+
for sigMemberNodes in sigMembers do
154171
NewLine(lineEnding)
155-
sigMember
172+
yield! sigMemberNodes
156173
] |> ignore
157174
| :? IStructRepresentation as repr ->
158175
ModificationUtil.DeleteChildRange(sigTypeDecl.EqualsToken.NextSibling, sigTypeDecl.LastChild)
159176
addNodesAfter sigTypeDecl.EqualsToken [
160177
NewLine(lineEnding)
161178
Whitespace(indentation + moduleDecl.GetIndentSize())
162179
repr
163-
for sigMember in sigMembers do
180+
for sigMemberNodes in sigMembers do
164181
NewLine(lineEnding)
165-
sigMember
182+
yield! sigMemberNodes
166183
] |> ignore
167184
| :? IDelegateRepresentation as repr ->
168185
ModificationUtil.DeleteChildRange(sigTypeDecl.EqualsToken.NextSibling, sigTypeDecl.LastChild)
@@ -177,9 +194,10 @@ type FSharpGenerateSignatureBuilder() =
177194
Whitespace(indentation + moduleDecl.GetIndentSize())
178195
if isNotNull typeDecl.PrimaryConstructorDeclaration then
179196
yield! createPrimaryConstructorSignature (getName typeDecl) typeDecl.PrimaryConstructorDeclaration
180-
for sigMember in sigMembers do
197+
198+
for sigMemberNodes in sigMembers do
181199
NewLine(lineEnding)
182-
sigMember
200+
yield! sigMemberNodes
183201
] |> ignore
184202
| repr ->
185203
// This pattern match should match the types we filtered out earlier for supportedTypeDeclarations
@@ -240,14 +258,15 @@ type FSharpGenerateSignatureBuilder() =
240258
let indentForMembers = indentation + moduleDecl.GetIndentSize()
241259
let sigMembers =
242260
exceptionDeclaration.TypeMembers
243-
|> Seq.choose (createMemberDeclaration indentForMembers >> Option.ofObj)
261+
|> Seq.map(createMemberDeclaration indentForMembers)
262+
|> Seq.filter(Seq.isEmpty >> not)
244263

245264
ModificationUtil.DeleteChildRange(sigExceptionDeclaration.WithKeyword.NextSibling, sigExceptionDeclaration.LastChild)
246265

247266
addNodesAfter sigExceptionDeclaration.WithKeyword [
248-
for sigMember in sigMembers do
267+
for sigMemberNodes in sigMembers do
249268
NewLine(lineEnding)
250-
sigMember
269+
yield! sigMemberNodes
251270
] |> ignore
252271

253272
addAttributes sigExceptionDeclaration.Indent sigExceptionDeclaration.AttributeLists sigExceptionDeclaration
@@ -278,7 +297,7 @@ type FSharpGenerateSignatureBuilder() =
278297

279298
moduleSig
280299

281-
and createMemberDeclaration (indentation: int) (memberDecl: IFSharpTypeMemberDeclaration) : IFSharpTypeMemberDeclaration =
300+
and createMemberDeclaration (indentation: int) (memberDecl: IFSharpTypeMemberDeclaration) : seq<ITreeNode> =
282301
match memberDecl with
283302
| :? IMemberDeclaration as memberDecl ->
284303
let sourceString =
@@ -319,12 +338,22 @@ type FSharpGenerateSignatureBuilder() =
319338

320339
let typeMember = factory.CreateTypeMember(sourceString)
321340

322-
// Todo find better indentation approach
323-
addNodeBefore typeMember.FirstChild (Whitespace(indentation))
324-
addAttributes indentation memberDecl.AttributeLists typeMember.FirstChild
325-
addXmlDocBlock indentation typeMember.FirstChild memberDecl.XmlDocBlock
326-
typeMember
327-
| _ -> null
341+
let attributes = genAttributes memberDecl.AttributeLists
342+
seq {
343+
if isNotNull memberDecl.XmlDocBlock then
344+
Whitespace(indentation)
345+
memberDecl.XmlDocBlock
346+
NewLine(lineEnding)
347+
for a in attributes do
348+
match a with
349+
| :? IAttributeList -> Whitespace(indentation)
350+
| _ -> ()
351+
a
352+
if Seq.isEmpty attributes || attributes |> Seq.last |> isNewLine then
353+
Whitespace(indentation)
354+
typeMember
355+
}
356+
| _ -> Seq.empty
328357

329358
// Todo refactor to reuse existing code
330359
and createPrimaryConstructorSignature (typeName: string) (primaryConstructorDeclaration: IPrimaryConstructorDeclaration) : ITreeNode seq =

0 commit comments

Comments
 (0)