From 3ae5023cd7a5cf923b0f3fdf9c98ca3cfcffebab Mon Sep 17 00:00:00 2001 From: Nat Elkins Date: Wed, 20 Nov 2024 16:30:46 -0500 Subject: [PATCH 1/4] feat: Fix erroneous constraint in return type [converter] --- .../class/generics/oneWithConstraint.d.ts | 3 ++ .../class/generics/oneWithConstraint.fsx | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 tests/specs/references/class/generics/oneWithConstraint.d.ts create mode 100644 tests/specs/references/class/generics/oneWithConstraint.fsx diff --git a/tests/specs/references/class/generics/oneWithConstraint.d.ts b/tests/specs/references/class/generics/oneWithConstraint.d.ts new file mode 100644 index 0000000..e4cb54e --- /dev/null +++ b/tests/specs/references/class/generics/oneWithConstraint.d.ts @@ -0,0 +1,3 @@ +class A {} + +class User {} diff --git a/tests/specs/references/class/generics/oneWithConstraint.fsx b/tests/specs/references/class/generics/oneWithConstraint.fsx new file mode 100644 index 0000000..0c0207b --- /dev/null +++ b/tests/specs/references/class/generics/oneWithConstraint.fsx @@ -0,0 +1,28 @@ +module rec Glutinum + +open Fable.Core +open Fable.Core.JsInterop +open System + +[] +[] +type Exports = + [] + static member A () : A = nativeOnly + [] + static member User<'T when 'T :> A> () : User<'T> = nativeOnly + +[] +[] +type A = + interface end + +[] +[] +type User<'T when 'T :> A> = + interface end + +(***) +#r "nuget: Fable.Core" +#r "nuget: Glutinum.Types" +(***) From 1effa140b1eb1e26decaff036c8b08046cb9340a Mon Sep 17 00:00:00 2001 From: Nat Elkins Date: Wed, 20 Nov 2024 17:05:28 -0500 Subject: [PATCH 2/4] feat: Fix [converter] --- src/Glutinum.Converter/Printer.fs | 54 ++++++++++++++++++------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/Glutinum.Converter/Printer.fs b/src/Glutinum.Converter/Printer.fs index b43febe..02b2817 100644 --- a/src/Glutinum.Converter/Printer.fs +++ b/src/Glutinum.Converter/Printer.fs @@ -164,6 +164,7 @@ let private printAttributes ) let rec private tryTransformTypeParametersToText + (isDeclaration: bool) (typeParameters: FSharpTypeParameter list) = let printer = new Printer() @@ -179,21 +180,22 @@ let rec private tryTransformTypeParametersToText printer.WriteInline($"'{typeParameter.Name}") ) - typeParameters - |> List.filter _.Constraint.IsSome - |> List.iteri (fun index typeParameter -> - match typeParameter.Constraint with - | Some constraint_ -> - if index = 0 then - printer.WriteInline(" when ") - else - printer.WriteInline(" and ") + if isDeclaration then + typeParameters + |> List.filter _.Constraint.IsSome + |> List.iteri (fun index typeParameter -> + match typeParameter.Constraint with + | Some constraint_ -> + if index = 0 then + printer.WriteInline(" when ") + else + printer.WriteInline(" and ") - printer.WriteInline($"'{typeParameter.Name}") - printer.WriteInline(" :> ") - printer.WriteInline(printType constraint_) - | None -> () - ) + printer.WriteInline($"'{typeParameter.Name}") + printer.WriteInline(" :> ") + printer.WriteInline(printType constraint_) + | None -> () + ) printer.WriteInline(">") @@ -206,23 +208,31 @@ and printTypeParameters (printer: Printer) (typeParameters: FSharpTypeParameter list) = - match tryTransformTypeParametersToText typeParameters with + let isDeclaration = true + + match tryTransformTypeParametersToText isDeclaration typeParameters with | Some typeParameters -> printer.WriteInline(typeParameters) | None -> () and printType (fsharpType: FSharpType) = - let printTypeNameWithTypeParemeters + let printTypeNameWithTypeParameters (name: string) (typeParameters: FSharpTypeParameter list) = - match tryTransformTypeParametersToText typeParameters with + let isDeclaration = false + + match tryTransformTypeParametersToText isDeclaration typeParameters with | Some typeParameters -> $"{name}{typeParameters}" | None -> name match fsharpType with | FSharpType.Object -> "obj" | FSharpType.Mapped info -> - match tryTransformTypeParametersToText info.TypeParameters with + let isDeclaration = false + + match + tryTransformTypeParametersToText isDeclaration info.TypeParameters + with | Some typeParameters -> $"{info.Name}{typeParameters}" | None -> info.Name @@ -247,7 +257,7 @@ and printType (fsharpType: FSharpType) = $"{info.Name}<{cases}>{option}" | FSharpType.ThisType thisTypeInfo -> - printTypeNameWithTypeParemeters + printTypeNameWithTypeParameters thisTypeInfo.Name thisTypeInfo.TypeParameters @@ -309,14 +319,14 @@ and printType (fsharpType: FSharpType) = match apiInfo with | FSharpJSApi.ReadonlyArray typ -> $"ReadonlyArray<{printType typ}>" | FSharpType.Interface interfaceInfo -> - printTypeNameWithTypeParemeters + printTypeNameWithTypeParameters interfaceInfo.Name interfaceInfo.TypeParameters | FSharpType.Class classInfo -> classInfo.Name | FSharpType.TypeAlias aliasInfo -> - printTypeNameWithTypeParemeters aliasInfo.Name aliasInfo.TypeParameters + printTypeNameWithTypeParameters aliasInfo.Name aliasInfo.TypeParameters | FSharpType.Delegate delegateInfo -> - printTypeNameWithTypeParemeters + printTypeNameWithTypeParameters delegateInfo.Name delegateInfo.TypeParameters | FSharpType.Module _ From a87ba252735447a50b36379e758e685b694b9094 Mon Sep 17 00:00:00 2001 From: Nat Elkins Date: Wed, 20 Nov 2024 17:10:58 -0500 Subject: [PATCH 3/4] feat: Adding comment [converter] --- src/Glutinum.Converter/Printer.fs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Glutinum.Converter/Printer.fs b/src/Glutinum.Converter/Printer.fs index 02b2817..6c7349b 100644 --- a/src/Glutinum.Converter/Printer.fs +++ b/src/Glutinum.Converter/Printer.fs @@ -180,6 +180,11 @@ let rec private tryTransformTypeParametersToText printer.WriteInline($"'{typeParameter.Name}") ) + // Print the constraints only if we are in the initial declaration. + // We want to avoid situations like the following: + // static member User<'T when 'T :> A> () : User<'T when 'T :> A> = nativeOnly + // Which should be: + // static member User<'T when 'T :> A> () : User<'T> = nativeOnly if isDeclaration then typeParameters |> List.filter _.Constraint.IsSome From c1f320038b61321f71466daec4652e2b8374b2f4 Mon Sep 17 00:00:00 2001 From: Maxime Mangel Date: Thu, 28 Nov 2024 16:02:57 +0100 Subject: [PATCH 4/4] refactor: to use different 2 functions instead of a boolean to control the output of type with type paremeters [converter] --- src/Glutinum.Converter/Printer.fs | 107 +++++++++++++++--------------- 1 file changed, 52 insertions(+), 55 deletions(-) diff --git a/src/Glutinum.Converter/Printer.fs b/src/Glutinum.Converter/Printer.fs index 6c7349b..6e45cf2 100644 --- a/src/Glutinum.Converter/Printer.fs +++ b/src/Glutinum.Converter/Printer.fs @@ -163,21 +163,21 @@ let private printAttributes printer.NewLine ) -let rec private tryTransformTypeParametersToText - (isDeclaration: bool) +let rec printTypeParametersDeclaration + (printer: Printer) (typeParameters: FSharpTypeParameter list) = - let printer = new Printer() + let innterPrinter = new Printer() if not typeParameters.IsEmpty then - printer.WriteInline("<") + innterPrinter.WriteInline("<") typeParameters |> List.iteri (fun index typeParameter -> if index <> 0 then - printer.WriteInline(", ") + innterPrinter.WriteInline(", ") - printer.WriteInline($"'{typeParameter.Name}") + innterPrinter.WriteInline($"'{typeParameter.Name}") ) // Print the constraints only if we are in the initial declaration. @@ -185,61 +185,52 @@ let rec private tryTransformTypeParametersToText // static member User<'T when 'T :> A> () : User<'T when 'T :> A> = nativeOnly // Which should be: // static member User<'T when 'T :> A> () : User<'T> = nativeOnly - if isDeclaration then - typeParameters - |> List.filter _.Constraint.IsSome - |> List.iteri (fun index typeParameter -> - match typeParameter.Constraint with - | Some constraint_ -> - if index = 0 then - printer.WriteInline(" when ") - else - printer.WriteInline(" and ") - - printer.WriteInline($"'{typeParameter.Name}") - printer.WriteInline(" :> ") - printer.WriteInline(printType constraint_) - | None -> () - ) + typeParameters + |> List.filter _.Constraint.IsSome + |> List.iteri (fun index typeParameter -> + match typeParameter.Constraint with + | Some constraint_ -> + if index = 0 then + innterPrinter.WriteInline(" when ") + else + innterPrinter.WriteInline(" and ") - printer.WriteInline(">") + innterPrinter.WriteInline($"'{typeParameter.Name}") + innterPrinter.WriteInline(" :> ") + innterPrinter.WriteInline(printType constraint_) + | None -> () + ) - printer.ToStringWithoutTrailNewLine() |> Some + innterPrinter.WriteInline(">") - else - None + innterPrinter.ToStringWithoutTrailNewLine() |> printer.WriteInline -and printTypeParameters - (printer: Printer) +and printTypeNameWithTypeParameters + (name: string) (typeParameters: FSharpTypeParameter list) = - let isDeclaration = true + let printer = new Printer() - match tryTransformTypeParametersToText isDeclaration typeParameters with - | Some typeParameters -> printer.WriteInline(typeParameters) - | None -> () + if not typeParameters.IsEmpty then + printer.WriteInline("<") -and printType (fsharpType: FSharpType) = - let printTypeNameWithTypeParameters - (name: string) - (typeParameters: FSharpTypeParameter list) - = - let isDeclaration = false + typeParameters + |> List.iteri (fun index typeParameter -> + if index <> 0 then + printer.WriteInline(", ") - match tryTransformTypeParametersToText isDeclaration typeParameters with - | Some typeParameters -> $"{name}{typeParameters}" - | None -> name + printer.WriteInline($"'{typeParameter.Name}") + ) + printer.WriteInline(">") + + $"{name}{printer.ToStringWithoutTrailNewLine()}" + +and printType (fsharpType: FSharpType) = match fsharpType with | FSharpType.Object -> "obj" | FSharpType.Mapped info -> - let isDeclaration = false - - match - tryTransformTypeParametersToText isDeclaration info.TypeParameters - with - | Some typeParameters -> $"{info.Name}{typeParameters}" - | None -> info.Name + printTypeNameWithTypeParameters info.Name info.TypeParameters | FSharpType.SingleErasedCaseUnion info -> info.Name @@ -518,7 +509,7 @@ let private printInterface (printer: Printer) (interfaceInfo: FSharpInterface) = printAttributes printer interfaceInfo.Attributes printer.Write($"type {interfaceInfo.Name}") - printTypeParameters printer interfaceInfo.TypeParameters + printTypeParametersDeclaration printer interfaceInfo.TypeParameters printer.WriteInline(" =") printer.NewLine @@ -547,7 +538,7 @@ let private printInterface (printer: Printer) (interfaceInfo: FSharpInterface) = printer.WriteInline($"member {methodInfo.Name}") - printTypeParameters printer methodInfo.TypeParameters + printTypeParametersDeclaration printer methodInfo.TypeParameters if methodInfo.IsStatic then printer.WriteInline(" ") @@ -719,7 +710,9 @@ import {{ %s{interfaceInfo.OriginalName} }} from \"{Naming.MODULE_PLACEHOLDER}\" printer.Write($"static member inline {staticMemberInfo.Name} ") - printTypeParameters printer staticMemberInfo.TypeParameters + printTypeParametersDeclaration + printer + staticMemberInfo.TypeParameters if staticMemberInfo.Parameters.IsEmpty then printer.WriteInline("() : ") @@ -826,7 +819,7 @@ let private printClass (printer: Printer) (classInfo: FSharpClass) = printAttributes printer classInfo.Attributes printer.Write($"type {classInfo.Name}") - printTypeParameters printer classInfo.TypeParameters + printTypeParametersDeclaration printer classInfo.TypeParameters printer.NewLine printer.Indent printPrimaryConstructor printer classInfo.PrimaryConstructor @@ -912,7 +905,7 @@ let private printTypeAlias (printer: Printer) (aliasInfo: FSharpTypeAlias) = printAttributes printer aliasInfo.Attributes printer.Write($"type {aliasInfo.Name}") - printTypeParameters printer aliasInfo.TypeParameters + printTypeParametersDeclaration printer aliasInfo.TypeParameters printer.WriteInline(" =") printer.NewLine @@ -923,7 +916,7 @@ let private printTypeAlias (printer: Printer) (aliasInfo: FSharpTypeAlias) = let private printDelegate (printer: Printer) (delegateInfo: FSharpDelegate) = printer.Write($"type {delegateInfo.Name}") - printTypeParameters printer delegateInfo.TypeParameters + printTypeParametersDeclaration printer delegateInfo.TypeParameters printer.WriteInline(" =") printer.NewLine @@ -1007,7 +1000,11 @@ let rec private print (printer: Printer) (fsharpTypes: FSharpType list) = (FSharpAttribute.Erase :: erasedCaseUnionInfo.Attributes) printer.Write($"type {erasedCaseUnionInfo.Name}") - printTypeParameters printer [ erasedCaseUnionInfo.TypeParameter ] + + printTypeParametersDeclaration + printer + [ erasedCaseUnionInfo.TypeParameter ] + printer.WriteInline(" =") printer.NewLine