@@ -79,7 +79,7 @@ type FSharpGenerateSignatureBuilder() =
79
79
if not attributeLists.IsEmpty then
80
80
let nodesToAdd = [
81
81
for attributeList in attributeLists do
82
- Whitespace( indentation) :> ITreeNode
82
+ Whitespace( indentation) :> ITreeNode // Todo: refactor to not add whitespace before anchor
83
83
attributeList :> ITreeNode
84
84
let last =
85
85
attributeList.NextTokens()
@@ -95,6 +95,22 @@ type FSharpGenerateSignatureBuilder() =
95
95
addNodesBefore anchor nodesToAdd |> ignore
96
96
else ()
97
97
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
+
98
114
let rec createModuleMemberSig ( indentation : int ) ( moduleDecl : IModuleLikeDeclaration ) ( moduleMember : IModuleMember ) : IFSharpTreeNode =
99
115
match moduleMember with
100
116
| :? ITypeDeclarationGroup as typeGroup ->
@@ -132,7 +148,8 @@ type FSharpGenerateSignatureBuilder() =
132
148
let indentForMembers = sigTypeDecl.Indent + moduleDecl.GetIndentSize()
133
149
let sigMembers =
134
150
typeDecl.TypeMembers
135
- |> Seq.choose ( createMemberDeclaration indentForMembers >> Option.ofObj)
151
+ |> Seq.map( createMemberDeclaration indentForMembers)
152
+ |> Seq.filter( Seq.isEmpty >> not )
136
153
137
154
addXmlDocBlock sigTypeDecl.Indent sigTypeDecl typeDecl.XmlDocBlock
138
155
addAttributes sigTypeDecl.Indent typeDecl.AttributeLists sigTypeDecl.TypeKeyword
@@ -150,19 +167,19 @@ type FSharpGenerateSignatureBuilder() =
150
167
NewLine( lineEnding)
151
168
Whitespace( indentation + moduleDecl.GetIndentSize())
152
169
repr
153
- for sigMember in sigMembers do
170
+ for sigMemberNodes in sigMembers do
154
171
NewLine( lineEnding)
155
- sigMember
172
+ yield ! sigMemberNodes
156
173
] |> ignore
157
174
| :? IStructRepresentation as repr ->
158
175
ModificationUtil.DeleteChildRange( sigTypeDecl.EqualsToken.NextSibling, sigTypeDecl.LastChild)
159
176
addNodesAfter sigTypeDecl.EqualsToken [
160
177
NewLine( lineEnding)
161
178
Whitespace( indentation + moduleDecl.GetIndentSize())
162
179
repr
163
- for sigMember in sigMembers do
180
+ for sigMemberNodes in sigMembers do
164
181
NewLine( lineEnding)
165
- sigMember
182
+ yield ! sigMemberNodes
166
183
] |> ignore
167
184
| :? IDelegateRepresentation as repr ->
168
185
ModificationUtil.DeleteChildRange( sigTypeDecl.EqualsToken.NextSibling, sigTypeDecl.LastChild)
@@ -177,9 +194,10 @@ type FSharpGenerateSignatureBuilder() =
177
194
Whitespace( indentation + moduleDecl.GetIndentSize())
178
195
if isNotNull typeDecl.PrimaryConstructorDeclaration then
179
196
yield ! createPrimaryConstructorSignature ( getName typeDecl) typeDecl.PrimaryConstructorDeclaration
180
- for sigMember in sigMembers do
197
+
198
+ for sigMemberNodes in sigMembers do
181
199
NewLine( lineEnding)
182
- sigMember
200
+ yield ! sigMemberNodes
183
201
] |> ignore
184
202
| repr ->
185
203
// This pattern match should match the types we filtered out earlier for supportedTypeDeclarations
@@ -240,14 +258,15 @@ type FSharpGenerateSignatureBuilder() =
240
258
let indentForMembers = indentation + moduleDecl.GetIndentSize()
241
259
let sigMembers =
242
260
exceptionDeclaration.TypeMembers
243
- |> Seq.choose ( createMemberDeclaration indentForMembers >> Option.ofObj)
261
+ |> Seq.map( createMemberDeclaration indentForMembers)
262
+ |> Seq.filter( Seq.isEmpty >> not )
244
263
245
264
ModificationUtil.DeleteChildRange( sigExceptionDeclaration.WithKeyword.NextSibling, sigExceptionDeclaration.LastChild)
246
265
247
266
addNodesAfter sigExceptionDeclaration.WithKeyword [
248
- for sigMember in sigMembers do
267
+ for sigMemberNodes in sigMembers do
249
268
NewLine( lineEnding)
250
- sigMember
269
+ yield ! sigMemberNodes
251
270
] |> ignore
252
271
253
272
addAttributes sigExceptionDeclaration.Indent sigExceptionDeclaration.AttributeLists sigExceptionDeclaration
@@ -278,7 +297,7 @@ type FSharpGenerateSignatureBuilder() =
278
297
279
298
moduleSig
280
299
281
- and createMemberDeclaration ( indentation : int ) ( memberDecl : IFSharpTypeMemberDeclaration ) : IFSharpTypeMemberDeclaration =
300
+ and createMemberDeclaration ( indentation : int ) ( memberDecl : IFSharpTypeMemberDeclaration ) : seq < ITreeNode > =
282
301
match memberDecl with
283
302
| :? IMemberDeclaration as memberDecl ->
284
303
let sourceString =
@@ -319,12 +338,22 @@ type FSharpGenerateSignatureBuilder() =
319
338
320
339
let typeMember = factory.CreateTypeMember( sourceString)
321
340
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
328
357
329
358
// Todo refactor to reuse existing code
330
359
and createPrimaryConstructorSignature ( typeName : string ) ( primaryConstructorDeclaration : IPrimaryConstructorDeclaration ) : ITreeNode seq =
0 commit comments