goscript 0.0.84 → 0.1.1
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 +267 -243
- package/cmd/goscript/cmd-test.go +193 -0
- package/cmd/goscript/cmd-test_test.go +76 -0
- package/cmd/goscript/cmd_compile.go +70 -69
- package/cmd/goscript/cmd_compile_test.go +79 -0
- package/cmd/goscript/main.go +11 -5
- package/compiler/build-flags.go +38 -0
- package/compiler/compile-request.go +220 -0
- package/compiler/compiler.go +16 -1336
- package/compiler/compliance_test.go +188 -0
- package/compiler/config.go +6 -13
- package/compiler/diagnostic.go +70 -0
- package/compiler/gotest/owner.go +24 -0
- package/compiler/gotest/package-result.go +67 -0
- package/compiler/gotest/request.go +145 -0
- package/compiler/gotest/result.go +28 -0
- package/compiler/gotest/runner.go +588 -0
- package/compiler/gotest/runner_test.go +627 -0
- package/compiler/gotest/test.go +9 -0
- package/compiler/index.test.ts +28 -28
- package/compiler/index.ts +40 -72
- package/compiler/lowered-program.go +184 -0
- package/compiler/lowering.go +8072 -0
- package/compiler/override-facts.go +307 -0
- package/compiler/override-registry.go +283 -0
- package/compiler/override-registry_test.go +254 -0
- package/compiler/package-graph.go +254 -0
- package/compiler/package-graph_test.go +316 -0
- package/compiler/package-test-function.go +9 -0
- package/compiler/package-test-graph-package.go +40 -0
- package/compiler/package-test-graph-variant.go +105 -0
- package/compiler/package-test-graph.go +117 -0
- package/compiler/package-test-graph_test.go +144 -0
- package/compiler/result.go +13 -0
- package/compiler/runtime-contract.go +439 -0
- package/compiler/runtime-contract_test.go +104 -0
- package/compiler/semantic-model-types.go +113 -0
- package/compiler/semantic-model.go +1422 -0
- package/compiler/semantic-model_test.go +471 -0
- package/compiler/service.go +133 -0
- package/compiler/skeleton_test.go +1775 -0
- package/compiler/tsworkspace/owner.go +334 -0
- package/compiler/tsworkspace/owner_test.go +93 -0
- package/compiler/tsworkspace/result.go +17 -0
- package/compiler/typescript-emitter.go +1040 -0
- package/compiler/wasm/compile.go +2 -3
- package/compiler/wasm/compile_test.go +79 -0
- package/compiler/wasm_api.go +140 -124
- 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 +33 -2
- package/dist/gs/builtin/builtin.js +217 -6
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +11 -3
- package/dist/gs/builtin/channel.js +12 -0
- 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 +23 -3
- package/dist/gs/builtin/slice.js +216 -44
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +16 -2
- package/dist/gs/builtin/type.js +134 -21
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +5 -0
- package/dist/gs/builtin/varRef.js +23 -0
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +48 -44
- 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 +20 -18
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/context/context.d.ts +5 -4
- package/dist/gs/context/context.js +10 -10
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
- 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/embed/index.d.ts +7 -0
- package/dist/gs/embed/index.js +16 -0
- package/dist/gs/embed/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +4 -0
- package/dist/gs/encoding/json/index.js +178 -0
- package/dist/gs/encoding/json/index.js.map +1 -0
- package/dist/gs/errors/errors.d.ts +4 -0
- package/dist/gs/errors/errors.js +81 -0
- package/dist/gs/errors/errors.js.map +1 -1
- package/dist/gs/fmt/fmt.d.ts +4 -4
- package/dist/gs/fmt/fmt.js +42 -11
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +36 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +212 -2
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +825 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +163 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +449 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
- package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +71 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
- 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/internal/scannerhooks/index.d.ts +3 -0
- package/dist/gs/go/internal/scannerhooks/index.js +5 -0
- package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
- package/dist/gs/go/scanner/index.d.ts +42 -0
- package/dist/gs/go/scanner/index.js +155 -0
- package/dist/gs/go/scanner/index.js.map +1 -0
- package/dist/gs/go/token/index.d.ts +187 -0
- package/dist/gs/go/token/index.js +578 -0
- package/dist/gs/go/token/index.js.map +1 -0
- package/dist/gs/internal/abi/index.d.ts +4 -0
- package/dist/gs/internal/abi/index.js +10 -0
- package/dist/gs/internal/abi/index.js.map +1 -1
- package/dist/gs/internal/bytealg/index.d.ts +2 -0
- package/dist/gs/internal/bytealg/index.js +14 -0
- package/dist/gs/internal/bytealg/index.js.map +1 -1
- package/dist/gs/internal/byteorder/index.d.ts +8 -2
- package/dist/gs/internal/byteorder/index.js +56 -25
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/internal/godebug/index.d.ts +12 -0
- package/dist/gs/internal/godebug/index.js +30 -0
- package/dist/gs/internal/godebug/index.js.map +1 -0
- package/dist/gs/io/fs/fs.js.map +1 -1
- package/dist/gs/io/fs/index.d.ts +1 -0
- package/dist/gs/io/fs/index.js +1 -0
- package/dist/gs/io/fs/index.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/readlink.d.ts +8 -0
- package/dist/gs/io/fs/readlink.js +64 -0
- package/dist/gs/io/fs/readlink.js.map +1 -0
- package/dist/gs/io/fs/stat.js.map +1 -1
- package/dist/gs/io/fs/sub.js.map +1 -1
- package/dist/gs/io/fs/walk.d.ts +3 -3
- package/dist/gs/io/fs/walk.js +7 -7
- package/dist/gs/io/fs/walk.js.map +1 -1
- package/dist/gs/io/io.d.ts +40 -6
- package/dist/gs/io/io.js +151 -26
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/maps/iter.d.ts +3 -3
- package/dist/gs/maps/iter.js +3 -3
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.d.ts +2 -2
- package/dist/gs/maps/maps.js +1 -1
- package/dist/gs/maps/maps.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +13 -4
- package/dist/gs/math/bits/index.js +66 -34
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/math/const.gs.d.ts +5 -5
- package/dist/gs/math/const.gs.js +4 -4
- package/dist/gs/math/const.gs.js.map +1 -1
- package/dist/gs/mime/index.d.ts +1 -0
- package/dist/gs/mime/index.js +50 -0
- package/dist/gs/mime/index.js.map +1 -0
- package/dist/gs/net/http/httptest/index.d.ts +11 -0
- package/dist/gs/net/http/httptest/index.js +21 -0
- package/dist/gs/net/http/httptest/index.js.map +1 -0
- package/dist/gs/net/http/index.d.ts +27 -0
- package/dist/gs/net/http/index.js +61 -0
- package/dist/gs/net/http/index.js.map +1 -0
- package/dist/gs/os/dir_unix.gs.js +2 -2
- 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 +165 -3
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/filepath/path.d.ts +3 -1
- package/dist/gs/path/filepath/path.js +133 -4
- package/dist/gs/path/filepath/path.js.map +1 -1
- package/dist/gs/path/match.js.map +1 -1
- package/dist/gs/path/path.d.ts +4 -1
- package/dist/gs/path/path.js +16 -4
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +3 -3
- package/dist/gs/reflect/index.js +2 -2
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js +3 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +9 -5
- package/dist/gs/reflect/type.js +233 -21
- 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/debug/index.d.ts +2 -0
- package/dist/gs/runtime/debug/index.js +8 -0
- package/dist/gs/runtime/debug/index.js.map +1 -0
- package/dist/gs/runtime/runtime.d.ts +35 -3
- package/dist/gs/runtime/runtime.js +72 -0
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/slices/slices.d.ts +24 -5
- package/dist/gs/slices/slices.js +214 -5
- package/dist/gs/slices/slices.js.map +1 -1
- package/dist/gs/sort/slice.gs.d.ts +3 -3
- package/dist/gs/sort/slice.gs.js +6 -6
- package/dist/gs/sort/slice.gs.js.map +1 -1
- package/dist/gs/sort/sort.gs.d.ts +4 -4
- package/dist/gs/sort/sort.gs.js +11 -8
- 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.d.ts +1 -1
- package/dist/gs/strings/builder.js +3 -2
- 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.d.ts +9 -8
- package/dist/gs/sync/atomic/type.gs.js +0 -2
- 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 +3 -0
- package/dist/gs/sync/sync.js +39 -0
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/syscall/constants.d.ts +36 -24
- package/dist/gs/syscall/constants.js +12 -0
- package/dist/gs/syscall/constants.js.map +1 -1
- package/dist/gs/syscall/errors.d.ts +2 -0
- package/dist/gs/syscall/errors.js +8 -0
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +43 -0
- package/dist/gs/syscall/fs.js +102 -0
- package/dist/gs/syscall/fs.js.map +1 -1
- package/dist/gs/syscall/js/index.d.ts +90 -0
- package/dist/gs/syscall/js/index.js +375 -0
- package/dist/gs/syscall/js/index.js.map +1 -0
- package/dist/gs/syscall/types.d.ts +22 -0
- package/dist/gs/syscall/types.js +45 -1
- package/dist/gs/syscall/types.js.map +1 -1
- package/dist/gs/testing/index.d.ts +1 -0
- package/dist/gs/testing/index.js +2 -0
- package/dist/gs/testing/index.js.map +1 -0
- package/dist/gs/testing/testing.d.ts +77 -0
- package/dist/gs/testing/testing.js +301 -0
- package/dist/gs/testing/testing.js.map +1 -0
- package/dist/gs/time/time.d.ts +41 -4
- package/dist/gs/time/time.js +205 -36
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.d.ts +23 -1
- package/dist/gs/unicode/unicode.js +79 -10
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
- package/dist/gs/unicode/utf8/utf8.js +24 -11
- package/dist/gs/unicode/utf8/utf8.js.map +1 -1
- package/dist/gs/unique/index.d.ts +11 -0
- package/dist/gs/unique/index.js +71 -0
- package/dist/gs/unique/index.js.map +1 -0
- package/go.mod +2 -2
- package/go.sum +9 -0
- package/gs/builtin/builtin.ts +266 -8
- package/gs/builtin/channel.ts +22 -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 +356 -0
- package/gs/builtin/slice.ts +259 -50
- package/gs/builtin/type.ts +188 -30
- package/gs/builtin/varRef.ts +38 -1
- package/gs/bytes/buffer.gs.ts +48 -44
- package/gs/bytes/meta.json +8 -3
- package/gs/bytes/reader.gs.ts +20 -19
- package/gs/context/context.test.ts +41 -0
- package/gs/context/context.ts +22 -26
- package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
- package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
- 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/embed/index.ts +20 -0
- package/gs/embed/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +79 -0
- package/gs/encoding/json/index.ts +210 -0
- package/gs/errors/errors.test.ts +82 -0
- package/gs/errors/errors.ts +104 -0
- package/gs/fmt/fmt.ts +56 -16
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +95 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +300 -2
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +159 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1005 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +719 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +40 -0
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/meta.json +3 -1
- package/gs/github.com/klauspost/compress/internal/le/index.test.ts +36 -0
- package/gs/github.com/klauspost/compress/internal/le/index.ts +114 -0
- package/gs/go/internal/scannerhooks/index.test.ts +14 -0
- package/gs/go/internal/scannerhooks/index.ts +9 -0
- package/gs/go/scanner/index.test.ts +72 -0
- package/gs/go/scanner/index.ts +204 -0
- package/gs/go/token/index.test.ts +67 -0
- package/gs/go/token/index.ts +686 -0
- package/gs/internal/abi/index.test.ts +18 -0
- package/gs/internal/abi/index.ts +14 -0
- package/gs/internal/bytealg/index.test.ts +18 -0
- package/gs/internal/bytealg/index.ts +16 -0
- package/gs/internal/byteorder/index.test.ts +39 -0
- package/gs/internal/byteorder/index.ts +100 -27
- package/gs/internal/godebug/index.test.ts +16 -0
- package/gs/internal/godebug/index.ts +35 -0
- package/gs/io/fs/index.ts +1 -0
- package/gs/io/fs/meta.json +5 -0
- package/gs/io/fs/readlink.test.ts +43 -0
- package/gs/io/fs/readlink.ts +77 -0
- package/gs/io/fs/walk.test.ts +61 -0
- package/gs/io/fs/walk.ts +9 -9
- package/gs/io/io.ts +174 -31
- package/gs/io/meta.json +10 -2
- package/gs/maps/iter.ts +12 -6
- package/gs/maps/maps.ts +8 -6
- package/gs/math/bits/index.ts +103 -47
- package/gs/math/const.gs.test.ts +11 -5
- package/gs/math/const.gs.ts +5 -6
- package/gs/mime/index.ts +54 -0
- package/gs/net/http/httptest/index.ts +25 -0
- package/gs/net/http/index.test.ts +20 -0
- package/gs/net/http/index.ts +81 -0
- package/gs/os/dir_unix.gs.ts +2 -3
- 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 +11 -11
- package/gs/path/filepath/match.test.ts +31 -12
- package/gs/path/filepath/match.ts +178 -3
- package/gs/path/filepath/path.test.ts +25 -0
- package/gs/path/filepath/path.ts +159 -5
- package/gs/path/path.ts +20 -5
- package/gs/reflect/index.ts +2 -1
- package/gs/reflect/map.test.ts +19 -0
- package/gs/reflect/map.ts +4 -0
- package/gs/reflect/type.ts +298 -29
- package/gs/reflect/typefor.test.ts +75 -0
- package/gs/runtime/debug/index.test.ts +24 -0
- package/gs/runtime/debug/index.ts +8 -0
- package/gs/runtime/runtime.test.ts +19 -0
- package/gs/runtime/runtime.ts +98 -3
- package/gs/slices/slices.test.ts +94 -0
- package/gs/slices/slices.ts +245 -5
- package/gs/sort/meta.json +7 -0
- package/gs/sort/slice.gs.ts +16 -7
- package/gs/sort/sort.gs.ts +16 -13
- package/gs/strings/builder.ts +4 -3
- package/gs/sync/atomic/type.gs.ts +13 -14
- package/gs/sync/meta.json +3 -1
- package/gs/sync/sync.test.ts +36 -0
- package/gs/sync/sync.ts +39 -0
- package/gs/syscall/constants.ts +39 -24
- package/gs/syscall/errors.ts +10 -0
- package/gs/syscall/fs.ts +195 -0
- package/gs/syscall/js/index.ts +458 -0
- package/gs/syscall/js/meta.json +4 -0
- package/gs/syscall/net.test.ts +85 -0
- package/gs/syscall/types.ts +56 -0
- package/gs/testing/index.ts +1 -0
- package/gs/testing/meta.json +5 -0
- package/gs/testing/testing.test.ts +90 -0
- package/gs/testing/testing.ts +382 -0
- package/gs/time/time.test.ts +106 -0
- package/gs/time/time.ts +278 -57
- package/gs/unicode/unicode.test.ts +25 -0
- package/gs/unicode/unicode.ts +119 -9
- package/gs/unicode/utf8/utf8.test.ts +13 -0
- package/gs/unicode/utf8/utf8.ts +28 -16
- package/gs/unique/index.ts +91 -0
- package/package.json +14 -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/gs/reflect/type.ts
CHANGED
|
@@ -167,11 +167,26 @@ export const Func: Kind = 19
|
|
|
167
167
|
export const Interface: Kind = 20
|
|
168
168
|
export const Map: Kind = 21
|
|
169
169
|
export const Ptr: Kind = 22
|
|
170
|
+
export const Pointer: Kind = Ptr
|
|
170
171
|
export const Slice: Kind = 23
|
|
171
172
|
export const String: Kind = 24
|
|
172
173
|
export const Struct: Kind = 25
|
|
173
174
|
export const UnsafePointer: Kind = 26
|
|
174
175
|
|
|
176
|
+
const pointerAddressStride = 0x100000000
|
|
177
|
+
const pointerAddresses = new WeakMap<object, number>()
|
|
178
|
+
let nextPointerAddress = 1
|
|
179
|
+
|
|
180
|
+
function pointerAddress(value: object): number {
|
|
181
|
+
let address = pointerAddresses.get(value)
|
|
182
|
+
if (address === undefined) {
|
|
183
|
+
address = nextPointerAddress * pointerAddressStride
|
|
184
|
+
nextPointerAddress++
|
|
185
|
+
pointerAddresses.set(value, address)
|
|
186
|
+
}
|
|
187
|
+
return address
|
|
188
|
+
}
|
|
189
|
+
|
|
175
190
|
// Type is the representation of a Go type.
|
|
176
191
|
export interface Type {
|
|
177
192
|
// String returns a string representation of the type.
|
|
@@ -225,6 +240,10 @@ export interface Type {
|
|
|
225
240
|
// NumMethod returns the number of methods in the type's method set
|
|
226
241
|
NumMethod(): number
|
|
227
242
|
|
|
243
|
+
// Len returns an array type's length.
|
|
244
|
+
// Panics if the type's Kind is not Array.
|
|
245
|
+
Len(): number
|
|
246
|
+
|
|
228
247
|
// Bits returns the size of the type in bits
|
|
229
248
|
// Panics if the type's Kind is not a sized type.
|
|
230
249
|
Bits(): number
|
|
@@ -271,6 +290,9 @@ class InvalidTypeClass implements Type {
|
|
|
271
290
|
NumMethod(): number {
|
|
272
291
|
return 0
|
|
273
292
|
}
|
|
293
|
+
Len(): number {
|
|
294
|
+
throw new Error('reflect: Len of invalid type')
|
|
295
|
+
}
|
|
274
296
|
Bits(): number {
|
|
275
297
|
throw new Error('reflect: Bits of invalid type')
|
|
276
298
|
}
|
|
@@ -507,6 +529,45 @@ export class Value {
|
|
|
507
529
|
return this._value
|
|
508
530
|
}
|
|
509
531
|
|
|
532
|
+
public Pointer(): number {
|
|
533
|
+
const kind = this.Kind()
|
|
534
|
+
if (
|
|
535
|
+
kind !== Chan &&
|
|
536
|
+
kind !== Func &&
|
|
537
|
+
kind !== Map &&
|
|
538
|
+
kind !== Ptr &&
|
|
539
|
+
kind !== Slice &&
|
|
540
|
+
kind !== UnsafePointer
|
|
541
|
+
) {
|
|
542
|
+
throw new ValueError({ Kind: kind, Method: 'Pointer' })
|
|
543
|
+
}
|
|
544
|
+
if (this._value === null || this._value === undefined) {
|
|
545
|
+
return 0
|
|
546
|
+
}
|
|
547
|
+
if ($.isVarRef(this._value)) {
|
|
548
|
+
const address = this._value.__goAddress?.()
|
|
549
|
+
if (address !== undefined) {
|
|
550
|
+
return address
|
|
551
|
+
}
|
|
552
|
+
return pointerAddress(this._value)
|
|
553
|
+
}
|
|
554
|
+
if (kind === Slice) {
|
|
555
|
+
const slice = this._value as $.Slice<unknown> | Uint8Array
|
|
556
|
+
try {
|
|
557
|
+
if ($.len(slice) === 0) {
|
|
558
|
+
return 0
|
|
559
|
+
}
|
|
560
|
+
return $.indexAddress(slice, 0)
|
|
561
|
+
} catch {
|
|
562
|
+
return 0
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
if (typeof this._value === 'object' || typeof this._value === 'function') {
|
|
566
|
+
return pointerAddress(this._value)
|
|
567
|
+
}
|
|
568
|
+
return 0
|
|
569
|
+
}
|
|
570
|
+
|
|
510
571
|
public pointer(): unknown {
|
|
511
572
|
return this._value
|
|
512
573
|
}
|
|
@@ -606,9 +667,35 @@ export class Value {
|
|
|
606
667
|
return new Value(null, new BasicType(Invalid, 'invalid'))
|
|
607
668
|
}
|
|
608
669
|
|
|
609
|
-
public
|
|
610
|
-
|
|
611
|
-
|
|
670
|
+
public MapKeys(): $.Slice<Value> {
|
|
671
|
+
if (this.Kind() !== Map) {
|
|
672
|
+
throw new ValueError({ Kind: this.Kind(), Method: 'MapKeys' })
|
|
673
|
+
}
|
|
674
|
+
if (this._value === null || this._value === undefined) {
|
|
675
|
+
return $.makeSlice<Value>(0)
|
|
676
|
+
}
|
|
677
|
+
if (!(this._value instanceof globalThis.Map)) {
|
|
678
|
+
throw new ValueError({ Kind: this.Kind(), Method: 'MapKeys' })
|
|
679
|
+
}
|
|
680
|
+
const keyType = this.Type().Key()
|
|
681
|
+
const keys: Value[] = []
|
|
682
|
+
for (const key of this._value.keys()) {
|
|
683
|
+
keys.push(new Value(key as ReflectValue, keyType))
|
|
684
|
+
}
|
|
685
|
+
return $.arrayToSlice(keys)
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
public Complex(): number | $.Complex | null {
|
|
689
|
+
const k = this.Kind()
|
|
690
|
+
if (k !== Complex64 && k !== Complex128) {
|
|
691
|
+
throw new Error(
|
|
692
|
+
'reflect: call of reflect.Value.Complex on ' +
|
|
693
|
+
Kind_String(k) +
|
|
694
|
+
' Value',
|
|
695
|
+
)
|
|
696
|
+
}
|
|
697
|
+
const value = this._parentVarRef ? this._parentVarRef.value : this._value
|
|
698
|
+
return value as number | $.Complex | null
|
|
612
699
|
}
|
|
613
700
|
|
|
614
701
|
// Send sends a value to a channel
|
|
@@ -754,6 +841,28 @@ export class Value {
|
|
|
754
841
|
}
|
|
755
842
|
}
|
|
756
843
|
|
|
844
|
+
// SetComplex sets v's underlying value to x
|
|
845
|
+
public SetComplex(x: number | $.Complex): void {
|
|
846
|
+
if (!this.CanSet()) {
|
|
847
|
+
throw new Error(
|
|
848
|
+
'reflect: call of reflect.Value.SetComplex on unaddressable value',
|
|
849
|
+
)
|
|
850
|
+
}
|
|
851
|
+
const k = this.Kind()
|
|
852
|
+
if (k !== Complex64 && k !== Complex128) {
|
|
853
|
+
throw new Error(
|
|
854
|
+
'reflect: call of reflect.Value.SetComplex on ' + k + ' Value',
|
|
855
|
+
)
|
|
856
|
+
}
|
|
857
|
+
this._value = x
|
|
858
|
+
if (this._parentVarRef) {
|
|
859
|
+
this._parentVarRef.value = x
|
|
860
|
+
}
|
|
861
|
+
if (this._parentStruct && this._fieldName) {
|
|
862
|
+
this._parentStruct[this._fieldName] = x
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
|
|
757
866
|
// SetBytes sets v's underlying value to x
|
|
758
867
|
public SetBytes(x: $.Slice<number>): void {
|
|
759
868
|
if (!this.CanSet()) {
|
|
@@ -1055,6 +1164,14 @@ export class BasicType implements Type {
|
|
|
1055
1164
|
return 0
|
|
1056
1165
|
}
|
|
1057
1166
|
|
|
1167
|
+
public Len(): number {
|
|
1168
|
+
throw new Error(
|
|
1169
|
+
'reflect: call of reflect.Type.Len on ' +
|
|
1170
|
+
Kind_String(this._kind) +
|
|
1171
|
+
' Type',
|
|
1172
|
+
)
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1058
1175
|
public Bits(): number {
|
|
1059
1176
|
const k = this._kind
|
|
1060
1177
|
switch (k) {
|
|
@@ -1074,6 +1191,10 @@ export class BasicType implements Type {
|
|
|
1074
1191
|
case Uint64:
|
|
1075
1192
|
case Float64:
|
|
1076
1193
|
return 64
|
|
1194
|
+
case Complex64:
|
|
1195
|
+
return 64
|
|
1196
|
+
case Complex128:
|
|
1197
|
+
return 128
|
|
1077
1198
|
case Int:
|
|
1078
1199
|
case Uint:
|
|
1079
1200
|
case Uintptr:
|
|
@@ -1153,6 +1274,10 @@ class SliceType implements Type {
|
|
|
1153
1274
|
return 0
|
|
1154
1275
|
}
|
|
1155
1276
|
|
|
1277
|
+
public Len(): number {
|
|
1278
|
+
throw new Error('reflect: call of reflect.Type.Len on slice Type')
|
|
1279
|
+
}
|
|
1280
|
+
|
|
1156
1281
|
public Bits(): number {
|
|
1157
1282
|
throw new Error('reflect: call of reflect.Type.Bits on slice Type')
|
|
1158
1283
|
}
|
|
@@ -1318,6 +1443,10 @@ class PointerType implements Type {
|
|
|
1318
1443
|
return 0
|
|
1319
1444
|
}
|
|
1320
1445
|
|
|
1446
|
+
public Len(): number {
|
|
1447
|
+
throw new Error('reflect: call of reflect.Type.Len on pointer Type')
|
|
1448
|
+
}
|
|
1449
|
+
|
|
1321
1450
|
public Bits(): number {
|
|
1322
1451
|
throw new Error('reflect: call of reflect.Type.Bits on pointer Type')
|
|
1323
1452
|
}
|
|
@@ -1394,6 +1523,10 @@ class FunctionType implements Type {
|
|
|
1394
1523
|
return 0
|
|
1395
1524
|
}
|
|
1396
1525
|
|
|
1526
|
+
public Len(): number {
|
|
1527
|
+
throw new Error('reflect: call of reflect.Type.Len on func Type')
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1397
1530
|
public Bits(): number {
|
|
1398
1531
|
throw new Error('reflect: call of reflect.Type.Bits on func Type')
|
|
1399
1532
|
}
|
|
@@ -1473,6 +1606,10 @@ class MapType implements Type {
|
|
|
1473
1606
|
return 0
|
|
1474
1607
|
}
|
|
1475
1608
|
|
|
1609
|
+
public Len(): number {
|
|
1610
|
+
throw new Error('reflect: call of reflect.Type.Len on map Type')
|
|
1611
|
+
}
|
|
1612
|
+
|
|
1476
1613
|
public Bits(): number {
|
|
1477
1614
|
throw new Error('reflect: call of reflect.Type.Bits on map Type')
|
|
1478
1615
|
}
|
|
@@ -1631,6 +1768,10 @@ class StructType implements Type {
|
|
|
1631
1768
|
return 0
|
|
1632
1769
|
}
|
|
1633
1770
|
|
|
1771
|
+
public Len(): number {
|
|
1772
|
+
throw new Error('reflect: call of reflect.Type.Len on struct Type')
|
|
1773
|
+
}
|
|
1774
|
+
|
|
1634
1775
|
public Bits(): number {
|
|
1635
1776
|
throw new Error('reflect: call of reflect.Type.Bits on struct Type')
|
|
1636
1777
|
}
|
|
@@ -1650,6 +1791,10 @@ class StructType implements Type {
|
|
|
1650
1791
|
return new BasicType(Bool, 'bool', 1)
|
|
1651
1792
|
case 'float64':
|
|
1652
1793
|
return new BasicType(Float64, ti, 8)
|
|
1794
|
+
case 'complex64':
|
|
1795
|
+
return new BasicType(Complex64, ti, 8)
|
|
1796
|
+
case 'complex128':
|
|
1797
|
+
return new BasicType(Complex128, ti, 16)
|
|
1653
1798
|
case 'uint':
|
|
1654
1799
|
case 'uint32':
|
|
1655
1800
|
case 'uint64':
|
|
@@ -1676,6 +1821,10 @@ class StructType implements Type {
|
|
|
1676
1821
|
return new BasicType(Bool, 'bool', 1)
|
|
1677
1822
|
case 'float64':
|
|
1678
1823
|
return new BasicType(Float64, 'float64', 8)
|
|
1824
|
+
case 'complex64':
|
|
1825
|
+
return new BasicType(Complex64, 'complex64', 8)
|
|
1826
|
+
case 'complex128':
|
|
1827
|
+
return new BasicType(Complex128, 'complex128', 16)
|
|
1679
1828
|
default:
|
|
1680
1829
|
return new BasicType(Invalid, name, 8)
|
|
1681
1830
|
}
|
|
@@ -1793,6 +1942,10 @@ class ChannelType implements Type {
|
|
|
1793
1942
|
return 0
|
|
1794
1943
|
}
|
|
1795
1944
|
|
|
1945
|
+
public Len(): number {
|
|
1946
|
+
throw new Error('reflect: call of reflect.Type.Len on chan Type')
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1796
1949
|
public Bits(): number {
|
|
1797
1950
|
throw new Error('reflect: call of reflect.Type.Bits on chan Type')
|
|
1798
1951
|
}
|
|
@@ -1826,10 +1979,7 @@ class InterfaceType implements Type {
|
|
|
1826
1979
|
}
|
|
1827
1980
|
|
|
1828
1981
|
public PkgPath?(): string {
|
|
1829
|
-
if (
|
|
1830
|
-
this._name === 'interface{}' ||
|
|
1831
|
-
this._name.startsWith('interface {')
|
|
1832
|
-
) {
|
|
1982
|
+
if (this._name === 'interface{}' || this._name.startsWith('interface {')) {
|
|
1833
1983
|
return ''
|
|
1834
1984
|
}
|
|
1835
1985
|
const dotIndex = this._name.lastIndexOf('.')
|
|
@@ -1840,10 +1990,7 @@ class InterfaceType implements Type {
|
|
|
1840
1990
|
}
|
|
1841
1991
|
|
|
1842
1992
|
public Name(): string {
|
|
1843
|
-
if (
|
|
1844
|
-
this._name === 'interface{}' ||
|
|
1845
|
-
this._name.startsWith('interface {')
|
|
1846
|
-
) {
|
|
1993
|
+
if (this._name === 'interface{}' || this._name.startsWith('interface {')) {
|
|
1847
1994
|
return this._name
|
|
1848
1995
|
}
|
|
1849
1996
|
const dotIndex = this._name.lastIndexOf('.')
|
|
@@ -1891,6 +2038,10 @@ class InterfaceType implements Type {
|
|
|
1891
2038
|
return 0
|
|
1892
2039
|
}
|
|
1893
2040
|
|
|
2041
|
+
public Len(): number {
|
|
2042
|
+
throw new Error('reflect: call of reflect.Type.Len on interface Type')
|
|
2043
|
+
}
|
|
2044
|
+
|
|
1894
2045
|
public Bits(): number {
|
|
1895
2046
|
throw new Error('reflect: call of reflect.Type.Bits on interface Type')
|
|
1896
2047
|
}
|
|
@@ -1945,22 +2096,7 @@ function getTypeOf(value: ReflectValue): Type {
|
|
|
1945
2096
|
typeInfo.params &&
|
|
1946
2097
|
typeInfo.results
|
|
1947
2098
|
) {
|
|
1948
|
-
|
|
1949
|
-
const paramTypes = typeInfo.params
|
|
1950
|
-
.map((p: any) => (typeof p === 'string' ? p : p.name || 'any'))
|
|
1951
|
-
.join(', ')
|
|
1952
|
-
const resultTypes = typeInfo.results.map((r: any) =>
|
|
1953
|
-
typeof r === 'string' ? r : r.name || 'any',
|
|
1954
|
-
)
|
|
1955
|
-
|
|
1956
|
-
let signature = `func(${paramTypes})`
|
|
1957
|
-
if (resultTypes.length === 1) {
|
|
1958
|
-
signature += ` ${resultTypes[0]}`
|
|
1959
|
-
} else if (resultTypes.length > 1) {
|
|
1960
|
-
signature += ` (${resultTypes.join(', ')})`
|
|
1961
|
-
}
|
|
1962
|
-
|
|
1963
|
-
return new FunctionType(signature)
|
|
2099
|
+
return functionTypeFromInfo(typeInfo)
|
|
1964
2100
|
}
|
|
1965
2101
|
}
|
|
1966
2102
|
|
|
@@ -2017,6 +2153,15 @@ function getTypeOf(value: ReflectValue): Type {
|
|
|
2017
2153
|
return new PointerType(elemType)
|
|
2018
2154
|
}
|
|
2019
2155
|
|
|
2156
|
+
if (
|
|
2157
|
+
'real' in value &&
|
|
2158
|
+
'imag' in value &&
|
|
2159
|
+
typeof (value as $.Complex).real === 'number' &&
|
|
2160
|
+
typeof (value as $.Complex).imag === 'number'
|
|
2161
|
+
) {
|
|
2162
|
+
return new BasicType(Complex128, 'complex128', 16)
|
|
2163
|
+
}
|
|
2164
|
+
|
|
2020
2165
|
// Check for arrays
|
|
2021
2166
|
if (globalThis.Array.isArray(value)) {
|
|
2022
2167
|
if (value.length === 0) {
|
|
@@ -2115,7 +2260,7 @@ function getTypeOf(value: ReflectValue): Type {
|
|
|
2115
2260
|
// Check if fieldInfo is a StructFieldInfo with type and tag
|
|
2116
2261
|
if (isStructFieldInfo(fieldInfo)) {
|
|
2117
2262
|
return {
|
|
2118
|
-
name,
|
|
2263
|
+
name: fieldInfo.name ?? name,
|
|
2119
2264
|
type: StructType.createTypeFromFieldInfo(fieldInfo.type),
|
|
2120
2265
|
tag: fieldInfo.tag,
|
|
2121
2266
|
}
|
|
@@ -2155,6 +2300,17 @@ export function ValueOf(i: ReflectValue): Value {
|
|
|
2155
2300
|
return new Value(i, getTypeOf(i))
|
|
2156
2301
|
}
|
|
2157
2302
|
|
|
2303
|
+
export function TypeAssert(
|
|
2304
|
+
typeArgs: $.GenericTypeArgs | undefined,
|
|
2305
|
+
v: Value,
|
|
2306
|
+
): [any, boolean] {
|
|
2307
|
+
const descriptor = typeArgs?.T
|
|
2308
|
+
if (!descriptor?.type) {
|
|
2309
|
+
return [v.Interface(), true]
|
|
2310
|
+
}
|
|
2311
|
+
return $.typeAssertTuple<any>(v.Interface(), descriptor.type)
|
|
2312
|
+
}
|
|
2313
|
+
|
|
2158
2314
|
export function ArrayOf(length: number, elem: Type): Type {
|
|
2159
2315
|
return new ArrayType(elem, length)
|
|
2160
2316
|
}
|
|
@@ -2180,10 +2336,123 @@ export function ChanOf(dir: ChanDir, t: Type): Type {
|
|
|
2180
2336
|
return new ChannelType(t, dir)
|
|
2181
2337
|
}
|
|
2182
2338
|
|
|
2183
|
-
export function TypeFor(): Type {
|
|
2339
|
+
export function TypeFor(typeArgs?: $.GenericTypeArgs): Type {
|
|
2340
|
+
const descriptor = typeArgs?.T
|
|
2341
|
+
if (descriptor?.type) {
|
|
2342
|
+
return typeFromTypeInfo(descriptor.type)
|
|
2343
|
+
}
|
|
2344
|
+
if (descriptor?.methods) {
|
|
2345
|
+
const methods = Object.keys(descriptor.methods)
|
|
2346
|
+
if (methods.length !== 0) {
|
|
2347
|
+
return new InterfaceType(
|
|
2348
|
+
`interface { ${methods.map((method) => method + '()').join('; ')} }`,
|
|
2349
|
+
)
|
|
2350
|
+
}
|
|
2351
|
+
}
|
|
2352
|
+
if (descriptor?.zero) {
|
|
2353
|
+
return getTypeOf(descriptor.zero())
|
|
2354
|
+
}
|
|
2184
2355
|
return new InterfaceType('interface{}')
|
|
2185
2356
|
}
|
|
2186
2357
|
|
|
2358
|
+
function typeFromTypeInfo(info: $.TypeInfo | string): Type {
|
|
2359
|
+
if (typeof info === 'string') {
|
|
2360
|
+
const registered = builtinGetTypeByName(info)
|
|
2361
|
+
if (registered) {
|
|
2362
|
+
return typeFromTypeInfo(registered)
|
|
2363
|
+
}
|
|
2364
|
+
return StructType.createTypeFromFieldInfo(info)
|
|
2365
|
+
}
|
|
2366
|
+
switch (info.kind) {
|
|
2367
|
+
case $.TypeKind.Array:
|
|
2368
|
+
return new ArrayType(
|
|
2369
|
+
typeFromTypeInfo(
|
|
2370
|
+
info.elemType ?? { kind: $.TypeKind.Basic, name: 'unknown' },
|
|
2371
|
+
),
|
|
2372
|
+
info.length,
|
|
2373
|
+
)
|
|
2374
|
+
case $.TypeKind.Channel:
|
|
2375
|
+
return new ChannelType(
|
|
2376
|
+
typeFromTypeInfo(
|
|
2377
|
+
info.elemType ?? { kind: $.TypeKind.Basic, name: 'unknown' },
|
|
2378
|
+
),
|
|
2379
|
+
chanDirFromTypeInfo(info.direction),
|
|
2380
|
+
)
|
|
2381
|
+
case $.TypeKind.Function:
|
|
2382
|
+
return functionTypeFromInfo(info)
|
|
2383
|
+
case $.TypeKind.Interface:
|
|
2384
|
+
return interfaceTypeFromInfo(info)
|
|
2385
|
+
case $.TypeKind.Map:
|
|
2386
|
+
return new MapType(
|
|
2387
|
+
typeFromTypeInfo(
|
|
2388
|
+
info.keyType ?? { kind: $.TypeKind.Basic, name: 'unknown' },
|
|
2389
|
+
),
|
|
2390
|
+
typeFromTypeInfo(
|
|
2391
|
+
info.elemType ?? { kind: $.TypeKind.Basic, name: 'unknown' },
|
|
2392
|
+
),
|
|
2393
|
+
)
|
|
2394
|
+
case $.TypeKind.Pointer:
|
|
2395
|
+
return new PointerType(
|
|
2396
|
+
typeFromTypeInfo(
|
|
2397
|
+
info.elemType ?? { kind: $.TypeKind.Basic, name: 'unknown' },
|
|
2398
|
+
),
|
|
2399
|
+
)
|
|
2400
|
+
default:
|
|
2401
|
+
return StructType.createTypeFromFieldInfo(info)
|
|
2402
|
+
}
|
|
2403
|
+
}
|
|
2404
|
+
|
|
2405
|
+
function functionTypeFromInfo(info: $.FunctionTypeInfo): Type {
|
|
2406
|
+
if (info.name) {
|
|
2407
|
+
return new FunctionType(info.name)
|
|
2408
|
+
}
|
|
2409
|
+
const params = info.params ?? []
|
|
2410
|
+
const paramTypes = params.map((param, index) => {
|
|
2411
|
+
const typeName = functionSignatureTypeName(param)
|
|
2412
|
+
if (!info.isVariadic || index !== params.length - 1) {
|
|
2413
|
+
return typeName
|
|
2414
|
+
}
|
|
2415
|
+
if (typeName.startsWith('[]')) {
|
|
2416
|
+
return '...' + typeName.slice(2)
|
|
2417
|
+
}
|
|
2418
|
+
return '...' + typeName
|
|
2419
|
+
})
|
|
2420
|
+
const resultTypes = (info.results ?? []).map(functionSignatureTypeName)
|
|
2421
|
+
let signature = `func(${paramTypes.join(', ')})`
|
|
2422
|
+
if (resultTypes.length === 1) {
|
|
2423
|
+
signature += ` ${resultTypes[0]}`
|
|
2424
|
+
}
|
|
2425
|
+
if (resultTypes.length > 1) {
|
|
2426
|
+
signature += ` (${resultTypes.join(', ')})`
|
|
2427
|
+
}
|
|
2428
|
+
return new FunctionType(signature)
|
|
2429
|
+
}
|
|
2430
|
+
|
|
2431
|
+
function functionSignatureTypeName(info: $.TypeInfo | string): string {
|
|
2432
|
+
return typeFromTypeInfo(info).String()
|
|
2433
|
+
}
|
|
2434
|
+
|
|
2435
|
+
function interfaceTypeFromInfo(info: $.InterfaceTypeInfo): Type {
|
|
2436
|
+
if (info.methods.length === 0) {
|
|
2437
|
+
return new InterfaceType('interface{}', info.name)
|
|
2438
|
+
}
|
|
2439
|
+
return new InterfaceType(
|
|
2440
|
+
`interface { ${info.methods.map((method) => method.name + '()').join('; ')} }`,
|
|
2441
|
+
info.name,
|
|
2442
|
+
)
|
|
2443
|
+
}
|
|
2444
|
+
|
|
2445
|
+
function chanDirFromTypeInfo(direction?: 'send' | 'receive' | 'both'): ChanDir {
|
|
2446
|
+
switch (direction) {
|
|
2447
|
+
case 'send':
|
|
2448
|
+
return SendDir
|
|
2449
|
+
case 'receive':
|
|
2450
|
+
return RecvDir
|
|
2451
|
+
default:
|
|
2452
|
+
return BothDir
|
|
2453
|
+
}
|
|
2454
|
+
}
|
|
2455
|
+
|
|
2187
2456
|
/**
|
|
2188
2457
|
* getInterfaceTypeByName looks up a registered interface type by name
|
|
2189
2458
|
* and returns a Type for it. Returns an interface{} type if not found.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import {
|
|
3
|
+
TypeKind,
|
|
4
|
+
registerInterfaceType,
|
|
5
|
+
registerStructType,
|
|
6
|
+
} from '../builtin/index.js'
|
|
7
|
+
import { Int, Struct, TypeFor } from './type.js'
|
|
8
|
+
|
|
9
|
+
describe('TypeFor', () => {
|
|
10
|
+
it('uses generic runtime type descriptors', () => {
|
|
11
|
+
const intType = TypeFor({
|
|
12
|
+
T: {
|
|
13
|
+
type: { kind: TypeKind.Basic, name: 'int' },
|
|
14
|
+
zero: () => 0,
|
|
15
|
+
},
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
expect(intType.String()).toBe('int')
|
|
19
|
+
expect(intType.Kind()).toBe(Int)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
it('formats literal interface methods from type metadata', () => {
|
|
23
|
+
const ifaceType = TypeFor({
|
|
24
|
+
T: {
|
|
25
|
+
type: {
|
|
26
|
+
kind: TypeKind.Interface,
|
|
27
|
+
methods: [{ name: 'SomeMethod', args: [], returns: [] }],
|
|
28
|
+
},
|
|
29
|
+
zero: () => null,
|
|
30
|
+
},
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
expect(ifaceType.String()).toBe('interface { SomeMethod() }')
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('formats unnamed function signatures from type metadata', () => {
|
|
37
|
+
const fnType = TypeFor({
|
|
38
|
+
T: {
|
|
39
|
+
type: {
|
|
40
|
+
kind: TypeKind.Function,
|
|
41
|
+
params: [{ kind: TypeKind.Basic, name: 'int' }],
|
|
42
|
+
results: [{ kind: TypeKind.Basic, name: 'string' }],
|
|
43
|
+
},
|
|
44
|
+
zero: () => null,
|
|
45
|
+
},
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
expect(fnType.String()).toBe('func(int) string')
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('resolves registered type names from descriptors', () => {
|
|
52
|
+
class RegisteredStruct {}
|
|
53
|
+
registerStructType(
|
|
54
|
+
'main.RegisteredStruct',
|
|
55
|
+
new RegisteredStruct(),
|
|
56
|
+
[],
|
|
57
|
+
RegisteredStruct,
|
|
58
|
+
{},
|
|
59
|
+
)
|
|
60
|
+
registerInterfaceType('main.RegisteredInterface', null, [
|
|
61
|
+
{ name: 'SomeMethod', args: [], returns: [] },
|
|
62
|
+
])
|
|
63
|
+
|
|
64
|
+
const structType = TypeFor({
|
|
65
|
+
T: { type: 'main.RegisteredStruct', zero: () => new RegisteredStruct() },
|
|
66
|
+
})
|
|
67
|
+
const ifaceType = TypeFor({
|
|
68
|
+
T: { type: 'main.RegisteredInterface', zero: () => null },
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
expect(structType.String()).toBe('main.RegisteredStruct')
|
|
72
|
+
expect(structType.Kind()).toBe(Struct)
|
|
73
|
+
expect(ifaceType.String()).toBe('interface { SomeMethod() }')
|
|
74
|
+
})
|
|
75
|
+
})
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { PrintStack, Stack } from './index.js'
|
|
4
|
+
|
|
5
|
+
describe('runtime/debug override', () => {
|
|
6
|
+
it('returns a stack trace as bytes', () => {
|
|
7
|
+
const stack = Stack()
|
|
8
|
+
|
|
9
|
+
expect(stack).toBeInstanceOf(Uint8Array)
|
|
10
|
+
expect(new TextDecoder().decode(stack)).toContain('Error')
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
it('prints the current stack trace', () => {
|
|
14
|
+
const consoleError = vi.spyOn(console, 'error').mockImplementation(() => {})
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
PrintStack()
|
|
18
|
+
expect(consoleError).toHaveBeenCalledTimes(1)
|
|
19
|
+
expect(consoleError.mock.calls[0][0]).toContain('Error')
|
|
20
|
+
} finally {
|
|
21
|
+
consoleError.mockRestore()
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Compiler,
|
|
5
|
+
FuncForPC,
|
|
6
|
+
ReadTrace,
|
|
7
|
+
StartTrace,
|
|
8
|
+
StopTrace,
|
|
9
|
+
} from './runtime.js'
|
|
10
|
+
|
|
11
|
+
describe('runtime override', () => {
|
|
12
|
+
it('exposes stack and trace compatibility helpers', () => {
|
|
13
|
+
expect(Compiler).toBe('gc')
|
|
14
|
+
expect(FuncForPC(0)).toBeNull()
|
|
15
|
+
expect(StartTrace()).toBeNull()
|
|
16
|
+
expect(ReadTrace()).toBeNull()
|
|
17
|
+
expect(() => StopTrace()).not.toThrow()
|
|
18
|
+
})
|
|
19
|
+
})
|