diff --git a/src/Glutinum.Converter/GlueAST.fs b/src/Glutinum.Converter/GlueAST.fs index 7bd5c7f..dd0d17b 100644 --- a/src/Glutinum.Converter/GlueAST.fs +++ b/src/Glutinum.Converter/GlueAST.fs @@ -259,6 +259,12 @@ type GlueRecord = ValueType: GlueType } +[] +type GlueUtilityType = + | Partial of GlueInterface + | Record of GlueRecord +// | ReadOnly of GlueType + [] type GlueType = | Discard @@ -275,8 +281,6 @@ type GlueType = | ModuleDeclaration of GlueModuleDeclaration | ClassDeclaration of GlueClassDeclaration | TypeReference of GlueTypeReference - | Partial of GlueInterface - | Record of GlueRecord | Array of GlueType | FunctionType of GlueFunctionType | TypeParameter of string @@ -289,6 +293,7 @@ type GlueType = | Unknown | ExportDefault of GlueType | TemplateLiteral + | UtilityType of GlueUtilityType member this.Name = match this with @@ -324,11 +329,13 @@ type GlueType = | IntersectionType _ | IndexedAccessType _ | Union _ - | Partial _ | FunctionType _ | TupleType _ | OptionalType _ // TODO: Should we take the name of the underlying type and add option to it? | Discard | ExportDefault _ - | Record _ | Unknown -> "obj" + | UtilityType utilityType -> + match utilityType with + | GlueUtilityType.Partial _ + | GlueUtilityType.Record _ -> "obj" diff --git a/src/Glutinum.Converter/Reader/TypeNode.fs b/src/Glutinum.Converter/Reader/TypeNode.fs index 604c4e5..fb9e574 100644 --- a/src/Glutinum.Converter/Reader/TypeNode.fs +++ b/src/Glutinum.Converter/Reader/TypeNode.fs @@ -129,7 +129,8 @@ module UtilityType = HeritageClauses = [] } : GlueInterface) - |> GlueType.Partial + |> GlueUtilityType.Partial + |> GlueType.UtilityType | _ -> GlueType.Discard @@ -144,7 +145,8 @@ module UtilityType = ValueType = typeArguments.[1] } : GlueRecord) - |> GlueType.Record + |> GlueUtilityType.Record + |> GlueType.UtilityType let readTypeNode (reader: ITypeScriptReader) diff --git a/src/Glutinum.Converter/Transform.fs b/src/Glutinum.Converter/Transform.fs index a49d4f8..594a382 100644 --- a/src/Glutinum.Converter/Transform.fs +++ b/src/Glutinum.Converter/Transform.fs @@ -577,23 +577,6 @@ let rec private transformType | GlueType.NamedTupleType namedTupleType -> transformType context namedTupleType.Type - | GlueType.Partial interfaceInfo -> - transformInterface context interfaceInfo - |> Interface.makePartial context.CurrentScopeName - |> FSharpType.Interface - |> context.ExposeType - - // Get fullname - // Store type in the exposed types memory - ({ - Name = context.FullName - FullName = context.FullName - TypeArguments = [] - Type = FSharpType.Discard - } - : FSharpTypeReference) - |> FSharpType.TypeReference - | GlueType.Discard -> FSharpType.Object | GlueType.Literal glueLiteral -> @@ -639,15 +622,34 @@ let rec private transformType }) |> FSharpType.Mapped - | GlueType.Record recordInfo -> - transformRecord context context.CurrentScopeName [] recordInfo - |> context.ExposeType + | GlueType.UtilityType utilityType -> + match utilityType with + | GlueUtilityType.Partial interfaceInfo -> + transformInterface context interfaceInfo + |> Interface.makePartial context.CurrentScopeName + |> FSharpType.Interface + |> context.ExposeType - ({ - Name = context.FullName - TypeParameters = [] - }) - |> FSharpType.Mapped + // Get fullname + // Store type in the exposed types memory + ({ + Name = context.FullName + FullName = context.FullName + TypeArguments = [] + Type = FSharpType.Discard + } + : FSharpTypeReference) + |> FSharpType.TypeReference + + | GlueUtilityType.Record recordInfo -> + transformRecord context context.CurrentScopeName [] recordInfo + |> context.ExposeType + + ({ + Name = context.FullName + TypeParameters = [] + }) + |> FSharpType.Mapped | GlueType.TypeAliasDeclaration typeAliasDeclaration -> ({ @@ -1953,18 +1955,20 @@ let private transformTypeAliasDeclaration : FSharpTypeAlias) |> FSharpType.TypeAlias - | GlueType.Partial interfaceInfo -> - transformInterface context interfaceInfo - // Use the alias name instead of the original interface name - |> Interface.makePartial typeAliasName - |> FSharpType.Interface + | GlueType.UtilityType utilityType -> + match utilityType with + | GlueUtilityType.Partial interfaceInfo -> + transformInterface context interfaceInfo + // Use the alias name instead of the original interface name + |> Interface.makePartial typeAliasName + |> FSharpType.Interface - | GlueType.Record recordInfo -> - transformRecord - context - typeAliasName - glueTypeAliasDeclaration.TypeParameters - recordInfo + | GlueUtilityType.Record recordInfo -> + transformRecord + context + typeAliasName + glueTypeAliasDeclaration.TypeParameters + recordInfo | GlueType.FunctionType functionType -> { @@ -2151,7 +2155,6 @@ let rec private transformToFsharp | GlueType.FunctionType _ | GlueType.TypeParameter _ - | GlueType.Partial _ | GlueType.Array _ | GlueType.TypeReference _ | GlueType.FunctionDeclaration _ @@ -2166,10 +2169,10 @@ let rec private transformToFsharp | GlueType.TupleType _ | GlueType.IntersectionType _ | GlueType.TypeLiteral _ - | GlueType.Record _ | GlueType.OptionalType _ | GlueType.NamedTupleType _ | GlueType.TemplateLiteral + | GlueType.UtilityType _ | GlueType.ThisType _ -> FSharpType.Discard ) diff --git a/src/Glutinum.Web/Pages/Editors.GlueAST.GlueASTViewer.fs b/src/Glutinum.Web/Pages/Editors.GlueAST.GlueASTViewer.fs index 419c13a..6d69afe 100644 --- a/src/Glutinum.Web/Pages/Editors.GlueAST.GlueASTViewer.fs +++ b/src/Glutinum.Web/Pages/Editors.GlueAST.GlueASTViewer.fs @@ -428,28 +428,30 @@ type GlueASTViewer = ] context - | GlueType.Partial partialInfo -> - ASTViewer.renderNode - "Partial" - [ - GlueASTViewer.Name partialInfo.Name - GlueASTViewer.Members partialInfo.Members - GlueASTViewer.TypeParameters partialInfo.TypeParameters - ] - context - - | GlueType.Record recordInfo -> - ASTViewer.renderNode - "Record" - [ - ASTViewer.renderNode "KeyType" [ - GlueASTViewer.GlueType recordInfo.KeyType + | GlueType.UtilityType utilityType -> + match utilityType with + | GlueUtilityType.Partial partialInfo -> + ASTViewer.renderNode + "Partial" + [ + GlueASTViewer.Name partialInfo.Name + GlueASTViewer.Members partialInfo.Members + GlueASTViewer.TypeParameters partialInfo.TypeParameters ] - ASTViewer.renderNode "ValueType" [ - GlueASTViewer.GlueType recordInfo.ValueType + context + + | GlueUtilityType.Record recordInfo -> + ASTViewer.renderNode + "Record" + [ + ASTViewer.renderNode "KeyType" [ + GlueASTViewer.GlueType recordInfo.KeyType + ] + ASTViewer.renderNode "ValueType" [ + GlueASTViewer.GlueType recordInfo.ValueType + ] ] - ] - context + context | GlueType.ThisType typeName -> ASTViewer.renderNode