Skip to content

Commit 8fa8837

Browse files
committed
fix: IndexSignature decorated with readonly should not generate a setter
[converter] === changelog === ```ts export interface MyType { readonly [n: number]: string; } ``` ```fs [<AllowNullLiteral>] [<Interface>] type MyType = [<EmitIndexer>] abstract member Item: n: float -> string with get ``` === changelog === Fix #136
1 parent cbf1c14 commit 8fa8837

File tree

6 files changed

+36
-1
lines changed

6 files changed

+36
-1
lines changed

src/Glutinum.Converter/GlueAST.fs

+1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ type GlueIndexSignature =
101101
{
102102
Parameters: GlueParameter list
103103
Type: GlueType
104+
IsReadOnly: bool
104105
}
105106

106107
type GlueMethodSignature =

src/Glutinum.Converter/Reader/Declaration.fs

+8
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ let readDeclaration
6666
({
6767
Parameters = reader.ReadParameters indexSignature.parameters
6868
Type = reader.ReadTypeNode(Some indexSignature.``type``)
69+
IsReadOnly =
70+
match indexSignature.modifiers with
71+
| Some modifiers ->
72+
modifiers
73+
|> Seq.exists (fun modifier ->
74+
modifier?kind = Ts.SyntaxKind.ReadonlyKeyword
75+
)
76+
| None -> false
6977
}
7078
: GlueIndexSignature)
7179
|> GlueMember.IndexSignature

src/Glutinum.Converter/Transform.fs

+5-1
Original file line numberDiff line numberDiff line change
@@ -1157,7 +1157,11 @@ module private TransformMembers =
11571157
TypeParameters = []
11581158
IsOptional = false
11591159
IsStatic = false
1160-
Accessor = Some FSharpAccessor.ReadWrite
1160+
Accessor =
1161+
if indexSignature.IsReadOnly then
1162+
Some FSharpAccessor.ReadOnly
1163+
else
1164+
Some FSharpAccessor.ReadWrite
11611165
Accessibility = FSharpAccessibility.Public
11621166
XmlDoc = []
11631167
Body = FSharpMemberInfoBody.NativeOnly

src/Glutinum.Web/Pages/Editors.GlueAST.GlueASTViewer.fs

+4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ type GlueASTViewer =
2424
static member private IsOptional(isOptional: bool) =
2525
ASTViewer.renderKeyValue "IsOptional" (string isOptional)
2626

27+
static member private IsReadOnly(isReadOnly: bool) =
28+
ASTViewer.renderKeyValue "IsReadOnly" (string isReadOnly)
29+
2730
static member private IsStatic(isStatic: bool) =
2831
ASTViewer.renderKeyValue "IsStatic" (string isStatic)
2932

@@ -165,6 +168,7 @@ type GlueASTViewer =
165168
ASTViewer.renderNode "IndexSignature" [
166169
GlueASTViewer.Parameters indexSignature.Parameters
167170
GlueASTViewer.Type indexSignature.Type
171+
GlueASTViewer.IsReadOnly indexSignature.IsReadOnly
168172
]
169173

170174
| GlueMember.Property propertyInfo ->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export interface MyType {
2+
readonly [n: number]: string;
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module rec Glutinum
2+
3+
open Fable.Core
4+
open Fable.Core.JsInterop
5+
open System
6+
7+
[<AllowNullLiteral>]
8+
[<Interface>]
9+
type MyType =
10+
[<EmitIndexer>]
11+
abstract member Item: n: float -> string with get
12+
13+
(***)
14+
#r "nuget: Fable.Core"
15+
(***)

0 commit comments

Comments
 (0)