goscript 0.0.84 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -1
- package/cmd/goscript/cmd_compile.go +70 -69
- package/cmd/goscript/cmd_compile_test.go +79 -0
- package/cmd/goscript/main.go +10 -5
- package/compiler/compile-request.go +218 -0
- package/compiler/compiler.go +16 -1336
- package/compiler/compliance_test.go +196 -0
- package/compiler/config.go +6 -13
- package/compiler/diagnostic.go +70 -0
- package/compiler/index.test.ts +28 -28
- package/compiler/index.ts +40 -72
- package/compiler/lowered-program.go +132 -0
- package/compiler/lowering.go +3576 -0
- package/compiler/override-registry.go +422 -0
- package/compiler/override-registry_test.go +207 -0
- package/compiler/package-graph.go +231 -0
- package/compiler/package-graph_test.go +281 -0
- package/compiler/result.go +13 -0
- package/compiler/runtime-contract.go +279 -0
- package/compiler/runtime-contract_test.go +90 -0
- package/compiler/semantic-model-types.go +110 -0
- package/compiler/semantic-model.go +922 -0
- package/compiler/semantic-model_test.go +416 -0
- package/compiler/service.go +133 -0
- package/compiler/skeleton_test.go +1145 -0
- package/compiler/typescript-emitter.go +663 -0
- package/compiler/wasm/compile.go +2 -3
- package/compiler/wasm/compile_test.go +29 -0
- package/compiler/wasm_api.go +10 -159
- package/dist/compiler/index.d.ts +1 -3
- package/dist/compiler/index.js +31 -55
- package/dist/compiler/index.js.map +1 -1
- package/dist/gs/builtin/builtin.d.ts +13 -0
- package/dist/gs/builtin/builtin.js +23 -0
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +3 -3
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +15 -1
- package/dist/gs/builtin/hostio.js +134 -49
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/index.d.ts +1 -0
- package/dist/gs/builtin/index.js +1 -0
- package/dist/gs/builtin/index.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +1 -1
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +11 -0
- package/dist/gs/builtin/type.js +55 -1
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/bytes.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/rand/index.d.ts +5 -0
- package/dist/gs/crypto/rand/index.js +77 -0
- package/dist/gs/crypto/rand/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +3 -0
- package/dist/gs/encoding/json/index.js +160 -0
- package/dist/gs/encoding/json/index.js.map +1 -0
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
- package/dist/gs/go/scanner/index.d.ts +29 -0
- package/dist/gs/go/scanner/index.js +120 -0
- package/dist/gs/go/scanner/index.js.map +1 -0
- package/dist/gs/go/token/index.d.ts +31 -0
- package/dist/gs/go/token/index.js +82 -0
- package/dist/gs/go/token/index.js.map +1 -0
- package/dist/gs/internal/abi/index.js.map +1 -1
- package/dist/gs/io/fs/fs.js.map +1 -1
- package/dist/gs/io/fs/readdir.js.map +1 -1
- package/dist/gs/io/fs/readfile.js.map +1 -1
- package/dist/gs/io/fs/stat.js.map +1 -1
- package/dist/gs/io/fs/sub.js.map +1 -1
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +2 -4
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/exec.gs.js.map +1 -1
- package/dist/gs/os/exec_posix.gs.js.map +1 -1
- package/dist/gs/os/rawconn_js.gs.js.map +1 -1
- package/dist/gs/os/root_js.gs.js.map +1 -1
- package/dist/gs/os/tempfile.gs.js +66 -9
- package/dist/gs/os/tempfile.gs.js.map +1 -1
- package/dist/gs/os/types.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +9 -9
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/types_unix.gs.js.map +1 -1
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/match.js.map +1 -1
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +2 -2
- package/dist/gs/reflect/index.js +1 -1
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +2 -1
- package/dist/gs/reflect/type.js +85 -14
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/sort/sort.gs.js.map +1 -1
- package/dist/gs/strconv/atoi.gs.js.map +1 -1
- package/dist/gs/strconv/quote.gs.js.map +1 -1
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/reader.js.map +1 -1
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/atomic/value.gs.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +1 -0
- package/dist/gs/sync/sync.js +12 -0
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/go.mod +2 -2
- package/gs/builtin/builtin.ts +27 -0
- package/gs/builtin/hostio.test.ts +177 -0
- package/gs/builtin/hostio.ts +171 -56
- package/gs/builtin/index.ts +1 -0
- package/gs/builtin/runtime-contract.test.ts +230 -0
- package/gs/builtin/type.ts +84 -1
- package/gs/crypto/rand/index.test.ts +32 -0
- package/gs/crypto/rand/index.ts +90 -0
- package/gs/crypto/rand/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +65 -0
- package/gs/encoding/json/index.ts +186 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +23 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +3 -1
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/meta.json +3 -1
- package/gs/go/scanner/index.test.ts +50 -0
- package/gs/go/scanner/index.ts +157 -0
- package/gs/go/token/index.test.ts +21 -0
- package/gs/go/token/index.ts +120 -0
- package/gs/os/file_unix_js.test.ts +50 -0
- package/gs/os/meta.json +1 -2
- package/gs/os/tempfile.gs.test.ts +85 -0
- package/gs/os/tempfile.gs.ts +71 -11
- package/gs/os/types_js.gs.ts +9 -9
- package/gs/reflect/index.ts +1 -1
- package/gs/reflect/type.ts +106 -17
- package/gs/reflect/typefor.test.ts +75 -0
- package/gs/sync/sync.test.ts +24 -0
- package/gs/sync/sync.ts +12 -0
- package/package.json +13 -13
- package/compiler/analysis.go +0 -3475
- package/compiler/analysis_test.go +0 -338
- package/compiler/assignment.go +0 -580
- package/compiler/builtin_test.go +0 -92
- package/compiler/code-writer.go +0 -115
- package/compiler/compiler_test.go +0 -149
- package/compiler/composite-lit.go +0 -779
- package/compiler/config_test.go +0 -62
- package/compiler/constraint.go +0 -86
- package/compiler/decl.go +0 -801
- package/compiler/expr-call-async.go +0 -188
- package/compiler/expr-call-builtins.go +0 -208
- package/compiler/expr-call-helpers.go +0 -382
- package/compiler/expr-call-make.go +0 -318
- package/compiler/expr-call-type-conversion.go +0 -520
- package/compiler/expr-call.go +0 -413
- package/compiler/expr-selector.go +0 -343
- package/compiler/expr-star.go +0 -82
- package/compiler/expr-type.go +0 -442
- package/compiler/expr-value.go +0 -89
- package/compiler/expr.go +0 -773
- package/compiler/field.go +0 -183
- package/compiler/gs_dependencies_test.go +0 -298
- package/compiler/lit.go +0 -322
- package/compiler/output.go +0 -72
- package/compiler/primitive.go +0 -149
- package/compiler/protobuf.go +0 -697
- package/compiler/sanitize.go +0 -100
- package/compiler/spec-struct.go +0 -995
- package/compiler/spec-value.go +0 -540
- package/compiler/spec.go +0 -725
- package/compiler/stmt-assign.go +0 -664
- package/compiler/stmt-for.go +0 -266
- package/compiler/stmt-range.go +0 -475
- package/compiler/stmt-select.go +0 -262
- package/compiler/stmt-type-switch.go +0 -147
- package/compiler/stmt.go +0 -1308
- package/compiler/type-assert.go +0 -386
- package/compiler/type-info.go +0 -156
- package/compiler/type-utils.go +0 -207
- package/compiler/type.go +0 -892
package/compiler/stmt-for.go
DELETED
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
package compiler
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"fmt"
|
|
5
|
-
"go/ast"
|
|
6
|
-
"go/token"
|
|
7
|
-
"go/types"
|
|
8
|
-
|
|
9
|
-
"github.com/pkg/errors"
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
// WriteStmtFor translates a Go `for` statement (`ast.ForStmt`) into a
|
|
13
|
-
// TypeScript `for` loop.
|
|
14
|
-
// The structure is `for (init_ts; cond_ts; post_ts) { body_ts }`.
|
|
15
|
-
// - The initialization part (`exp.Init`) is translated using `WriteStmtForInit`.
|
|
16
|
-
// - The condition part (`exp.Cond`) is translated using `WriteValueExpr`. If nil,
|
|
17
|
-
// the condition part in TypeScript is empty (resulting in an infinite loop
|
|
18
|
-
// unless broken out of).
|
|
19
|
-
// - The post-iteration part (`exp.Post`) is translated using `WriteStmtForPost`.
|
|
20
|
-
// - The loop body (`exp.Body`) is translated as a block statement using `WriteStmtBlock`.
|
|
21
|
-
//
|
|
22
|
-
// This function covers standard Go `for` loops (three-part loops, condition-only
|
|
23
|
-
// loops, and infinite loops). `for...range` loops are handled by `WriteStmtRange`.
|
|
24
|
-
func (c *GoToTSCompiler) WriteStmtFor(exp *ast.ForStmt) error {
|
|
25
|
-
c.tsw.WriteLiterally("for (")
|
|
26
|
-
if exp.Init != nil {
|
|
27
|
-
if err := c.WriteStmtForInit(exp.Init); err != nil { // Use WriteStmtForInit
|
|
28
|
-
return fmt.Errorf("failed to write for loop initialization: %w", err)
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
c.tsw.WriteLiterally("; ")
|
|
32
|
-
if exp.Cond != nil {
|
|
33
|
-
if err := c.WriteValueExpr(exp.Cond); err != nil { // Condition is a value
|
|
34
|
-
return fmt.Errorf("failed to write for loop condition: %w", err)
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
c.tsw.WriteLiterally("; ")
|
|
38
|
-
if exp.Post != nil {
|
|
39
|
-
if err := c.WriteStmtForPost(exp.Post); err != nil { // Use WriteStmtForPost
|
|
40
|
-
return fmt.Errorf("failed to write for loop post statement: %w", err)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
c.tsw.WriteLiterally(") ")
|
|
44
|
-
if err := c.WriteStmtBlock(exp.Body, false); err != nil {
|
|
45
|
-
return fmt.Errorf("failed to write for loop body: %w", err)
|
|
46
|
-
}
|
|
47
|
-
return nil
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// WriteStmtForInit translates the initialization part of a Go `for` loop header
|
|
51
|
-
// (e.g., `i := 0` or `i = 0` in `for i := 0; ...`) into its TypeScript equivalent.
|
|
52
|
-
// - If `stmt` is an `ast.AssignStmt`:
|
|
53
|
-
// - For short variable declarations (`:=`) with multiple variables (e.g., `i, j := 0, 10`),
|
|
54
|
-
// it generates `let i = 0, j = 10`. Each LHS variable is paired with its
|
|
55
|
-
// corresponding RHS value; if RHS values are insufficient, remaining LHS
|
|
56
|
-
// variables are initialized with their zero value using `WriteZeroValue`.
|
|
57
|
-
// - For other assignments (single variable `:=`, or regular `=`), it uses
|
|
58
|
-
// `writeAssignmentCore`. If it's `:=`, `let` is prepended.
|
|
59
|
-
// - If `stmt` is an `ast.ExprStmt` (less common in `for` inits), it translates
|
|
60
|
-
// the expression using `WriteValueExpr`.
|
|
61
|
-
//
|
|
62
|
-
// Unhandled statement types in the init part result in a comment.
|
|
63
|
-
func (c *GoToTSCompiler) WriteStmtForInit(stmt ast.Stmt) error {
|
|
64
|
-
switch s := stmt.(type) {
|
|
65
|
-
case *ast.AssignStmt:
|
|
66
|
-
// Handle assignment in init (e.g., i := 0 or i = 0)
|
|
67
|
-
// For TypeScript for-loop init, we need to handle multi-variable declarations differently
|
|
68
|
-
if s.Tok == token.DEFINE && len(s.Lhs) > 1 && len(s.Rhs) == 1 {
|
|
69
|
-
// Handle the case where we have multiple LHS variables but only one RHS expression
|
|
70
|
-
// Use array destructuring for all cases including map comma-ok idiom
|
|
71
|
-
rhsExpr := s.Rhs[0]
|
|
72
|
-
c.tsw.WriteLiterally("let [")
|
|
73
|
-
for i, lhs := range s.Lhs {
|
|
74
|
-
if i > 0 {
|
|
75
|
-
c.tsw.WriteLiterally(", ")
|
|
76
|
-
}
|
|
77
|
-
if err := c.WriteValueExpr(lhs); err != nil {
|
|
78
|
-
return err
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
c.tsw.WriteLiterally("] = ")
|
|
82
|
-
if err := c.writeDestructuringValue(rhsExpr); err != nil {
|
|
83
|
-
return err
|
|
84
|
-
}
|
|
85
|
-
return nil
|
|
86
|
-
} else if s.Tok == token.DEFINE && len(s.Lhs) > 1 && len(s.Rhs) > 0 {
|
|
87
|
-
// For loop initialization with multiple variables (e.g., let i = 0, j = 10)
|
|
88
|
-
c.tsw.WriteLiterally("let ")
|
|
89
|
-
|
|
90
|
-
// Handle each LHS variable with its corresponding RHS value
|
|
91
|
-
for i, lhs := range s.Lhs {
|
|
92
|
-
if i > 0 {
|
|
93
|
-
c.tsw.WriteLiterally(", ")
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Write the LHS variable name
|
|
97
|
-
if err := c.WriteValueExpr(lhs); err != nil {
|
|
98
|
-
return err
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Write the corresponding RHS, or a default if not enough RHS values
|
|
102
|
-
c.tsw.WriteLiterally(" = ")
|
|
103
|
-
if i < len(s.Rhs) {
|
|
104
|
-
// If there's a corresponding RHS value
|
|
105
|
-
if err := c.WriteValueExpr(s.Rhs[i]); err != nil {
|
|
106
|
-
return err
|
|
107
|
-
}
|
|
108
|
-
} else {
|
|
109
|
-
// No corresponding RHS
|
|
110
|
-
return errors.Errorf("no corresponding rhs to lhs: %v", s)
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
} else {
|
|
114
|
-
// Regular single variable or assignment (not declaration)
|
|
115
|
-
if s.Tok == token.DEFINE {
|
|
116
|
-
c.tsw.WriteLiterally("let ")
|
|
117
|
-
}
|
|
118
|
-
// Use existing assignment core logic
|
|
119
|
-
if err := c.writeAssignmentCore(s.Lhs, s.Rhs, s.Tok, false); err != nil {
|
|
120
|
-
return err
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return nil
|
|
124
|
-
case *ast.ExprStmt:
|
|
125
|
-
// Handle expression statement in init
|
|
126
|
-
return c.WriteValueExpr(s.X)
|
|
127
|
-
case *ast.IncDecStmt:
|
|
128
|
-
// Handle increment/decrement in init (e.g., for i++; ...)
|
|
129
|
-
if err := c.WriteValueExpr(s.X); err != nil { // The expression (e.g., i)
|
|
130
|
-
return err
|
|
131
|
-
}
|
|
132
|
-
tokStr, ok := TokenToTs(s.Tok)
|
|
133
|
-
if !ok {
|
|
134
|
-
return errors.Errorf("unknown incdec token: %v", s.Tok)
|
|
135
|
-
}
|
|
136
|
-
c.tsw.WriteLiterally(tokStr) // The token (e.g., ++)
|
|
137
|
-
return nil
|
|
138
|
-
default:
|
|
139
|
-
return errors.Errorf("unhandled for loop init statement: %T", stmt)
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// writeDestructuringValue writes a value expression in a destructuring context.
|
|
144
|
-
// For map index expressions, it generates the full tuple without [0] indexing.
|
|
145
|
-
func (c *GoToTSCompiler) writeDestructuringValue(expr ast.Expr) error {
|
|
146
|
-
// Check if this is a map index expression that should return a tuple
|
|
147
|
-
if indexExpr, ok := expr.(*ast.IndexExpr); ok {
|
|
148
|
-
if tv, ok := c.pkg.TypesInfo.Types[indexExpr.X]; ok {
|
|
149
|
-
underlyingType := tv.Type.Underlying()
|
|
150
|
-
// Check if it's a map type
|
|
151
|
-
if mapType, isMap := underlyingType.(*types.Map); isMap {
|
|
152
|
-
c.tsw.WriteLiterally("$.mapGet(")
|
|
153
|
-
if err := c.WriteValueExpr(indexExpr.X); err != nil {
|
|
154
|
-
return err
|
|
155
|
-
}
|
|
156
|
-
c.tsw.WriteLiterally(", ")
|
|
157
|
-
if err := c.WriteValueExpr(indexExpr.Index); err != nil {
|
|
158
|
-
return err
|
|
159
|
-
}
|
|
160
|
-
c.tsw.WriteLiterally(", ")
|
|
161
|
-
// Write the zero value as the default value for mapGet
|
|
162
|
-
c.WriteZeroValueForType(mapType.Elem())
|
|
163
|
-
c.tsw.WriteLiterally(")") // Don't add [0] for destructuring
|
|
164
|
-
return nil
|
|
165
|
-
}
|
|
166
|
-
// Check if it's a type parameter constrained to be a map type
|
|
167
|
-
if typeParam, isTypeParam := tv.Type.(*types.TypeParam); isTypeParam {
|
|
168
|
-
constraint := typeParam.Constraint()
|
|
169
|
-
if constraint != nil {
|
|
170
|
-
underlying := constraint.Underlying()
|
|
171
|
-
if iface, isInterface := underlying.(*types.Interface); isInterface {
|
|
172
|
-
if hasMapConstraint(iface) {
|
|
173
|
-
c.tsw.WriteLiterally("$.mapGet(")
|
|
174
|
-
if err := c.WriteValueExpr(indexExpr.X); err != nil {
|
|
175
|
-
return err
|
|
176
|
-
}
|
|
177
|
-
c.tsw.WriteLiterally(", ")
|
|
178
|
-
if err := c.WriteValueExpr(indexExpr.Index); err != nil {
|
|
179
|
-
return err
|
|
180
|
-
}
|
|
181
|
-
c.tsw.WriteLiterally(", ")
|
|
182
|
-
// Generate the zero value as the default value for mapGet
|
|
183
|
-
mapValueType := getMapValueTypeFromConstraint(iface)
|
|
184
|
-
if mapValueType != nil {
|
|
185
|
-
c.WriteZeroValueForType(mapValueType)
|
|
186
|
-
} else {
|
|
187
|
-
c.tsw.WriteLiterally("null")
|
|
188
|
-
}
|
|
189
|
-
c.tsw.WriteLiterally(")") // Don't add [0] for destructuring
|
|
190
|
-
return nil
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
// For non-map expressions, use the regular WriteValueExpr
|
|
198
|
-
return c.WriteValueExpr(expr)
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// WriteStmtForPost translates the post-iteration part of a Go `for` loop header
|
|
202
|
-
// (e.g., `i++` or `i, j = i+1, j-1` in `for ...; i++`) into its TypeScript
|
|
203
|
-
// equivalent.
|
|
204
|
-
// - If `stmt` is an `ast.IncDecStmt` (e.g., `i++`), it writes `i_ts++`.
|
|
205
|
-
// - If `stmt` is an `ast.AssignStmt`:
|
|
206
|
-
// - For multiple variable assignments (e.g., `i, j = i+1, j-1`), it generates
|
|
207
|
-
// TypeScript array destructuring: `[i_ts, j_ts] = [i_ts+1, j_ts-1]`.
|
|
208
|
-
// - For single variable assignments, it uses `writeAssignmentCore`.
|
|
209
|
-
// - If `stmt` is an `ast.ExprStmt` (less common), it translates the expression
|
|
210
|
-
// using `WriteValueExpr`.
|
|
211
|
-
//
|
|
212
|
-
// Unhandled statement types in the post part result in a comment.
|
|
213
|
-
func (c *GoToTSCompiler) WriteStmtForPost(stmt ast.Stmt) error {
|
|
214
|
-
switch s := stmt.(type) {
|
|
215
|
-
case *ast.IncDecStmt:
|
|
216
|
-
// Handle increment/decrement (e.g., i++)
|
|
217
|
-
if err := c.WriteValueExpr(s.X); err != nil { // The expression (e.g., i)
|
|
218
|
-
return err
|
|
219
|
-
}
|
|
220
|
-
tokStr, ok := TokenToTs(s.Tok)
|
|
221
|
-
if !ok {
|
|
222
|
-
return errors.Errorf("unknown incdec token: %v", s.Tok)
|
|
223
|
-
}
|
|
224
|
-
c.tsw.WriteLiterally(tokStr) // The token (e.g., ++)
|
|
225
|
-
return nil
|
|
226
|
-
case *ast.AssignStmt:
|
|
227
|
-
// For multiple variable assignment in post like i, j = i+1, j-1
|
|
228
|
-
// we need to use destructuring in TypeScript like [i, j] = [i+1, j-1]
|
|
229
|
-
if len(s.Lhs) > 1 && len(s.Rhs) > 0 {
|
|
230
|
-
// Write LHS as array destructuring
|
|
231
|
-
c.tsw.WriteLiterally("[")
|
|
232
|
-
for i, lhs := range s.Lhs {
|
|
233
|
-
if i > 0 {
|
|
234
|
-
c.tsw.WriteLiterally(", ")
|
|
235
|
-
}
|
|
236
|
-
if err := c.WriteValueExpr(lhs); err != nil {
|
|
237
|
-
return err
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
c.tsw.WriteLiterally("] = [")
|
|
241
|
-
|
|
242
|
-
// Write RHS as array
|
|
243
|
-
for i, rhs := range s.Rhs {
|
|
244
|
-
if i > 0 {
|
|
245
|
-
c.tsw.WriteLiterally(", ")
|
|
246
|
-
}
|
|
247
|
-
if err := c.WriteValueExpr(rhs); err != nil {
|
|
248
|
-
return err
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
c.tsw.WriteLiterally("]")
|
|
252
|
-
} else {
|
|
253
|
-
// Regular single variable assignment
|
|
254
|
-
// No declaration handling needed in for loop post statements
|
|
255
|
-
if err := c.writeAssignmentCore(s.Lhs, s.Rhs, s.Tok, false); err != nil {
|
|
256
|
-
return err
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
return nil
|
|
260
|
-
case *ast.ExprStmt:
|
|
261
|
-
// Handle expression statement in post
|
|
262
|
-
return c.WriteValueExpr(s.X)
|
|
263
|
-
default:
|
|
264
|
-
return errors.Errorf("unhandled for loop post statement: %T", stmt)
|
|
265
|
-
}
|
|
266
|
-
}
|