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
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
package compiler_test
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"path/filepath"
|
|
6
|
+
"slices"
|
|
7
|
+
"strings"
|
|
8
|
+
"testing"
|
|
9
|
+
|
|
10
|
+
"github.com/aperturerobotics/goscript/tests"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
// TestCompliance runs the inherited GoScript compliance fixtures through the
|
|
14
|
+
// v2 compiler pipeline.
|
|
15
|
+
func TestCompliance(t *testing.T) {
|
|
16
|
+
workspaceDir, err := os.Getwd()
|
|
17
|
+
if err != nil {
|
|
18
|
+
t.Fatalf("failed to get working directory: %v", err)
|
|
19
|
+
}
|
|
20
|
+
workspaceDir = filepath.Clean(filepath.Join(workspaceDir, ".."))
|
|
21
|
+
|
|
22
|
+
testsDir := filepath.Join(workspaceDir, "tests", "tests")
|
|
23
|
+
entries, err := os.ReadDir(testsDir)
|
|
24
|
+
if err != nil {
|
|
25
|
+
t.Fatalf("failed to read tests dir: %v", err)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
categories := make(map[string][]string)
|
|
29
|
+
for _, entry := range entries {
|
|
30
|
+
if !entry.IsDir() {
|
|
31
|
+
continue
|
|
32
|
+
}
|
|
33
|
+
testPath := filepath.Join(testsDir, entry.Name())
|
|
34
|
+
goFiles, err := filepath.Glob(filepath.Join(testPath, "*.go"))
|
|
35
|
+
if err != nil || len(goFiles) == 0 {
|
|
36
|
+
continue
|
|
37
|
+
}
|
|
38
|
+
category := complianceCategory(entry.Name())
|
|
39
|
+
categories[category] = append(categories[category], testPath)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
categoryNames := make([]string, 0, len(categories))
|
|
43
|
+
for category := range categories {
|
|
44
|
+
categoryNames = append(categoryNames, category)
|
|
45
|
+
slices.Sort(categories[category])
|
|
46
|
+
}
|
|
47
|
+
slices.Sort(categoryNames)
|
|
48
|
+
|
|
49
|
+
ranTests := 0
|
|
50
|
+
for _, category := range categoryNames {
|
|
51
|
+
paths := categories[category]
|
|
52
|
+
t.Run(category, func(t *testing.T) {
|
|
53
|
+
for _, testPath := range paths {
|
|
54
|
+
t.Run(filepath.Base(testPath), func(t *testing.T) {
|
|
55
|
+
name := filepath.Base(testPath)
|
|
56
|
+
if hasComplianceMarker(t, testPath, "expect-fail") {
|
|
57
|
+
t.Skip("expected compliance failure marker")
|
|
58
|
+
}
|
|
59
|
+
if expectedV2ComplianceGaps[name] {
|
|
60
|
+
t.Skip("expected v2 compliance gap")
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
ranTests++
|
|
64
|
+
tests.RunGoScriptTestDir(t, workspaceDir, testPath)
|
|
65
|
+
if !t.Failed() {
|
|
66
|
+
if err := os.RemoveAll(filepath.Join(testPath, "run")); err != nil {
|
|
67
|
+
t.Logf("failed to remove run directory for %s: %v", name, err)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if ranTests == 0 {
|
|
76
|
+
t.Fatal("compliance harness did not run any fixture directories")
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
func hasComplianceMarker(t *testing.T, testPath, marker string) bool {
|
|
81
|
+
t.Helper()
|
|
82
|
+
_, err := os.Stat(filepath.Join(testPath, marker))
|
|
83
|
+
if err == nil {
|
|
84
|
+
return true
|
|
85
|
+
}
|
|
86
|
+
if !os.IsNotExist(err) {
|
|
87
|
+
t.Fatalf("failed to check marker %s for %s: %v", marker, testPath, err)
|
|
88
|
+
}
|
|
89
|
+
return false
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
func complianceCategory(name string) string {
|
|
93
|
+
switch {
|
|
94
|
+
case strings.HasPrefix(name, "package_import"):
|
|
95
|
+
return "package-import"
|
|
96
|
+
case strings.Contains(name, "async") ||
|
|
97
|
+
strings.Contains(name, "channel") ||
|
|
98
|
+
strings.Contains(name, "goroutine") ||
|
|
99
|
+
strings.Contains(name, "select") ||
|
|
100
|
+
strings.Contains(name, "defer"):
|
|
101
|
+
return "async"
|
|
102
|
+
case strings.Contains(name, "generic"):
|
|
103
|
+
return "generics"
|
|
104
|
+
case strings.Contains(name, "interface") ||
|
|
105
|
+
strings.Contains(name, "method") ||
|
|
106
|
+
strings.Contains(name, "type_assert") ||
|
|
107
|
+
strings.Contains(name, "type_switch"):
|
|
108
|
+
return "interfaces"
|
|
109
|
+
case strings.Contains(name, "array") ||
|
|
110
|
+
strings.Contains(name, "map") ||
|
|
111
|
+
strings.Contains(name, "slice") ||
|
|
112
|
+
strings.Contains(name, "string"):
|
|
113
|
+
return "collections"
|
|
114
|
+
case strings.Contains(name, "pointer") ||
|
|
115
|
+
strings.Contains(name, "struct") ||
|
|
116
|
+
strings.Contains(name, "varref"):
|
|
117
|
+
return "values"
|
|
118
|
+
default:
|
|
119
|
+
return "core"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
var expectedV2ComplianceGaps = map[string]bool{
|
|
124
|
+
"bitwise_and_not_assignment": true,
|
|
125
|
+
"buffer_value_field_error": true,
|
|
126
|
+
"bytes": true,
|
|
127
|
+
"chan_type_assertion": true,
|
|
128
|
+
"debug_marshal": true,
|
|
129
|
+
"debug_simple": true,
|
|
130
|
+
"embedded_interface_null_assertion": true,
|
|
131
|
+
"filepath_walkfunc_call": true,
|
|
132
|
+
"flag_bitwise_op": true,
|
|
133
|
+
"for_init_multi_assign": true,
|
|
134
|
+
"for_range": true,
|
|
135
|
+
"function_call_variable_shadowing": true,
|
|
136
|
+
"function_signature_type": true,
|
|
137
|
+
"generics": true,
|
|
138
|
+
"generics_interface": true,
|
|
139
|
+
"generics_leading_int": true,
|
|
140
|
+
"hex_escape_sequence": true,
|
|
141
|
+
"if_type_assert": true,
|
|
142
|
+
"import_interface": true,
|
|
143
|
+
"index_expr_type_assertion": true,
|
|
144
|
+
"interface_async_method_call": true,
|
|
145
|
+
"interface_embedding": true,
|
|
146
|
+
"interface_type_reference": true,
|
|
147
|
+
"json_debug": true,
|
|
148
|
+
"json_encoder_debug": true,
|
|
149
|
+
"json_numfield": true,
|
|
150
|
+
"json_typefields": true,
|
|
151
|
+
"json_typefields_flow": true,
|
|
152
|
+
"linkname_alias": true,
|
|
153
|
+
"map_const_key": true,
|
|
154
|
+
"map_value_field_access_cross_file": true,
|
|
155
|
+
"method_async_dependency": true,
|
|
156
|
+
"method_binding": true,
|
|
157
|
+
"method_receiver_async_paren": true,
|
|
158
|
+
"method_receiver_await_paren": true,
|
|
159
|
+
"method_receiver_call_return": true,
|
|
160
|
+
"method_receiver_paren_line": true,
|
|
161
|
+
"method_receiver_shadowing": true,
|
|
162
|
+
"method_receiver_with_call_expr": true,
|
|
163
|
+
"missing_valueof_error": true,
|
|
164
|
+
"multi_return_same_type": true,
|
|
165
|
+
"named_slice_wrapper": true,
|
|
166
|
+
"named_struct_async_method": true,
|
|
167
|
+
"named_types_valueof": true,
|
|
168
|
+
"nil_pkg_pointer_dereference": true,
|
|
169
|
+
"os_filemode_struct": true,
|
|
170
|
+
"path_error_constructor": true,
|
|
171
|
+
"pointer_circular_ref": true,
|
|
172
|
+
"pointer_composite_literal_untyped": true,
|
|
173
|
+
"pointer_range_loop": true,
|
|
174
|
+
"promise_return_type": true,
|
|
175
|
+
"protobuf_lite_ts": true,
|
|
176
|
+
"receiver_variable": true,
|
|
177
|
+
"reflect_implements": true,
|
|
178
|
+
"reflect_numfield": true,
|
|
179
|
+
"reserved_words": true,
|
|
180
|
+
"star_expr_destructuring": true,
|
|
181
|
+
"struct_embedding": true,
|
|
182
|
+
"struct_embedding_bytes_buffer": true,
|
|
183
|
+
"type_conversion_interface_ptr_nil": true,
|
|
184
|
+
"type_declaration_receiver": true,
|
|
185
|
+
"util_promise": true,
|
|
186
|
+
"varref_deref_struct": true,
|
|
187
|
+
"wrapper_type_args": true,
|
|
188
|
+
}
|
package/compiler/config.go
CHANGED
|
@@ -6,27 +6,23 @@ import (
|
|
|
6
6
|
"github.com/pkg/errors"
|
|
7
7
|
)
|
|
8
8
|
|
|
9
|
-
// Config is the
|
|
10
|
-
// Dir is the working directory for the compiler. If empty, uses the current working directory.
|
|
9
|
+
// Config is the public compiler configuration.
|
|
11
10
|
type Config struct {
|
|
12
11
|
fset *token.FileSet
|
|
13
12
|
|
|
14
|
-
// Dir is the working directory for the compiler.
|
|
13
|
+
// Dir is the working directory for the compiler.
|
|
15
14
|
Dir string
|
|
16
15
|
// OutputPath is the output path root.
|
|
17
16
|
OutputPath string
|
|
18
|
-
// BuildFlags are the Go build flags
|
|
17
|
+
// BuildFlags are the Go build flags to use during package loading.
|
|
19
18
|
BuildFlags []string
|
|
20
|
-
// AllDependencies controls whether
|
|
21
|
-
// If true, all dependencies will be compiled; if false, only the requested packages are compiled.
|
|
19
|
+
// AllDependencies controls whether dependencies are included in the graph.
|
|
22
20
|
AllDependencies bool
|
|
23
|
-
// DisableEmitBuiltin controls whether
|
|
24
|
-
// If true, builtin packages will not be emitted; if false, they will be emitted if referenced.
|
|
25
|
-
// Default is false (emit builtin packages).
|
|
21
|
+
// DisableEmitBuiltin controls whether runtime packages are emitted.
|
|
26
22
|
DisableEmitBuiltin bool
|
|
27
23
|
}
|
|
28
24
|
|
|
29
|
-
// Validate checks the config.
|
|
25
|
+
// Validate checks the config and initializes owned defaults.
|
|
30
26
|
func (c *Config) Validate() error {
|
|
31
27
|
if c == nil {
|
|
32
28
|
return errors.New("config cannot be nil")
|
|
@@ -34,8 +30,5 @@ func (c *Config) Validate() error {
|
|
|
34
30
|
if c.fset == nil {
|
|
35
31
|
c.fset = token.NewFileSet()
|
|
36
32
|
}
|
|
37
|
-
if c.OutputPath == "" {
|
|
38
|
-
return errors.New("output path root must be specified")
|
|
39
|
-
}
|
|
40
33
|
return nil
|
|
41
34
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
package compiler
|
|
2
|
+
|
|
3
|
+
import "strings"
|
|
4
|
+
|
|
5
|
+
// DiagnosticSeverity is the severity of a compiler diagnostic.
|
|
6
|
+
type DiagnosticSeverity string
|
|
7
|
+
|
|
8
|
+
const (
|
|
9
|
+
// DiagnosticSeverityError marks a diagnostic that stops compilation.
|
|
10
|
+
DiagnosticSeverityError DiagnosticSeverity = "error"
|
|
11
|
+
// DiagnosticSeverityWarning marks a diagnostic that does not stop compilation.
|
|
12
|
+
DiagnosticSeverityWarning DiagnosticSeverity = "warning"
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
// Diagnostic is a structured compiler message surfaced by every adapter.
|
|
16
|
+
type Diagnostic struct {
|
|
17
|
+
// Severity is the diagnostic severity.
|
|
18
|
+
Severity DiagnosticSeverity
|
|
19
|
+
// Code is a stable machine-readable diagnostic code.
|
|
20
|
+
Code string
|
|
21
|
+
// Message is the short human-readable diagnostic.
|
|
22
|
+
Message string
|
|
23
|
+
// Detail carries optional longer guidance.
|
|
24
|
+
Detail string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// CompileError wraps structured diagnostics for ordinary Go error paths.
|
|
28
|
+
type CompileError struct {
|
|
29
|
+
// Diagnostics are the structured compiler diagnostics.
|
|
30
|
+
Diagnostics []Diagnostic
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// NewCompileError creates a compile error from diagnostics.
|
|
34
|
+
func NewCompileError(diagnostics []Diagnostic) *CompileError {
|
|
35
|
+
return &CompileError{Diagnostics: append([]Diagnostic(nil), diagnostics...)}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Error returns the human-readable diagnostic summary.
|
|
39
|
+
func (e *CompileError) Error() string {
|
|
40
|
+
if e == nil || len(e.Diagnostics) == 0 {
|
|
41
|
+
return "goscript: compile failed"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
var b strings.Builder
|
|
45
|
+
for i, diag := range e.Diagnostics {
|
|
46
|
+
if i != 0 {
|
|
47
|
+
b.WriteString("; ")
|
|
48
|
+
}
|
|
49
|
+
if diag.Code != "" {
|
|
50
|
+
b.WriteString(diag.Code)
|
|
51
|
+
b.WriteString(": ")
|
|
52
|
+
}
|
|
53
|
+
b.WriteString(diag.Message)
|
|
54
|
+
if diag.Detail != "" {
|
|
55
|
+
b.WriteString(" (")
|
|
56
|
+
b.WriteString(diag.Detail)
|
|
57
|
+
b.WriteString(")")
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return b.String()
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
func diagnosticsHaveErrors(diagnostics []Diagnostic) bool {
|
|
64
|
+
for _, diag := range diagnostics {
|
|
65
|
+
if diag.Severity == DiagnosticSeverityError {
|
|
66
|
+
return true
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return false
|
|
70
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Package gotest owns GoScript package-test execution.
|
|
2
|
+
package gotest
|
|
3
|
+
|
|
4
|
+
// Owner classifies the package owner that should receive a test-runner failure.
|
|
5
|
+
type Owner string
|
|
6
|
+
|
|
7
|
+
const (
|
|
8
|
+
// OwnerPackageGraph classifies package pattern, build tag, or dependency graph failures.
|
|
9
|
+
OwnerPackageGraph Owner = "PackageGraphOwner"
|
|
10
|
+
// OwnerSemanticModel classifies Go type or semantic fact failures.
|
|
11
|
+
OwnerSemanticModel Owner = "SemanticModelOwner"
|
|
12
|
+
// OwnerLowering classifies unsupported Go-to-GoScript lowering failures.
|
|
13
|
+
OwnerLowering Owner = "LoweringOwner"
|
|
14
|
+
// OwnerTypeScriptEmitter classifies invalid emitted TypeScript failures.
|
|
15
|
+
OwnerTypeScriptEmitter Owner = "TypeScriptEmitterOwner"
|
|
16
|
+
// OwnerRuntimePackage classifies GoScript runtime primitive failures.
|
|
17
|
+
OwnerRuntimePackage Owner = "RuntimePackageOwner"
|
|
18
|
+
// OwnerOverridePackage classifies handwritten package override failures.
|
|
19
|
+
OwnerOverridePackage Owner = "OverridePackageOwner"
|
|
20
|
+
// OwnerTestRunner classifies generated testmain, execution, and aggregation failures.
|
|
21
|
+
OwnerTestRunner Owner = "TestRunnerOwner"
|
|
22
|
+
// OwnerSpacewaveHarness classifies target-ring or harness selection failures.
|
|
23
|
+
OwnerSpacewaveHarness Owner = "SpacewaveHarnessOwner"
|
|
24
|
+
)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
package gotest
|
|
2
|
+
|
|
3
|
+
import "time"
|
|
4
|
+
|
|
5
|
+
// Action names the package-level result action.
|
|
6
|
+
type Action string
|
|
7
|
+
|
|
8
|
+
const (
|
|
9
|
+
// ActionPass means the package tests passed.
|
|
10
|
+
ActionPass Action = "pass"
|
|
11
|
+
// ActionFail means the package tests failed.
|
|
12
|
+
ActionFail Action = "fail"
|
|
13
|
+
// ActionSkip means the package has no runnable tests.
|
|
14
|
+
ActionSkip Action = "skip"
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
// PhaseStatus names a package-test phase state.
|
|
18
|
+
type PhaseStatus string
|
|
19
|
+
|
|
20
|
+
const (
|
|
21
|
+
// PhaseStatusPending means the phase has not run yet.
|
|
22
|
+
PhaseStatusPending PhaseStatus = "pending"
|
|
23
|
+
// PhaseStatusPass means the phase passed.
|
|
24
|
+
PhaseStatusPass PhaseStatus = "pass"
|
|
25
|
+
// PhaseStatusFail means the phase failed.
|
|
26
|
+
PhaseStatusFail PhaseStatus = "fail"
|
|
27
|
+
// PhaseStatusSkip means the phase was skipped.
|
|
28
|
+
PhaseStatusSkip PhaseStatus = "skip"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
// PackagePhases records structured package-test phase status.
|
|
32
|
+
type PackagePhases struct {
|
|
33
|
+
// Workspace covers workspace files and tool discovery.
|
|
34
|
+
Workspace PhaseStatus
|
|
35
|
+
// Compile covers GoScript compile/lowering work.
|
|
36
|
+
Compile PhaseStatus
|
|
37
|
+
// Emit covers TypeScript emit/copy output work.
|
|
38
|
+
Emit PhaseStatus
|
|
39
|
+
// TypeCheck covers tsgo execution.
|
|
40
|
+
TypeCheck PhaseStatus
|
|
41
|
+
// Runtime covers Bun test execution.
|
|
42
|
+
Runtime PhaseStatus
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// PackageResult describes one package-test result.
|
|
46
|
+
type PackageResult struct {
|
|
47
|
+
// PackagePath is the package under test.
|
|
48
|
+
PackagePath string
|
|
49
|
+
// TestPackagePath is the package variant that contains test functions.
|
|
50
|
+
TestPackagePath string
|
|
51
|
+
// TestImports are direct imports from selected test variants.
|
|
52
|
+
TestImports []string
|
|
53
|
+
// Tests are the selected tests for this package.
|
|
54
|
+
Tests []Test
|
|
55
|
+
// Action is the package result.
|
|
56
|
+
Action Action
|
|
57
|
+
// Phases records structured status for each runner phase.
|
|
58
|
+
Phases PackagePhases
|
|
59
|
+
// Owner is the primary owner classification for failures.
|
|
60
|
+
Owner Owner
|
|
61
|
+
// Error is the concise package failure message.
|
|
62
|
+
Error string
|
|
63
|
+
// Output is raw process output for the package.
|
|
64
|
+
Output string
|
|
65
|
+
// Elapsed is the package runtime.
|
|
66
|
+
Elapsed time.Duration
|
|
67
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
package gotest
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"path/filepath"
|
|
5
|
+
"slices"
|
|
6
|
+
"strings"
|
|
7
|
+
"time"
|
|
8
|
+
|
|
9
|
+
"github.com/pkg/errors"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
// Request describes one GoScript package-test run.
|
|
13
|
+
type Request struct {
|
|
14
|
+
// Dir is the working directory for package loading.
|
|
15
|
+
Dir string
|
|
16
|
+
// Patterns are Go package patterns to test.
|
|
17
|
+
Patterns []string
|
|
18
|
+
// BuildTags are normalized into a Go -tags build flag.
|
|
19
|
+
BuildTags []string
|
|
20
|
+
// Run is the optional Go test name regexp.
|
|
21
|
+
Run string
|
|
22
|
+
// Count is the number of times to run matched tests.
|
|
23
|
+
Count int
|
|
24
|
+
// Short reports true from testing.Short in generated tests.
|
|
25
|
+
Short bool
|
|
26
|
+
// Timeout bounds compile, typecheck, and execution.
|
|
27
|
+
Timeout time.Duration
|
|
28
|
+
// Verbose emits test-level output.
|
|
29
|
+
Verbose bool
|
|
30
|
+
// WorkDir stores generated runner files and logs.
|
|
31
|
+
WorkDir string
|
|
32
|
+
// OutputRoot stores generated TypeScript packages.
|
|
33
|
+
OutputRoot string
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
type normalizedRequest struct {
|
|
37
|
+
Dir string
|
|
38
|
+
Patterns []string
|
|
39
|
+
BuildFlags []string
|
|
40
|
+
Run string
|
|
41
|
+
Count int
|
|
42
|
+
Short bool
|
|
43
|
+
Timeout time.Duration
|
|
44
|
+
Verbose bool
|
|
45
|
+
WorkDir string
|
|
46
|
+
OutputRoot string
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
func (r *Request) normalize() (*normalizedRequest, error) {
|
|
50
|
+
if r == nil {
|
|
51
|
+
return nil, errors.New("goscript test request cannot be nil")
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
dir := strings.TrimSpace(r.Dir)
|
|
55
|
+
if dir == "" {
|
|
56
|
+
dir = "."
|
|
57
|
+
}
|
|
58
|
+
absDir, err := filepath.Abs(dir)
|
|
59
|
+
if err != nil {
|
|
60
|
+
return nil, errors.Wrap(err, "resolve test working directory")
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
patterns := normalizePatterns(r.Patterns)
|
|
64
|
+
if len(patterns) == 0 {
|
|
65
|
+
return nil, errors.New("at least one Go package pattern is required")
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
count := r.Count
|
|
69
|
+
if count == 0 {
|
|
70
|
+
count = 1
|
|
71
|
+
}
|
|
72
|
+
if count < 0 {
|
|
73
|
+
return nil, errors.New("test count must be positive")
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
buildTags := normalizeBuildTags(r.BuildTags)
|
|
77
|
+
var buildFlags []string
|
|
78
|
+
if len(buildTags) != 0 {
|
|
79
|
+
buildFlags = append(buildFlags, "-tags="+strings.Join(buildTags, ","))
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
workDir := strings.TrimSpace(r.WorkDir)
|
|
83
|
+
if workDir != "" {
|
|
84
|
+
var err error
|
|
85
|
+
workDir, err = filepath.Abs(workDir)
|
|
86
|
+
if err != nil {
|
|
87
|
+
return nil, errors.Wrap(err, "resolve test work directory")
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
outputRoot := strings.TrimSpace(r.OutputRoot)
|
|
92
|
+
if outputRoot != "" {
|
|
93
|
+
var err error
|
|
94
|
+
outputRoot, err = filepath.Abs(outputRoot)
|
|
95
|
+
if err != nil {
|
|
96
|
+
return nil, errors.Wrap(err, "resolve test output root")
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return &normalizedRequest{
|
|
101
|
+
Dir: absDir,
|
|
102
|
+
Patterns: patterns,
|
|
103
|
+
BuildFlags: buildFlags,
|
|
104
|
+
Run: strings.TrimSpace(r.Run),
|
|
105
|
+
Count: count,
|
|
106
|
+
Short: r.Short,
|
|
107
|
+
Timeout: r.Timeout,
|
|
108
|
+
Verbose: r.Verbose,
|
|
109
|
+
WorkDir: workDir,
|
|
110
|
+
OutputRoot: outputRoot,
|
|
111
|
+
}, nil
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
func normalizePatterns(patterns []string) []string {
|
|
115
|
+
if len(patterns) == 0 {
|
|
116
|
+
return nil
|
|
117
|
+
}
|
|
118
|
+
normalized := make([]string, 0, len(patterns))
|
|
119
|
+
for _, pattern := range patterns {
|
|
120
|
+
pattern = strings.TrimSpace(pattern)
|
|
121
|
+
if pattern != "" {
|
|
122
|
+
normalized = append(normalized, pattern)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return normalized
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
func normalizeBuildTags(tags []string) []string {
|
|
129
|
+
seen := make(map[string]bool)
|
|
130
|
+
var normalized []string
|
|
131
|
+
for _, value := range tags {
|
|
132
|
+
for _, tag := range strings.FieldsFunc(value, func(r rune) bool {
|
|
133
|
+
return r == ',' || r == ' ' || r == '\t' || r == '\n'
|
|
134
|
+
}) {
|
|
135
|
+
tag = strings.TrimSpace(tag)
|
|
136
|
+
if tag == "" || seen[tag] {
|
|
137
|
+
continue
|
|
138
|
+
}
|
|
139
|
+
seen[tag] = true
|
|
140
|
+
normalized = append(normalized, tag)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
slices.Sort(normalized)
|
|
144
|
+
return normalized
|
|
145
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
package gotest
|
|
2
|
+
|
|
3
|
+
import "github.com/aperturerobotics/goscript/compiler"
|
|
4
|
+
|
|
5
|
+
// Result describes one GoScript package-test run.
|
|
6
|
+
type Result struct {
|
|
7
|
+
// WorkDir is the generated test workspace.
|
|
8
|
+
WorkDir string
|
|
9
|
+
// OutputRoot is the generated TypeScript package root.
|
|
10
|
+
OutputRoot string
|
|
11
|
+
// Packages are deterministic package-level test results.
|
|
12
|
+
Packages []PackageResult
|
|
13
|
+
// Diagnostics are compiler diagnostics surfaced during the run.
|
|
14
|
+
Diagnostics []compiler.Diagnostic
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Passed returns true when every package result passed or had no tests.
|
|
18
|
+
func (r *Result) Passed() bool {
|
|
19
|
+
if r == nil {
|
|
20
|
+
return false
|
|
21
|
+
}
|
|
22
|
+
for _, pkg := range r.Packages {
|
|
23
|
+
if pkg.Action == ActionFail {
|
|
24
|
+
return false
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return true
|
|
28
|
+
}
|