Skip to content

Commit b1dff0e

Browse files
committed
feat: add supports for generics constraints
[converter][web] #107
1 parent 8d40f9f commit b1dff0e

File tree

6 files changed

+75
-7
lines changed

6 files changed

+75
-7
lines changed

src/Glutinum.Converter/Printer.fs

+20-5
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ let private printAttributes
174174
printer.NewLine
175175
)
176176

177-
let private tryTransformTypeParametersToText
177+
let rec private tryTransformTypeParametersToText
178178
(typeParameters: FSharpTypeParameter list)
179179
=
180180
let printer = new Printer()
@@ -187,8 +187,23 @@ let private tryTransformTypeParametersToText
187187
if index <> 0 then
188188
printer.WriteInline(", ")
189189

190-
printer.WriteInline("'")
191-
printer.WriteInline(typeParameter.Name)
190+
printer.WriteInline($"'{typeParameter.Name}")
191+
)
192+
193+
typeParameters
194+
|> List.filter _.Constraint.IsSome
195+
|> List.iteri (fun index typeParameter ->
196+
match typeParameter.Constraint with
197+
| Some constraint_ ->
198+
if index = 0 then
199+
printer.WriteInline(" when ")
200+
else
201+
printer.WriteInline(" and ")
202+
203+
printer.WriteInline($"'{typeParameter.Name}")
204+
printer.WriteInline(" :> ")
205+
printer.WriteInline(printType constraint_)
206+
| None -> ()
192207
)
193208

194209
printer.WriteInline(">")
@@ -198,15 +213,15 @@ let private tryTransformTypeParametersToText
198213
else
199214
None
200215

201-
let private printTypeParameters
216+
and printTypeParameters
202217
(printer: Printer)
203218
(typeParameters: FSharpTypeParameter list)
204219
=
205220
match tryTransformTypeParametersToText typeParameters with
206221
| Some typeParameters -> printer.WriteInline(typeParameters)
207222
| None -> ()
208223

209-
let rec private printType (fsharpType: FSharpType) =
224+
and printType (fsharpType: FSharpType) =
210225
match fsharpType with
211226
| FSharpType.Object -> "obj"
212227
| FSharpType.Mapped info ->

src/Glutinum.Converter/Reader/TypeParameters.fs

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ module Glutinum.Converter.Reader.TypeParameters
33
open Glutinum.Converter.GlueAST
44
open Glutinum.Converter.Reader.Types
55
open TypeScript
6-
open Fable.Core.JsInterop
76

87
let readTypeParameters
98
(reader: ITypeScriptReader)
@@ -18,7 +17,9 @@ let readTypeParameters
1817
|> List.map (fun typeParameter ->
1918
{
2019
Name = typeParameter.name.getText ()
21-
Constraint = None
20+
Constraint =
21+
typeParameter.``constraint``
22+
|> Option.map reader.ReadTypeNode
2223
Default = None
2324
}
2425
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export class Foo<A> { }
2+
3+
type ReturnType<A, T extends Foo<A>, B extends Foo<A>> = [A, T, B]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module rec Glutinum
2+
3+
open Fable.Core
4+
open Fable.Core.JsInterop
5+
open System
6+
7+
[<AbstractClass>]
8+
[<Erase>]
9+
type Exports =
10+
[<Import("Foo", "REPLACE_ME_WITH_MODULE_NAME"); EmitConstructor>]
11+
static member Foo<'A> () : Foo<'A> = nativeOnly
12+
13+
[<AllowNullLiteral>]
14+
[<Interface>]
15+
type Foo<'A> =
16+
interface end
17+
18+
type ReturnType<'A, 'T, 'B when 'T :> Foo<'A> and 'B :> Foo<'A>> =
19+
'A * 'T * 'B
20+
21+
(***)
22+
#r "nuget: Fable.Core"
23+
(***)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export class Foo<A> { }
2+
3+
type ReturnType<A, T extends Foo<A>> = T
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module rec Glutinum
2+
3+
open Fable.Core
4+
open Fable.Core.JsInterop
5+
open System
6+
7+
[<AbstractClass>]
8+
[<Erase>]
9+
type Exports =
10+
[<Import("Foo", "REPLACE_ME_WITH_MODULE_NAME"); EmitConstructor>]
11+
static member Foo<'A> () : Foo<'A> = nativeOnly
12+
13+
[<AllowNullLiteral>]
14+
[<Interface>]
15+
type Foo<'A> =
16+
interface end
17+
18+
type ReturnType<'A, 'T when 'T :> Foo<'A>> =
19+
'T
20+
21+
(***)
22+
#r "nuget: Fable.Core"
23+
(***)

0 commit comments

Comments
 (0)