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,316 @@
|
|
|
1
|
+
package compiler
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"slices"
|
|
8
|
+
"strings"
|
|
9
|
+
"testing"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
func TestCompileRequestValidation(t *testing.T) {
|
|
13
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
14
|
+
"go.mod": "module example.test/request\n\ngo 1.25.3\n",
|
|
15
|
+
"main.go": "package main\nfunc main() {}\n",
|
|
16
|
+
})
|
|
17
|
+
owner := NewCompileRequestOwner()
|
|
18
|
+
|
|
19
|
+
tests := []struct {
|
|
20
|
+
name string
|
|
21
|
+
req *CompileRequest
|
|
22
|
+
code string
|
|
23
|
+
}{
|
|
24
|
+
{
|
|
25
|
+
name: "empty package",
|
|
26
|
+
req: &CompileRequest{
|
|
27
|
+
Patterns: []string{""},
|
|
28
|
+
Dir: moduleDir,
|
|
29
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
30
|
+
DependencyMode: DependencyModeRequested,
|
|
31
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
32
|
+
},
|
|
33
|
+
code: "goscript/request:empty-package",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "single file",
|
|
37
|
+
req: &CompileRequest{
|
|
38
|
+
Patterns: []string{"main.go"},
|
|
39
|
+
Dir: moduleDir,
|
|
40
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
41
|
+
DependencyMode: DependencyModeRequested,
|
|
42
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
43
|
+
},
|
|
44
|
+
code: "goscript/request:single-file-unsupported",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "no output",
|
|
48
|
+
req: &CompileRequest{
|
|
49
|
+
Patterns: []string{"."},
|
|
50
|
+
Dir: moduleDir,
|
|
51
|
+
DependencyMode: DependencyModeRequested,
|
|
52
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
53
|
+
},
|
|
54
|
+
code: "goscript/request:no-output",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: "no module",
|
|
58
|
+
req: &CompileRequest{
|
|
59
|
+
Patterns: []string{"."},
|
|
60
|
+
Dir: t.TempDir(),
|
|
61
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
62
|
+
DependencyMode: DependencyModeRequested,
|
|
63
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
64
|
+
},
|
|
65
|
+
code: "goscript/request:no-module",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "empty build flag",
|
|
69
|
+
req: &CompileRequest{
|
|
70
|
+
Patterns: []string{"."},
|
|
71
|
+
Dir: moduleDir,
|
|
72
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
73
|
+
BuildFlags: []string{" "},
|
|
74
|
+
DependencyMode: DependencyModeRequested,
|
|
75
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
76
|
+
},
|
|
77
|
+
code: "goscript/request:empty-build-flag",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "dependency mode",
|
|
81
|
+
req: &CompileRequest{
|
|
82
|
+
Patterns: []string{"."},
|
|
83
|
+
Dir: moduleDir,
|
|
84
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
85
|
+
DependencyMode: DependencyMode("invalid"),
|
|
86
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
87
|
+
},
|
|
88
|
+
code: "goscript/request:dependency-mode",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: "runtime emission mode",
|
|
92
|
+
req: &CompileRequest{
|
|
93
|
+
Patterns: []string{"."},
|
|
94
|
+
Dir: moduleDir,
|
|
95
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
96
|
+
DependencyMode: DependencyModeRequested,
|
|
97
|
+
RuntimeEmissionMode: RuntimeEmissionMode("invalid"),
|
|
98
|
+
},
|
|
99
|
+
code: "goscript/request:runtime-emission-mode",
|
|
100
|
+
},
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
for _, tt := range tests {
|
|
104
|
+
t.Run(tt.name, func(t *testing.T) {
|
|
105
|
+
diagnostics := owner.Validate(tt.req)
|
|
106
|
+
requireDiagnosticCode(t, diagnostics, tt.code)
|
|
107
|
+
})
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
func TestPackageGraphLoadsRequestedPackage(t *testing.T) {
|
|
112
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
113
|
+
"go.mod": "module example.test/graph\n\ngo 1.25.3\n",
|
|
114
|
+
"main.go": "package main\nfunc main() {}\n",
|
|
115
|
+
})
|
|
116
|
+
graph := loadPackageGraph(t, &CompileRequest{
|
|
117
|
+
Patterns: []string{"."},
|
|
118
|
+
Dir: moduleDir,
|
|
119
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
120
|
+
DependencyMode: DependencyModeRequested,
|
|
121
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
if len(graph.Nodes) != 1 {
|
|
125
|
+
t.Fatalf("expected one requested node, got %d", len(graph.Nodes))
|
|
126
|
+
}
|
|
127
|
+
node := graph.Nodes[0]
|
|
128
|
+
if node.PkgPath != "example.test/graph" || !node.Requested {
|
|
129
|
+
t.Fatalf("unexpected node: %#v", node)
|
|
130
|
+
}
|
|
131
|
+
if node.ModulePath != "example.test/graph" {
|
|
132
|
+
t.Fatalf("unexpected module path: %q", node.ModulePath)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
func TestPackageGraphReportsLoadErrors(t *testing.T) {
|
|
137
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
138
|
+
"go.mod": "module example.test/loaderr\n\ngo 1.25.3\n",
|
|
139
|
+
"main.go": "package main\nimport \"missing.invalid/pkg\"\nfunc main() { _ = pkg.Value }\n",
|
|
140
|
+
})
|
|
141
|
+
_, diagnostics := NewPackageGraphOwner().Load(context.Background(), &CompileRequest{
|
|
142
|
+
Patterns: []string{"."},
|
|
143
|
+
Dir: moduleDir,
|
|
144
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
145
|
+
DependencyMode: DependencyModeRequested,
|
|
146
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
147
|
+
})
|
|
148
|
+
requireDiagnosticCode(t, diagnostics, "goscript/package-graph:load-error")
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
func TestPackageGraphHonorsBuildFlags(t *testing.T) {
|
|
152
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
153
|
+
"go.mod": "module example.test/tags\n\ngo 1.25.3\n",
|
|
154
|
+
"default.go": "package tags\nconst Selected = \"default\"\n",
|
|
155
|
+
"tagged.go": "//go:build customtag\n\npackage tags\nconst Tagged = true\n",
|
|
156
|
+
"excluded.go": "//go:build !customtag\n\npackage tags\nconst Excluded = true\n",
|
|
157
|
+
})
|
|
158
|
+
graph := loadPackageGraph(t, &CompileRequest{
|
|
159
|
+
Patterns: []string{"."},
|
|
160
|
+
Dir: moduleDir,
|
|
161
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
162
|
+
BuildFlags: []string{"-tags=customtag"},
|
|
163
|
+
DependencyMode: DependencyModeRequested,
|
|
164
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
var compiled []string
|
|
168
|
+
for _, file := range graph.Nodes[0].CompiledGoFiles {
|
|
169
|
+
compiled = append(compiled, filepath.Base(file))
|
|
170
|
+
}
|
|
171
|
+
if !slices.Contains(compiled, "tagged.go") {
|
|
172
|
+
t.Fatalf("expected tagged.go in compiled files: %v", compiled)
|
|
173
|
+
}
|
|
174
|
+
if slices.Contains(compiled, "excluded.go") {
|
|
175
|
+
t.Fatalf("did not expect excluded.go in compiled files: %v", compiled)
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
func TestPackageGraphAddsGoScriptBuildTag(t *testing.T) {
|
|
180
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
181
|
+
"go.mod": "module example.test/goscripttag\n\ngo 1.25.3\n",
|
|
182
|
+
"default.go": "package goscripttag\nconst Selected = \"default\"\n",
|
|
183
|
+
"goscript.go": "//go:build goscript\n\npackage goscripttag\nconst GoScript = true\n",
|
|
184
|
+
"excluded.go": "//go:build !goscript\n\npackage goscripttag\nconst Excluded = true\n",
|
|
185
|
+
"customtag.go": "//go:build customtag\n\npackage goscripttag\nconst Custom = true\n",
|
|
186
|
+
})
|
|
187
|
+
graph := loadPackageGraph(t, &CompileRequest{
|
|
188
|
+
Patterns: []string{"."},
|
|
189
|
+
Dir: moduleDir,
|
|
190
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
191
|
+
BuildFlags: []string{"-tags=customtag"},
|
|
192
|
+
DependencyMode: DependencyModeRequested,
|
|
193
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
var compiled []string
|
|
197
|
+
for _, file := range graph.Nodes[0].CompiledGoFiles {
|
|
198
|
+
compiled = append(compiled, filepath.Base(file))
|
|
199
|
+
}
|
|
200
|
+
for _, expected := range []string{"default.go", "goscript.go", "customtag.go"} {
|
|
201
|
+
if !slices.Contains(compiled, expected) {
|
|
202
|
+
t.Fatalf("expected %s in compiled files: %v", expected, compiled)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if slices.Contains(compiled, "excluded.go") {
|
|
206
|
+
t.Fatalf("did not expect excluded.go in compiled files: %v", compiled)
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
func TestPackageGraphLoadsLocalReplacement(t *testing.T) {
|
|
211
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
212
|
+
"go.mod": strings.Join([]string{
|
|
213
|
+
"module example.test/app",
|
|
214
|
+
"",
|
|
215
|
+
"go 1.25.3",
|
|
216
|
+
"",
|
|
217
|
+
"require example.test/lib v0.0.0",
|
|
218
|
+
"replace example.test/lib => ./lib",
|
|
219
|
+
"",
|
|
220
|
+
}, "\n"),
|
|
221
|
+
"main.go": "package main\nimport \"example.test/lib\"\nfunc main() { lib.Value() }\n",
|
|
222
|
+
"lib/go.mod": "module example.test/lib\n\ngo 1.25.3\n",
|
|
223
|
+
"lib/value.go": "package lib\nfunc Value() int { return 1 }\n",
|
|
224
|
+
"lib/unused.go": "package lib\n",
|
|
225
|
+
})
|
|
226
|
+
graph := loadPackageGraph(t, &CompileRequest{
|
|
227
|
+
Patterns: []string{"."},
|
|
228
|
+
Dir: moduleDir,
|
|
229
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
230
|
+
DependencyMode: DependencyModeAll,
|
|
231
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
if graph.NodesByPackagePath["example.test/lib"] == nil {
|
|
235
|
+
t.Fatalf("expected local replacement dependency in graph")
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
func TestPackageGraphDetectsOverrideCandidates(t *testing.T) {
|
|
240
|
+
moduleDir := writePackageGraphFixture(t, map[string]string{
|
|
241
|
+
"go.mod": "module example.test/override\n\ngo 1.25.3\n",
|
|
242
|
+
"main.go": "package main\nimport \"fmt\"\nfunc main() { fmt.Println(\"ok\") }\n",
|
|
243
|
+
})
|
|
244
|
+
graph := loadPackageGraph(t, &CompileRequest{
|
|
245
|
+
Patterns: []string{"."},
|
|
246
|
+
Dir: moduleDir,
|
|
247
|
+
OutputPath: filepath.Join(t.TempDir(), "out"),
|
|
248
|
+
DependencyMode: DependencyModeAll,
|
|
249
|
+
RuntimeEmissionMode: RuntimeEmissionModeEmit,
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
node := graph.NodesByPackagePath["fmt"]
|
|
253
|
+
if node == nil {
|
|
254
|
+
t.Fatalf("expected fmt node in graph")
|
|
255
|
+
}
|
|
256
|
+
if !node.OverrideCandidate {
|
|
257
|
+
t.Fatalf("expected fmt to be detected as an override candidate")
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
func TestPackageGraphOverrideCandidatesRequirePackageIndex(t *testing.T) {
|
|
262
|
+
parent := "github.com/aperturerobotics/wasivm/wazero/kernel"
|
|
263
|
+
child := parent + "/runtime"
|
|
264
|
+
facts, diagnostics := NewOverrideRegistryOwner().Facts(context.Background())
|
|
265
|
+
if diagnosticsHaveErrors(diagnostics) {
|
|
266
|
+
t.Fatalf("override facts failed: %#v", diagnostics)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if facts.HasPackage(parent) {
|
|
270
|
+
t.Fatalf("parent directory without an override index was detected as an override candidate")
|
|
271
|
+
}
|
|
272
|
+
if !facts.HasPackage(child) {
|
|
273
|
+
t.Fatalf("nested package with an override index was not detected as an override candidate")
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
func loadPackageGraph(t *testing.T, req *CompileRequest) *PackageGraph {
|
|
278
|
+
t.Helper()
|
|
279
|
+
|
|
280
|
+
diagnostics := NewCompileRequestOwner().Validate(req)
|
|
281
|
+
if diagnosticsHaveErrors(diagnostics) {
|
|
282
|
+
t.Fatalf("request validation failed: %#v", diagnostics)
|
|
283
|
+
}
|
|
284
|
+
graph, diagnostics := NewPackageGraphOwner().Load(context.Background(), req)
|
|
285
|
+
if diagnosticsHaveErrors(diagnostics) {
|
|
286
|
+
t.Fatalf("package graph load failed: %#v", diagnostics)
|
|
287
|
+
}
|
|
288
|
+
return graph
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
func writePackageGraphFixture(t *testing.T, files map[string]string) string {
|
|
292
|
+
t.Helper()
|
|
293
|
+
|
|
294
|
+
dir := t.TempDir()
|
|
295
|
+
for name, contents := range files {
|
|
296
|
+
path := filepath.Join(dir, name)
|
|
297
|
+
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
|
298
|
+
t.Fatal(err.Error())
|
|
299
|
+
}
|
|
300
|
+
if err := os.WriteFile(path, []byte(contents), 0o644); err != nil {
|
|
301
|
+
t.Fatal(err.Error())
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return dir
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
func requireDiagnosticCode(t *testing.T, diagnostics []Diagnostic, code string) {
|
|
308
|
+
t.Helper()
|
|
309
|
+
|
|
310
|
+
for _, diagnostic := range diagnostics {
|
|
311
|
+
if diagnostic.Code == code {
|
|
312
|
+
return
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
t.Fatalf("missing diagnostic %q in %#v", code, diagnostics)
|
|
316
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
package compiler
|
|
2
|
+
|
|
3
|
+
// PackageTestFunction describes one discovered ordinary Go test function.
|
|
4
|
+
type PackageTestFunction struct {
|
|
5
|
+
// Name is the Go TestXxx function name.
|
|
6
|
+
Name string
|
|
7
|
+
// PackagePath is the package variant that exports the function.
|
|
8
|
+
PackagePath string
|
|
9
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
package compiler
|
|
2
|
+
|
|
3
|
+
import "golang.org/x/tools/go/packages"
|
|
4
|
+
|
|
5
|
+
// PackageTestGraphPackage describes one requested package under test.
|
|
6
|
+
type PackageTestGraphPackage struct {
|
|
7
|
+
// PackagePath is the package under test.
|
|
8
|
+
PackagePath string
|
|
9
|
+
// PackageName is the base package name.
|
|
10
|
+
PackageName string
|
|
11
|
+
// PackageID is the go/packages package identity for the package under test.
|
|
12
|
+
PackageID string
|
|
13
|
+
// GoFiles are the package source files.
|
|
14
|
+
GoFiles []string
|
|
15
|
+
// CompiledGoFiles are files selected by build constraints.
|
|
16
|
+
CompiledGoFiles []string
|
|
17
|
+
// SamePackageTests is the same-package test variant when present.
|
|
18
|
+
SamePackageTests *PackageTestGraphVariant
|
|
19
|
+
// ExternalPackageTests is the external-package test variant when present.
|
|
20
|
+
ExternalPackageTests *PackageTestGraphVariant
|
|
21
|
+
// Diagnostics are package or variant load diagnostics attached to this package.
|
|
22
|
+
Diagnostics []Diagnostic
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// HasTests returns true when the package has any loaded test variant.
|
|
26
|
+
func (p *PackageTestGraphPackage) HasTests() bool {
|
|
27
|
+
return p != nil && (p.SamePackageTests != nil || p.ExternalPackageTests != nil)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
func (p *PackageTestGraphPackage) appendDiagnostics(diagnostics []Diagnostic) {
|
|
31
|
+
p.Diagnostics = append(p.Diagnostics, diagnostics...)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
func (p *PackageTestGraphPackage) setPackage(pkg *packages.Package) {
|
|
35
|
+
p.PackagePath = packagePath(pkg)
|
|
36
|
+
p.PackageName = pkg.Name
|
|
37
|
+
p.PackageID = pkg.ID
|
|
38
|
+
p.GoFiles = append([]string(nil), pkg.GoFiles...)
|
|
39
|
+
p.CompiledGoFiles = append([]string(nil), pkg.CompiledGoFiles...)
|
|
40
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
package compiler
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"go/ast"
|
|
5
|
+
"go/types"
|
|
6
|
+
"slices"
|
|
7
|
+
"strings"
|
|
8
|
+
"unicode"
|
|
9
|
+
|
|
10
|
+
"golang.org/x/tools/go/packages"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
// PackageTestGraphVariant describes one Go test package variant.
|
|
14
|
+
type PackageTestGraphVariant struct {
|
|
15
|
+
// ID is the go/packages package identity.
|
|
16
|
+
ID string
|
|
17
|
+
// PkgPath is the stable Go package path for this variant.
|
|
18
|
+
PkgPath string
|
|
19
|
+
// Name is the Go package name for this variant.
|
|
20
|
+
Name string
|
|
21
|
+
// ForTest is the package path this variant tests.
|
|
22
|
+
ForTest string
|
|
23
|
+
// GoFiles are the package source files.
|
|
24
|
+
GoFiles []string
|
|
25
|
+
// CompiledGoFiles are files selected by build constraints.
|
|
26
|
+
CompiledGoFiles []string
|
|
27
|
+
// Imports are packages imported directly by this test variant.
|
|
28
|
+
Imports []string
|
|
29
|
+
// Diagnostics are load diagnostics attached to this variant.
|
|
30
|
+
Diagnostics []Diagnostic
|
|
31
|
+
// Tests are ordinary TestXxx functions discovered in this variant.
|
|
32
|
+
Tests []PackageTestFunction
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
func newPackageTestGraphVariant(pkg *packages.Package, diagnostics []Diagnostic) *PackageTestGraphVariant {
|
|
36
|
+
imports := make([]string, 0, len(pkg.Imports))
|
|
37
|
+
for importPath := range pkg.Imports {
|
|
38
|
+
imports = append(imports, importPath)
|
|
39
|
+
}
|
|
40
|
+
slices.Sort(imports)
|
|
41
|
+
return &PackageTestGraphVariant{
|
|
42
|
+
ID: pkg.ID,
|
|
43
|
+
PkgPath: packagePath(pkg),
|
|
44
|
+
Name: pkg.Name,
|
|
45
|
+
ForTest: pkg.ForTest,
|
|
46
|
+
GoFiles: append([]string(nil), pkg.GoFiles...),
|
|
47
|
+
CompiledGoFiles: append([]string(nil), pkg.CompiledGoFiles...),
|
|
48
|
+
Imports: imports,
|
|
49
|
+
Diagnostics: append([]Diagnostic(nil), diagnostics...),
|
|
50
|
+
Tests: discoverPackageTestFunctions(pkg),
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
func discoverPackageTestFunctions(pkg *packages.Package) []PackageTestFunction {
|
|
55
|
+
if pkg == nil {
|
|
56
|
+
return nil
|
|
57
|
+
}
|
|
58
|
+
var tests []PackageTestFunction
|
|
59
|
+
for _, file := range pkg.Syntax {
|
|
60
|
+
for _, decl := range file.Decls {
|
|
61
|
+
fn, ok := decl.(*ast.FuncDecl)
|
|
62
|
+
if !ok || fn.Recv != nil || !isTestName(fn.Name.Name) {
|
|
63
|
+
continue
|
|
64
|
+
}
|
|
65
|
+
obj, _ := pkg.TypesInfo.Defs[fn.Name].(*types.Func)
|
|
66
|
+
if !isOrdinaryTestFunc(obj) {
|
|
67
|
+
continue
|
|
68
|
+
}
|
|
69
|
+
tests = append(tests, PackageTestFunction{
|
|
70
|
+
Name: fn.Name.Name,
|
|
71
|
+
PackagePath: packagePath(pkg),
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return tests
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
func isOrdinaryTestFunc(fn *types.Func) bool {
|
|
79
|
+
if fn == nil {
|
|
80
|
+
return false
|
|
81
|
+
}
|
|
82
|
+
sig, _ := fn.Type().(*types.Signature)
|
|
83
|
+
if sig == nil || sig.Params().Len() != 1 || sig.Results().Len() != 0 {
|
|
84
|
+
return false
|
|
85
|
+
}
|
|
86
|
+
ptr, _ := sig.Params().At(0).Type().(*types.Pointer)
|
|
87
|
+
if ptr == nil {
|
|
88
|
+
return false
|
|
89
|
+
}
|
|
90
|
+
named, _ := ptr.Elem().(*types.Named)
|
|
91
|
+
if named == nil || named.Obj() == nil || named.Obj().Pkg() == nil {
|
|
92
|
+
return false
|
|
93
|
+
}
|
|
94
|
+
return named.Obj().Name() == "T" && named.Obj().Pkg().Path() == "testing"
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
func isTestName(name string) bool {
|
|
98
|
+
if !strings.HasPrefix(name, "Test") || name == "Test" {
|
|
99
|
+
return false
|
|
100
|
+
}
|
|
101
|
+
for _, r := range strings.TrimPrefix(name, "Test") {
|
|
102
|
+
return !unicode.IsLower(r)
|
|
103
|
+
}
|
|
104
|
+
return false
|
|
105
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
package compiler
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"os"
|
|
6
|
+
"slices"
|
|
7
|
+
"strings"
|
|
8
|
+
|
|
9
|
+
"golang.org/x/tools/go/packages"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
// PackageTestGraph is the package-scoped graph used by GoScript test runners.
|
|
13
|
+
type PackageTestGraph struct {
|
|
14
|
+
// RequestedPatterns are the package patterns from the compile request.
|
|
15
|
+
RequestedPatterns []string
|
|
16
|
+
// Packages are deterministic package-test facts keyed by package under test.
|
|
17
|
+
Packages []*PackageTestGraphPackage
|
|
18
|
+
|
|
19
|
+
packagesByPath map[string]*PackageTestGraphPackage
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// PackageByPath returns the package facts for a package under test.
|
|
23
|
+
func (g *PackageTestGraph) PackageByPath(path string) *PackageTestGraphPackage {
|
|
24
|
+
if g == nil {
|
|
25
|
+
return nil
|
|
26
|
+
}
|
|
27
|
+
return g.packagesByPath[path]
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// LoadTestGraph builds package-scoped test graph facts for a validated request.
|
|
31
|
+
func (o *PackageGraphOwner) LoadTestGraph(ctx context.Context, req *CompileRequest) (*PackageTestGraph, []Diagnostic) {
|
|
32
|
+
if err := ctx.Err(); err != nil {
|
|
33
|
+
return nil, []Diagnostic{{
|
|
34
|
+
Severity: DiagnosticSeverityError,
|
|
35
|
+
Code: "goscript/context:canceled",
|
|
36
|
+
Message: err.Error(),
|
|
37
|
+
}}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
cfg := &packages.Config{
|
|
41
|
+
Context: ctx,
|
|
42
|
+
Dir: req.Dir,
|
|
43
|
+
Env: append(os.Environ(), "GOOS=js", "GOARCH=wasm"),
|
|
44
|
+
BuildFlags: goScriptBuildFlags(req.BuildFlags),
|
|
45
|
+
Tests: true,
|
|
46
|
+
Mode: packages.NeedName |
|
|
47
|
+
packages.NeedFiles |
|
|
48
|
+
packages.NeedCompiledGoFiles |
|
|
49
|
+
packages.NeedImports |
|
|
50
|
+
packages.NeedDeps |
|
|
51
|
+
packages.NeedExportFile |
|
|
52
|
+
packages.NeedTypes |
|
|
53
|
+
packages.NeedSyntax |
|
|
54
|
+
packages.NeedTypesInfo |
|
|
55
|
+
packages.NeedTypesSizes |
|
|
56
|
+
packages.NeedForTest |
|
|
57
|
+
packages.NeedModule,
|
|
58
|
+
}
|
|
59
|
+
pkgs, err := packages.Load(cfg, req.Patterns...)
|
|
60
|
+
if err != nil {
|
|
61
|
+
return nil, []Diagnostic{{
|
|
62
|
+
Severity: DiagnosticSeverityError,
|
|
63
|
+
Code: "goscript/package-graph:load",
|
|
64
|
+
Message: "failed to load Go test packages",
|
|
65
|
+
Detail: err.Error(),
|
|
66
|
+
}}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
graph := &PackageTestGraph{
|
|
70
|
+
RequestedPatterns: append([]string(nil), req.Patterns...),
|
|
71
|
+
packagesByPath: make(map[string]*PackageTestGraphPackage),
|
|
72
|
+
}
|
|
73
|
+
var diagnostics []Diagnostic
|
|
74
|
+
for _, pkg := range pkgs {
|
|
75
|
+
if pkg == nil || isTestMainPackage(pkg) {
|
|
76
|
+
continue
|
|
77
|
+
}
|
|
78
|
+
pkgDiagnostics := packageDiagnostics(pkg)
|
|
79
|
+
diagnostics = append(diagnostics, pkgDiagnostics...)
|
|
80
|
+
if pkg.ForTest == "" {
|
|
81
|
+
facts := graph.packageFacts(packagePath(pkg))
|
|
82
|
+
facts.setPackage(pkg)
|
|
83
|
+
facts.appendDiagnostics(pkgDiagnostics)
|
|
84
|
+
continue
|
|
85
|
+
}
|
|
86
|
+
facts := graph.packageFacts(pkg.ForTest)
|
|
87
|
+
variant := newPackageTestGraphVariant(pkg, pkgDiagnostics)
|
|
88
|
+
if strings.HasSuffix(pkg.Name, "_test") {
|
|
89
|
+
facts.ExternalPackageTests = variant
|
|
90
|
+
} else {
|
|
91
|
+
facts.SamePackageTests = variant
|
|
92
|
+
}
|
|
93
|
+
facts.appendDiagnostics(pkgDiagnostics)
|
|
94
|
+
}
|
|
95
|
+
if len(graph.Packages) == 0 {
|
|
96
|
+
diagnostics = append(diagnostics, Diagnostic{
|
|
97
|
+
Severity: DiagnosticSeverityError,
|
|
98
|
+
Code: "goscript/package-graph:no-test-packages",
|
|
99
|
+
Message: "package patterns did not match any test packages",
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
slices.SortFunc(graph.Packages, func(a, b *PackageTestGraphPackage) int {
|
|
103
|
+
return strings.Compare(a.PackagePath, b.PackagePath)
|
|
104
|
+
})
|
|
105
|
+
return graph, diagnostics
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
func (g *PackageTestGraph) packageFacts(path string) *PackageTestGraphPackage {
|
|
109
|
+
facts := g.packagesByPath[path]
|
|
110
|
+
if facts != nil {
|
|
111
|
+
return facts
|
|
112
|
+
}
|
|
113
|
+
facts = &PackageTestGraphPackage{PackagePath: path}
|
|
114
|
+
g.packagesByPath[path] = facts
|
|
115
|
+
g.Packages = append(g.Packages, facts)
|
|
116
|
+
return facts
|
|
117
|
+
}
|