@@ -163,68 +163,74 @@ let private printAttributes
163
163
printer.NewLine
164
164
)
165
165
166
- let rec private tryTransformTypeParametersToText
166
+ let rec printTypeParametersDeclaration
167
+ ( printer : Printer )
167
168
( typeParameters : FSharpTypeParameter list )
168
169
=
169
- let printer = new Printer()
170
+ let innterPrinter = new Printer()
170
171
171
172
if not typeParameters.IsEmpty then
172
- printer .WriteInline( " <" )
173
+ innterPrinter .WriteInline( " <" )
173
174
174
175
typeParameters
175
176
|> List.iteri ( fun index typeParameter ->
176
177
if index <> 0 then
177
- printer .WriteInline( " , " )
178
+ innterPrinter .WriteInline( " , " )
178
179
179
- printer .WriteInline( $" '{typeParameter.Name}" )
180
+ innterPrinter .WriteInline( $" '{typeParameter.Name}" )
180
181
)
181
182
183
+ // Print the constraints only if we are in the initial declaration.
184
+ // We want to avoid situations like the following:
185
+ // static member User<'T when 'T :> A> () : User<'T when 'T :> A> = nativeOnly
186
+ // Which should be:
187
+ // static member User<'T when 'T :> A> () : User<'T> = nativeOnly
182
188
typeParameters
183
189
|> List.filter _. Constraint.IsSome
184
190
|> List.iteri ( fun index typeParameter ->
185
191
match typeParameter.Constraint with
186
192
| Some constraint_ ->
187
193
if index = 0 then
188
- printer .WriteInline( " when " )
194
+ innterPrinter .WriteInline( " when " )
189
195
else
190
- printer .WriteInline( " and " )
196
+ innterPrinter .WriteInline( " and " )
191
197
192
- printer .WriteInline( $" '{typeParameter.Name}" )
193
- printer .WriteInline( " :> " )
194
- printer .WriteInline( printType constraint_)
198
+ innterPrinter .WriteInline( $" '{typeParameter.Name}" )
199
+ innterPrinter .WriteInline( " :> " )
200
+ innterPrinter .WriteInline( printType constraint_)
195
201
| None -> ()
196
202
)
197
203
198
- printer.WriteInline( " >" )
199
-
200
- printer.ToStringWithoutTrailNewLine() |> Some
204
+ innterPrinter.WriteInline( " >" )
201
205
202
- else
203
- None
206
+ innterPrinter.ToStringWithoutTrailNewLine() |> printer.WriteInline
204
207
205
- and printTypeParameters
206
- ( printer : Printer )
208
+ and printTypeNameWithTypeParameters
209
+ ( name : string )
207
210
( typeParameters : FSharpTypeParameter list )
208
211
=
209
- match tryTransformTypeParametersToText typeParameters with
210
- | Some typeParameters -> printer.WriteInline( typeParameters)
211
- | None -> ()
212
+ let printer = new Printer()
212
213
213
- and printType ( fsharpType : FSharpType ) =
214
- let printTypeNameWithTypeParemeters
215
- ( name : string )
216
- ( typeParameters : FSharpTypeParameter list )
217
- =
218
- match tryTransformTypeParametersToText typeParameters with
219
- | Some typeParameters -> $" {name}{typeParameters}"
220
- | None -> name
214
+ if not typeParameters.IsEmpty then
215
+ printer.WriteInline( " <" )
221
216
217
+ typeParameters
218
+ |> List.iteri ( fun index typeParameter ->
219
+ if index <> 0 then
220
+ printer.WriteInline( " , " )
221
+
222
+ printer.WriteInline( $" '{typeParameter.Name}" )
223
+ )
224
+
225
+ printer.WriteInline( " >" )
226
+
227
+ $" {name}{printer.ToStringWithoutTrailNewLine()}"
228
+
229
+ and printType ( fsharpType : FSharpType ) =
222
230
match fsharpType with
223
231
| FSharpType.Object -> " obj"
224
232
| FSharpType.Mapped info ->
225
- match tryTransformTypeParametersToText info.TypeParameters with
226
- | Some typeParameters -> $" {info.Name}{typeParameters}"
227
- | None -> info.Name
233
+ printTypeNameWithTypeParameters info.Name info.TypeParameters
228
234
229
235
| FSharpType.SingleErasedCaseUnion info -> info.Name
230
236
@@ -247,7 +253,7 @@ and printType (fsharpType: FSharpType) =
247
253
$" {info.Name}<{cases}>{option}"
248
254
249
255
| FSharpType.ThisType thisTypeInfo ->
250
- printTypeNameWithTypeParemeters
256
+ printTypeNameWithTypeParameters
251
257
thisTypeInfo.Name
252
258
thisTypeInfo.TypeParameters
253
259
@@ -309,14 +315,14 @@ and printType (fsharpType: FSharpType) =
309
315
match apiInfo with
310
316
| FSharpJSApi.ReadonlyArray typ -> $" ReadonlyArray<{printType typ}>"
311
317
| FSharpType.Interface interfaceInfo ->
312
- printTypeNameWithTypeParemeters
318
+ printTypeNameWithTypeParameters
313
319
interfaceInfo.Name
314
320
interfaceInfo.TypeParameters
315
321
| FSharpType.Class classInfo -> classInfo.Name
316
322
| FSharpType.TypeAlias aliasInfo ->
317
- printTypeNameWithTypeParemeters aliasInfo.Name aliasInfo.TypeParameters
323
+ printTypeNameWithTypeParameters aliasInfo.Name aliasInfo.TypeParameters
318
324
| FSharpType.Delegate delegateInfo ->
319
- printTypeNameWithTypeParemeters
325
+ printTypeNameWithTypeParameters
320
326
delegateInfo.Name
321
327
delegateInfo.TypeParameters
322
328
| FSharpType.Module _
@@ -503,7 +509,7 @@ let private printInterface (printer: Printer) (interfaceInfo: FSharpInterface) =
503
509
printAttributes printer interfaceInfo.Attributes
504
510
505
511
printer.Write( $" type {interfaceInfo.Name}" )
506
- printTypeParameters printer interfaceInfo.TypeParameters
512
+ printTypeParametersDeclaration printer interfaceInfo.TypeParameters
507
513
printer.WriteInline( " =" )
508
514
printer.NewLine
509
515
@@ -532,7 +538,7 @@ let private printInterface (printer: Printer) (interfaceInfo: FSharpInterface) =
532
538
533
539
printer.WriteInline( $" member {methodInfo.Name}" )
534
540
535
- printTypeParameters printer methodInfo.TypeParameters
541
+ printTypeParametersDeclaration printer methodInfo.TypeParameters
536
542
537
543
if methodInfo.IsStatic then
538
544
printer.WriteInline( " " )
@@ -704,7 +710,9 @@ import {{ %s{interfaceInfo.OriginalName} }} from \"{Naming.MODULE_PLACEHOLDER}\"
704
710
705
711
printer.Write( $" static member inline {staticMemberInfo.Name} " )
706
712
707
- printTypeParameters printer staticMemberInfo.TypeParameters
713
+ printTypeParametersDeclaration
714
+ printer
715
+ staticMemberInfo.TypeParameters
708
716
709
717
if staticMemberInfo.Parameters.IsEmpty then
710
718
printer.WriteInline( " () : " )
@@ -811,7 +819,7 @@ let private printClass (printer: Printer) (classInfo: FSharpClass) =
811
819
printAttributes printer classInfo.Attributes
812
820
813
821
printer.Write( $" type {classInfo.Name}" )
814
- printTypeParameters printer classInfo.TypeParameters
822
+ printTypeParametersDeclaration printer classInfo.TypeParameters
815
823
printer.NewLine
816
824
printer.Indent
817
825
printPrimaryConstructor printer classInfo.PrimaryConstructor
@@ -897,7 +905,7 @@ let private printTypeAlias (printer: Printer) (aliasInfo: FSharpTypeAlias) =
897
905
printAttributes printer aliasInfo.Attributes
898
906
899
907
printer.Write( $" type {aliasInfo.Name}" )
900
- printTypeParameters printer aliasInfo.TypeParameters
908
+ printTypeParametersDeclaration printer aliasInfo.TypeParameters
901
909
printer.WriteInline( " =" )
902
910
903
911
printer.NewLine
@@ -908,7 +916,7 @@ let private printTypeAlias (printer: Printer) (aliasInfo: FSharpTypeAlias) =
908
916
909
917
let private printDelegate ( printer : Printer ) ( delegateInfo : FSharpDelegate ) =
910
918
printer.Write( $" type {delegateInfo.Name}" )
911
- printTypeParameters printer delegateInfo.TypeParameters
919
+ printTypeParametersDeclaration printer delegateInfo.TypeParameters
912
920
printer.WriteInline( " =" )
913
921
914
922
printer.NewLine
@@ -992,7 +1000,11 @@ let rec private print (printer: Printer) (fsharpTypes: FSharpType list) =
992
1000
( FSharpAttribute.Erase :: erasedCaseUnionInfo.Attributes)
993
1001
994
1002
printer.Write( $" type {erasedCaseUnionInfo.Name}" )
995
- printTypeParameters printer [ erasedCaseUnionInfo.TypeParameter ]
1003
+
1004
+ printTypeParametersDeclaration
1005
+ printer
1006
+ [ erasedCaseUnionInfo.TypeParameter ]
1007
+
996
1008
printer.WriteInline( " =" )
997
1009
998
1010
printer.NewLine
0 commit comments