diff --git a/Makefile b/Makefile index c63cf43d..7fd0c144 100644 --- a/Makefile +++ b/Makefile @@ -150,10 +150,18 @@ all: $(ALL-TARGETS) stdlib-targets: $(STDLIB-TARGETS) +stdlib-present: + @for file in $(STDLIB-TARGETS); do \ + test -f "$$file" || { \ + echo "missing committed stdlib source: $$file" >&2; \ + exit 1; \ + }; \ + done + generate: $(GO) go generate ./... -aot: $(GO) $(STDLIB-TARGETS) +aot: $(GO) stdlib-present GLOJURE_USE_AOT=false \ GLOJURE_STDLIB_PATH=./pkg/stdlib \ go run -tags glj_no_aot_stdlib ./cmd/glj \ @@ -196,7 +204,7 @@ bin/%/glj: generate \ @mkdir -p $(dir $@) scripts/build-glj.sh $@ $* -bin/%/glj.wasm: \ +bin/%/glj.wasm: $(GO) \ $(wildcard ./cmd/glj/*.go) \ $(wildcard ./pkg/**/*.go) \ $(wildcard ./internal/**/*.go) \ @@ -209,7 +217,7 @@ vet: $(GO) go vet ./... # vet is disabled until we fix errors in generated code -test: test-aot-runtime test-glj # vet +test: test-aot-runtime test-glj test-repl-wasm test-repl-bsd # vet ($(MAKE) test-suite v=1 || $(MAKE) test-suite v=1) || $(MAKE) test-suite v=1 TEST-COMPARE-LOAD := $(shell \ @@ -226,6 +234,23 @@ test-compare: $(YS) test-aot-runtime: $(GO) go test -tags glj_aot_runtime ./pkg/glj ./pkg/gljmain ./pkg/runtime +.PHONY: test-repl-wasm +test-repl-wasm: $(GO) + GOOS=js GOARCH=wasm CGO_ENABLED=0 go build ./pkg/repl + +.PHONY: test-repl-bsd +test-repl-bsd: $(GO) + @set -e; \ + for target in \ + dragonfly/amd64 \ + freebsd/386 freebsd/amd64 freebsd/arm64 \ + netbsd/amd64 netbsd/arm64 \ + openbsd/amd64 openbsd/arm64; do \ + echo "Building pkg/repl for $$target"; \ + GOOS=$${target%/*} GOARCH=$${target#*/} CGO_ENABLED=0 \ + go build ./pkg/repl; \ + done + .PHONY: test-aot test-suite-aot test-aot: test-aot-runtime test-glj $(MAKE) test-suite-aot @@ -276,7 +301,7 @@ release-dist: @$(if $(filter command line,$(origin VERSION)),,\ $(error VERSION is required on the command line)) $(eval RELEASE_VER := $(patsubst v%,%,$(VERSION))) - GLJ_VERSION=v$(RELEASE_VER) $(MAKE) stdlib-targets generate aot glj-imports $(RELEASE-BINS) + GLJ_VERSION=v$(RELEASE_VER) $(MAKE) generate aot glj-imports $(RELEASE-BINS) mkdir -p dist $(foreach p,$(RELEASE-PLATFORMS), \ tar -czf dist/glj-$(RELEASE_VER)-$(p).tar.gz -C bin/$(p) glj ;) @@ -302,7 +327,6 @@ release: $(GH) $(eval RELEASE_VER := $(patsubst v%,%,$(VERSION))) @echo "=== Release v$(RELEASE_VER) ===" $(MAKE) clean - $(MAKE) stdlib-targets $(MAKE) generate aot $(MAKE) glj-imports force=1 GLJ_VERSION=v$(RELEASE_VER) $(MAKE) build diff --git a/README.md b/README.md index 66577560..da21d762 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,50 @@ $ glj server.glj Server starting on :8080... ``` +#### Dynamic dependencies + +Glojure embeds the ClojureStar dependency facade and Grenadine resolver. A +script can acquire a Maven library and import its namespace without a JVM: + +```clojure +(require '[clojurestar.deps :refer [require-deps]]) + +(require-deps + ["mvn:dev.weavejester/medley@1.10.0/medley.core" :as medley]) + +(println (medley/index-by :id [{:id 1} {:id 2}])) +``` + +Literal libspec vectors do not need quoting; quoted vectors remain supported. +`require-deps` accepts Maven, Gist, and GitHub source-file coordinates, with `:as` or an explicit +`:refer [...]` list. Use `clojurestar.deps/add-deps` or `glojure.deps` +for deps.edn-style Maven, Git, and local coordinates. +A pinned Gist file accepts either `gist://@` or +`gist:///`; both forms use the same cache entry. +A GitHub source file accepts either +`github:///` or the equivalent +`github://blob//` form. Refs occupy one path +segment; full commit SHAs reuse persistent cache while named refs refresh in a +new process. Selected files must be self-contained and begin with an `ns` form. + +The Maven repository is selected in this order: + +1. explicit `:mvn/local-repo` or `:local-repo`; +2. `GLOJURE_MAVEN_REPOSITORY`; +3. `GRENADINE_MAVEN_REPOSITORY`; +4. `$HOME/.m2/repository`. + +The Git, Gist, and GitHub source cache root uses explicit `:gitlibs/dir` or `:gitlibs-dir`, then +`GLOJURE_GITLIBS_DIR`, `GRENADINE_GITLIBS_DIR`, `GITLIBS`, and finally +`$HOME/.gitlibs`. Gist and GitHub source are stored under `gist/` and +`github/` in that root; +`require-deps` also accepts `:cache-dir` as a compatibility alias. + +Glojure supplies `org.clojure/clojure` and `org.clojure/clojurescript`, so +those coordinates are terminal: their artifacts and transitive dependencies +are not acquired. Explicit dependencies such as `org.clojure/spec.alpha` +remain ordinary coordinates, subject to Glojure's source compatibility. + ### Embedding Glojure in Go Applications You can also embed Glojure as a scripting language within your Go applications. diff --git a/pkg/compiler/analyze.go b/pkg/compiler/analyze.go index 2a9824a0..994b1ddb 100644 --- a/pkg/compiler/analyze.go +++ b/pkg/compiler/analyze.go @@ -247,6 +247,9 @@ func (a *Analyzer) analyzeSeq(form ISeq, env Env) (*ast.Node, error) { if op == nil { return nil, exInfo("can't call nil", nil) // TODO: include form and source info } + if symbol, ok := op.(*Symbol); ok && isSpecialFormSymbol(symbol) { + return a.parse(form, env) + } mform, err := a.Macroexpand1(form) if err != nil { return nil, err @@ -264,6 +267,16 @@ func (a *Analyzer) analyzeSeq(form ISeq, env Env) (*ast.Node, error) { return withRawForm(n, form), nil } +func isSpecialFormSymbol(symbol *Symbol) bool { + switch symbol.FullName() { + case "do", "if", "new", "quote", "set!", "try", "throw", "def", ".", + "let*", "letfn*", "loop*", "recur", "fn*", "var", "case*", "go/go": + return true + default: + return false + } +} + // analyzeConst performs semantic analysis on the given constant // expression, func (a *Analyzer) analyzeConst(v interface{}, env Env) (*ast.Node, error) { diff --git a/pkg/compiler/analyze_test.go b/pkg/compiler/analyze_test.go index f9c580c8..d75b4530 100644 --- a/pkg/compiler/analyze_test.go +++ b/pkg/compiler/analyze_test.go @@ -53,6 +53,17 @@ func TestResolvedHostConstantsRetainTheirSymbols(t *testing.T) { } } +func TestSpecialFormsAreRecognizedBeforeMacroExpansion(t *testing.T) { + for _, name := range []string{"def", "if", "let*", "fn*", "try"} { + if !isSpecialFormSymbol(lang.NewSymbol(name)) { + t.Fatalf("%s was not recognized as a special form", name) + } + } + if isSpecialFormSymbol(lang.NewSymbol("ordinary-macro")) { + t.Fatal("ordinary macro was recognized as a special form") + } +} + func TestInlineExpansionSupportedChecksHostMethodArity(t *testing.T) { resolveNumbers := func(sym *lang.Symbol) (interface{}, bool) { if sym.String() == "test/Numbers" { diff --git a/pkg/gen/gljimports/gljimports_darwin_amd64.go b/pkg/gen/gljimports/gljimports_darwin_amd64.go index 3a20686a..4fa445be 100644 --- a/pkg/gen/gljimports/gljimports_darwin_amd64.go +++ b/pkg/gen/gljimports/gljimports_darwin_amd64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_darwin_arm64.go b/pkg/gen/gljimports/gljimports_darwin_arm64.go index f12feeb3..0bd2d427 100644 --- a/pkg/gen/gljimports/gljimports_darwin_arm64.go +++ b/pkg/gen/gljimports/gljimports_darwin_arm64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_dragonfly_amd64.go b/pkg/gen/gljimports/gljimports_dragonfly_amd64.go index c5d95fab..498f6a13 100644 --- a/pkg/gen/gljimports/gljimports_dragonfly_amd64.go +++ b/pkg/gen/gljimports/gljimports_dragonfly_amd64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_freebsd_386.go b/pkg/gen/gljimports/gljimports_freebsd_386.go index c29f3a34..08ed903a 100644 --- a/pkg/gen/gljimports/gljimports_freebsd_386.go +++ b/pkg/gen/gljimports/gljimports_freebsd_386.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_freebsd_amd64.go b/pkg/gen/gljimports/gljimports_freebsd_amd64.go index 87f07c38..0c66d5d3 100644 --- a/pkg/gen/gljimports/gljimports_freebsd_amd64.go +++ b/pkg/gen/gljimports/gljimports_freebsd_amd64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_freebsd_arm64.go b/pkg/gen/gljimports/gljimports_freebsd_arm64.go index f72c171c..c231d348 100644 --- a/pkg/gen/gljimports/gljimports_freebsd_arm64.go +++ b/pkg/gen/gljimports/gljimports_freebsd_arm64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_js_wasm.go b/pkg/gen/gljimports/gljimports_js_wasm.go index 646a42ac..8427d624 100644 --- a/pkg/gen/gljimports/gljimports_js_wasm.go +++ b/pkg/gen/gljimports/gljimports_js_wasm.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_linux_386.go b/pkg/gen/gljimports/gljimports_linux_386.go index 00816b05..b3df814e 100644 --- a/pkg/gen/gljimports/gljimports_linux_386.go +++ b/pkg/gen/gljimports/gljimports_linux_386.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_linux_amd64.go b/pkg/gen/gljimports/gljimports_linux_amd64.go index 47b723db..e8ba6240 100644 --- a/pkg/gen/gljimports/gljimports_linux_amd64.go +++ b/pkg/gen/gljimports/gljimports_linux_amd64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_linux_arm.go b/pkg/gen/gljimports/gljimports_linux_arm.go index 3e82ee7d..14375f1d 100644 --- a/pkg/gen/gljimports/gljimports_linux_arm.go +++ b/pkg/gen/gljimports/gljimports_linux_arm.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_linux_arm64.go b/pkg/gen/gljimports/gljimports_linux_arm64.go index 620e79e3..82c6828e 100644 --- a/pkg/gen/gljimports/gljimports_linux_arm64.go +++ b/pkg/gen/gljimports/gljimports_linux_arm64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_linux_ppc64le.go b/pkg/gen/gljimports/gljimports_linux_ppc64le.go index a473b8ca..e27a1b5e 100644 --- a/pkg/gen/gljimports/gljimports_linux_ppc64le.go +++ b/pkg/gen/gljimports/gljimports_linux_ppc64le.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_linux_riscv64.go b/pkg/gen/gljimports/gljimports_linux_riscv64.go index ba8e0e42..f5f4e231 100644 --- a/pkg/gen/gljimports/gljimports_linux_riscv64.go +++ b/pkg/gen/gljimports/gljimports_linux_riscv64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_linux_s390x.go b/pkg/gen/gljimports/gljimports_linux_s390x.go index e5b03f30..5dffa74d 100644 --- a/pkg/gen/gljimports/gljimports_linux_s390x.go +++ b/pkg/gen/gljimports/gljimports_linux_s390x.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_netbsd_amd64.go b/pkg/gen/gljimports/gljimports_netbsd_amd64.go index 8b48d1df..aa8a50ac 100644 --- a/pkg/gen/gljimports/gljimports_netbsd_amd64.go +++ b/pkg/gen/gljimports/gljimports_netbsd_amd64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_netbsd_arm64.go b/pkg/gen/gljimports/gljimports_netbsd_arm64.go index 5e1ebe1f..ad7175cc 100644 --- a/pkg/gen/gljimports/gljimports_netbsd_arm64.go +++ b/pkg/gen/gljimports/gljimports_netbsd_arm64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_openbsd_amd64.go b/pkg/gen/gljimports/gljimports_openbsd_amd64.go index 5d2f458d..6b8fbd44 100644 --- a/pkg/gen/gljimports/gljimports_openbsd_amd64.go +++ b/pkg/gen/gljimports/gljimports_openbsd_amd64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_openbsd_arm64.go b/pkg/gen/gljimports/gljimports_openbsd_arm64.go index f40d8c94..96d828fb 100644 --- a/pkg/gen/gljimports/gljimports_openbsd_arm64.go +++ b/pkg/gen/gljimports/gljimports_openbsd_arm64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_plan9_386.go b/pkg/gen/gljimports/gljimports_plan9_386.go index 115052d9..6211c7c2 100644 --- a/pkg/gen/gljimports/gljimports_plan9_386.go +++ b/pkg/gen/gljimports/gljimports_plan9_386.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_plan9_amd64.go b/pkg/gen/gljimports/gljimports_plan9_amd64.go index c3ab8dea..46c9cc67 100644 --- a/pkg/gen/gljimports/gljimports_plan9_amd64.go +++ b/pkg/gen/gljimports/gljimports_plan9_amd64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_plan9_arm.go b/pkg/gen/gljimports/gljimports_plan9_arm.go index 3824c65b..d822d15c 100644 --- a/pkg/gen/gljimports/gljimports_plan9_arm.go +++ b/pkg/gen/gljimports/gljimports_plan9_arm.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_wasip1_wasm.go b/pkg/gen/gljimports/gljimports_wasip1_wasm.go index 6220a280..062404be 100644 --- a/pkg/gen/gljimports/gljimports_wasip1_wasm.go +++ b/pkg/gen/gljimports/gljimports_wasip1_wasm.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_windows_386.go b/pkg/gen/gljimports/gljimports_windows_386.go index b80cd247..2acc4b2e 100644 --- a/pkg/gen/gljimports/gljimports_windows_386.go +++ b/pkg/gen/gljimports/gljimports_windows_386.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_windows_amd64.go b/pkg/gen/gljimports/gljimports_windows_amd64.go index f0637d11..3f3c3d1e 100644 --- a/pkg/gen/gljimports/gljimports_windows_amd64.go +++ b/pkg/gen/gljimports/gljimports_windows_amd64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_windows_arm.go b/pkg/gen/gljimports/gljimports_windows_arm.go index a6d70d61..e27d4441 100644 --- a/pkg/gen/gljimports/gljimports_windows_arm.go +++ b/pkg/gen/gljimports/gljimports_windows_arm.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/gen/gljimports/gljimports_windows_arm64.go b/pkg/gen/gljimports/gljimports_windows_arm64.go index 731e0b9c..060d7bbc 100644 --- a/pkg/gen/gljimports/gljimports_windows_arm64.go +++ b/pkg/gen/gljimports/gljimports_windows_arm64.go @@ -373,6 +373,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*EmptyList", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyList)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*EmptyMapIterator", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.EmptyMapIterator)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.EmptyPersistentQueue", github_com_glojurelang_glojure_pkg_lang.EmptyPersistentQueue) _register("github.com/glojurelang/glojure/pkg/lang.Environment", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Environment)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Equals", github_com_glojurelang_glojure_pkg_lang.Equals) _register("github.com/glojurelang/glojure/pkg/lang.Equalser", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Equalser)(nil)).Elem()) @@ -741,6 +742,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewChunkBuffer", github_com_glojurelang_glojure_pkg_lang.NewChunkBuffer) _register("github.com/glojurelang/glojure/pkg/lang.NewChunkedCons", github_com_glojurelang_glojure_pkg_lang.NewChunkedCons) _register("github.com/glojurelang/glojure/pkg/lang.NewClass", github_com_glojurelang_glojure_pkg_lang.NewClass) + _register("github.com/glojurelang/glojure/pkg/lang.NewClassWithTypes", github_com_glojurelang_glojure_pkg_lang.NewClassWithTypes) _register("github.com/glojurelang/glojure/pkg/lang.NewCompilerError", github_com_glojurelang_glojure_pkg_lang.NewCompilerError) _register("github.com/glojurelang/glojure/pkg/lang.NewCons", github_com_glojurelang_glojure_pkg_lang.NewCons) _register("github.com/glojurelang/glojure/pkg/lang.NewCycle", github_com_glojurelang_glojure_pkg_lang.NewCycle) @@ -816,6 +818,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.NewSubVector", github_com_glojurelang_glojure_pkg_lang.NewSubVector) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbol", github_com_glojurelang_glojure_pkg_lang.NewSymbol) _register("github.com/glojurelang/glojure/pkg/lang.NewSymbolUnchecked", github_com_glojurelang_glojure_pkg_lang.NewSymbolUnchecked) + _register("github.com/glojurelang/glojure/pkg/lang.NewTaggedLiteral", github_com_glojurelang_glojure_pkg_lang.NewTaggedLiteral) _register("github.com/glojurelang/glojure/pkg/lang.NewTimeoutError", github_com_glojurelang_glojure_pkg_lang.NewTimeoutError) _register("github.com/glojurelang/glojure/pkg/lang.NewUnsupportedOperationError", github_com_glojurelang_glojure_pkg_lang.NewUnsupportedOperationError) _register("github.com/glojurelang/glojure/pkg/lang.NewVar", github_com_glojurelang_glojure_pkg_lang.NewVar) @@ -846,6 +849,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentHashSet", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentHashSet)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*PersistentQueue", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentQueue)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*PersistentStructMap", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMap)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.PersistentStructMapDef", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.PersistentStructMapDef)(nil)).Elem()) @@ -866,6 +871,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Range", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Range)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ratio", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ratio)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReadablePrinter", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.ReadablePrinter)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Record", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Record)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RecordApplyTo", github_com_glojurelang_glojure_pkg_lang.RecordApplyTo) @@ -904,9 +910,12 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.*Reduced", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reduced)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Ref", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Ref)(nil))) + _register("github.com/glojurelang/glojure/pkg/lang.ReflectType", github_com_glojurelang_glojure_pkg_lang.ReflectType) _register("github.com/glojurelang/glojure/pkg/lang.RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*RegexpMatcher", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RegexpMatcher)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterHostTypeConstructor", github_com_glojurelang_glojure_pkg_lang.RegisterHostTypeConstructor) + _register("github.com/glojurelang/glojure/pkg/lang.RegisterReadablePrinter", github_com_glojurelang_glojure_pkg_lang.RegisterReadablePrinter) _register("github.com/glojurelang/glojure/pkg/lang.RegisterStringMethod", github_com_glojurelang_glojure_pkg_lang.RegisterStringMethod) _register("github.com/glojurelang/glojure/pkg/lang.RemoveNamespace", github_com_glojurelang_glojure_pkg_lang.RemoveNamespace) _register("github.com/glojurelang/glojure/pkg/lang.Repeat", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Repeat)(nil)).Elem()) @@ -915,6 +924,11 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Rest", github_com_glojurelang_glojure_pkg_lang.Rest) _register("github.com/glojurelang/glojure/pkg/lang.ReverseString", github_com_glojurelang_glojure_pkg_lang.ReverseString) _register("github.com/glojurelang/glojure/pkg/lang.Reversible", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Reversible)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingMode", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.RoundingMode)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeCeiling", github_com_glojurelang_glojure_pkg_lang.RoundingModeCeiling) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeDown", github_com_glojurelang_glojure_pkg_lang.RoundingModeDown) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeFloor", github_com_glojurelang_glojure_pkg_lang.RoundingModeFloor) + _register("github.com/glojurelang/glojure/pkg/lang.RoundingModeHalfEven", github_com_glojurelang_glojure_pkg_lang.RoundingModeHalfEven) _register("github.com/glojurelang/glojure/pkg/lang.RuneFromCharLiteral", github_com_glojurelang_glojure_pkg_lang.RuneFromCharLiteral) _register("github.com/glojurelang/glojure/pkg/lang.SafeMerge", github_com_glojurelang_glojure_pkg_lang.SafeMerge) _register("github.com/glojurelang/glojure/pkg/lang.Seq", github_com_glojurelang_glojure_pkg_lang.Seq) @@ -952,6 +966,8 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/lang.Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*Symbol", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.Symbol)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.SymbolCoreNamespace", github_com_glojurelang_glojure_pkg_lang.SymbolCoreNamespace) + _register("github.com/glojurelang/glojure/pkg/lang.TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil)).Elem()) + _register("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TaggedLiteral)(nil))) _register("github.com/glojurelang/glojure/pkg/lang.Throwable", github_com_glojurelang_glojure_pkg_lang.Throwable) _register("github.com/glojurelang/glojure/pkg/lang.TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/lang.*TimeoutError", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_lang.TimeoutError)(nil))) @@ -1037,6 +1053,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/repl.WithEnvironment", github_com_glojurelang_glojure_pkg_repl.WithEnvironment) _register("github.com/glojurelang/glojure/pkg/repl.WithHistoryFile", github_com_glojurelang_glojure_pkg_repl.WithHistoryFile) _register("github.com/glojurelang/glojure/pkg/repl.WithNREPLClient", github_com_glojurelang_glojure_pkg_repl.WithNREPLClient) + _register("github.com/glojurelang/glojure/pkg/repl.WithShareBaseURL", github_com_glojurelang_glojure_pkg_repl.WithShareBaseURL) _register("github.com/glojurelang/glojure/pkg/repl.WithStdin", github_com_glojurelang_glojure_pkg_repl.WithStdin) _register("github.com/glojurelang/glojure/pkg/repl.WithStdout", github_com_glojurelang_glojure_pkg_repl.WithStdout) @@ -1082,6 +1099,7 @@ func RegisterImports(_register func(string, interface{})) { _register("github.com/glojurelang/glojure/pkg/runtime.ReducePipelineTransformKind", reflect.TypeOf((*github_com_glojurelang_glojure_pkg_runtime.ReducePipelineTransformKind)(nil)).Elem()) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterNSLoader", github_com_glojurelang_glojure_pkg_runtime.RegisterNSLoader) _register("github.com/glojurelang/glojure/pkg/runtime.RegisterURLOpener", github_com_glojurelang_glojure_pkg_runtime.RegisterURLOpener) + _register("github.com/glojurelang/glojure/pkg/runtime.SetSourceTransformer", github_com_glojurelang_glojure_pkg_runtime.SetSourceTransformer) _register("github.com/glojurelang/glojure/pkg/runtime.SymInNS", github_com_glojurelang_glojure_pkg_runtime.SymInNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymNS", github_com_glojurelang_glojure_pkg_runtime.SymNS) _register("github.com/glojurelang/glojure/pkg/runtime.SymbolDot", github_com_glojurelang_glojure_pkg_runtime.SymbolDot) diff --git a/pkg/glj/init-bootstrap.go b/pkg/glj/init-bootstrap.go index 57274ec3..d007fa09 100644 --- a/pkg/glj/init-bootstrap.go +++ b/pkg/glj/init-bootstrap.go @@ -8,6 +8,7 @@ import ( "net/url" "reflect" + "github.com/glojurelang/glojure/pkg/lang" "github.com/glojurelang/glojure/pkg/pkgmap" "github.com/glojurelang/glojure/pkg/runtime" "github.com/google/uuid" @@ -17,6 +18,10 @@ import ( // standard library. Production builds use the generated AOT loaders and do not // need these bootstrap-only exports in their default interop registry. func init() { + pkgmap.Set("clojure.lang.ChunkBuffer", reflect.TypeOf((*lang.ChunkBuffer)(nil))) + pkgmap.Set("clojure.lang.IChunk", reflect.TypeOf((*lang.IChunk)(nil)).Elem()) + pkgmap.Set("github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral", reflect.TypeOf((*lang.TaggedLiteral)(nil))) + pkgmap.Set("go/ast.*Ident", reflect.TypeOf((*ast.Ident)(nil))) pkgmap.Set("go/ast.*ArrayType", reflect.TypeOf((*ast.ArrayType)(nil))) pkgmap.Set("go/ast.*MapType", reflect.TypeOf((*ast.MapType)(nil))) diff --git a/pkg/glj/init_bootstrap_test.go b/pkg/glj/init_bootstrap_test.go index 0e2d4abb..8d3a0006 100644 --- a/pkg/glj/init_bootstrap_test.go +++ b/pkg/glj/init_bootstrap_test.go @@ -8,9 +8,28 @@ import ( "reflect" "testing" + "github.com/glojurelang/glojure/pkg/lang" "github.com/glojurelang/glojure/pkg/pkgmap" ) +func TestBootstrapRegistersCoreTypes(t *testing.T) { + types := map[string]reflect.Type{ + "clojure.lang.ChunkBuffer": reflect.TypeOf((*lang.ChunkBuffer)(nil)), + "clojure.lang.IChunk": reflect.TypeOf((*lang.IChunk)(nil)).Elem(), + "github.com/glojurelang/glojure/pkg/lang.*TaggedLiteral": reflect.TypeOf((*lang.TaggedLiteral)(nil)), + } + for name, want := range types { + got, ok := pkgmap.Get(name) + if !ok { + t.Errorf("bootstrap package map does not contain %s", name) + continue + } + if got != want { + t.Errorf("bootstrap package map %s = %v, want %v", name, got, want) + } + } +} + func TestBootstrapRegistersGoTypesDependencies(t *testing.T) { types := map[string]reflect.Type{ "go/ast.*Ident": reflect.TypeOf((*ast.Ident)(nil)), diff --git a/pkg/gljmain/gljmain.go b/pkg/gljmain/gljmain.go index 004cfbf5..e3aed44e 100644 --- a/pkg/gljmain/gljmain.go +++ b/pkg/gljmain/gljmain.go @@ -3,9 +3,11 @@ package gljmain import ( "bufio" "fmt" + "io" "log" "os" "path/filepath" + "strconv" "strings" // bootstrap the runtime @@ -50,9 +52,10 @@ func interactiveCommands() InteractiveCommands { func printHelp() { fmt.Printf(`Glojure v%s -Usage: glj [options] [file] +Usage: glj [options] [file | -] Options: + -Sdeps Merge inline deps data after the project deps.edn -e Evaluate expression from command line --nrepl[=VALUE] Start nREPL server --nrepl-connect H:P Connect REPL to nREPL server @@ -61,10 +64,14 @@ Options: -h, --help Show this help message --version Show version information +A deps.edn in the current directory is resolved before evaluating code, +running a file, or starting a REPL or REPL server. + Examples: glj # Start REPL glj -e "(+ 1 2)" # Evaluate expression glj script.glj # Run script file + printf '(println 42)\n' | glj - # Run script from stdin glj --nrepl # Start nREPL on random port glj --nrepl=7888 # Start nREPL on port 7888 glj --nrepl=0.0.0.0:7888 # Bind to all interfaces @@ -79,12 +86,96 @@ For more information, visit: https://github.com/glojurelang/glojure `, runtime.Version) } +func usesProjectDeps(args []string) bool { + if len(args) == 0 { + return true + } + arg := args[0] + return arg == "-e" || arg == "--nrepl" || strings.HasPrefix(arg, "--nrepl=") || + arg == "--srepl" || strings.HasPrefix(arg, "--srepl=") || + arg == "-" || !strings.HasPrefix(arg, "-") +} + +func runScript(input io.Reader, args []string) { + env := lang.GlobalEnv + + core := lang.FindNamespace(lang.NewSymbol("clojure.core")) + core.FindInternedVar(lang.NewSymbol("*command-line-args*")).BindRoot(lang.Seq(args)) + + rdr := reader.New(bufio.NewReader(input), reader.WithGetCurrentNS(func() *lang.Namespace { + return env.CurrentNamespace() + })) + for { + val, err := rdr.ReadOne() + if err == reader.ErrEOF { + break + } + if err != nil { + log.Fatal(err) + } + _, err = env.Eval(val) + if err != nil { + log.Fatal(err) + } + } +} + +func splitDepsOption(args []string) (string, []string, error) { + if len(args) == 0 || args[0] != "-Sdeps" { + return "", args, nil + } + if len(args) < 2 { + return "", nil, fmt.Errorf("glj: -Sdeps requires an EDN map") + } + return args[1], args[2:], nil +} + +func loadProjectDeps(extraEDN string) { + const path = "deps.edn" + projectEDN := "{}" + if content, err := os.ReadFile(path); err == nil { + projectEDN = string(content) + } else { + if os.IsNotExist(err) { + if extraEDN == "" { + return + } + } else { + log.Fatal(err) + } + } + if extraEDN == "" { + extraEDN = "{}" + } + runtime.ReadEval( + fmt.Sprintf( + `(require 'clojurestar.deps) + (let [merge-value (fn [left right] + (if (and (map? left) (map? right)) + (merge left right) + right))] + (clojurestar.deps/add-deps + (merge-with merge-value + (read-string %s) + (read-string %s))))`, + strconv.Quote(projectEDN), strconv.Quote(extraEDN)), + runtime.WithFilename(path), + ) +} + func Main(args []string) { for _, path := range filepath.SplitList(os.Getenv("GLJ_CLASSPATH")) { if path != "" { runtime.AddLoadPath(os.DirFS(path)) } } + extraEDN, args, err := splitDepsOption(args) + if err != nil { + log.Fatal(err) + } + if usesProjectDeps(args) { + loadProjectDeps(extraEDN) + } if len(args) == 0 { // Check if stdin is a terminal @@ -167,6 +258,8 @@ func Main(args []string) { if !lang.IsNil(lastResult) { fmt.Println(lang.PrintString(lastResult)) } + } else if args[0] == "-" { + runScript(os.Stdin, args[1:]) } else if strings.HasPrefix(args[0], "-") { log.Fatalf("glj: unknown option: %s\nRun 'glj --help' for usage.", args[0]) } else { @@ -175,26 +268,11 @@ func Main(args []string) { if err != nil { log.Fatal(err) } - env := lang.GlobalEnv - - core := lang.FindNamespace(lang.NewSymbol("clojure.core")) - core.FindInternedVar(lang.NewSymbol("*command-line-args*")).BindRoot(lang.Seq(args[1:])) - - rdr := reader.New(bufio.NewReader(file), reader.WithGetCurrentNS(func() *lang.Namespace { - return env.CurrentNamespace() - })) - for { - val, err := rdr.ReadOne() - if err == reader.ErrEOF { - break - } - if err != nil { - log.Fatal(err) - } - _, err = env.Eval(val) - if err != nil { + defer func() { + if err := file.Close(); err != nil { log.Fatal(err) } - } + }() + runScript(file, args[1:]) } } diff --git a/pkg/gljmain/gljmain_test.go b/pkg/gljmain/gljmain_test.go new file mode 100644 index 00000000..ac4bd129 --- /dev/null +++ b/pkg/gljmain/gljmain_test.go @@ -0,0 +1,75 @@ +package gljmain + +import ( + "os" + "os/exec" + "slices" + "strings" + "testing" +) + +func TestDashStdin(t *testing.T) { + const helperEnv = "GLJMAIN_TEST_DASH_STDIN_HELPER" + if os.Getenv(helperEnv) == "1" { + Main([]string{"-", "alpha", "beta"}) + os.Exit(0) + } + + cmd := exec.Command(os.Args[0], "-test.run=^TestDashStdin$") + cmd.Env = append(os.Environ(), helperEnv+"=1") + cmd.Stdin = strings.NewReader("(println 123)\n(println *command-line-args*)\n") + output, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("glj - failed: %v\n%s", err, output) + } + if got, want := string(output), "123\n(alpha beta)\n"; got != want { + t.Errorf("glj - output = %q, want %q", got, want) + } +} + +func TestUsesProjectDeps(t *testing.T) { + tests := []struct { + args []string + want bool + }{ + {nil, true}, + {[]string{"main.clj"}, true}, + {[]string{"-"}, true}, + {[]string{"-e", "(+ 1 2)"}, true}, + {[]string{"--nrepl"}, true}, + {[]string{"--nrepl=7888"}, true}, + {[]string{"--srepl"}, true}, + {[]string{"--srepl=7777"}, true}, + {[]string{"--help"}, false}, + {[]string{"--version"}, false}, + {[]string{"--color"}, false}, + {[]string{"--nrepl-connect", "localhost:7888"}, false}, + {[]string{"--unknown"}, false}, + } + for _, test := range tests { + if got := usesProjectDeps(test.args); got != test.want { + t.Errorf("usesProjectDeps(%q) = %v, want %v", test.args, got, test.want) + } + } +} + +func TestSplitDepsOption(t *testing.T) { + tests := []struct { + args []string + wantEDN string + wantArgs []string + wantError bool + }{ + {[]string{"main.clj"}, "", []string{"main.clj"}, false}, + {[]string{"-Sdeps", "{:deps {}}", "main.clj"}, "{:deps {}}", []string{"main.clj"}, false}, + {[]string{"-Sdeps", "{}"}, "{}", nil, false}, + {[]string{"-Sdeps"}, "", nil, true}, + } + for _, test := range tests { + gotEDN, gotArgs, err := splitDepsOption(test.args) + if gotEDN != test.wantEDN || !slices.Equal(gotArgs, test.wantArgs) || (err != nil) != test.wantError { + t.Errorf("splitDepsOption(%q) = (%q, %q, %v), want (%q, %q, error=%v)", + test.args, gotEDN, gotArgs, err, test.wantEDN, test.wantArgs, test.wantError) + } + } +} diff --git a/pkg/javacompat/arrays/arrays.go b/pkg/javacompat/arrays/arrays.go new file mode 100644 index 00000000..3c1ff6fb --- /dev/null +++ b/pkg/javacompat/arrays/arrays.go @@ -0,0 +1,104 @@ +// Package arrays exposes common java.util.Arrays operations. +package arrays + +import ( + "fmt" + "reflect" + + "github.com/glojurelang/glojure/pkg/lang" + "github.com/glojurelang/glojure/pkg/pkgmap" +) + +type Arrays struct{} + +func Equals(left, right any) bool { + if left == nil || right == nil { + return left == nil && right == nil + } + lv, rv := reflect.ValueOf(left), reflect.ValueOf(right) + if !isArray(lv.Kind()) || !isArray(rv.Kind()) || lv.Len() != rv.Len() { + return false + } + for index := 0; index < lv.Len(); index++ { + l, r := lv.Index(index).Interface(), rv.Index(index).Interface() + if isByteValue(l) && isByteValue(r) { + if byte(lang.MustAsInt(l)) != byte(lang.MustAsInt(r)) { + return false + } + } else if !lang.Equals(l, r) { + return false + } + } + return true +} + +func NewInstance(component any, dimensions any) any { + typ, ok := lang.ReflectType(component) + if !ok { + panic(fmt.Sprintf("Array.newInstance: expected Class, got %T", component)) + } + dims := dimensionSlice(dimensions) + if len(dims) == 0 { + panic("Array.newInstance: at least one dimension is required") + } + return newArray(typ, dims).Interface() +} + +func dimensionSlice(value any) []int { + if lang.IsNumber(value) { + return []int{lang.MustAsInt(value)} + } + sequence := lang.Seq(value) + result := make([]int, 0, lang.Count(value)) + for ; sequence != nil; sequence = sequence.Next() { + result = append(result, lang.MustAsInt(sequence.First())) + } + return result +} + +func newArray(component reflect.Type, dimensions []int) reflect.Value { + if dimensions[0] < 0 { + panic(fmt.Sprintf("Array.newInstance: negative array size %d", dimensions[0])) + } + if len(dimensions) == 1 { + return reflect.MakeSlice(reflect.SliceOf(component), dimensions[0], dimensions[0]) + } + innerType := component + for range dimensions[1:] { + innerType = reflect.SliceOf(innerType) + } + result := reflect.MakeSlice(reflect.SliceOf(innerType), dimensions[0], dimensions[0]) + for index := 0; index < result.Len(); index++ { + result.Index(index).Set(newArray(component, dimensions[1:])) + } + return result +} + +func Link() {} + +func init() { + pkgmap.SetHostClassPackage("Arrays", "java.util") + pkgmap.SetHostClass("Arrays", + lang.NewClass(reflect.TypeOf(Arrays{}), "java.util.Arrays")) + fn := lang.FnFunc2(func(left, right any) any { return Equals(left, right) }) + pkgmap.Set("Arrays.equals", fn) + pkgmap.Set("java.util.Arrays.equals", fn) + newInstance := lang.FnFunc2(func(component, dimensions any) any { + return NewInstance(component, dimensions) + }) + pkgmap.Set("Array.newInstance", newInstance) + pkgmap.Set("java.lang.reflect.Array.newInstance", newInstance) +} + +func isArray(kind reflect.Kind) bool { + return kind == reflect.Array || kind == reflect.Slice +} + +func isByteValue(value any) bool { + switch value.(type) { + case byte, int8: + return true + default: + return false + } +} diff --git a/pkg/javacompat/arrays/arrays_test.go b/pkg/javacompat/arrays/arrays_test.go new file mode 100644 index 00000000..ce793df2 --- /dev/null +++ b/pkg/javacompat/arrays/arrays_test.go @@ -0,0 +1,27 @@ +package arrays + +import ( + "reflect" + "testing" +) + +func TestNewInstance(t *testing.T) { + bytes := NewInstance(reflect.TypeOf(int8(0)), int64(3)) + if got := reflect.TypeOf(bytes); got != reflect.TypeOf([]int8{}) { + t.Fatalf("byte array type = %v, want []int8", got) + } + matrix := NewInstance(reflect.TypeOf(""), []int32{2, 3}) + value := reflect.ValueOf(matrix) + if value.Len() != 2 || value.Index(0).Len() != 3 { + t.Fatalf("matrix dimensions = %dx%d, want 2x3", value.Len(), value.Index(0).Len()) + } +} + +func TestEqualsByteRepresentations(t *testing.T) { + if !Equals([]byte{0, 255}, []int8{0, -1}) { + t.Fatal("signed and unsigned byte storage should compare equally") + } + if Equals([]byte{1}, []byte{2}) { + t.Fatal("different arrays compared equal") + } +} diff --git a/pkg/javacompat/base64/base64.go b/pkg/javacompat/base64/base64.go new file mode 100644 index 00000000..de12fedc --- /dev/null +++ b/pkg/javacompat/base64/base64.go @@ -0,0 +1,101 @@ +// Package base64 exposes java.util.Base64 over Go's standard base64 codec. +package base64 + +import ( + stdbase64 "encoding/base64" + "fmt" + "reflect" + + "github.com/glojurelang/glojure/pkg/lang" + "github.com/glojurelang/glojure/pkg/pkgmap" +) + +const pkg = "github.com/glojurelang/glojure/pkg/javacompat/base64" + +type Base64 struct{} +type Encoder struct{} +type Decoder struct{} + +var encoder = &Encoder{} +var decoder = &Decoder{} + +func GetEncoder() *Encoder { return encoder } +func GetDecoder() *Decoder { return decoder } + +func (*Encoder) EncodeToString(value any) string { + return stdbase64.StdEncoding.EncodeToString(byteSlice(value)) +} + +func (*Encoder) Encode(value any) []int8 { + encoded := stdbase64.StdEncoding.EncodeToString(byteSlice(value)) + result := make([]int8, len(encoded)) + for index := range encoded { + result[index] = int8(encoded[index]) + } + return result +} + +func (*Decoder) Decode(value any) []int8 { + var text string + switch value := value.(type) { + case string: + text = value + default: + text = string(byteSlice(value)) + } + decoded, err := stdbase64.StdEncoding.DecodeString(text) + if err != nil { + panic(err) + } + result := make([]int8, len(decoded)) + for index, item := range decoded { + result[index] = int8(item) + } + return result +} + +// Link gives embedders an explicit reference that retains this package and +// therefore its host-class registrations in tree-shaken builds. +func Link() {} + +func init() { + pkgmap.SetHostClassPackage("Base64", "java.util") + pkgmap.SetHostClass("Base64", + lang.NewClass(reflect.TypeOf(Base64{}), "java.util.Base64")) + for _, prefix := range []string{"Base64", "java.util.Base64"} { + pkgmap.Set(prefix+".getEncoder", lang.FnFunc0(func() any { return GetEncoder() })) + pkgmap.Set(prefix+".getDecoder", lang.FnFunc0(func() any { return GetDecoder() })) + } + pkgmap.Set(pkg+".GetEncoder", lang.FnFunc0(func() any { return GetEncoder() })) + pkgmap.Set(pkg+".GetDecoder", lang.FnFunc0(func() any { return GetDecoder() })) +} + +func byteSlice(value any) []byte { + switch value := value.(type) { + case []byte: + return value + case []int8: + result := make([]byte, len(value)) + for index, item := range value { + result[index] = byte(item) + } + return result + case string: + return []byte(value) + case lang.IPersistentVector: + result := make([]byte, value.Count()) + for index := range result { + result[index] = byte(lang.MustAsInt(value.Nth(index))) + } + return result + default: + if sequence := lang.Seq(value); sequence != nil { + result := make([]byte, 0, lang.Count(value)) + for ; sequence != nil; sequence = sequence.Next() { + result = append(result, byte(lang.MustAsInt(sequence.First()))) + } + return result + } + panic(fmt.Errorf("cannot coerce %T to byte[]", value)) + } +} diff --git a/pkg/javacompat/base64/base64_test.go b/pkg/javacompat/base64/base64_test.go new file mode 100644 index 00000000..b51d0429 --- /dev/null +++ b/pkg/javacompat/base64/base64_test.go @@ -0,0 +1,33 @@ +package base64 + +import "testing" + +func TestBase64RoundTrip(t *testing.T) { + encoded := GetEncoder().EncodeToString([]int8{'h', 'i'}) + if encoded != "aGk=" { + t.Fatalf("encoded = %q, want aGk=", encoded) + } + if decoded := GetDecoder().Decode(encoded); !EqualsBytes(decoded, []int8{'h', 'i'}) { + t.Fatalf("decoded = %v, want hi", decoded) + } +} + +func TestBase64EncoderEncodeReturnsJavaBytes(t *testing.T) { + got := GetEncoder().Encode([]int8{1, 2, 3}) + want := []int8{'A', 'Q', 'I', 'D'} + if !EqualsBytes(got, want) { + t.Fatalf("Encode = %v, want %v", got, want) + } +} + +func EqualsBytes(left, right []int8) bool { + if len(left) != len(right) { + return false + } + for index := range left { + if left[index] != right[index] { + return false + } + } + return true +} diff --git a/pkg/javacompat/boolean/boolean.go b/pkg/javacompat/boolean/boolean.go index 35fc1713..66c04cf0 100644 --- a/pkg/javacompat/boolean/boolean.go +++ b/pkg/javacompat/boolean/boolean.go @@ -13,6 +13,8 @@ import ( const pkg = "github.com/glojurelang/glojure/pkg/javacompat/boolean" +var reflectBool = reflect.TypeOf(false) + const ( TRUE = jbool.TRUE FALSE = jbool.FALSE @@ -45,10 +47,17 @@ func register(jvmName, goName string, v any) { pkgmap.Set(pkg+"."+goName, v) pkgmap.Set("Boolean."+jvmName, v) pkgmap.SetHostClassPackage("Boolean", "java.lang") - pkgmap.SetHostClass("Boolean", lang.NewClass(reflect.TypeOf(false), "java.lang.Boolean")) + pkgmap.SetHostClass("Boolean", lang.NewClass(reflectBool, "java.lang.Boolean")) } func init() { + lang.RegisterHostConstructor("java.lang.Boolean", lang.FnFunc(func(args ...any) any { + if len(args) != 1 { + panic(fmt.Sprintf("Boolean/new: wrong number of args (%d)", len(args))) + } + return ValueOf(args[0]) + })) + register("TRUE", "TRUE", TRUE) register("FALSE", "FALSE", FALSE) diff --git a/pkg/javacompat/boolean/boolean_test.go b/pkg/javacompat/boolean/boolean_test.go new file mode 100644 index 00000000..8f651b6a --- /dev/null +++ b/pkg/javacompat/boolean/boolean_test.go @@ -0,0 +1,17 @@ +package boolean + +import ( + "testing" + + "github.com/glojurelang/glojure/pkg/lang" +) + +func TestBooleanHostConstructor(t *testing.T) { + class := lang.NewClass(reflectBool, "java.lang.Boolean") + if got := lang.NewHostInstance(class, "true"); got != true { + t.Fatalf("new Boolean(true) = %v, want true", got) + } + if got := lang.NewHostInstance(class, "yes"); got != false { + t.Fatalf("new Boolean(yes) = %v, want false", got) + } +} diff --git a/pkg/javacompat/classes/classes.go b/pkg/javacompat/classes/classes.go index e0a8f054..43224f22 100644 --- a/pkg/javacompat/classes/classes.go +++ b/pkg/javacompat/classes/classes.go @@ -3,24 +3,134 @@ package classes import ( + "fmt" + "math/big" "reflect" "github.com/glojurelang/glojure/pkg/lang" "github.com/glojurelang/glojure/pkg/pkgmap" ) +type URL struct{} +type URLClassLoader struct{} + func register(name, javaPackage string, typ reflect.Type) { pkgmap.SetHostClassPackage(name, javaPackage) pkgmap.SetHostClass(name, lang.NewClass(typ, javaPackage+"."+name)) } +func newBigInteger(args ...any) any { + if len(args) < 1 || len(args) > 2 { + panic(fmt.Sprintf("BigInteger constructor: wrong number of args (%d)", len(args))) + } + if len(args) == 1 { + if text, ok := args[0].(string); ok { + value, err := lang.NewBigInt(text) + if err != nil { + panic(err) + } + return value.ToBigInteger() + } + } + magnitudeArg := args[len(args)-1] + var bytes []byte + switch value := magnitudeArg.(type) { + case []byte: + bytes = append(bytes, value...) + case []int8: + for _, item := range value { + bytes = append(bytes, byte(item)) + } + case interface { + Count() int + Nth(int) any + }: + for index := 0; index < value.Count(); index++ { + bytes = append(bytes, byte(lang.AsInt64(value.Nth(index)))) + } + default: + panic(fmt.Sprintf("BigInteger constructor: unsupported %T", magnitudeArg)) + } + number := new(big.Int).SetBytes(bytes) + if len(args) == 2 { + signum := lang.MustAsInt(args[0]) + if signum < -1 || signum > 1 { + panic(fmt.Sprintf("BigInteger constructor: invalid signum %d", signum)) + } + if signum == 0 && number.Sign() != 0 { + panic("BigInteger constructor: signum-magnitude mismatch") + } + if signum < 0 { + number.Neg(number) + } + return number + } + if len(bytes) > 0 && bytes[0]&0x80 != 0 { + number.Sub(number, new(big.Int).Lsh(big.NewInt(1), uint(8*len(bytes)))) + } + return number +} + func init() { register("Object", "java.lang", reflect.TypeOf((*any)(nil)).Elem()) + register("Byte", "java.lang", reflect.TypeOf(int8(0))) + pkgmap.Set("Byte.MIN_VALUE", int8(-128)) + pkgmap.Set("java.lang.Byte.MIN_VALUE", int8(-128)) + pkgmap.Set("Byte.MAX_VALUE", int8(127)) + pkgmap.Set("java.lang.Byte.MAX_VALUE", int8(127)) + pkgmap.Set("Byte.TYPE", reflect.TypeOf(int8(0))) + pkgmap.Set("java.lang.Byte.TYPE", reflect.TypeOf(int8(0))) + register("Short", "java.lang", reflect.TypeOf(int16(0))) + register("Float", "java.lang", reflect.TypeOf(float32(0))) register("Comparable", "java.lang", reflect.TypeOf((*lang.Comparer)(nil)).Elem()) + register("CharSequence", "java.lang", reflect.TypeOf("")) + pkgmap.SetHostClassPackage("Number", "java.lang") + pkgmap.SetHostClass("Number", lang.NewClassWithTypes( + "java.lang.Number", reflect.TypeOf(int(0)), reflect.TypeOf(int32(0)), + reflect.TypeOf(int64(0)), reflect.TypeOf(float32(0)), reflect.TypeOf(float64(0)), + reflect.TypeOf((*lang.BigInt)(nil)), reflect.TypeOf((*lang.Ratio)(nil)), + reflect.TypeOf((*lang.BigDecimal)(nil)))) + register("Class", "java.lang", reflect.TypeOf((*reflect.Type)(nil)).Elem()) + register("ClassNotFoundException", "java.lang", reflect.TypeOf((*error)(nil)).Elem()) + register("URL", "java.net", reflect.TypeOf((*URL)(nil))) + register("URLClassLoader", "java.net", reflect.TypeOf((*URLClassLoader)(nil))) + register("NumberFormatException", "java.lang", reflect.TypeOf((*error)(nil)).Elem()) register("Set", "java.util", reflect.TypeOf((*lang.IPersistentSet)(nil)).Elem()) + register("Collection", "java.util", reflect.TypeOf((*lang.IPersistentCollection)(nil)).Elem()) register("List", "java.util", reflect.TypeOf((*lang.Sequential)(nil)).Elem()) register("Map", "java.util", reflect.TypeOf((*lang.IPersistentMap)(nil)).Elem()) - register("Keyword", "clojure.lang", reflect.TypeOf((*lang.Keyword)(nil))) + register("Keyword", "clojure.lang", reflect.TypeOf(lang.Keyword{})) + register("Namespace", "clojure.lang", reflect.TypeOf((*lang.Namespace)(nil))) + register("Var", "clojure.lang", reflect.TypeOf((*lang.Var)(nil))) + pushThreadBindings := lang.FnFunc1(func(bindings any) any { + mapping, ok := bindings.(lang.IPersistentMap) + if !ok { + panic(fmt.Sprintf("Var/pushThreadBindings: expected map, got %T", bindings)) + } + lang.PushThreadBindings(mapping) + return nil + }) + popThreadBindings := lang.FnFunc0(func() any { + lang.PopThreadBindings() + return nil + }) + for _, prefix := range []string{"Var.", "clojure.lang.Var."} { + pkgmap.Set(prefix+"pushThreadBindings", pushThreadBindings) + pkgmap.Set(prefix+"popThreadBindings", popThreadBindings) + } + pkgmap.SetHostClassPackage("BigInteger", "java.math") + pkgmap.SetHostClass("BigInteger", lang.NewClassWithTypes( + "java.math.BigInteger", + reflect.TypeOf((*big.Int)(nil)), + reflect.TypeOf((*lang.BigInt)(nil)))) + register("BigInt", "clojure.lang", reflect.TypeOf((*lang.BigInt)(nil))) + register("AtomicInteger", "java.util.concurrent.atomic", reflect.TypeOf(int32(0))) + register("AtomicLong", "java.util.concurrent.atomic", reflect.TypeOf(int64(0))) + register("PersistentVector", "clojure.lang", reflect.TypeOf((*lang.Vector)(nil))) + bigIntegerConstructor := lang.FnFunc(newBigInteger) + lang.RegisterHostConstructor("java.math.BigInteger", bigIntegerConstructor) + lang.RegisterHostTypeConstructor(reflect.TypeOf((*lang.BigInt)(nil)), bigIntegerConstructor) + lang.RegisterHostTypeConstructor(reflect.TypeOf((*big.Int)(nil)), bigIntegerConstructor) register("IDeref", "clojure.lang", reflect.TypeOf((*lang.IDeref)(nil)).Elem()) register("Associative", "clojure.lang", reflect.TypeOf((*lang.Associative)(nil)).Elem()) register("Counted", "clojure.lang", reflect.TypeOf((*lang.Counted)(nil)).Elem()) @@ -35,15 +145,22 @@ func init() { register("IObj", "clojure.lang", reflect.TypeOf((*lang.IObj)(nil)).Elem()) register("IPending", "clojure.lang", reflect.TypeOf((*lang.IPending)(nil)).Elem()) register("IPersistentCollection", "clojure.lang", reflect.TypeOf((*lang.IPersistentCollection)(nil)).Elem()) + register("IPersistentList", "clojure.lang", reflect.TypeOf((*lang.IPersistentList)(nil)).Elem()) register("IPersistentMap", "clojure.lang", reflect.TypeOf((*lang.IPersistentMap)(nil)).Elem()) register("IPersistentSet", "clojure.lang", reflect.TypeOf((*lang.IPersistentSet)(nil)).Elem()) + register("APersistentSet", "clojure.lang", reflect.TypeOf((*lang.IPersistentSet)(nil)).Elem()) register("IPersistentVector", "clojure.lang", reflect.TypeOf((*lang.IPersistentVector)(nil)).Elem()) register("IRecord", "clojure.lang", reflect.TypeOf((*lang.IRecord)(nil)).Elem()) register("IReduceInit", "clojure.lang", reflect.TypeOf((*lang.IReduceInit)(nil)).Elem()) + register("IReduce", "clojure.lang", reflect.TypeOf((*lang.IReduce)(nil)).Elem()) register("IRef", "clojure.lang", reflect.TypeOf((*lang.IRef)(nil)).Elem()) register("ISeq", "clojure.lang", reflect.TypeOf((*lang.ISeq)(nil)).Elem()) register("Indexed", "clojure.lang", reflect.TypeOf((*lang.Indexed)(nil)).Elem()) - register("Named", "clojure.lang", reflect.TypeOf((*lang.Named)(nil)).Elem()) + pkgmap.SetHostClassPackage("Named", "clojure.lang") + pkgmap.SetHostClass("Named", lang.NewClassWithTypes( + "clojure.lang.Named", + reflect.TypeOf(lang.Keyword{}), + reflect.TypeOf((*lang.Symbol)(nil)))) register("Reversible", "clojure.lang", reflect.TypeOf((*lang.Reversible)(nil)).Elem()) register("Seqable", "clojure.lang", reflect.TypeOf((*lang.Seqable)(nil)).Elem()) register("Sequential", "clojure.lang", reflect.TypeOf((*lang.Sequential)(nil)).Elem()) diff --git a/pkg/javacompat/classes/classes_test.go b/pkg/javacompat/classes/classes_test.go index 4c81be93..ee135e87 100644 --- a/pkg/javacompat/classes/classes_test.go +++ b/pkg/javacompat/classes/classes_test.go @@ -1,22 +1,84 @@ package classes import ( + "math/big" + "reflect" "testing" + "github.com/glojurelang/glojure/pkg/lang" "github.com/glojurelang/glojure/pkg/pkgmap" ) func TestCommonClassesAreRegistered(t *testing.T) { for _, name := range []string{ - "Object", "Comparable", "Set", "List", "Map", "Keyword", "IDeref", "Associative", + "Object", "Byte", "Short", "Float", "Comparable", "CharSequence", "Number", "Class", "ClassNotFoundException", "URL", "URLClassLoader", "NumberFormatException", "Set", "Collection", "List", "Map", "Keyword", "IDeref", "Associative", "Counted", "IAtom", "IBlockingDeref", "IChunkedSeq", "IEditableCollection", "IFn", "ILookup", "IMapEntry", "IMeta", "IObj", "IPending", "IPersistentCollection", - "IPersistentMap", "IPersistentSet", "IPersistentVector", "IRecord", "IReduceInit", + "IPersistentMap", "IPersistentSet", "IPersistentVector", "IRecord", "IReduce", "IReduceInit", "IRef", "ISeq", "Indexed", "Named", "Reversible", "Seqable", "Sequential", "Sorted", - "Ratio", "Symbol", "ExceptionInfo", "Atom", "Volatile", + "Ratio", "Symbol", "Namespace", "Var", "BigInteger", "BigInt", "AtomicInteger", "AtomicLong", "PersistentVector", "ExceptionInfo", "Atom", "Volatile", } { if _, ok := pkgmap.HostClass(name); !ok { t.Fatalf("host class %s is not registered", name) } } } + +func TestBigIntegerSignumMagnitudeConstructor(t *testing.T) { + value := newBigInteger(int64(1), []int8{-1}).(*big.Int) + if got, want := value.Cmp(big.NewInt(255)), 0; got != want { + t.Fatalf("BigInteger(1, [0xff]) = %v", value) + } + if got, want := value.Text(16), "ff"; got != want { + t.Fatalf("hex = %q, want %q", got, want) + } +} + +func TestKeywordClassMatchesKeywordValues(t *testing.T) { + class, ok := pkgmap.HostClass("Keyword") + if !ok { + t.Fatal("Keyword host class is not registered") + } + typ, ok := lang.ReflectType(class) + if !ok { + t.Fatalf("Keyword host class %T has no reflect type", class) + } + if typ != reflect.TypeOf(lang.NewKeyword("example")) { + t.Fatalf("Keyword class type = %v, want %v", + typ, reflect.TypeOf(lang.NewKeyword("example"))) + } +} + +func TestNamedClassMatchesKeywordsAndSymbols(t *testing.T) { + class, ok := pkgmap.HostClass("Named") + if !ok { + t.Fatal("Named host class is not registered") + } + if !lang.HasType(class, lang.NewKeyword("key")) { + t.Fatal("keyword is not a clojure.lang.Named") + } + if !lang.HasType(class, lang.NewSymbol("symbol")) { + t.Fatal("symbol is not a clojure.lang.Named") + } + if got := len(class.(*lang.Class).Types()); got != 2 { + t.Fatalf("Named represented types = %d, want 2", got) + } +} + +func TestVarThreadBindingStaticsAreRegistered(t *testing.T) { + for _, name := range []string{ + "Var.pushThreadBindings", "Var.popThreadBindings", + "clojure.lang.Var.pushThreadBindings", "clojure.lang.Var.popThreadBindings", + } { + if _, ok := pkgmap.Get(name); !ok { + t.Fatalf("static method %s is not registered", name) + } + } + class, _ := pkgmap.HostClass("Var") + if _, ok := lang.FieldOrMethod(class, "pushThreadBindings"); !ok { + t.Fatal("Var class does not resolve pushThreadBindings") + } + if _, ok := lang.FieldOrMethod(class, "PushThreadBindings"); !ok { + t.Fatal("Var class does not resolve rewritten PushThreadBindings") + } +} diff --git a/pkg/javacompat/date/date.go b/pkg/javacompat/date/date.go index 4cff53c9..d02ffea2 100644 --- a/pkg/javacompat/date/date.go +++ b/pkg/javacompat/date/date.go @@ -4,6 +4,7 @@ package date import ( "fmt" + "io" "reflect" "time" @@ -21,12 +22,23 @@ func New(args ...any) any { return &Date{millis: time.Now().UnixMilli()} case 1: return &Date{millis: toInt64(args[0])} + case 3: + // java.sql.Date retains java.util.Date's deprecated + // (year-since-1900, zero-based-month, day) constructor. + value := time.Date( + toInt(args[0])+1900, time.Month(toInt(args[1])+1), toInt(args[2]), + 0, 0, 0, 0, time.Local) + return &Date{millis: value.UnixMilli()} default: panic(fmt.Sprintf("Date/new: wrong number of args (%d)", len(args))) } } func (d *Date) GetTime() int64 { return d.millis } +func (d *Date) HashCode() int32 { + value := uint64(d.millis) + return int32(uint32(value) ^ uint32(value>>32)) +} func (d *Date) Compare(other any) int { o, ok := other.(*Date) @@ -44,15 +56,60 @@ func (d *Date) Compare(other any) int { } func (d *Date) CompareTo(other *Date) int32 { return int32(d.Compare(other)) } +func (d *Date) Equals(other any) bool { + value, ok := other.(*Date) + return ok && d.millis == value.millis +} + +func (d *Date) PrintReadable(writer io.Writer) { + instant := time.UnixMilli(d.millis).UTC() + fmt.Fprintf(writer, "#inst %q", instant.Format("2006-01-02T15:04:05.000-07:00")) +} + +// ParseInstantDate implements Clojure's built-in #inst reader using Go's +// RFC3339 parser and returns the java.util.Date compatibility value. +func ParseInstantDate(value any) any { + text, ok := value.(string) + if !ok { + panic(fmt.Sprintf("#inst data reader expected string, got %T", value)) + } + parsed, err := time.Parse(time.RFC3339Nano, text) + if err != nil { + panic(err) + } + return &Date{millis: parsed.UnixMilli()} +} func init() { class := lang.NewClass(reflect.TypeOf((*Date)(nil)), "java.util.Date") pkgmap.SetHostClassPackage("Date", "java.util") pkgmap.SetHostClass("Date", class) + pkgmap.Set("java.sql.Date", + lang.NewClass(reflect.TypeOf((*Date)(nil)), "java.sql.Date")) + pkgmap.Set("java.sql.Timestamp", + lang.NewClass(reflect.TypeOf((*Date)(nil)), "java.sql.Timestamp")) lang.RegisterHostConstructor("java.util.Date", lang.FnFunc(func(args ...any) any { return New(args...) })) + lang.RegisterHostConstructor("java.sql.Date", + lang.FnFunc(func(args ...any) any { return New(args...) })) + valueOf := lang.FnFunc1(func(value any) any { + text, ok := value.(string) + if !ok { + panic(fmt.Sprintf("java.sql.Date/valueOf: expected string, got %T", value)) + } + parsed, err := time.ParseInLocation("2006-01-02", text, time.Local) + if err != nil { + panic(err) + } + return &Date{millis: parsed.UnixMilli()} + }) + pkgmap.Set("java.sql.Date.valueOf", valueOf) + pkgmap.Set("github.com/glojurelang/glojure/pkg/javacompat/date.ParseInstantDate", + lang.FnFunc1(ParseInstantDate)) } +func toInt(value any) int { return int(toInt64(value)) } + func toInt64(value any) int64 { switch v := value.(type) { case int: diff --git a/pkg/javacompat/date/date_test.go b/pkg/javacompat/date/date_test.go index ac76a401..46f20bf6 100644 --- a/pkg/javacompat/date/date_test.go +++ b/pkg/javacompat/date/date_test.go @@ -1,11 +1,23 @@ package date import ( + "bytes" "testing" + "time" "github.com/glojurelang/glojure/pkg/lang" + "github.com/glojurelang/glojure/pkg/pkgmap" ) +func TestDateReadableRepresentation(t *testing.T) { + value := New(int64(1577934245006)).(*Date) + var output bytes.Buffer + value.PrintReadable(&output) + if got, want := output.String(), `#inst "2020-01-02T03:04:05.006+00:00"`; got != want { + t.Fatalf("printed = %q, want %q", got, want) + } +} + func TestDateConstructionAndComparison(t *testing.T) { earlier := New(int64(10)).(*Date) later := New(int64(11)).(*Date) @@ -16,3 +28,37 @@ func TestDateConstructionAndComparison(t *testing.T) { t.Fatalf("Compare = %d, want negative", got) } } + +func TestParseInstantDate(t *testing.T) { + date := ParseInstantDate("2020-01-02T03:04:05.006Z").(*Date) + if got, want := date.GetTime(), int64(1577934245006); got != want { + t.Fatalf("GetTime() = %d, want %d", got, want) + } +} + +func TestDateEquality(t *testing.T) { + left := New(int64(42)).(*Date) + right := New(int64(42)).(*Date) + if !left.Equals(right) { + t.Fatal("dates with equal milliseconds were not equal") + } + if left.HashCode() != right.HashCode() { + t.Fatal("equal dates did not have equal hash codes") + } +} + +func TestSQLDateCompatibility(t *testing.T) { + constructed := New(int64(55), int64(6), int64(12)).(*Date) + valueOf, ok := pkgmap.Get("java.sql.Date.valueOf") + if !ok { + t.Fatal("java.sql.Date.valueOf is not registered") + } + parsed := lang.Apply(valueOf.(lang.IFn), []any{"1955-07-12"}).(*Date) + if !constructed.Equals(parsed) { + t.Fatalf("constructed %v != parsed %v", constructed, parsed) + } + instant := time.UnixMilli(parsed.GetTime()).In(time.Local) + if got, want := instant.Format("2006-01-02"), "1955-07-12"; got != want { + t.Fatalf("date = %s, want %s", got, want) + } +} diff --git a/pkg/javacompat/double/double.go b/pkg/javacompat/double/double.go index 8bb9f3b3..c4cd8d70 100644 --- a/pkg/javacompat/double/double.go +++ b/pkg/javacompat/double/double.go @@ -4,8 +4,10 @@ package double import ( + "errors" "fmt" "reflect" + "strconv" jdouble "github.com/gloathub/gojava/double" "github.com/glojurelang/glojure/pkg/lang" @@ -29,27 +31,27 @@ var ( ) func ParseDouble(x any) float64 { - n, err := jdouble.ParseDouble(toString(x)) - if err != nil { - panic(err.Error()) - } - return n + return parseDouble(toString(x)) } // ValueOf accepts a string (parsed) or any numeric (coerced to float64). func ValueOf(x any) float64 { switch v := x.(type) { case string: - n, err := jdouble.ParseDouble(v) - if err != nil { - panic(err.Error()) - } - return n + return parseDouble(v) default: return toFloat64(v) } } +func parseDouble(value string) float64 { + n, err := strconv.ParseFloat(value, 64) + if err == nil || errors.Is(err, strconv.ErrRange) { + return n + } + panic(fmt.Sprintf("NumberFormatException: For input string: %q", value)) +} + func ToString(x any) string { return jdouble.ToString(toFloat64(x)) } func ToHexString(x any) string { return jdouble.ToHexString(toFloat64(x)) } diff --git a/pkg/javacompat/double/double_test.go b/pkg/javacompat/double/double_test.go index b3594777..ced6d761 100644 --- a/pkg/javacompat/double/double_test.go +++ b/pkg/javacompat/double/double_test.go @@ -1,6 +1,7 @@ package double import ( + "math" "testing" "github.com/glojurelang/glojure/pkg/lang" @@ -11,3 +12,12 @@ func TestValueOfAcceptsRatio(t *testing.T) { t.Fatalf("ValueOf ratio = %v, want %v", got, want) } } + +func TestValueOfReturnsInfinityOnOverflow(t *testing.T) { + if got := ValueOf("1e9999"); !math.IsInf(got, 1) { + t.Fatalf("ValueOf overflow = %v, want +Inf", got) + } + if got := ValueOf("-1e9999"); !math.IsInf(got, -1) { + t.Fatalf("ValueOf negative overflow = %v, want -Inf", got) + } +} diff --git a/pkg/javacompat/filesystem/filesystem.go b/pkg/javacompat/filesystem/filesystem.go index 543c5de9..68d76127 100644 --- a/pkg/javacompat/filesystem/filesystem.go +++ b/pkg/javacompat/filesystem/filesystem.go @@ -69,6 +69,7 @@ func (f *File) GetCanonicalFile() *File { } func (f *File) AbsoluteFile() *File { return f.GetAbsoluteFile() } func (f *File) CanonicalFile() *File { return f.GetCanonicalFile() } +func (f *File) IsAbsolute() bool { return filepath.IsAbs(f.Pathname) } func (f *File) Exists() bool { _, err := os.Stat(f.Pathname); return err == nil } func (f *File) IsFile() bool { info, err := os.Stat(f.Pathname) @@ -111,6 +112,9 @@ func (f *File) LastModified() int64 { func (f *File) Mkdir() bool { return os.Mkdir(f.Pathname, 0o777) == nil } func (f *File) Mkdirs() bool { return os.MkdirAll(f.Pathname, 0o777) == nil } func (f *File) Delete() bool { return os.Remove(f.Pathname) == nil } +// DeleteOnExit accepts Java's lifecycle hint. Gobb processes are short-lived +// and do not expose a JVM-style shutdown-hook registry, so this is best-effort. +func (f *File) DeleteOnExit() {} func (f *File) List() []string { entries, err := os.ReadDir(f.Pathname) if err != nil { @@ -123,16 +127,42 @@ func (f *File) List() []string { return out } func (f *File) ListFiles() []*File { + return f.listFilesFiltered(nil) +} + +func (f *File) listFilesFiltered(filter any) []*File { entries, err := os.ReadDir(f.Pathname) if err != nil { return nil } - out := make([]*File, len(entries)) - for i, entry := range entries { - out[i] = &File{Pathname: filepath.Join(f.Pathname, entry.Name())} + out := make([]*File, 0, len(entries)) + for _, entry := range entries { + if filter != nil { + predicate := lang.MustHostCast[lang.IFn](filter) + if !lang.BooleanCast(predicate.Invoke(f, entry.Name())) { + continue + } + } + out = append(out, &File{Pathname: filepath.Join(f.Pathname, entry.Name())}) } return out } + +func (f *File) ResolveFieldOrMethod(name string) (any, bool) { + if name != "ListFiles" && name != "listFiles" { + return nil, false + } + return lang.FnFunc(func(args ...any) any { + switch len(args) { + case 0: + return f.ListFiles() + case 1: + return f.listFilesFiltered(args[0]) + default: + panic(fmt.Sprintf("File.listFiles: wrong number of args (%d)", len(args))) + } + }), true +} func (f *File) ToPath() *Path { return &Path{Pathname: f.Pathname} } func (f *File) ToString() string { return f.Pathname } func (f *File) String() string { return f.Pathname } diff --git a/pkg/javacompat/filesystem/filesystem_test.go b/pkg/javacompat/filesystem/filesystem_test.go index f2cef15c..dfc1db19 100644 --- a/pkg/javacompat/filesystem/filesystem_test.go +++ b/pkg/javacompat/filesystem/filesystem_test.go @@ -3,7 +3,10 @@ package filesystem import ( "os" "path/filepath" + "strings" "testing" + + "github.com/glojurelang/glojure/pkg/lang" ) func TestFileListFiles(t *testing.T) { @@ -18,6 +21,27 @@ func TestFileListFiles(t *testing.T) { } } +func TestFileListFilesWithFilter(t *testing.T) { + directory := t.TempDir() + if err := os.WriteFile(filepath.Join(directory, "keep.txt"), nil, 0o600); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(directory, "drop.log"), nil, 0o600); err != nil { + t.Fatal(err) + } + filter := lang.FnFunc2(func(_ any, name any) any { + return strings.HasSuffix(name.(string), ".txt") + }) + method, found := (&File{Pathname: directory}).ResolveFieldOrMethod("ListFiles") + if !found { + t.Fatal("ListFiles dynamic method was not found") + } + files := method.(lang.IFn).Invoke(filter).([]*File) + if len(files) != 1 || files[0].GetName() != "keep.txt" { + t.Fatalf("filtered ListFiles = %#v", files) + } +} + func TestCreateTempFile(t *testing.T) { file := CreateTempFile("glojure-file-", ".tmp") defer os.Remove(file.Pathname) @@ -28,3 +52,12 @@ func TestCreateTempFile(t *testing.T) { t.Fatalf("extension = %q, want .tmp", got) } } + +func TestFileIsAbsolute(t *testing.T) { + if !NewFile(filepath.Join(string(os.PathSeparator), "tmp")).(*File).IsAbsolute() { + t.Fatal("absolute file was not recognized") + } + if NewFile("relative").(*File).IsAbsolute() { + t.Fatal("relative file was recognized as absolute") + } +} diff --git a/pkg/javacompat/instant/instant.go b/pkg/javacompat/instant/instant.go index aacc9705..eab47647 100644 --- a/pkg/javacompat/instant/instant.go +++ b/pkg/javacompat/instant/instant.go @@ -22,6 +22,12 @@ const pkg = "github.com/glojurelang/glojure/pkg/javacompat/instant" // EPOCH mirrors Instant.EPOCH. var EPOCH = jinstant.EPOCH +type DateTimeFormatter struct{} + +var ISO_INSTANT = &DateTimeFormatter{} + +func (*DateTimeFormatter) Format(value any) string { return toString(value) } + // Now mirrors Instant.now. func Now() *jinstant.Instant { return jinstant.Now() } @@ -59,11 +65,17 @@ func OfEpochMilli(args ...any) *jinstant.Instant { func register(jvmName, goName string, v any) { pkgmap.Set(pkg+"."+goName, v) pkgmap.Set("Instant."+jvmName, v) + pkgmap.Set("java.time.Instant."+jvmName, v) pkgmap.SetHostClassPackage("Instant", "java.time") pkgmap.SetHostClass("Instant", lang.NewClass(reflect.TypeOf((*jinstant.Instant)(nil)), "java.time.Instant")) } func init() { + formatterClass := lang.NewClass( + reflect.TypeOf((*DateTimeFormatter)(nil)), + "java.time.format.DateTimeFormatter") + pkgmap.Set("java.time.format.DateTimeFormatter", formatterClass) + pkgmap.Set("java.time.format.DateTimeFormatter.ISO_INSTANT", ISO_INSTANT) register("EPOCH", "EPOCH", EPOCH) register("now", "Now", lang.FnFunc(func(_ ...any) any { return Now() })) register("parse", "Parse", lang.FnFunc(func(args ...any) any { return Parse(args...) })) diff --git a/pkg/javacompat/instant/instant_test.go b/pkg/javacompat/instant/instant_test.go new file mode 100644 index 00000000..38ba040f --- /dev/null +++ b/pkg/javacompat/instant/instant_test.go @@ -0,0 +1,18 @@ +package instant + +import ( + "testing" + + "github.com/glojurelang/glojure/pkg/lang" + "github.com/glojurelang/glojure/pkg/pkgmap" +) + +func TestFullyQualifiedInstantParse(t *testing.T) { + parse, found := pkgmap.Get("java.time.Instant.parse") + if !found { + t.Fatal("java.time.Instant.parse was not registered") + } + if got := lang.Apply1(parse, "2006-03-24T15:49:00Z"); got == nil { + t.Fatal("Instant.parse returned nil") + } +} diff --git a/pkg/javacompat/integer/integer.go b/pkg/javacompat/integer/integer.go index 9adfea2e..a79f8a6f 100644 --- a/pkg/javacompat/integer/integer.go +++ b/pkg/javacompat/integer/integer.go @@ -97,10 +97,24 @@ func register(jvmName, goName string, v any) { pkgmap.Set(pkg+"."+goName, v) pkgmap.Set("Integer."+jvmName, v) pkgmap.SetHostClassPackage("Integer", "java.lang") - pkgmap.SetHostClass("Integer", lang.NewClass(reflect.TypeOf(int64(0)), "java.lang.Integer")) + pkgmap.SetHostClass("Integer", lang.NewClassWithTypes( + "java.lang.Integer", + reflect.TypeOf(int(0)), + reflect.TypeOf(int32(0)), + )) } func init() { + constructor := lang.FnFunc(func(args ...any) any { + if len(args) != 1 { + panic(fmt.Sprintf("Integer constructor: wrong number of args (%d)", len(args))) + } + return ValueOf(args[0]) + }) + lang.RegisterHostConstructor("java.lang.Integer", constructor) + lang.RegisterHostTypeConstructor(reflect.TypeOf(int(0)), constructor) + lang.RegisterHostTypeConstructor(reflect.TypeOf(int32(0)), constructor) + register("MIN_VALUE", "MIN_VALUE", MIN_VALUE) register("MAX_VALUE", "MAX_VALUE", MAX_VALUE) register("SIZE", "SIZE", int32(SIZE)) diff --git a/pkg/javacompat/math/math.go b/pkg/javacompat/math/math.go index 5c838e0d..74017415 100644 --- a/pkg/javacompat/math/math.go +++ b/pkg/javacompat/math/math.go @@ -14,6 +14,7 @@ package math import ( "fmt" + mathrand "math/rand" "reflect" jmath "github.com/gloathub/gojava/math" @@ -29,6 +30,26 @@ const pkg = "github.com/glojurelang/glojure/pkg/javacompat/math" // (instance? Class Math) succeed so (ns-imports *ns*) sees the import. type Math struct{} +// JavaRandom provides the small java.util.Random instance surface used by +// clojure.data.generators and other portable libraries. +type JavaRandom struct{ rng *mathrand.Rand } + +func NewJavaRandom(args ...any) any { + seed := int64(0) + if len(args) == 1 { + seed = lang.AsInt64(args[0]) + } + if len(args) > 1 { + panic("java.util.Random expects zero or one constructor argument") + } + return &JavaRandom{rng: mathrand.New(mathrand.NewSource(seed))} +} + +func (r *JavaRandom) NextBoolean() bool { return r.rng.Int63()&1 == 0 } +func (r *JavaRandom) NextDouble() float64 { return r.rng.Float64() } +func (r *JavaRandom) NextFloat() float32 { return r.rng.Float32() } +func (r *JavaRandom) NextLong() int64 { return r.rng.Int63() } + var ( PI = jmath.PI E = jmath.E @@ -163,6 +184,14 @@ func register(jvmName, goName string, v any) { } func init() { + randomClass := lang.NewClass( + reflect.TypeOf((*JavaRandom)(nil)), "java.util.Random") + pkgmap.SetHostClassPackage("Random", "java.util") + pkgmap.SetHostClass("Random", randomClass) + lang.RegisterHostConstructor("java.util.Random", lang.FnFunc(NewJavaRandom)) + lang.RegisterHostTypeConstructor( + reflect.TypeOf((*JavaRandom)(nil)), lang.FnFunc(NewJavaRandom)) + register("PI", "PI", PI) register("E", "E", E) diff --git a/pkg/javacompat/messagedigest/messagedigest.go b/pkg/javacompat/messagedigest/messagedigest.go new file mode 100644 index 00000000..feedec7e --- /dev/null +++ b/pkg/javacompat/messagedigest/messagedigest.go @@ -0,0 +1,175 @@ +package messagedigest + +import ( + "crypto/md5" + "crypto/sha1" + "crypto/sha256" + "crypto/sha512" + "fmt" + "hash" + "reflect" + "strings" + + "github.com/glojurelang/glojure/pkg/lang" + "github.com/glojurelang/glojure/pkg/pkgmap" +) + +type MessageDigest struct { + hash hash.Hash +} + +type Provider struct{ algorithms []string } +type Enumeration struct { + values []string + index int +} + +type javaEnumeration interface { + HasMoreElements() bool + NextElement() any +} + +// EnumerationSeqCreate mirrors clojure.lang.EnumerationSeq/create. Java's +// implementation is lazy, but eagerly consuming the mutable Enumeration is +// observably equivalent once a caller asks for the resulting sequence. +func EnumerationSeqCreate(enumeration any) any { + if enumeration == nil { + return nil + } + javaEnumeration, ok := enumeration.(javaEnumeration) + if !ok { + panic(fmt.Sprintf("EnumerationSeq.create: %T is not a java.util.Enumeration", enumeration)) + } + items := []any{} + for javaEnumeration.HasMoreElements() { + items = append(items, javaEnumeration.NextElement()) + } + return lang.Seq(items) +} + +func (provider *Provider) Keys() *Enumeration { + values := make([]string, len(provider.algorithms)) + for index, algorithm := range provider.algorithms { + values[index] = "MessageDigest." + algorithm + } + return &Enumeration{values: values} +} + +func (enumeration *Enumeration) HasMoreElements() bool { + return enumeration.index < len(enumeration.values) +} + +func (enumeration *Enumeration) NextElement() any { + if !enumeration.HasMoreElements() { + panic("Enumeration has no more elements") + } + value := enumeration.values[enumeration.index] + enumeration.index++ + return value +} + +func GetProviders() []any { + return []any{&Provider{algorithms: []string{"MD5", "SHA-1", "SHA-256", "SHA-384", "SHA-512"}}} +} + +func GetInstance(algorithm any) any { + var digest hash.Hash + switch strings.ToLower(lang.ToString(algorithm)) { + case "md5": + digest = md5.New() + case "sha-1", "sha1": + digest = sha1.New() + case "sha-256", "sha256": + digest = sha256.New() + case "sha-384", "sha384": + digest = sha512.New384() + case "sha-512", "sha512": + digest = sha512.New() + default: + panic(fmt.Sprintf("MessageDigest: unsupported algorithm %s", algorithm)) + } + return &MessageDigest{hash: digest} +} + +func (digest *MessageDigest) ResolveFieldOrMethod(name string) (any, bool) { + switch strings.ToLower(name) { + case "reset": + return lang.FnFunc0(func() any { + digest.hash.Reset() + return nil + }), true + case "getdigestlength": + return lang.FnFunc0(func() any { return int64(digest.hash.Size()) }), true + case "update": + return lang.FnFunc(func(args ...any) any { + if len(args) != 1 && len(args) != 3 { + panic(fmt.Sprintf("MessageDigest.update: wrong number of args (%d)", len(args))) + } + data := byteSlice(args[0]) + if len(args) == 3 { + offset, length := lang.MustAsInt(args[1]), lang.MustAsInt(args[2]) + data = data[offset : offset+length] + } + _, _ = digest.hash.Write(data) + return nil + }), true + case "digest": + return lang.FnFunc(func(args ...any) any { + if len(args) > 1 { + panic(fmt.Sprintf("MessageDigest.digest: wrong number of args (%d)", len(args))) + } + if len(args) == 1 { + _, _ = digest.hash.Write(byteSlice(args[0])) + } + raw := digest.hash.Sum(nil) + digest.hash.Reset() + result := make([]int8, len(raw)) + for index, value := range raw { + result[index] = int8(value) + } + return result + }), true + default: + return nil, false + } +} + +func byteSlice(value any) []byte { + switch value := value.(type) { + case []byte: + return value + case []int8: + result := make([]byte, len(value)) + for index, item := range value { + result[index] = byte(item) + } + return result + case lang.IPersistentVector: + result := make([]byte, value.Count()) + for index := range result { + result[index] = byte(lang.MustAsInt(value.Nth(index))) + } + return result + default: + panic(fmt.Sprintf("MessageDigest: %T is not a byte[]", value)) + } +} + +func init() { + pkgmap.Set("clojure.lang.EnumerationSeq.create", lang.FnFunc1(EnumerationSeqCreate)) + pkgmap.SetHostClassPackage("MessageDigest", "java.security") + pkgmap.SetHostClass("MessageDigest", + lang.NewClass(reflect.TypeOf((*MessageDigest)(nil)), "java.security.MessageDigest")) + for _, prefix := range []string{"MessageDigest", "java.security.MessageDigest"} { + pkgmap.Set(prefix+".getInstance", lang.FnFunc1(GetInstance)) + } + pkgmap.SetHostClassPackage("Security", "java.security") + pkgmap.SetHostClass("Security", + lang.NewClass(reflect.TypeOf(struct{}{}), "java.security.Security")) + for _, prefix := range []string{"Security", "java.security.Security"} { + pkgmap.Set(prefix+".getProviders", lang.FnFunc0(func() any { return GetProviders() })) + } + pkgmap.SetHostClassPackage("Provider", "java.security") + pkgmap.SetHostClass("Provider", + lang.NewClass(reflect.TypeOf((*Provider)(nil)), "java.security.Provider")) +} diff --git a/pkg/javacompat/messagedigest/messagedigest_test.go b/pkg/javacompat/messagedigest/messagedigest_test.go new file mode 100644 index 00000000..4662d18b --- /dev/null +++ b/pkg/javacompat/messagedigest/messagedigest_test.go @@ -0,0 +1,56 @@ +package messagedigest + +import ( + "encoding/hex" + "testing" + + "github.com/glojurelang/glojure/pkg/lang" +) + +func TestMD5Digest(t *testing.T) { + digest := GetInstance("MD5").(*MessageDigest) + length, _ := digest.ResolveFieldOrMethod("getDigestLength") + if got := lang.Apply(length, nil); got != int64(16) { + t.Fatalf("digest length = %v, want 16", got) + } + reset, _ := digest.ResolveFieldOrMethod("reset") + lang.Apply(reset, nil) + update, _ := digest.ResolveFieldOrMethod("update") + lang.Apply1(update, []byte("hello")) + digestFn, _ := digest.ResolveFieldOrMethod("digest") + signed := lang.Apply(digestFn, nil).([]int8) + bytes := make([]byte, len(signed)) + for index, value := range signed { + bytes[index] = byte(value) + } + got := hex.EncodeToString(bytes) + if want := "5d41402abc4b2a76b9719d911017c592"; got != want { + t.Fatalf("digest = %s, want %s", got, want) + } +} + +func TestSecurityProvidersEnumerateDigestAlgorithms(t *testing.T) { + providers := GetProviders() + keys := providers[0].(*Provider).Keys() + var values []any + for keys.HasMoreElements() { + values = append(values, keys.NextElement()) + } + if len(values) != 5 || values[2] != "MessageDigest.SHA-256" { + t.Fatalf("provider keys = %v", values) + } +} + +func TestEnumerationSeqCreate(t *testing.T) { + enumeration := (&Provider{algorithms: []string{"MD5", "SHA-1"}}).Keys() + sequence := lang.Seq(EnumerationSeqCreate(enumeration)) + if got := sequence.First(); got != "MessageDigest.MD5" { + t.Fatalf("first = %v", got) + } + if got := sequence.Next().First(); got != "MessageDigest.SHA-1" { + t.Fatalf("second = %v", got) + } + if got := sequence.Next().Next(); got != nil { + t.Fatalf("tail = %v", got) + } +} diff --git a/pkg/javacompat/nio/nio.go b/pkg/javacompat/nio/nio.go new file mode 100644 index 00000000..da76ae5e --- /dev/null +++ b/pkg/javacompat/nio/nio.go @@ -0,0 +1,190 @@ +// Package nio exposes the small java.nio charset surface used by portable +// Clojure libraries. +package nio + +import ( + "encoding/binary" + "fmt" + "reflect" + "unicode/utf8" + + "github.com/glojurelang/glojure/pkg/lang" + "github.com/glojurelang/glojure/pkg/pkgmap" +) + +type Charset struct{ name string } +type CharsetDecoder struct{ charset *Charset } +type ByteBuffer struct { + bytes []byte + position int + limit int +} +type CodingErrorAction string +type CharacterCodingException struct{ message string } + +var ( + UTF8 = &Charset{name: "UTF-8"} + USASCII = &Charset{name: "US-ASCII"} + ISO88591 = &Charset{name: "ISO-8859-1"} + REPORT CodingErrorAction = "REPORT" +) + +func (c *Charset) String() string { return c.name } +func (c *Charset) NewDecoder() *CharsetDecoder { return &CharsetDecoder{charset: c} } +func (d *CharsetDecoder) OnMalformedInput(_ any) *CharsetDecoder { return d } +func (d *CharsetDecoder) OnUnmappableCharacter(_ any) *CharsetDecoder { return d } + +func (d *CharsetDecoder) Decode(buffer any) string { + data := byteSlice(buffer) + switch d.charset.name { + case "UTF-8": + if !utf8.Valid(data) { + panic(&CharacterCodingException{message: "Input length = 1"}) + } + return string(data) + case "US-ASCII": + for _, value := range data { + if value > 0x7f { + panic(&CharacterCodingException{message: "Unmappable character"}) + } + } + return string(data) + case "ISO-8859-1": + runes := make([]rune, len(data)) + for index, value := range data { + runes[index] = rune(value) + } + return string(runes) + default: + panic(fmt.Errorf("unsupported charset %s", d.charset.name)) + } +} + +func (*CharacterCodingException) Error() string { return "Input length = 1" } +func Wrap(value any) *ByteBuffer { + data := byteSlice(value) + return &ByteBuffer{bytes: data, limit: len(data)} +} + +func (b *ByteBuffer) Remaining() int32 { return int32(b.limit - b.position) } + +func (b *ByteBuffer) Position(args ...any) any { + if len(args) == 0 { + return int32(b.position) + } + position := lang.MustAsInt(args[0]) + if position < 0 || position > b.limit { + panic(fmt.Errorf("ByteBuffer.position: %d outside 0..%d", position, b.limit)) + } + b.position = position + return b +} + +func (b *ByteBuffer) Limit(args ...any) any { + if len(args) == 0 { + return int32(b.limit) + } + limit := lang.MustAsInt(args[0]) + if limit < 0 || limit > len(b.bytes) { + panic(fmt.Errorf("ByteBuffer.limit: %d outside 0..%d", limit, len(b.bytes))) + } + b.limit = limit + if b.position > limit { + b.position = limit + } + return b +} + +func (b *ByteBuffer) Get(index any) int8 { + offset := lang.MustAsInt(index) + if offset < 0 || offset >= b.limit { + panic(fmt.Errorf("ByteBuffer.get: index %d outside 0..%d", offset, b.limit)) + } + return int8(b.bytes[offset]) +} + +// GetLong reads a signed, big-endian Java long at the current position and +// advances the position by eight bytes. +func (b *ByteBuffer) GetLong() int64 { + if b.position+8 > b.limit { + panic(fmt.Errorf("ByteBuffer.getLong: insufficient bytes remaining")) + } + value := int64(binary.BigEndian.Uint64(b.bytes[b.position : b.position+8])) + b.position += 8 + return value +} + +func (b *ByteBuffer) Slice() *ByteBuffer { + data := b.bytes[b.position:b.limit] + return &ByteBuffer{bytes: data, limit: len(data)} +} + +// Link gives embedders an explicit package-retention reference. +func Link() {} + +func init() { + pkgmap.SetHostClassPackage("Charset", "java.nio.charset") + pkgmap.SetHostClass("Charset", + lang.NewClass(reflect.TypeOf((*Charset)(nil)), "java.nio.charset.Charset")) + for _, prefix := range []string{"Charset", "java.nio.charset.Charset"} { + pkgmap.Set(prefix+".forName", lang.FnFunc1(func(value any) any { + switch fmt.Sprint(value) { + case "UTF-8", "UTF8": + return UTF8 + case "US-ASCII", "ASCII": + return USASCII + case "ISO-8859-1": + return ISO88591 + default: + panic(fmt.Errorf("unsupported charset %v", value)) + } + })) + } + + pkgmap.SetHostClassPackage("ByteBuffer", "java.nio") + pkgmap.SetHostClass("ByteBuffer", + lang.NewClass(reflect.TypeOf((*ByteBuffer)(nil)), "java.nio.ByteBuffer")) + for _, prefix := range []string{"ByteBuffer", "java.nio.ByteBuffer"} { + pkgmap.Set(prefix+".wrap", lang.FnFunc1(func(value any) any { return Wrap(value) })) + } + + pkgmap.SetHostClassPackage("StandardCharsets", "java.nio.charset") + pkgmap.SetHostClass("StandardCharsets", + lang.NewClass(reflect.TypeOf((*Charset)(nil)), "java.nio.charset.StandardCharsets")) + for _, prefix := range []string{"StandardCharsets", "java.nio.charset.StandardCharsets"} { + pkgmap.Set(prefix+".UTF_8", UTF8) + pkgmap.Set(prefix+".US_ASCII", USASCII) + pkgmap.Set(prefix+".ISO_8859_1", ISO88591) + } + + pkgmap.SetHostClassPackage("CodingErrorAction", "java.nio.charset") + pkgmap.SetHostClass("CodingErrorAction", + lang.NewClass(reflect.TypeOf(CodingErrorAction("")), "java.nio.charset.CodingErrorAction")) + for _, prefix := range []string{"CodingErrorAction", "java.nio.charset.CodingErrorAction"} { + pkgmap.Set(prefix+".REPORT", REPORT) + } + + pkgmap.SetHostClassPackage("CharacterCodingException", "java.nio.charset") + pkgmap.SetHostClass("CharacterCodingException", + lang.NewClass(reflect.TypeOf((*CharacterCodingException)(nil)), + "java.nio.charset.CharacterCodingException")) +} + +func byteSlice(value any) []byte { + switch value := value.(type) { + case *ByteBuffer: + return value.bytes + case []byte: + return value + case []int8: + result := make([]byte, len(value)) + for index, item := range value { + result[index] = byte(item) + } + return result + case string: + return []byte(value) + default: + panic(fmt.Errorf("cannot coerce %T to byte[]", value)) + } +} diff --git a/pkg/javacompat/nio/nio_test.go b/pkg/javacompat/nio/nio_test.go new file mode 100644 index 00000000..7b7b3db6 --- /dev/null +++ b/pkg/javacompat/nio/nio_test.go @@ -0,0 +1,54 @@ +package nio + +import "testing" + +func TestUTF8Decoder(t *testing.T) { + decoder := UTF8.NewDecoder().OnMalformedInput(REPORT) + if got := decoder.Decode(Wrap([]int8{-61, -68})); got != "ü" { + t.Fatalf("decoded = %q, want ü", got) + } + defer func() { + if _, ok := recover().(*CharacterCodingException); !ok { + t.Fatal("invalid UTF-8 did not raise CharacterCodingException") + } + }() + decoder.Decode(Wrap([]byte{0xff})) +} + +func TestByteBufferPositionLimitAndSlice(t *testing.T) { + buffer := Wrap([]byte("Duty Now For The Future")) + if got := buffer.Remaining(); got != 23 { + t.Fatalf("remaining = %d, want 23", got) + } + if got := buffer.Position(int64(5)); got != buffer { + t.Fatalf("position setter returned %T, want buffer", got) + } + buffer.Limit(int64(9)) + if got := buffer.Remaining(); got != 4 { + t.Fatalf("remaining = %d, want 4", got) + } + if got := buffer.Get(int64(5)); got != int8('N') { + t.Fatalf("get(5) = %d, want %d", got, 'N') + } + slice := buffer.Slice() + if got := slice.Remaining(); got != 4 { + t.Fatalf("slice remaining = %d, want 4", got) + } + if got := slice.Get(int64(0)); got != int8('N') { + t.Fatalf("slice get(0) = %d, want %d", got, 'N') + } +} + +func TestByteBufferGetLongAdvancesPosition(t *testing.T) { + buffer := Wrap([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0, 0, 0, 0, 0, 0, 0, 3}) + if got := buffer.GetLong(); got != -2 { + t.Fatalf("first getLong = %d, want -2", got) + } + if got := buffer.GetLong(); got != 3 { + t.Fatalf("second getLong = %d, want 3", got) + } + if got := buffer.Remaining(); got != 0 { + t.Fatalf("remaining = %d, want 0", got) + } +} diff --git a/pkg/javacompat/processbuilder/processbuilder.go b/pkg/javacompat/processbuilder/processbuilder.go new file mode 100644 index 00000000..f2c0635f --- /dev/null +++ b/pkg/javacompat/processbuilder/processbuilder.go @@ -0,0 +1,110 @@ +// Package processbuilder provides the java.lang.ProcessBuilder surface used +// by portable Clojure libraries to launch child processes. +package processbuilder + +import ( + "bytes" + "fmt" + "io" + "os" + "os/exec" + "reflect" + + "github.com/glojurelang/glojure/pkg/lang" + "github.com/glojurelang/glojure/pkg/pkgmap" +) + +type Redirect string + +const Inherit Redirect = "INHERIT" + +type Environment struct{ values map[string]string } + +func (e *Environment) Put(key, value any) any { + e.values[fmt.Sprint(key)] = fmt.Sprint(value) + return nil +} + +type ProcessBuilder struct { + command []string + environment *Environment + inheritStderr bool +} + +type Process struct { + exit int32 + out []byte + err []byte +} + +func New(command any) *ProcessBuilder { + values := []string{} + for items := lang.Seq(command); items != nil; items = items.Next() { + values = append(values, fmt.Sprint(items.First())) + } + return &ProcessBuilder{ + command: values, + environment: &Environment{values: map[string]string{}}, + } +} + +func (b *ProcessBuilder) Environment() *Environment { return b.environment } + +func (b *ProcessBuilder) RedirectError(value any) *ProcessBuilder { + b.inheritStderr = value == Inherit + return b +} + +func (b *ProcessBuilder) Start() *Process { + if len(b.command) == 0 { + panic("ProcessBuilder: empty command") + } + command := exec.Command(b.command[0], b.command[1:]...) + command.Env = os.Environ() + for key, value := range b.environment.values { + command.Env = append(command.Env, key+"="+value) + } + var stdout, stderr bytes.Buffer + command.Stdout = &stdout + if b.inheritStderr { + command.Stderr = os.Stderr + } else { + command.Stderr = &stderr + } + exit := int32(0) + if err := command.Run(); err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + exit = int32(exitError.ExitCode()) + } else { + panic(err) + } + } + return &Process{ + exit: exit, + out: stdout.Bytes(), + err: stderr.Bytes(), + } +} + +func (p *Process) WaitFor() int32 { return p.exit } +func (p *Process) GetInputStream() io.ReadCloser { return io.NopCloser(bytes.NewReader(p.out)) } +func (p *Process) GetErrorStream() io.ReadCloser { return io.NopCloser(bytes.NewReader(p.err)) } + +// Link gives embedders an explicit package-retention reference. +func Link() {} + +func init() { + pkgmap.SetHostClassPackage("ProcessBuilder", "java.lang") + pkgmap.SetHostClass("ProcessBuilder", + lang.NewClass(reflect.TypeOf((*ProcessBuilder)(nil)), "java.lang.ProcessBuilder")) + lang.RegisterHostConstructor("java.lang.ProcessBuilder", lang.FnFunc1(func(command any) any { + return New(command) + })) + + pkgmap.SetHostClassPackage("ProcessBuilder$Redirect", "java.lang") + pkgmap.SetHostClass("ProcessBuilder$Redirect", + lang.NewClass(reflect.TypeOf(Redirect("")), "java.lang.ProcessBuilder$Redirect")) + for _, prefix := range []string{"ProcessBuilder$Redirect", "java.lang.ProcessBuilder$Redirect"} { + pkgmap.Set(prefix+".INHERIT", Inherit) + } +} diff --git a/pkg/javacompat/processbuilder/processbuilder_test.go b/pkg/javacompat/processbuilder/processbuilder_test.go new file mode 100644 index 00000000..2775ece3 --- /dev/null +++ b/pkg/javacompat/processbuilder/processbuilder_test.go @@ -0,0 +1,22 @@ +package processbuilder + +import ( + "io" + "testing" +) + +func TestProcessBuilderRunsCommand(t *testing.T) { + builder := New([]string{"sh", "-c", "printf %s \"$GOBB_PROCESS_TEST\""}) + builder.Environment().Put("GOBB_PROCESS_TEST", "ok") + process := builder.Start() + if got := process.WaitFor(); got != 0 { + t.Fatalf("exit = %d, want 0", got) + } + output, err := io.ReadAll(process.GetInputStream()) + if err != nil { + t.Fatal(err) + } + if string(output) != "ok" { + t.Fatalf("output = %q, want ok", output) + } +} diff --git a/pkg/javacompat/regex/regex.go b/pkg/javacompat/regex/regex.go index b1d05120..ace4f19c 100644 --- a/pkg/javacompat/regex/regex.go +++ b/pkg/javacompat/regex/regex.go @@ -12,6 +12,8 @@ package regex import ( "fmt" "reflect" + stdregexp "regexp" + "strings" jregex "github.com/gloathub/gojava/regex" "github.com/glojurelang/glojure/pkg/lang" @@ -35,19 +37,24 @@ func Compile(args ...any) *jregex.Pattern { panic("Pattern/compile: missing regex string") } if len(args) == 1 { - p, err := jregex.Compile(toString(args[0])) + p, err := jregex.Compile(TranslateJavaPattern(toString(args[0]))) if err != nil { panic(err.Error()) } return p } - p, err := jregex.CompileFlags(toString(args[0]), toInt32(args[1])) + p, err := jregex.CompileFlags(TranslateJavaPattern(toString(args[0])), toInt32(args[1])) if err != nil { panic(err.Error()) } return p } +func TranslateJavaPattern(pattern string) string { + pattern = strings.ReplaceAll(pattern, `\p{XDigit}`, `[0-9A-Fa-f]`) + return strings.ReplaceAll(pattern, `\e`, `\x1b`) +} + // Matches mirrors Pattern.matches(regex, input): convenience for a // one-shot whole-input match. func Matches(args ...any) bool { @@ -69,11 +76,34 @@ func Quote(args ...any) string { return jregex.Quote(toString(args[0])) } +func IsPattern(value any) bool { + _, ok := value.(*jregex.Pattern) + return ok +} + +func ReplaceAll(pattern any, input, replacement string) string { + compiled, ok := pattern.(*jregex.Pattern) + if !ok { + panic(fmt.Sprintf("ReplaceAll: expected Pattern, got %T", pattern)) + } + return compiled.Matcher(input).ReplaceAll(replacement) +} + +func IsPatternCompat(value any) any { return IsPattern(value) } + +func ReplaceAllCompat(pattern, input, replacement any) any { + return ReplaceAll(pattern, toString(input), toString(replacement)) +} + func register(jvmName, goName string, v any) { pkgmap.Set(pkg+"."+goName, v) pkgmap.Set("Pattern."+jvmName, v) pkgmap.SetHostClassPackage("Pattern", "java.util.regex") - pkgmap.SetHostClass("Pattern", lang.NewClass(reflect.TypeOf((*jregex.Pattern)(nil)), "java.util.regex.Pattern")) + pkgmap.SetHostClass("Pattern", lang.NewClassWithTypes( + "java.util.regex.Pattern", + reflect.TypeOf((*stdregexp.Regexp)(nil)), + reflect.TypeOf((*jregex.Pattern)(nil)), + )) } func init() { @@ -86,6 +116,8 @@ func init() { register("compile", "Compile", lang.FnFunc(func(args ...any) any { return Compile(args...) })) register("matches", "Matches", lang.FnFunc(func(args ...any) any { return Matches(args...) })) register("quote", "Quote", lang.FnFunc(func(args ...any) any { return Quote(args...) })) + pkgmap.Set(pkg+".IsPattern", IsPatternCompat) + pkgmap.Set(pkg+".ReplaceAll", ReplaceAllCompat) } func toString(x any) string { diff --git a/pkg/javacompat/regex/regex_test.go b/pkg/javacompat/regex/regex_test.go new file mode 100644 index 00000000..f9229785 --- /dev/null +++ b/pkg/javacompat/regex/regex_test.go @@ -0,0 +1,21 @@ +package regex + +import "testing" + +func TestReplaceAll(t *testing.T) { + pattern := Compile(`\x1b\[.*?m`) + if !IsPattern(pattern) { + t.Fatal("compiled value is not recognized as a Pattern") + } + if got := ReplaceAll(pattern, "a\x1b[31mb", ""); got != "ab" { + t.Fatalf("ReplaceAll = %q, want ab", got) + } +} + +func TestCompileJavaEscape(t *testing.T) { + pattern := Compile(`\e\[.*?m`) + matcher := pattern.Matcher("\x1b[31m") + if !matcher.Find() { + t.Fatal("translated Java escape pattern did not match") + } +} diff --git a/pkg/javacompat/stacktrace/stacktrace.go b/pkg/javacompat/stacktrace/stacktrace.go new file mode 100644 index 00000000..237bb2ec --- /dev/null +++ b/pkg/javacompat/stacktrace/stacktrace.go @@ -0,0 +1,42 @@ +// Package stacktrace supplies the java.lang.StackTraceElement value used by +// portable exception-formatting libraries. +package stacktrace + +import ( + "reflect" + + "github.com/glojurelang/glojure/pkg/lang" + "github.com/glojurelang/glojure/pkg/pkgmap" +) + +type StackTraceElement struct { + className string + methodName string + fileName any + lineNumber int32 +} + +func New(className, methodName string, fileName any, lineNumber any) *StackTraceElement { + return &StackTraceElement{ + className: className, methodName: methodName, fileName: fileName, + lineNumber: int32(lang.MustAsInt(lineNumber)), + } +} + +func (e *StackTraceElement) GetClassName() string { return e.className } +func (e *StackTraceElement) GetMethodName() string { return e.methodName } +func (e *StackTraceElement) GetFileName() any { return e.fileName } +func (e *StackTraceElement) GetLineNumber() int32 { return e.lineNumber } + +// Link gives embedders an explicit package-retention reference. +func Link() {} + +func init() { + const javaName = "java.lang.StackTraceElement" + pkgmap.SetHostClassPackage("StackTraceElement", "java.lang") + pkgmap.SetHostClass("StackTraceElement", + lang.NewClass(reflect.TypeOf((*StackTraceElement)(nil)), javaName)) + lang.RegisterHostConstructor(javaName, lang.FnFunc(func(args ...any) any { + return New(args[0].(string), args[1].(string), args[2], args[3]) + })) +} diff --git a/pkg/javacompat/stacktrace/stacktrace_test.go b/pkg/javacompat/stacktrace/stacktrace_test.go new file mode 100644 index 00000000..e4156464 --- /dev/null +++ b/pkg/javacompat/stacktrace/stacktrace_test.go @@ -0,0 +1,13 @@ +package stacktrace + +import "testing" + +func TestStackTraceElementAccessors(t *testing.T) { + element := New("foo.bar", "invoke", "bar.clj", int64(456)) + if element.GetClassName() != "foo.bar" || + element.GetMethodName() != "invoke" || + element.GetFileName() != "bar.clj" || + element.GetLineNumber() != 456 { + t.Fatalf("unexpected element: %#v", element) + } +} diff --git a/pkg/javacompat/streams/streams.go b/pkg/javacompat/streams/streams.go index 8dcc3c0d..68a91884 100644 --- a/pkg/javacompat/streams/streams.go +++ b/pkg/javacompat/streams/streams.go @@ -4,11 +4,14 @@ package streams import ( "bufio" "bytes" + "errors" "fmt" "io" "os" "reflect" "strings" + "unicode/utf16" + "unicode/utf8" "github.com/glojurelang/glojure/pkg/lang" "github.com/glojurelang/glojure/pkg/pkgmap" @@ -19,16 +22,81 @@ type OutputStream interface{ Write([]byte) (int, error) } type ByteArrayInputStream struct{ *bytes.Reader } type ByteArrayOutputStream struct{ bytes.Buffer } -type StringReader struct{ *bufio.Reader } +type StringReader struct { + data []byte + position int + mark int + lastRuneSize int + closed bool +} type PushbackReader struct { *bufio.Reader - closer io.Closer + closer io.Closer + pushback []rune + lineNumber int + lastRune rune + lastRuneSize int + lastRuneWasNew bool } + +func (s *PushbackReader) ResolveFieldOrMethod(name string) (any, bool) { + switch strings.ToLower(name) { + case "read": + return lang.FnFunc(func(args ...any) any { + switch len(args) { + case 0: + rn, _, err := s.ReadRune() + if errors.Is(err, io.EOF) { + return int64(-1) + } + if err != nil { + panic(err) + } + return int64(rn) + case 3: + return s.readChars(args[0], lang.MustAsInt(args[1]), lang.MustAsInt(args[2])) + default: + panic(fmt.Sprintf("PushbackReader.read: wrong number of args (%d)", len(args))) + } + }), true + case "unread": + return lang.FnFunc(func(args ...any) any { + switch len(args) { + case 1: + s.unreadRunes([]rune{rune(lang.MustAsInt(args[0]))}) + case 3: + s.unreadChars(args[0], lang.MustAsInt(args[1]), lang.MustAsInt(args[2])) + default: + panic(fmt.Sprintf("PushbackReader.unread: wrong number of args (%d)", len(args))) + } + return nil + }), true + default: + return nil, false + } +} + type PrintWriter struct { io.Writer closer io.Closer } -type StringWriter struct{ strings.Builder } + +func (writer *PrintWriter) Append(value any) *PrintWriter { + fmt.Fprint(writer.Writer, lang.ToString(value)) + return writer +} + +type StringWriter struct { + strings.Builder + pendingHigh rune +} +type ColumnWriter struct { + base io.Writer + fields *lang.Ref +} +type DynamicWriterProxy struct { + methods any +} type FileInputStream struct { *os.File reader *bufio.Reader @@ -39,13 +107,81 @@ type BufferedOutputStream struct{ *bufio.Writer } func (s *ByteArrayInputStream) Available() int { return s.Len() } func (s *ByteArrayInputStream) Close() {} -func (s *ByteArrayOutputStream) ToByteArray() []byte { - return append([]byte(nil), s.Bytes()...) +func (s *ByteArrayOutputStream) ToByteArray() []int8 { + bytes := s.Bytes() + result := make([]int8, len(bytes)) + for index, value := range bytes { + result[index] = int8(value) + } + return result } func (s *ByteArrayOutputStream) ToString() string { return s.String() } func (s *ByteArrayOutputStream) Size() int { return s.Len() } func (s *ByteArrayOutputStream) Close() {} -func (s *StringReader) Close() {} +func (s *StringReader) ensureOpen() { + if s.closed { + panic(errors.New("Stream closed")) + } +} +func (s *StringReader) Close() { s.closed = true } +func (s *StringReader) Read(buffer []byte) (int, error) { + if s.closed { + return 0, errors.New("Stream closed") + } + if s.position >= len(s.data) { + return 0, io.EOF + } + n := copy(buffer, s.data[s.position:]) + s.position += n + s.lastRuneSize = 0 + return n, nil +} +func (s *StringReader) ReadRune() (rune, int, error) { + if s.closed { + return 0, 0, errors.New("Stream closed") + } + if s.position >= len(s.data) { + return 0, 0, io.EOF + } + rn, size := utf8.DecodeRune(s.data[s.position:]) + s.position += size + s.lastRuneSize = size + return rn, size, nil +} +func (s *StringReader) UnreadRune() error { + if s.closed { + return errors.New("Stream closed") + } + if s.lastRuneSize == 0 { + return fmt.Errorf("StringReader.UnreadRune: previous operation was not ReadRune") + } + s.position -= s.lastRuneSize + s.lastRuneSize = 0 + return nil +} +func (s *StringReader) Mark(_ int) { + s.ensureOpen() + s.mark = s.position +} +func (s *StringReader) Reset() { + s.ensureOpen() + s.position = s.mark + s.lastRuneSize = 0 +} +func (s *StringReader) Skip(count any) int64 { + s.ensureOpen() + want := lang.MustAsInt(count) + if want < 0 { + panic(fmt.Sprintf("StringReader.skip: negative count (%d)", want)) + } + remaining := len(s.data) - s.position + if want > remaining { + want = remaining + } + s.position += want + s.lastRuneSize = 0 + return int64(want) +} func (s *PushbackReader) Close() { if s.closer != nil { if err := s.closer.Close(); err != nil { @@ -53,6 +189,88 @@ func (s *PushbackReader) Close() { } } } +func (s *PushbackReader) ReadRune() (rune, int, error) { + var rn rune + var size int + var err error + if len(s.pushback) > 0 { + rn = s.pushback[0] + s.pushback = s.pushback[1:] + size = utf8.RuneLen(rn) + } else { + rn, size, err = s.Reader.ReadRune() + } + if err != nil { + return rn, size, err + } + s.lastRune = rn + s.lastRuneSize = size + s.lastRuneWasNew = rn == '\n' + if s.lastRuneWasNew { + s.lineNumber++ + } + return rn, size, nil +} +func (s *PushbackReader) UnreadRune() error { + if s.lastRuneSize == 0 { + return errors.New("PushbackReader.UnreadRune: previous operation was not ReadRune") + } + s.unreadRunes([]rune{s.lastRune}) + s.lastRuneSize = 0 + s.lastRuneWasNew = false + return nil +} + +func (s *PushbackReader) readChars(buffer any, offset, length int) int64 { + chars, ok := buffer.([]lang.Char) + if !ok { + panic(fmt.Sprintf("PushbackReader.read: %T is not a char[]", buffer)) + } + if offset < 0 || length < 0 || offset+length > len(chars) { + panic("PushbackReader.read: index out of bounds") + } + read := 0 + for read < length { + rn, _, err := s.ReadRune() + if errors.Is(err, io.EOF) { + break + } + if err != nil { + panic(err) + } + chars[offset+read] = lang.Char(rn) + read++ + } + if read == 0 { + return int64(-1) + } + return int64(read) +} + +func (s *PushbackReader) unreadChars(buffer any, offset, length int) { + chars, ok := buffer.([]lang.Char) + if !ok { + panic(fmt.Sprintf("PushbackReader.unread: %T is not a char[]", buffer)) + } + if offset < 0 || length < 0 || offset+length > len(chars) { + panic("PushbackReader.unread: index out of bounds") + } + runes := make([]rune, length) + for index := range runes { + runes[index] = rune(chars[offset+index]) + } + s.unreadRunes(runes) +} + +func (s *PushbackReader) unreadRunes(runes []rune) { + for _, rn := range runes { + if rn == '\n' { + s.lineNumber-- + } + } + s.pushback = append(append(make([]rune, 0, len(runes)+len(s.pushback)), runes...), s.pushback...) +} +func (s *PushbackReader) GetLineNumber() int { return s.lineNumber } func (w *PrintWriter) Close() { if w.closer != nil { if err := w.closer.Close(); err != nil { @@ -68,11 +286,58 @@ func (w *PrintWriter) Flush() { } } func (s *StringReader) ReadLine() any { - return readLine(s.Reader) + s.ensureOpen() + if s.position >= len(s.data) { + return nil + } + remaining := s.data[s.position:] + end := bytes.IndexByte(remaining, '\n') + if end < 0 { + s.position = len(s.data) + return strings.TrimSuffix(string(remaining), "\r") + } + s.position += end + 1 + return strings.TrimSuffix(string(remaining[:end]), "\r") } func (s *FileInputStream) Read(buffer []byte) (int, error) { return s.reader.Read(buffer) } func (s *FileInputStream) ReadLine() any { return readLine(s.reader) } +func (s *FileInputStream) ResolveFieldOrMethod(name string) (any, bool) { + if strings.EqualFold(name, "read") { + return lang.FnFunc1(func(buffer any) any { + var target []byte + switch buffer := buffer.(type) { + case []byte: + target = buffer + case []int8: + target = make([]byte, len(buffer)) + n, err := s.reader.Read(target) + for index := 0; index < n; index++ { + buffer[index] = int8(target[index]) + } + if err == io.EOF && n == 0 { + return int64(-1) + } + if err != nil && err != io.EOF { + panic(err) + } + return int64(n) + default: + panic(fmt.Sprintf("InputStream.read: expected byte[], got %T", buffer)) + } + n, err := s.reader.Read(target) + if err == io.EOF && n == 0 { + return int64(-1) + } + if err != nil && err != io.EOF { + panic(err) + } + return int64(n) + }), true + } + return nil, false +} + func readLine(reader *bufio.Reader) any { line, err := reader.ReadString('\n') if err != nil && err != io.EOF { @@ -87,6 +352,130 @@ func readLine(reader *bufio.Reader) any { } func (s *StringWriter) ToString() string { return s.String() } func (s *StringWriter) Close() {} +func (s *StringWriter) Append(value any) *StringWriter { + if character, ok := value.(lang.Char); ok { + rn := rune(character) + if 0xD800 <= rn && rn <= 0xDBFF { + s.pendingHigh = rn + return s + } + if s.pendingHigh != 0 && 0xDC00 <= rn && rn <= 0xDFFF { + s.WriteRune(utf16.DecodeRune(s.pendingHigh, rn)) + s.pendingHigh = 0 + return s + } + } + if s.pendingHigh != 0 { + s.WriteRune(utf8.RuneError) + s.pendingHigh = 0 + } + s.WriteString(lang.ToString(value)) + return s +} + +func NewColumnWriter(writer any, maxColumns any, fields any) any { + base, ok := writer.(io.Writer) + if !ok { + panic(fmt.Sprintf("ColumnWriter: %T is not a writer", writer)) + } + state, ok := fields.(*lang.Ref) + if !ok { + state = lang.NewRef(lang.NewMap( + lang.NewKeyword("max"), maxColumns, + lang.NewKeyword("cur"), int64(0), + lang.NewKeyword("line"), int64(0), + lang.NewKeyword("base"), writer)) + } + return &ColumnWriter{base: base, fields: state} +} + +func NewDynamicWriterProxy(methods any) any { + return &DynamicWriterProxy{methods: methods} +} +func (proxy *DynamicWriterProxy) method(name string) (lang.IFn, bool) { + method := lang.Get(proxy.methods, lang.NewKeyword(strings.ToLower(name))) + fn, ok := method.(lang.IFn) + return fn, ok +} +func (proxy *DynamicWriterProxy) Deref() any { + method, ok := proxy.method("deref") + if !ok { + return nil + } + return lang.Apply0(method) +} +func (proxy *DynamicWriterProxy) Write(data []byte) (int, error) { + method, ok := proxy.method("write") + if !ok { + return 0, fmt.Errorf("dynamic Writer proxy has no write method") + } + lang.Apply1(method, string(data)) + return len(data), nil +} +func (proxy *DynamicWriterProxy) ResolveFieldOrMethod(name string) (any, bool) { + return proxy.method(name) +} + +func (writer *ColumnWriter) Deref() any { return writer.fields } +func (writer *ColumnWriter) Flush() { + if flusher, ok := writer.base.(interface{ Flush() }); ok { + flusher.Flush() + } +} +func (writer *ColumnWriter) Write(data []byte) (int, error) { + writer.updatePosition(string(data)) + return writer.base.Write(data) +} +func (writer *ColumnWriter) updatePosition(text string) { + state := writer.fields.Deref() + line := lang.MustAsInt(lang.Get(state, lang.NewKeyword("line"))) + column := lang.MustAsInt(lang.Get(state, lang.NewKeyword("cur"))) + if lastNewline := strings.LastIndexByte(text, '\n'); lastNewline >= 0 { + line += strings.Count(text, "\n") + column = len(text) - lastNewline - 1 + } else { + column += len([]rune(text)) + } + state = lang.Assoc(state, lang.NewKeyword("line"), int64(line)) + state = lang.Assoc(state, lang.NewKeyword("cur"), int64(column)) + writer.fields.Set(state) +} +func (writer *ColumnWriter) ResolveFieldOrMethod(name string) (any, bool) { + switch strings.ToLower(name) { + case "flush": + return lang.FnFunc0(func() any { writer.Flush(); return nil }), true + case "write": + return lang.FnFunc(func(args ...any) any { + if len(args) != 1 && len(args) != 3 { + panic(fmt.Sprintf("ColumnWriter.write: wrong number of args (%d)", len(args))) + } + var text string + if len(args) == 1 { + switch value := args[0].(type) { + case string: + text = value + case lang.Char: + text = string(value) + default: + text = string(rune(lang.MustAsInt(value))) + } + } else { + chars := lang.Seq(args[0]) + all := []rune{} + for ; chars != nil; chars = chars.Next() { + all = append(all, rune(lang.MustAsInt(chars.First()))) + } + offset, length := lang.MustAsInt(args[1]), lang.MustAsInt(args[2]) + text = string(all[offset : offset+length]) + } + if _, err := io.WriteString(writer, text); err != nil { + panic(err) + } + return nil + }), true + } + return nil, false +} func NewByteArrayInputStream(args ...any) any { if len(args) != 1 { @@ -106,7 +495,7 @@ func NewStringReader(args ...any) any { if len(args) != 1 { panic(fmt.Sprintf("StringReader/new: wrong number of args (%d)", len(args))) } - return &StringReader{Reader: bufio.NewReader(strings.NewReader(lang.ToString(args[0])))} + return &StringReader{data: []byte(lang.ToString(args[0]))} } func NewStringWriter(args ...any) any { @@ -117,14 +506,21 @@ func NewStringWriter(args ...any) any { } func NewPushbackReader(args ...any) any { - if len(args) != 1 { + if len(args) < 1 || len(args) > 2 { panic(fmt.Sprintf("PushbackReader/new: wrong number of args (%d)", len(args))) } reader, ok := args[0].(io.Reader) if !ok { panic(fmt.Sprintf("PushbackReader/new: %T is not a reader", args[0])) } - pushback := &PushbackReader{Reader: bufio.NewReader(reader)} + bufferSize := 1 + if len(args) == 2 { + bufferSize = lang.MustAsInt(args[1]) + if bufferSize <= 0 { + panic("PushbackReader/new: buffer size must be positive") + } + } + pushback := &PushbackReader{Reader: bufio.NewReaderSize(reader, bufferSize), lineNumber: 1} pushback.closer, _ = args[0].(io.Closer) return pushback } @@ -194,6 +590,12 @@ func byteSlice(value any) []byte { switch value := value.(type) { case []byte: return value + case []int8: + out := make([]byte, len(value)) + for index, item := range value { + out[index] = byte(item) + } + return out case string: return []byte(value) case lang.IPersistentVector: @@ -217,6 +619,8 @@ func registerClass(name, javaName string, classType reflect.Type, constructor fu } func init() { + pkgmap.Set("github.com/glojurelang/glojure/pkg/javacompat/streams.NewColumnWriter", lang.FnFunc3(NewColumnWriter)) + pkgmap.Set("github.com/glojurelang/glojure/pkg/javacompat/streams.NewDynamicWriterProxy", lang.FnFunc1(NewDynamicWriterProxy)) registerClass("InputStream", "java.io.InputStream", reflect.TypeOf((*InputStream)(nil)).Elem(), nil) registerClass("OutputStream", "java.io.OutputStream", diff --git a/pkg/javacompat/streams/streams_test.go b/pkg/javacompat/streams/streams_test.go index 7ec43981..f80a3fdd 100644 --- a/pkg/javacompat/streams/streams_test.go +++ b/pkg/javacompat/streams/streams_test.go @@ -2,11 +2,39 @@ package streams import ( "bytes" + "io" "os" "path/filepath" + "reflect" "testing" + + "github.com/glojurelang/glojure/pkg/lang" ) +func TestByteArrayOutputStreamJavaWriteOverloads(t *testing.T) { + stream := &ByteArrayOutputStream{} + write, found := lang.FieldOrMethod(stream, "write") + if !found { + t.Fatal("write method not found") + } + lang.Apply(write, []any{int('A')}) + lang.Apply(write, []any{[]int8{'B', 'C'}}) + if got := stream.ToByteArray(); !reflect.DeepEqual(got, []int8{65, 66, 67}) { + t.Fatalf("bytes = %v, want ASCII ABC", got) + } +} + +func TestByteArrayInputStreamAcceptsSignedBytes(t *testing.T) { + stream := NewByteArrayInputStream([]int8{0, 127, -128, -1}).(*ByteArrayInputStream) + got, err := io.ReadAll(stream) + if err != nil { + t.Fatal(err) + } + if want := []byte{0, 127, 128, 255}; !bytes.Equal(got, want) { + t.Fatalf("bytes = %v, want %v", got, want) + } +} + type closeTrackingReader struct { *bytes.Reader closed bool @@ -40,6 +68,35 @@ func TestStringReaderReadLine(t *testing.T) { } } +func TestStringReaderMarkResetSkipAndRunes(t *testing.T) { + reader := NewStringReader("aébc").(*StringReader) + reader.Mark(4) + rn, _, err := reader.ReadRune() + if err != nil || rn != 'a' { + t.Fatalf("first ReadRune = %q, %v", rn, err) + } + rn, _, err = reader.ReadRune() + if err != nil || rn != 'é' { + t.Fatalf("second ReadRune = %q, %v", rn, err) + } + reader.Reset() + if skipped := reader.Skip(1); skipped != 1 { + t.Fatalf("Skip = %d, want 1", skipped) + } + rn, _, err = reader.ReadRune() + if err != nil || rn != 'é' { + t.Fatalf("ReadRune after reset/skip = %q, %v", rn, err) + } +} + +func TestStringReaderRejectsReadsAfterClose(t *testing.T) { + reader := NewStringReader("a").(*StringReader) + reader.Close() + if _, _, err := reader.ReadRune(); err == nil || err.Error() != "Stream closed" { + t.Fatalf("ReadRune after close error = %v", err) + } +} + func TestPushbackReaderRunes(t *testing.T) { reader := NewPushbackReader(NewStringReader("ab")).(*PushbackReader) r, _, err := reader.ReadRune() @@ -55,6 +112,59 @@ func TestPushbackReaderRunes(t *testing.T) { } } +func TestPushbackReaderAcceptsBufferSize(t *testing.T) { + reader := NewPushbackReader(NewStringReader("ab"), int64(8)).(*PushbackReader) + r, _, err := reader.ReadRune() + if err != nil || r != 'a' { + t.Fatalf("ReadRune = %q, %v", r, err) + } +} + +func TestPushbackReaderJavaReadAndUnreadOverloads(t *testing.T) { + reader := NewPushbackReader(NewStringReader("abcd"), int64(8)).(*PushbackReader) + readMethod, found := reader.ResolveFieldOrMethod("read") + if !found { + t.Fatal("read method not found") + } + buffer := make([]lang.Char, 4) + if got := readMethod.(lang.IFn).Invoke(buffer, int64(0), int64(4)); got != int64(4) { + t.Fatalf("read count = %v, want 4", got) + } + unreadMethod, found := reader.ResolveFieldOrMethod("unread") + if !found { + t.Fatal("unread method not found") + } + unreadMethod.(lang.IFn).Invoke(buffer, int64(1), int64(2)) + if got := readMethod.(lang.IFn).Invoke(); got != int64('b') { + t.Fatalf("first unread character = %v, want %d", got, 'b') + } + if got := readMethod.(lang.IFn).Invoke(); got != int64('c') { + t.Fatalf("second unread character = %v, want %d", got, 'c') + } +} + +func TestPushbackReaderTracksLineNumbers(t *testing.T) { + reader := NewPushbackReader(NewStringReader("a\nb")).(*PushbackReader) + if got := reader.GetLineNumber(); got != 1 { + t.Fatalf("initial line = %d, want 1", got) + } + for _, want := range []rune{'a', '\n'} { + got, _, err := reader.ReadRune() + if err != nil || got != want { + t.Fatalf("ReadRune = %q, %v; want %q", got, err, want) + } + } + if got := reader.GetLineNumber(); got != 2 { + t.Fatalf("line after newline = %d, want 2", got) + } + if err := reader.UnreadRune(); err != nil { + t.Fatal(err) + } + if got := reader.GetLineNumber(); got != 1 { + t.Fatalf("line after unread = %d, want 1", got) + } +} + func TestPushbackReaderClosesWrappedReader(t *testing.T) { wrapped := &closeTrackingReader{Reader: bytes.NewReader([]byte("a"))} reader := NewPushbackReader(wrapped).(*PushbackReader) @@ -79,6 +189,17 @@ func TestPrintWriterWritesAndCloses(t *testing.T) { } } +func TestPrintWriterAppend(t *testing.T) { + var output bytes.Buffer + writer := NewPrintWriter(&output).(*PrintWriter) + if got := writer.Append("hello").Append(lang.NewChar('!')); got != writer { + t.Fatal("Append did not return its receiver") + } + if got, want := output.String(), "hello!"; got != want { + t.Fatalf("content = %q, want %q", got, want) + } +} + func TestFileInputStreamReadLine(t *testing.T) { path := filepath.Join(t.TempDir(), "lines.txt") if err := os.WriteFile(path, []byte("first\nsecond"), 0o600); err != nil { @@ -93,3 +214,85 @@ func TestFileInputStreamReadLine(t *testing.T) { t.Fatalf("second ReadLine = %v, want %v", got, want) } } + +func TestFileInputStreamJavaRead(t *testing.T) { + path := filepath.Join(t.TempDir(), "bytes.txt") + if err := os.WriteFile(path, []byte{0, 127, 128, 255}, 0o600); err != nil { + t.Fatal(err) + } + reader := NewFileInputStream(path).(*FileInputStream) + defer reader.Close() + read, ok := reader.ResolveFieldOrMethod("read") + if !ok { + t.Fatal("read method not resolved") + } + buffer := make([]int8, 4) + if got := lang.Apply1(read, buffer); got != int64(4) { + t.Fatalf("read = %v, want 4", got) + } + if want := []int8{0, 127, -128, -1}; !reflect.DeepEqual(buffer, want) { + t.Fatalf("buffer = %v, want %v", buffer, want) + } + if got := lang.Apply1(read, buffer); got != int64(-1) { + t.Fatalf("EOF read = %v, want -1", got) + } +} + +func TestStringWriterAppend(t *testing.T) { + writer := &StringWriter{} + if got := writer.Append("Go").Append(lang.NewChar('!')); got != writer { + t.Fatal("Append did not return its receiver") + } + if got, want := writer.String(), "Go!"; got != want { + t.Fatalf("content = %q, want %q", got, want) + } +} + +func TestStringWriterCombinesUTF16Surrogates(t *testing.T) { + writer := &StringWriter{} + writer.Append(lang.Char(0xD83D)).Append(lang.Char(0xDE03)) + if got, want := writer.String(), "😃"; got != want { + t.Fatalf("content = %q, want %q", got, want) + } +} + +func TestColumnWriterTracksPosition(t *testing.T) { + base := &StringWriter{} + fields := lang.NewRef(lang.NewMap( + lang.NewKeyword("max"), int64(72), + lang.NewKeyword("cur"), int64(0), + lang.NewKeyword("line"), int64(0), + lang.NewKeyword("base"), base)) + writer := NewColumnWriter(base, int64(72), fields).(*ColumnWriter) + write, _ := writer.ResolveFieldOrMethod("write") + lang.Apply1(write, "abc\ndef") + if got, want := base.String(), "abc\ndef"; got != want { + t.Fatalf("content = %q, want %q", got, want) + } + state := fields.Deref() + if got := lang.Get(state, lang.NewKeyword("line")); got != int64(1) { + t.Fatalf("line = %v, want 1", got) + } + if got := lang.Get(state, lang.NewKeyword("cur")); got != int64(3) { + t.Fatalf("column = %v, want 3", got) + } +} + +func TestDynamicWriterProxy(t *testing.T) { + base := &StringWriter{} + proxy := NewDynamicWriterProxy(lang.NewMap( + lang.NewKeyword("write"), lang.FnFunc1(func(value any) any { + base.WriteString(lang.ToString(value)) + return nil + }), + lang.NewKeyword("deref"), lang.FnFunc0(func() any { return "state" }))).(*DynamicWriterProxy) + if _, err := io.WriteString(proxy, "hello"); err != nil { + t.Fatal(err) + } + if got := base.String(); got != "hello" { + t.Fatalf("content = %q", got) + } + if got := proxy.Deref(); got != "state" { + t.Fatalf("deref = %v", got) + } +} diff --git a/pkg/javacompat/string/string.go b/pkg/javacompat/string/string.go index 96ef3c9a..8a80b2f7 100644 --- a/pkg/javacompat/string/string.go +++ b/pkg/javacompat/string/string.go @@ -54,7 +54,43 @@ func Join(args ...any) string { return jstr.Join(delim, rest) } -func ValueOf(x any) string { return jstr.ValueOf(x) } +func ValueOf(x any) string { + if ch, ok := x.(lang.Char); ok { + return string(rune(ch)) + } + return jstr.ValueOf(x) +} + +func New(args ...any) any { + if len(args) < 1 || len(args) > 3 { + panic(fmt.Sprintf("String/new: wrong number of args (%d)", len(args))) + } + if len(args) == 3 { + chars, ok := toInt32Slice(args[0]) + if !ok { + panic(fmt.Sprintf("String/new: cannot coerce %T to char[]", args[0])) + } + return jstr.CopyValueOf(chars, toInt32(args[1]), toInt32(args[2])) + } + switch value := args[0].(type) { + case string: + return value + case []byte: + return string(value) + case []int8: + bytes := make([]byte, len(value)) + for index, item := range value { + bytes[index] = byte(item) + } + return string(bytes) + case []lang.Char, []int32, lang.IPersistentVector: + chars, ok := toInt32Slice(value) + if ok { + return string(chars) + } + } + panic(fmt.Sprintf("String/new: cannot coerce %T", args[0])) +} func CopyValueOf(args ...any) string { data, ok := toInt32Slice(args[0]) @@ -82,6 +118,8 @@ func registerMethod(name string, fn lang.StringMethod) { } func init() { + lang.RegisterHostConstructor("java.lang.String", + lang.FnFunc(func(args ...any) any { return New(args...) })) // Static methods. Registered under bare "String." prefix; the runtime // also accepts "java.lang.String/" via prefix stripping in evalast.go. register("format", "Format", lang.FnFunc(func(args ...any) any { return Format(args...) })) @@ -214,7 +252,14 @@ func init() { } return lang.NewVector(out...) }) - registerMethod("getBytes", func(s string, _ ...any) any { return jstr.GetBytes(s) }) + registerMethod("getBytes", func(s string, _ ...any) any { + bytes := jstr.GetBytes(s) + result := make([]int8, len(bytes)) + for index, value := range bytes { + result[index] = int8(value) + } + return result + }) registerMethod("chars", func(s string, _ ...any) any { units := jstr.Chars(s) out := make([]any, len(units)) @@ -343,6 +388,12 @@ func toStringSlice(x any) ([]string, bool) { func toInt32Slice(x any) ([]int32, bool) { switch v := x.(type) { + case []lang.Char: + out := make([]int32, len(v)) + for index, value := range v { + out[index] = int32(value) + } + return out, true case []int32: return v, true case []any: diff --git a/pkg/javacompat/string/string_compat_test.go b/pkg/javacompat/string/string_compat_test.go new file mode 100644 index 00000000..6a754a32 --- /dev/null +++ b/pkg/javacompat/string/string_compat_test.go @@ -0,0 +1,36 @@ +package string + +import ( + "reflect" + "testing" + + "github.com/glojurelang/glojure/pkg/lang" +) + +func TestStringConstructors(t *testing.T) { + if got := New([]byte("hello"), "ASCII"); got != "hello" { + t.Fatalf("byte String = %q, want hello", got) + } + if got := New([]int8{-61, -68}, "UTF-8"); got != "ü" { + t.Fatalf("signed-byte String = %q, want ü", got) + } +} + +func TestStringCharArrayRangeConstructor(t *testing.T) { + chars := []lang.Char{'a', 'b', 'c', 'd'} + if got := New(chars, int64(1), int64(2)); got != "bc" { + t.Fatalf("char range String = %q, want bc", got) + } +} + +func TestGetBytesReturnsSignedJavaByteArray(t *testing.T) { + method, found := lang.FieldOrMethod("ÿ", "getBytes") + if !found { + t.Fatal("getBytes method not found") + } + got := lang.Apply(method, nil).([]int8) + want := []int8{-61, -65} + if !reflect.DeepEqual(got, want) { + t.Fatalf("getBytes = %v, want %v", got, want) + } +} diff --git a/pkg/javacompat/stringbuilder/stringbuilder.go b/pkg/javacompat/stringbuilder/stringbuilder.go index ff377e4b..ed49b4be 100644 --- a/pkg/javacompat/stringbuilder/stringbuilder.go +++ b/pkg/javacompat/stringbuilder/stringbuilder.go @@ -30,6 +30,11 @@ func (b *StringBuilder) Append(value any) *StringBuilder { return b } +func (b *StringBuilder) AppendCodePoint(value any) *StringBuilder { + b.value += string(rune(lang.MustAsInt(value))) + return b +} + func (b *StringBuilder) Write(value []byte) (int, error) { b.value += string(value) return len(value), nil diff --git a/pkg/javacompat/stringbuilder/stringbuilder_test.go b/pkg/javacompat/stringbuilder/stringbuilder_test.go index 34d75be4..10c075ed 100644 --- a/pkg/javacompat/stringbuilder/stringbuilder_test.go +++ b/pkg/javacompat/stringbuilder/stringbuilder_test.go @@ -14,7 +14,8 @@ func TestStringBuilderSupportsJavaAndWriterCalls(t *testing.T) { } lang.AppendWriter(builder, " + bb!") builder.Append("!") - if got, want := builder.ToString(), "Go + bb!!"; got != want { + builder.AppendCodePoint(int('✓')) + if got, want := builder.ToString(), "Go + bb!!✓"; got != want { t.Fatalf("StringBuilder value = %q, want %q", got, want) } } diff --git a/pkg/javacompat/thread/thread.go b/pkg/javacompat/thread/thread.go index ab601193..72fe8905 100644 --- a/pkg/javacompat/thread/thread.go +++ b/pkg/javacompat/thread/thread.go @@ -16,12 +16,16 @@ import ( const pkg = "github.com/glojurelang/glojure/pkg/javacompat/thread" -// Thread is the placeholder type registered as java.lang.Thread's -// reflect.Type. We don't expose Thread instances yet (only static -// sleep), so the value just makes (ns-imports *ns*) include the -// auto-imported class. +// Thread is a lightweight hosted representation of the current goroutine. +// Go does not expose a stable goroutine identity or JVM-shaped frames, but a +// concrete value with an empty stack preserves portable feature-detection and +// non-REPL control flow. type Thread struct{} +func CurrentThread() any { return &Thread{} } + +func (thread *Thread) GetStackTrace() []any { return []any{} } + // Sleep mirrors java.lang.Thread.sleep. Accepts (millis) or (millis, nanos); // both arguments are coerced from any int-like value glojure may pass. func Sleep(args ...any) any { @@ -45,6 +49,7 @@ func register(jvmName, goName string, v any) { func init() { register("sleep", "Sleep", lang.FnFunc(func(args ...any) any { return Sleep(args...) })) + register("currentThread", "CurrentThread", lang.FnFunc0(CurrentThread)) } func toInt64(x any) int64 { diff --git a/pkg/javacompat/thread/thread_test.go b/pkg/javacompat/thread/thread_test.go new file mode 100644 index 00000000..283ea266 --- /dev/null +++ b/pkg/javacompat/thread/thread_test.go @@ -0,0 +1,19 @@ +package thread + +import ( + "testing" + + "github.com/glojurelang/glojure/pkg/lang" + "github.com/glojurelang/glojure/pkg/pkgmap" +) + +func TestCurrentThreadCompatibility(t *testing.T) { + method, ok := pkgmap.Get("Thread.currentThread") + if !ok { + t.Fatal("Thread.currentThread is not registered") + } + current := lang.Apply0(method.(lang.IFn)).(*Thread) + if got := len(current.GetStackTrace()); got != 0 { + t.Fatalf("stack trace length = %d, want 0", got) + } +} diff --git a/pkg/javacompat/throwable/throwable.go b/pkg/javacompat/throwable/throwable.go index fbb1d04d..cd944736 100644 --- a/pkg/javacompat/throwable/throwable.go +++ b/pkg/javacompat/throwable/throwable.go @@ -3,6 +3,7 @@ package throwable import ( "errors" + "fmt" "reflect" "github.com/glojurelang/glojure/pkg/lang" @@ -12,10 +13,20 @@ import ( var errorType = reflect.TypeOf((*error)(nil)).Elem() func New(args ...any) any { - if len(args) == 0 { + switch len(args) { + case 0: return errors.New("") + case 1: + return errors.New(lang.ToString(args[0])) + case 2: + cause, ok := args[1].(error) + if !ok { + panic(fmt.Sprintf("Throwable/new: cause must be an error, got %T", args[1])) + } + return fmt.Errorf("%s: %w", lang.ToString(args[0]), cause) + default: + panic(fmt.Sprintf("Throwable/new: wrong number of args (%d)", len(args))) } - return errors.New(lang.ToString(args[0])) } func register(name string) { diff --git a/pkg/javacompat/throwable/throwable_test.go b/pkg/javacompat/throwable/throwable_test.go new file mode 100644 index 00000000..0bfb7cb5 --- /dev/null +++ b/pkg/javacompat/throwable/throwable_test.go @@ -0,0 +1,17 @@ +package throwable + +import ( + "errors" + "testing" + + "github.com/glojurelang/glojure/pkg/lang" +) + +func TestNewWithCause(t *testing.T) { + cause := errors.New("cause") + wrapped := New("outer", cause).(error) + method, ok := lang.FieldOrMethod(wrapped, "getCause") + if !ok || method.(lang.IFn).Invoke() != cause { + t.Fatalf("getCause = %v, want %v", method, cause) + } +} diff --git a/pkg/javacompat/uuid/uuid.go b/pkg/javacompat/uuid/uuid.go index 3f269c8b..8afc3cd3 100644 --- a/pkg/javacompat/uuid/uuid.go +++ b/pkg/javacompat/uuid/uuid.go @@ -9,19 +9,25 @@ package uuid import ( "fmt" + "io" "reflect" juuid "github.com/gloathub/gojava/uuid" "github.com/glojurelang/glojure/pkg/lang" "github.com/glojurelang/glojure/pkg/pkgmap" + guuid "github.com/google/uuid" ) const pkg = "github.com/glojurelang/glojure/pkg/javacompat/uuid" // IsUUID reports whether x is a java.util.UUID compatibility value. func IsUUID(x any) bool { - _, ok := x.(*juuid.UUID) - return ok + switch x.(type) { + case *juuid.UUID, guuid.UUID: + return true + default: + return false + } } // RandomUUID mirrors UUID.randomUUID. @@ -63,11 +69,22 @@ func FromBits(args ...any) *juuid.UUID { func register(jvmName, goName string, v any) { pkgmap.Set(pkg+"."+goName, v) pkgmap.Set("UUID."+jvmName, v) + pkgmap.Set("java.util.UUID."+jvmName, v) pkgmap.SetHostClassPackage("UUID", "java.util") - pkgmap.SetHostClass("UUID", lang.NewClass(reflect.TypeOf((*juuid.UUID)(nil)), "java.util.UUID")) + pkgmap.SetHostClass("UUID", lang.NewClassWithTypes( + "java.util.UUID", + reflect.TypeOf((*juuid.UUID)(nil)), + reflect.TypeOf(guuid.UUID{}), + )) } func init() { + lang.RegisterReadablePrinter(reflect.TypeOf((*juuid.UUID)(nil)), func(value any, writer io.Writer) { + fmt.Fprintf(writer, "#uuid %q", value.(*juuid.UUID).String()) + }) + lang.RegisterHostTypeConstructor( + reflect.TypeOf((*juuid.UUID)(nil)), + lang.FnFunc(func(args ...any) any { return FromBits(args...) })) register("randomUUID", "RandomUUID", lang.FnFunc(func(_ ...any) any { return RandomUUID() })) register("fromString", "FromString", lang.FnFunc(func(args ...any) any { return FromString(args...) })) register("nameUUIDFromBytes", "NameUUIDFromBytes", lang.FnFunc(func(args ...any) any { return NameUUIDFromBytes(args...) })) diff --git a/pkg/javacompat/uuid/uuid_test.go b/pkg/javacompat/uuid/uuid_test.go index 4641bd9d..884eee68 100644 --- a/pkg/javacompat/uuid/uuid_test.go +++ b/pkg/javacompat/uuid/uuid_test.go @@ -1,12 +1,34 @@ package uuid -import "testing" +import ( + "testing" + + "github.com/glojurelang/glojure/pkg/lang" + "github.com/glojurelang/glojure/pkg/pkgmap" + guuid "github.com/google/uuid" +) func TestIsUUID(t *testing.T) { if !IsUUID(RandomUUID()) { t.Fatal("RandomUUID result is not recognized as a UUID") } + if !IsUUID(guuid.MustParse("f81d4fae-7dec-11d0-a765-00a0c91e6bf6")) { + t.Fatal("google/uuid parser result is not recognized as a UUID") + } if IsUUID("not-a-uuid") { t.Fatal("string was recognized as a UUID") } } + +func TestUUIDClassAcceptsCompatibilityAndParserValues(t *testing.T) { + class, ok := pkgmap.HostClass("UUID") + if !ok { + t.Fatal("UUID host class is not registered") + } + if !lang.HasType(class, RandomUUID()) { + t.Fatal("UUID class rejected a compatibility UUID") + } + if !lang.HasType(class, guuid.New()) { + t.Fatal("UUID class rejected a parser UUID") + } +} diff --git a/pkg/lang/bigdecimal.go b/pkg/lang/bigdecimal.go index 752bede8..9c808329 100644 --- a/pkg/lang/bigdecimal.go +++ b/pkg/lang/bigdecimal.go @@ -3,9 +3,11 @@ package lang import ( "fmt" "math/big" + "reflect" "strings" "bitbucket.org/pcastools/hash" + "github.com/glojurelang/glojure/pkg/pkgmap" ) // BigDec is an arbitrary-precision floating point number. It wraps @@ -20,16 +22,28 @@ import ( // arithmetic with decimal fractions. A decimal representation // would avoid this problem. type BigDecimal struct { - val *big.Float + val *big.Float + text string + scale int + hasScale bool } +type RoundingMode string + +const ( + RoundingModeDown RoundingMode = "DOWN" + RoundingModeHalfEven RoundingMode = "HALF_EVEN" + RoundingModeFloor RoundingMode = "FLOOR" + RoundingModeCeiling RoundingMode = "CEILING" +) + // NewBigDecimal creates a new BigDecimal from a string. func NewBigDecimal(s string) (*BigDecimal, error) { bf, ok := new(big.Float).SetString(s) if !ok { return nil, fmt.Errorf("invalid big decimal: %s", s) } - return &BigDecimal{val: bf}, nil + return &BigDecimal{val: bf, text: s}, nil } // NewBigDecimalFromBigFloat @@ -61,6 +75,59 @@ func (n *BigDecimal) ToBigInteger() *big.Int { return res } +// SetScale implements the java.math.BigDecimal rounding modes used by +// portable Clojure libraries. DOWN truncates toward zero and HALF_EVEN uses +// banker's rounding. +func (n *BigDecimal) SetScale(scale any, mode any) *BigDecimal { + digits := MustAsInt(scale) + if digits < 0 { + panic(fmt.Errorf("BigDecimal.setScale: negative scale %d is unsupported", digits)) + } + + factor := new(big.Int).Exp(big.NewInt(10), big.NewInt(int64(digits)), nil) + rat, _ := n.val.Rat(nil) + scaledNumerator := new(big.Int).Mul(rat.Num(), factor) + quotient, remainder := new(big.Int), new(big.Int) + quotient.QuoRem(scaledNumerator, rat.Denom(), remainder) + + modeName := fmt.Sprint(mode) + if remainder.Sign() != 0 && modeName == string(RoundingModeFloor) && scaledNumerator.Sign() < 0 { + quotient.Sub(quotient, big.NewInt(1)) + } + if remainder.Sign() != 0 && modeName == string(RoundingModeCeiling) && scaledNumerator.Sign() > 0 { + quotient.Add(quotient, big.NewInt(1)) + } + if modeName == string(RoundingModeHalfEven) && remainder.Sign() != 0 { + twiceRemainder := new(big.Int).Lsh(new(big.Int).Abs(remainder), 1) + denominator := new(big.Int).Abs(rat.Denom()) + comparison := twiceRemainder.Cmp(denominator) + if comparison > 0 || (comparison == 0 && quotient.Bit(0) == 1) { + if scaledNumerator.Sign() < 0 { + quotient.Sub(quotient, big.NewInt(1)) + } else { + quotient.Add(quotient, big.NewInt(1)) + } + } + } + + result := new(big.Rat).SetFrac(quotient, factor) + return &BigDecimal{ + val: new(big.Float).SetPrec(256).SetRat(result), + scale: digits, + hasScale: true, + } +} + +func (n *BigDecimal) ToPlainString() string { + if n.hasScale { + return n.val.Text('f', n.scale) + } + if n.text != "" { + return n.text + } + return n.val.Text('f', -1) +} + func (n *BigDecimal) ToBigFloat() *big.Float { res := new(big.Float) res.Set(n.val) @@ -68,6 +135,9 @@ func (n *BigDecimal) ToBigFloat() *big.Float { } func (n *BigDecimal) String() string { + if n.text != "" { + return n.text + } s := n.val.Text('f', -1) // Ensure decimal point is present (e.g. "0" → "0.0") if !strings.Contains(s, ".") { @@ -79,7 +149,7 @@ func (n *BigDecimal) String() string { // StripTrailingZeros returns a string representation with trailing // fractional zeros removed (e.g. "1.0" → "1", "1.50" → "1.5"). func (n *BigDecimal) StripTrailingZeros() string { - s := n.val.Text('f', -1) + s := n.String() if strings.Contains(s, ".") { s = strings.TrimRight(s, "0") s = strings.TrimRight(s, ".") @@ -177,3 +247,71 @@ func (n *BigDecimal) Abs() *BigDecimal { } return n } + +func newHostBigDecimal(args ...any) any { + if len(args) == 2 { + var value *big.Int + switch unscaled := args[0].(type) { + case *BigInt: + value = unscaled.ToBigInteger() + case *big.Int: + value = new(big.Int).Set(unscaled) + default: + panic(fmt.Errorf("BigDecimal/new: expected BigInteger, got %T", args[0])) + } + scale := AsInt64(args[1]) + factor := new(big.Int).Exp(big.NewInt(10), big.NewInt(absInt64(scale)), nil) + if scale < 0 { + value.Mul(value, factor) + result, err := NewBigDecimal(value.String()) + if err != nil { + panic(err) + } + return result + } + text := new(big.Rat).SetFrac(value, factor).FloatString(int(scale)) + result, err := NewBigDecimal(text) + if err != nil { + panic(err) + } + return result + } + if len(args) != 1 { + panic(fmt.Errorf("BigDecimal/new: wrong number of args (%d)", len(args))) + } + if text, ok := args[0].(string); ok { + value, err := NewBigDecimal(text) + if err != nil { + panic(err) + } + return value + } + return AsBigDecimal(args[0]) +} + +func absInt64(value int64) int64 { + if value < 0 { + return -value + } + return value +} + +func init() { + pkgmap.SetHostClassPackage("BigDecimal", "java.math") + pkgmap.SetHostClass("BigDecimal", + NewClass(reflect.TypeOf((*BigDecimal)(nil)), "java.math.BigDecimal")) + RegisterHostConstructor("java.math.BigDecimal", + FnFunc(func(args ...any) any { return newHostBigDecimal(args...) })) + + pkgmap.SetHostClassPackage("RoundingMode", "java.math") + pkgmap.SetHostClass("RoundingMode", + NewClass(reflect.TypeOf(RoundingMode("")), "java.math.RoundingMode")) + for _, prefix := range []string{"RoundingMode", "java.math.RoundingMode"} { + pkgmap.Set(prefix+".DOWN", RoundingModeDown) + pkgmap.Set(prefix+".HALF_EVEN", RoundingModeHalfEven) + } + for _, prefix := range []string{"BigDecimal", "java.math.BigDecimal"} { + pkgmap.Set(prefix+".ROUND_FLOOR", RoundingModeFloor) + pkgmap.Set(prefix+".ROUND_CEILING", RoundingModeCeiling) + } +} diff --git a/pkg/lang/bigdecimal_test.go b/pkg/lang/bigdecimal_test.go new file mode 100644 index 00000000..67a4ed22 --- /dev/null +++ b/pkg/lang/bigdecimal_test.go @@ -0,0 +1,63 @@ +package lang + +import ( + "testing" + + "github.com/glojurelang/glojure/pkg/pkgmap" +) + +func TestBigDecimalJavaCompatibility(t *testing.T) { + class, found := pkgmap.Get("java.math.BigDecimal") + if !found { + t.Fatal("java.math.BigDecimal was not registered") + } + value := NewHostInstance(class, "3.145").(*BigDecimal) + if got := value.SetScale(2, RoundingModeHalfEven).ToPlainString(); got != "3.14" { + t.Fatalf("half-even rounding = %q, want 3.14", got) + } + if got := value.SetScale(0, RoundingModeDown).ToPlainString(); got != "3" { + t.Fatalf("down rounding = %q, want 3", got) + } + if got := AsBigDecimal(3.0).SetScale(3, RoundingModeHalfEven).ToPlainString(); got != "3.000" { + t.Fatalf("scaled decimal = %q, want 3.000", got) + } +} + +func TestBigDecimalPreservesParsedDecimalText(t *testing.T) { + input := "23380875855752415049.311059436287553537054164807932529589059912485" + value, err := NewBigDecimal(input) + if err != nil { + t.Fatal(err) + } + if got := value.String(); got != input { + t.Fatalf("String = %q, want %q", got, input) + } +} + +func TestBigDecimalUnscaledConstructorPreservesDecimalText(t *testing.T) { + unscaled := newBigIntegerForTest("3145") + value := newHostBigDecimal(unscaled, int64(3)).(*BigDecimal) + want := "3.145" + if got := value.String(); got != want { + t.Fatalf("String = %q, want %q", got, want) + } +} + +func TestBigDecimalFloorAndCeilingScale(t *testing.T) { + negative, _ := NewBigDecimal("-4.3") + if got, want := negative.SetScale(0, RoundingModeFloor).ToPlainString(), "-5"; got != want { + t.Fatalf("floor = %q, want %q", got, want) + } + positive, _ := NewBigDecimal("4.3") + if got, want := positive.SetScale(0, RoundingModeCeiling).ToPlainString(), "5"; got != want { + t.Fatalf("ceiling = %q, want %q", got, want) + } +} + +func newBigIntegerForTest(value string) *BigInt { + result, err := NewBigInt(value) + if err != nil { + panic(err) + } + return result +} diff --git a/pkg/lang/bigint.go b/pkg/lang/bigint.go index 665fa711..91415d5c 100644 --- a/pkg/lang/bigint.go +++ b/pkg/lang/bigint.go @@ -73,6 +73,25 @@ func (n *BigInt) String() string { return n.val.String() } +// ToString mirrors java.math.BigInteger.toString, including its radix +// overload used by portable JVM libraries. +func (n *BigInt) ToString(args ...any) string { + if len(args) == 0 { + return n.String() + } + if len(args) != 1 { + panic(fmt.Sprintf("BigInteger.toString: wrong number of args (%d)", len(args))) + } + return n.val.Text(MustAsInt(args[0])) +} + +func (n *BigInt) ResolveFieldOrMethod(name string) (any, bool) { + if strings.EqualFold(name, "toString") { + return FnFunc(func(args ...any) any { return n.ToString(args...) }), true + } + return nil, false +} + func (n *BigInt) Hash() uint32 { if n.val.IsInt64() { return uint32(hash.Int64(n.val.Int64())) diff --git a/pkg/lang/char.go b/pkg/lang/char.go index de6fd754..d53b31fb 100644 --- a/pkg/lang/char.go +++ b/pkg/lang/char.go @@ -60,6 +60,18 @@ func RuneFromCharLiteral(lit string) (rune, error) { } char = string(unquoted) } + // Clojure also accepts octal character literals in the form \oNNN. + if len(char) > 1 && char[0] == 'o' { + digits := char[1:] + if len(digits) > 3 { + return 0, fmt.Errorf("invalid octal character: %s", char) + } + value, err := strconv.ParseUint(digits, 8, 8) + if err != nil { + return 0, fmt.Errorf("invalid octal character: %s", char) + } + char = string(rune(value)) + } // if the character is more than one rune, it's invalid if utf8.RuneCountInString(char) != 1 { @@ -91,8 +103,20 @@ func CharLiteralFromRune(rn rune) string { } func CharAt(s string, idx int) Char { - if idx < 0 || idx >= len(s) { + if idx < 0 { + panic(NewIndexOutOfBoundsError()) + } + bytePos := 0 + for i := 0; i < idx; i++ { + if bytePos >= len(s) { + panic(NewIndexOutOfBoundsError()) + } + _, size := utf8.DecodeRuneInString(s[bytePos:]) + bytePos += size + } + if bytePos >= len(s) { panic(NewIndexOutOfBoundsError()) } - return NewChar(rune(s[idx])) + r, _ := utf8.DecodeRuneInString(s[bytePos:]) + return NewChar(r) } diff --git a/pkg/lang/char_test.go b/pkg/lang/char_test.go new file mode 100644 index 00000000..8d582f5c --- /dev/null +++ b/pkg/lang/char_test.go @@ -0,0 +1,32 @@ +package lang + +import "testing" + +func TestRuneFromOctalCharLiteral(t *testing.T) { + tests := []struct { + literal string + want rune + }{ + {`\o0`, 0}, + {`\o013`, 11}, + {`\o377`, 255}, + } + + for _, test := range tests { + got, err := RuneFromCharLiteral(test.literal) + if err != nil { + t.Fatalf("RuneFromCharLiteral(%q): %v", test.literal, err) + } + if got != test.want { + t.Errorf("RuneFromCharLiteral(%q) = %d, want %d", test.literal, got, test.want) + } + } +} + +func TestRuneFromInvalidOctalCharLiteral(t *testing.T) { + for _, literal := range []string{`\o400`, `\o1234`, `\o89`} { + if _, err := RuneFromCharLiteral(literal); err == nil { + t.Errorf("RuneFromCharLiteral(%q) unexpectedly succeeded", literal) + } + } +} diff --git a/pkg/lang/class.go b/pkg/lang/class.go index 99e924bf..f7f7e66d 100644 --- a/pkg/lang/class.go +++ b/pkg/lang/class.go @@ -16,15 +16,60 @@ import ( // print as `java.lang.Math` rather than the underlying Go type name. type Class struct { reflect.Type - JavaName string + JavaName string + acceptedTypes []reflect.Type +} + +// ReadablePrinter is implemented by hosted JVM compatibility values whose +// Clojure readable representation cannot be inferred from their Go type. +type ReadablePrinter interface { + PrintReadable(io.Writer) } var hostConstructors sync.Map +var hostTypeConstructors sync.Map +var readablePrinterMethods sync.Map + +// RegisterReadablePrinter installs a Clojure-readable print-method for a +// hosted type that cannot implement ReadablePrinter itself. +func RegisterReadablePrinter(t reflect.Type, printer func(any, io.Writer)) { + readablePrinterMethods.Store(t, FnFunc(func(args ...any) any { + printer(args[0], args[1].(io.Writer)) + return nil + })) +} // NewClass wraps t with the given fully-qualified Java name. The Java // name is what shows up in print-method output and (.getName c). func NewClass(t reflect.Type, javaName string) *Class { - return &Class{Type: t, JavaName: javaName} + return NewClassWithTypes(javaName, t) +} + +// NewClassWithTypes creates a JVM-style class represented by one or more Go +// types. The first type remains the primary type used for host construction +// and static interop; the remaining types are accepted by dynamic instance?. +func NewClassWithTypes(javaName string, types ...reflect.Type) *Class { + if len(types) == 0 { + return &Class{JavaName: javaName} + } + return &Class{ + Type: types[0], + JavaName: javaName, + acceptedTypes: append([]reflect.Type(nil), types...), + } +} + +func (c *Class) accepts(v any) bool { + if c == nil || v == nil { + return false + } + vType := reflect.TypeOf(v) + for _, accepted := range c.acceptedTypes { + if accepted != nil && (vType == accepted || vType.AssignableTo(accepted)) { + return true + } + } + return false } // RegisterHostConstructor installs the implementation used by `(Class. ...)` @@ -33,6 +78,12 @@ func RegisterHostConstructor(javaName string, constructor IFn) { hostConstructors.Store(javaName, constructor) } +// RegisterHostTypeConstructor preserves constructor dispatch when analysis +// has reduced a compatibility Class wrapper to its primary reflect.Type. +func RegisterHostTypeConstructor(t reflect.Type, constructor IFn) { + hostTypeConstructors.Store(t, constructor) +} + // NewHostInstance constructs a registered JVM compatibility class, falling // back to Go's zero-value allocation for ordinary reflect.Types. func NewHostInstance(class any, args ...any) any { @@ -46,6 +97,9 @@ func NewHostInstance(class any, args ...any) any { if !ok { panic(fmt.Sprintf("new value must be a reflect.Type, got %T", class)) } + if constructor, found := hostTypeConstructors.Load(t); found { + return Apply(constructor.(IFn), args) + } if len(args) != 0 { panic(fmt.Sprintf("new %s with args unsupported", t)) } @@ -60,6 +114,16 @@ func (c *Class) Name() string { return c.JavaName } // fmt.Stringer caller renders the FQ Java name. func (c *Class) String() string { return c.JavaName } +// Types returns every hosted Go type represented by this JVM compatibility +// class. Protocol extension uses this for marker classes such as Named, whose +// JVM surface covers both Keyword and Symbol values. +func (c *Class) Types() []reflect.Type { + if c == nil { + return nil + } + return append([]reflect.Type(nil), c.acceptedTypes...) +} + // classPrintMethod is the print-method body for *Class values: write the // JavaName verbatim. Installed into the print-method MultiFn at // construction time (see registerWellKnownMethods in multifn.go). @@ -72,3 +136,13 @@ var classPrintMethod = FnFunc(func(args ...any) any { io.WriteString(w, c.JavaName) return nil }) + +var readablePrintMethod = FnFunc(func(args ...any) any { + value, _ := args[0].(ReadablePrinter) + writer, _ := args[1].(io.Writer) + if value == nil || writer == nil { + return nil + } + value.PrintReadable(writer) + return nil +}) diff --git a/pkg/lang/equal.go b/pkg/lang/equal.go index 07ff2c2d..f6b0badb 100644 --- a/pkg/lang/equal.go +++ b/pkg/lang/equal.go @@ -23,8 +23,17 @@ func Equals(a, b any) bool { } return Equals(Seq(a), Seq(b)) } + // Clojure's type returns the same Class object used by class literals. + // Hosted execution may expose one side as a JVM Class wrapper and the + // other as its underlying reflect.Type; compare their host identities. + if aType, aIsType := ReflectType(a); aIsType { + if bType, bIsType := ReflectType(b); bIsType { + return aType == bType + } + } - if a == b { + if aVal.IsValid() && bVal.IsValid() && + aVal.Type() == bVal.Type() && aVal.Type().Comparable() && a == b { return true } @@ -66,6 +75,18 @@ func Equals(a, b any) bool { return b.Equiv(a) } + // Java compatibility values may expose a typed Equals method (for example + // UUID.Equals(*UUID)) rather than Glojure's Equals(any) interface. Invoke + // that shape when the argument is assignable and the result is boolean. + if method := aVal.MethodByName("Equals"); method.IsValid() { + typeOfMethod := method.Type() + if typeOfMethod.NumIn() == 1 && typeOfMethod.NumOut() == 1 && + typeOfMethod.Out(0).Kind() == reflect.Bool && + bVal.Type().AssignableTo(typeOfMethod.In(0)) { + return method.Call([]reflect.Value{bVal})[0].Bool() + } + } + // TODO: match all clojure equality rules return false @@ -103,6 +124,12 @@ func Identical(a, b any) bool { return aVal.Pointer() == bVal.Pointer() } + if !aVal.IsValid() || !bVal.IsValid() { + return !aVal.IsValid() && !bVal.IsValid() + } + if aVal.Type() != bVal.Type() || !aVal.Type().Comparable() { + return false + } return a == b } diff --git a/pkg/lang/equal_typed_test.go b/pkg/lang/equal_typed_test.go new file mode 100644 index 00000000..c08ca73d --- /dev/null +++ b/pkg/lang/equal_typed_test.go @@ -0,0 +1,15 @@ +package lang + +import "testing" + +type typedEqualValue struct{ value int } + +func (v *typedEqualValue) Equals(other *typedEqualValue) bool { + return other != nil && v.value == other.value +} + +func TestEqualsTypedJavaShape(t *testing.T) { + if !Equals(&typedEqualValue{value: 7}, &typedEqualValue{value: 7}) { + t.Fatal("typed Equals method was not honored") + } +} diff --git a/pkg/lang/equals_test.go b/pkg/lang/equals_test.go index ccb9bd6e..f3d5d418 100644 --- a/pkg/lang/equals_test.go +++ b/pkg/lang/equals_test.go @@ -2,6 +2,7 @@ package lang import ( "fmt" + "math" "testing" ) @@ -44,3 +45,13 @@ func TestEquiv(t *testing.T) { }) } } + +func TestListNaNEqualityMatchesJVMQuirk(t *testing.T) { + nan := math.NaN() + if !Equiv(NewList(nan), NewList(nan)) { + t.Fatal("lists containing NaN should be equivalent") + } + if Equiv(NewVector(nan), NewVector(nan)) { + t.Fatal("vectors containing NaN should not be equivalent") + } +} diff --git a/pkg/lang/hashes.go b/pkg/lang/hashes.go index ff9ec6fd..940b37bf 100644 --- a/pkg/lang/hashes.go +++ b/pkg/lang/hashes.go @@ -59,6 +59,8 @@ func Hash(x interface{}) uint32 { switch x := x.(type) { case Hasher: return x.Hash() + case interface{ HashCode() int32 }: + return uint32(x.HashCode()) case string: return hashStringFNV1a(x) case reflect.Type: diff --git a/pkg/lang/interfaces.go b/pkg/lang/interfaces.go index 163e2fe9..3b7f0079 100644 --- a/pkg/lang/interfaces.go +++ b/pkg/lang/interfaces.go @@ -4,6 +4,7 @@ import ( "fmt" "reflect" "time" + "unicode/utf8" ) type ( @@ -32,6 +33,7 @@ type ( } IRecord interface { + IPersistentMap xxx_irecord() } @@ -502,9 +504,7 @@ func Count(coll any) int { case nil: return 0 case string: - // Go strings are immutable byte sequences. Text operations that need - // Unicode semantics decode UTF-8 explicitly. - return len(arg) + return utf8.RuneCountInString(arg) case Counted: return arg.Count() } diff --git a/pkg/lang/iteration.go b/pkg/lang/iteration.go index 4bfde8cc..e0c2e86b 100644 --- a/pkg/lang/iteration.go +++ b/pkg/lang/iteration.go @@ -3,6 +3,7 @@ package lang import ( "fmt" "reflect" + "unicode/utf8" ) // Nther is an interface for compound values whose elements can be @@ -28,7 +29,7 @@ func Nth(x interface{}, n int) (interface{}, bool) { return x.Nth(n) case Indexed: val := x.NthDefault(n, notFound) - if val == notFound { + if Identical(val, notFound) { return nil, false } return val, true @@ -44,10 +45,22 @@ func Nth(x interface{}, n int) (interface{}, bool) { x = x.Next() } case string: - if n < 0 || n >= len(x) { + if n < 0 { return nil, false } - return NewChar(rune(x[n])), true + bytePos := 0 + for i := 0; i < n; i++ { + if bytePos >= len(x) { + return nil, false + } + _, size := utf8.DecodeRuneInString(x[bytePos:]) + bytePos += size + } + if bytePos >= len(x) { + return nil, false + } + r, _ := utf8.DecodeRuneInString(x[bytePos:]) + return NewChar(r), true } if seq := Seq(x); seq != nil { diff --git a/pkg/lang/keyword.go b/pkg/lang/keyword.go index b8f53b6e..41d1090b 100644 --- a/pkg/lang/keyword.go +++ b/pkg/lang/keyword.go @@ -118,11 +118,7 @@ func (k Keyword) Invoke2(coll, defaultVal interface{}) interface{} { if lookup, ok := coll.(keywordLookup); ok { return lookup.valAtKeyword(k, defaultVal) } - lookup, ok := coll.(ILookup) - if !ok { - return defaultVal - } - return lookup.ValAtDefault(k, defaultVal) + return GetDefault(coll, k, defaultVal) } func (k Keyword) ApplyTo(args ISeq) interface{} { diff --git a/pkg/lang/keyword_test.go b/pkg/lang/keyword_test.go index abbe3f9a..21830f1d 100644 --- a/pkg/lang/keyword_test.go +++ b/pkg/lang/keyword_test.go @@ -53,3 +53,11 @@ func TestKeywordFixedArityLookup(t *testing.T) { t.Fatalf("keyword array-map lookup allocated %v objects, want 0", got) } } + +func TestKeywordInvokesPersistentSet(t *testing.T) { + keyword := NewKeyword("at") + set := NewSet(keyword) + if got := keyword.Invoke1(set); !Equals(got, keyword) { + t.Fatalf("keyword set lookup = %v, want %v", got, keyword) + } +} diff --git a/pkg/lang/list.go b/pkg/lang/list.go index 4f857c9a..453e4813 100644 --- a/pkg/lang/list.go +++ b/pkg/lang/list.go @@ -1,6 +1,7 @@ package lang import ( + "math" "reflect" "github.com/glojurelang/glojure/internal/murmur3" @@ -291,9 +292,35 @@ func (l *List) Equals(other any) bool { } func (l *List) Equiv(other any) bool { + if otherList, ok := other.(*List); ok { + return listEquiv(l, otherList) + } return aseqEquiv(l, other) } +func listEquiv(a, b *List) bool { + if a.Count() != b.Count() { + return false + } + for left, right := ISeq(a), ISeq(b); left != nil; left, right = left.Next(), right.Next() { + lv, rv := left.First(), right.First() + if lf, ok := lv.(float64); ok && math.IsNaN(lf) { + if rf, ok := rv.(float64); ok && math.IsNaN(rf) { + continue + } + } + if lf, ok := lv.(float32); ok && math.IsNaN(float64(lf)) { + if rf, ok := rv.(float32); ok && math.IsNaN(float64(rf)) { + continue + } + } + if !Equiv(lv, rv) { + return false + } + } + return true +} + func (l *List) Hash() uint32 { return aseqHash(&l.hash, l) } diff --git a/pkg/lang/multifn.go b/pkg/lang/multifn.go index 8025222e..71783314 100644 --- a/pkg/lang/multifn.go +++ b/pkg/lang/multifn.go @@ -49,6 +49,11 @@ func registerWellKnownMethods(mf *MultiFn) { switch mf.name { case "print-method", "print-dup": mf.AddMethod(reflect.TypeOf((*Class)(nil)), classPrintMethod) + mf.AddMethod(reflect.TypeOf((*ReadablePrinter)(nil)).Elem(), readablePrintMethod) + readablePrinterMethods.Range(func(dispatch, method any) bool { + mf.AddMethod(dispatch, method.(IFn)) + return true + }) case "kv-reduce": mf.AddMethod(nil, kvReduceNilMethod) mf.AddMethod(reflect.TypeOf((*Object)(nil)).Elem(), kvReduceObjectMethod) @@ -84,14 +89,26 @@ func IsAutoRegisteredMethod(mfName string, dispatchVal any, method any) bool { switch mfName { case "print-method", "print-dup": dv, ok := dispatchVal.(reflect.Type) - if !ok || dv != reflect.TypeOf((*Class)(nil)) { + if !ok { return false } m, ok := method.(FnFunc) if !ok { return false } - return reflect.ValueOf(m).Pointer() == reflect.ValueOf(classPrintMethod).Pointer() + switch dv { + case reflect.TypeOf((*Class)(nil)): + return reflect.ValueOf(m).Pointer() == reflect.ValueOf(classPrintMethod).Pointer() + case reflect.TypeOf((*ReadablePrinter)(nil)).Elem(): + return reflect.ValueOf(m).Pointer() == reflect.ValueOf(readablePrintMethod).Pointer() + default: + registered, found := readablePrinterMethods.Load(dv) + if !found { + return false + } + registeredFn, ok := registered.(FnFunc) + return ok && reflect.ValueOf(m).Pointer() == reflect.ValueOf(registeredFn).Pointer() + } case "kv-reduce": m, ok := method.(FnFunc3) if !ok { @@ -200,6 +217,12 @@ func (m *MultiFn) prefers(hierarchy, x, y any) (res bool) { // Some go-specific logic // TODO: Vet go-specific multi-method preference logic. // for now, prefer x if x is more specific than y + if _, ok := x.(*RecordType); ok { + if yType, ok := y.(reflect.Type); ok && + reflect.TypeOf((*IRecord)(nil)).Elem().AssignableTo(yType) { + return true + } + } xType, ok := x.(reflect.Type) if !ok { return false @@ -296,6 +319,12 @@ func (m *MultiFn) findBestMethod(dispatchVal any) IFn { } func (m *MultiFn) isA(h, x, y any) bool { + if _, ok := x.(*RecordType); ok { + if yType, ok := y.(reflect.Type); ok && + reflect.TypeOf((*IRecord)(nil)).Elem().AssignableTo(yType) { + return true + } + } return varIsA.Invoke(h, x, y).(bool) } diff --git a/pkg/lang/multifn_test.go b/pkg/lang/multifn_test.go index b0e1fbcf..193c862a 100644 --- a/pkg/lang/multifn_test.go +++ b/pkg/lang/multifn_test.go @@ -96,3 +96,32 @@ func TestKVReduceAutoRegisteredMethods(t *testing.T) { } } } + +func TestMultiFnDispatchesRecordsByConcreteIdentityAndInterfaces(t *testing.T) { + oldIsA := varIsA.Deref() + defer varIsA.BindRoot(oldIsA) + oldParents := VarParents.Deref() + defer VarParents.BindRoot(oldParents) + + hierarchy := NewMap() + hierarchyVar := NewVar(NSCore, NewSymbol("test-record-hierarchy")) + hierarchyVar.BindRoot(hierarchy) + varIsA.BindRoot(FnFunc3(func(_, child, parent any) any { return child == parent })) + VarParents.BindRoot(FnFunc2(func(_, _ any) any { return nil })) + + specificType := InternRecordType("test", "SpecificDispatchRecord", "value") + otherType := InternRecordType("test", "OtherDispatchRecord", "value") + mf := NewMultiFn("record-dispatch", + FnFunc1(func(value any) any { return TypeOf(value) }), + NewKeyword("default"), hierarchyVar) + mf.AddMethod(reflect.TypeOf((*IRecord)(nil)).Elem(), + FnFunc1(func(any) any { return "record" })) + mf.AddMethod(specificType, FnFunc1(func(any) any { return "specific" })) + + if got := mf.Invoke(NewRecord(specificType, 1)); got != "specific" { + t.Fatalf("specific record dispatch = %v, want specific", got) + } + if got := mf.Invoke(NewRecord(otherType, 1)); got != "record" { + t.Fatalf("generic record dispatch = %v, want record", got) + } +} diff --git a/pkg/lang/namespace.go b/pkg/lang/namespace.go index 58ca8816..9e78a5dd 100644 --- a/pkg/lang/namespace.go +++ b/pkg/lang/namespace.go @@ -173,6 +173,10 @@ func (ns *Namespace) Aliases() IPersistentMap { return ns.aliasesBox().val.(IPersistentMap) } +func (ns *Namespace) GetAliases() IPersistentMap { + return ns.Aliases() +} + func (ns *Namespace) isInternedMapping(sym *Symbol, v interface{}) bool { vr, ok := v.(*Var) return ok && vr.Namespace() == ns && Equals(vr.Symbol(), sym) diff --git a/pkg/lang/numbers.go b/pkg/lang/numbers.go index 3444e08e..f962131a 100644 --- a/pkg/lang/numbers.go +++ b/pkg/lang/numbers.go @@ -131,6 +131,34 @@ func (nm *NumberMethods) UncheckedDec(x any) any { return Ops(x).UncheckedDec(x) } +func (nm *NumberMethods) Unchecked_int_add(x, y any) any { + return int32(MustAsInt(x)) + int32(MustAsInt(y)) +} + +func (nm *NumberMethods) Unchecked_int_dec(x any) any { + return int32(MustAsInt(x)) - 1 +} + +func (nm *NumberMethods) Unchecked_int_inc(x any) any { + return int32(MustAsInt(x)) + 1 +} + +func (nm *NumberMethods) Unchecked_int_multiply(x, y any) any { + return int32(MustAsInt(x)) * int32(MustAsInt(y)) +} + +func (nm *NumberMethods) Unchecked_int_negate(x any) any { + return -int32(MustAsInt(x)) +} + +func (nm *NumberMethods) Unchecked_int_remainder(x, y any) any { + return int32(MustAsInt(x)) % int32(MustAsInt(y)) +} + +func (nm *NumberMethods) Unchecked_int_subtract(x, y any) any { + return int32(MustAsInt(x)) - int32(MustAsInt(y)) +} + func (nm *NumberMethods) UncheckedIntDivide(x, y int) any { return x / y } @@ -531,7 +559,18 @@ func (nm *NumberMethods) CharArrayInit(size int, init any) []Char { } func (nm *NumberMethods) Bytes(x any) []int8 { - return x.([]int8) + switch value := x.(type) { + case []int8: + return value + case []byte: + result := make([]int8, len(value)) + for index, item := range value { + result[index] = int8(item) + } + return result + default: + panic(fmt.Sprintf("cannot coerce %T to byte[]", x)) + } } func (nm *NumberMethods) ByteArray(sizeOrSeq any) []int8 { @@ -1034,8 +1073,19 @@ func UncheckedCharCast(x any) Char { } func ShortCast(x any) int16 { - if v, ok := x.(int16); ok { + switch v := x.(type) { + case int16: return v + case float32: + if v < math.MinInt16 || v > math.MaxInt16 { + panic(fmt.Errorf("value out of range for int16: %v", x)) + } + return int16(v) + case float64: + if v < math.MinInt16 || v > math.MaxInt16 { + panic(fmt.Errorf("value out of range for int16: %v", x)) + } + return int16(v) } v := AsInt64(x) if v < math.MinInt16 || v > math.MaxInt16 { diff --git a/pkg/lang/numbers_cast_test.go b/pkg/lang/numbers_cast_test.go new file mode 100644 index 00000000..74aca9ad --- /dev/null +++ b/pkg/lang/numbers_cast_test.go @@ -0,0 +1,28 @@ +package lang + +import ( + "reflect" + "testing" +) + +func TestBytesAcceptsUnsignedGoByteSlice(t *testing.T) { + input := []byte{0, 127, 128, 255} + got := Numbers.Bytes(input) + want := []int8{0, 127, -128, -1} + if !reflect.DeepEqual(got, want) { + t.Fatalf("Bytes(%v) = %v, want %v", input, got, want) + } +} + +func TestShortCastRejectsFractionalValuesOutsideRange(t *testing.T) { + for _, value := range []float64{-32768.000001, 32767.000001} { + func() { + defer func() { + if recover() == nil { + t.Errorf("ShortCast(%v) did not panic", value) + } + }() + ShortCast(value) + }() + } +} diff --git a/pkg/lang/numbers_unchecked_test.go b/pkg/lang/numbers_unchecked_test.go new file mode 100644 index 00000000..c5caf868 --- /dev/null +++ b/pkg/lang/numbers_unchecked_test.go @@ -0,0 +1,15 @@ +package lang + +import "testing" + +func TestUncheckedIntOperations(t *testing.T) { + if got := Numbers.Unchecked_int_dec(int64(4)); got != int32(3) { + t.Fatalf("unchecked int dec = %v, want 3", got) + } + if got := Numbers.Unchecked_int_add(int64(2), int64(5)); got != int32(7) { + t.Fatalf("unchecked int add = %v, want 7", got) + } + if got := Numbers.Unchecked_int_inc(int64(2147483647)); got != int32(-2147483648) { + t.Fatalf("unchecked int overflow = %v, want -2147483648", got) + } +} diff --git a/pkg/lang/persistentqueue.go b/pkg/lang/persistentqueue.go new file mode 100644 index 00000000..34ac8549 --- /dev/null +++ b/pkg/lang/persistentqueue.go @@ -0,0 +1,117 @@ +package lang + +import ( + "fmt" + "reflect" + + "github.com/glojurelang/glojure/pkg/pkgmap" +) + +// PersistentQueue is an immutable FIFO collection compatible with +// clojure.lang.PersistentQueue. +type PersistentQueue struct { + meta IPersistentMap + items []any +} + +var EmptyPersistentQueue = &PersistentQueue{} + +var ( + _ IPersistentCollection = (*PersistentQueue)(nil) + _ IPersistentStack = (*PersistentQueue)(nil) + _ Counted = (*PersistentQueue)(nil) + _ Sequential = (*PersistentQueue)(nil) + _ IObj = (*PersistentQueue)(nil) + _ IFn = (*PersistentQueue)(nil) +) + +func (q *PersistentQueue) xxx_sequential() {} +func (q *PersistentQueue) xxx_counted() {} + +func (q *PersistentQueue) Count() int { return len(q.items) } + +// JVM static field syntax is emitted both as PersistentQueue/EMPTY and as the +// zero-argument form (PersistentQueue/EMPTY). Accept the latter while keeping +// the value usable directly as a collection. +func (q *PersistentQueue) Invoke(args ...any) any { + if len(args) != 0 { + panic(NewIllegalArgumentError(fmt.Sprintf( + "PersistentQueue.EMPTY: wrong number of arguments (%d)", len(args)))) + } + return q +} + +func (q *PersistentQueue) ApplyTo(args ISeq) any { + if args != nil { + panic(NewIllegalArgumentError(fmt.Sprintf( + "PersistentQueue.EMPTY: wrong number of arguments (%d)", args.Count()))) + } + return q +} + +func (q *PersistentQueue) Seq() ISeq { + if len(q.items) == 0 { + return nil + } + return NewSliceSeq(q.items) +} + +// Cons implements Clojure's conj behavior for queues by appending at the rear. +func (q *PersistentQueue) Cons(value any) Conser { + items := make([]any, len(q.items)+1) + copy(items, q.items) + items[len(q.items)] = value + return &PersistentQueue{meta: q.meta, items: items} +} + +func (q *PersistentQueue) Empty() IPersistentCollection { + return EmptyPersistentQueue.WithMeta(q.meta).(IPersistentCollection) +} + +func (q *PersistentQueue) Peek() any { + if len(q.items) == 0 { + return nil + } + return q.items[0] +} + +func (q *PersistentQueue) Pop() IPersistentStack { + if len(q.items) == 0 { + panic(NewIllegalStateError("Can't pop empty queue")) + } + items := append([]any(nil), q.items[1:]...) + return &PersistentQueue{meta: q.meta, items: items} +} + +func (q *PersistentQueue) Equiv(other any) bool { + seq := Seq(other) + for _, item := range q.items { + if seq == nil || !Equiv(item, seq.First()) { + return false + } + seq = seq.Next() + } + return seq == nil +} + +func (q *PersistentQueue) Equals(other any) bool { return q.Equiv(other) } +func (q *PersistentQueue) Meta() IPersistentMap { return q.meta } + +func (q *PersistentQueue) WithMeta(meta IPersistentMap) any { + if q.meta == meta { + return q + } + copy := *q + copy.meta = meta + return © +} + +func (q *PersistentQueue) String() string { return PrintString(q) } + +func init() { + class := NewClass(reflect.TypeOf((*PersistentQueue)(nil)), + "clojure.lang.PersistentQueue") + pkgmap.SetHostClassPackage("PersistentQueue", "clojure.lang") + pkgmap.SetHostClass("PersistentQueue", class) + pkgmap.Set("clojure.lang.PersistentQueue.EMPTY", EmptyPersistentQueue) +} diff --git a/pkg/lang/persistentqueue_test.go b/pkg/lang/persistentqueue_test.go new file mode 100644 index 00000000..bf39dc91 --- /dev/null +++ b/pkg/lang/persistentqueue_test.go @@ -0,0 +1,22 @@ +package lang + +import "testing" + +func TestPersistentQueueFIFO(t *testing.T) { + queue := EmptyPersistentQueue.Cons(1).(*PersistentQueue) + queue = queue.Cons(2).(*PersistentQueue) + queue = queue.Cons(3).(*PersistentQueue) + if got := queue.Peek(); got != 1 { + t.Fatalf("Peek = %v, want 1", got) + } + queue = queue.Pop().(*PersistentQueue) + if got := queue.Peek(); got != 2 { + t.Fatalf("Peek after Pop = %v, want 2", got) + } + if got := queue.Count(); got != 2 { + t.Fatalf("Count = %d, want 2", got) + } + if !queue.Equiv(NewList(2, 3)) { + t.Fatal("queue is not sequentially equivalent to its items") + } +} diff --git a/pkg/lang/record.go b/pkg/lang/record.go index e22665ae..507ed7e3 100644 --- a/pkg/lang/record.go +++ b/pkg/lang/record.go @@ -3,6 +3,8 @@ package lang import ( "fmt" "sync" + + "github.com/glojurelang/glojure/pkg/pkgmap" ) // RecordMarker lets generated record implementations satisfy the private @@ -50,9 +52,11 @@ func InternRecordType(namespace, name string, fieldNames ...string) *RecordType } actual, loaded := recordTypes.LoadOrStore(qualifiedName, candidate) if !loaded { + pkgmap.Set(qualifiedName, candidate) return candidate } existing := actual.(*RecordType) + pkgmap.Set(qualifiedName, existing) if len(existing.fieldNames) != len(fieldNames) { panic(NewIllegalArgumentError( "record type redefined with a different field layout: " + @@ -132,6 +136,8 @@ type Record struct { var ( _ RecordValue = (*Record)(nil) _ Counted = (*Record)(nil) + _ IReduce = (*Record)(nil) + _ IReduceInit = (*Record)(nil) ) func NewRecord(recordType *RecordType, values ...any) *Record { @@ -189,6 +195,32 @@ func (r *Record) WithMeta(meta IPersistentMap) any { return r.RecordWithMeta(meta) } +func (r *Record) Reduce(f IFn) any { + seq := r.Seq() + if seq == nil { + return f.Invoke() + } + result := seq.First() + for seq = seq.Next(); seq != nil; seq = seq.Next() { + result = f.Invoke(result, seq.First()) + if IsReduced(result) { + return result.(IDeref).Deref() + } + } + return result +} + +func (r *Record) ReduceInit(f IFn, initial any) any { + result := initial + for seq := r.Seq(); seq != nil; seq = seq.Next() { + result = f.Invoke(result, seq.First()) + if IsReduced(result) { + return result.(IDeref).Deref() + } + } + return result +} + func (r *Record) RecordWithField(index int, value any) RecordValue { if Identical(r.fields[index], value) { return r diff --git a/pkg/lang/record_test.go b/pkg/lang/record_test.go index 6cd4cf20..d8a851e0 100644 --- a/pkg/lang/record_test.go +++ b/pkg/lang/record_test.go @@ -1,6 +1,10 @@ package lang -import "testing" +import ( + "testing" + + "github.com/glojurelang/glojure/pkg/pkgmap" +) func TestRecordMapSemantics(t *testing.T) { recordType := InternRecordType( @@ -50,6 +54,14 @@ func TestRecordMapSemantics(t *testing.T) { } } +func TestRecordTypeIsResolvableByQualifiedName(t *testing.T) { + recordType := InternRecordType("record.test", "Resolvable", "value") + resolved, found := pkgmap.Get("record.test.Resolvable") + if !found || resolved != recordType { + t.Fatalf("resolved record type = %v, %v; want %v, true", resolved, found, recordType) + } +} + func TestRecordMapConstructor(t *testing.T) { recordType := InternRecordType( "record.test", diff --git a/pkg/lang/reduced.go b/pkg/lang/reduced.go index 842d5270..84ddacfa 100644 --- a/pkg/lang/reduced.go +++ b/pkg/lang/reduced.go @@ -1,5 +1,7 @@ package lang +import "github.com/glojurelang/glojure/pkg/pkgmap" + type Reduced struct { val interface{} } @@ -20,3 +22,8 @@ func NewReduced(v interface{}) *Reduced { func (r *Reduced) Deref() interface{} { return r.val } + +func init() { + pkgmap.Set("github.com/glojurelang/glojure/pkg/lang.IsReduced", IsReduced) + pkgmap.Set("github.com/glojurelang/glojure/pkg/lang.NewReduced", NewReduced) +} diff --git a/pkg/lang/ref.go b/pkg/lang/ref.go index 2487cded..5f653503 100644 --- a/pkg/lang/ref.go +++ b/pkg/lang/ref.go @@ -21,10 +21,24 @@ func (r *Ref) Deref() interface{} { return r.val } +// Set replaces the value held by this hosted Ref. Transactional callers still +// use Commute; JVM compatibility adapters use Set when they implement mutable +// host objects whose state is exposed through IDeref. +func (r *Ref) Set(value interface{}) interface{} { + r.val = value + return value +} + func (r *Ref) Commute(fn IFn, args ISeq) interface{} { return LockingTransaction.doCommute(r, fn, args) } +// Alter applies fn to the in-transaction value. The hosted transaction model +// is currently serialized, so it shares the same implementation as Commute. +func (r *Ref) Alter(fn IFn, args ISeq) interface{} { + return LockingTransaction.doCommute(r, fn, args) +} + type LockingTransactor struct { txCount atomic.Int64 } diff --git a/pkg/lang/ref_test.go b/pkg/lang/ref_test.go new file mode 100644 index 00000000..6ba8a923 --- /dev/null +++ b/pkg/lang/ref_test.go @@ -0,0 +1,15 @@ +package lang + +import "testing" + +func TestRefAlterUpdatesTransactionValue(t *testing.T) { + ref := NewRef(int64(1)) + result := LockingTransaction.RunInTransaction(FnFunc0(func() any { + return ref.Alter(FnFunc1(func(value any) any { + return value.(int64) + 1 + }), nil) + })) + if result != int64(2) || ref.Deref() != int64(2) { + t.Fatalf("Alter result = %v, ref = %v", result, ref.Deref()) + } +} diff --git a/pkg/lang/regexpmatcher.go b/pkg/lang/regexpmatcher.go index 77e0de87..32ae5ce2 100644 --- a/pkg/lang/regexpmatcher.go +++ b/pkg/lang/regexpmatcher.go @@ -45,6 +45,8 @@ func (m *RegexpMatcher) ResolveFieldOrMethod( return FnFunc1(func(group any) any { return m.GroupInt(MustAsInt(group)) }), true + case "End": + return FnFunc0(func() any { return m.End() }), true case "Matches": return FnFunc0(func() any { return m.Matches() }), true case "AppendReplacement": @@ -92,6 +94,14 @@ func (m *RegexpMatcher) GroupCount() int { return m.re.NumSubexp() } +// End returns the offset immediately after the most recent match. +func (m *RegexpMatcher) End() int { + if len(m.lastMatch) == 0 { + panic(NewIllegalStateError("No match available")) + } + return m.lastMatchOffset + m.lastMatch[1] +} + // Group returns the input subsequence matched by the previous match. func (m *RegexpMatcher) Group() string { if len(m.lastMatch) == 0 { diff --git a/pkg/lang/regexpmatcher_test.go b/pkg/lang/regexpmatcher_test.go index 32977293..b21b040e 100644 --- a/pkg/lang/regexpmatcher_test.go +++ b/pkg/lang/regexpmatcher_test.go @@ -130,6 +130,13 @@ func TestRegexpMatcherResolvesMethodsWithoutReflection(t *testing.T) { if got := Apply0(groupCount); got != 2 { t.Fatalf("groupCount returned %v, want 2", got) } + end, ok := FieldOrMethod(matcher, "end") + if !ok { + t.Fatal("end method was not resolved") + } + if got := Apply0(end); got != 2 { + t.Fatalf("end returned %v, want 2", got) + } groupInt, ok := FieldOrMethod(matcher, "groupInt") if !ok { diff --git a/pkg/lang/slices.go b/pkg/lang/slices.go index 83a4507d..b353c152 100644 --- a/pkg/lang/slices.go +++ b/pkg/lang/slices.go @@ -7,6 +7,10 @@ import ( func SliceSet(slc any, idx int, val any) { slcVal := reflect.ValueOf(slc) + if val == nil { + slcVal.Index(idx).Set(reflect.Zero(slcVal.Type().Elem())) + return + } valVal := reflect.ValueOf(val) // coerce valVal to the element type of slcVal if valVal.Type() != slcVal.Type().Elem() { @@ -62,11 +66,12 @@ func ToSlice(x any) []any { return res } - // Handle string - convert each byte to a character value. + // Handle string - convert each Unicode code point to a character value. if s, ok := x.(string); ok { - res := make([]any, len(s)) - for i := 0; i < len(s); i++ { - res[i] = NewChar(rune(s[i])) + runes := []rune(s) + res := make([]any, len(runes)) + for i, ch := range runes { + res[i] = NewChar(ch) } return res } diff --git a/pkg/lang/slices_test.go b/pkg/lang/slices_test.go index 677d1bff..99bcaac4 100644 --- a/pkg/lang/slices_test.go +++ b/pkg/lang/slices_test.go @@ -27,3 +27,11 @@ func TestSeqToTypedArrayEmptySequenceUsesAny(t *testing.T) { t.Fatalf("empty array type = %v, want []any", typ) } } + +func TestSliceSetAcceptsNilForReferenceArrays(t *testing.T) { + values := []any{"old"} + SliceSet(values, 0, nil) + if values[0] != nil { + t.Fatalf("value = %v, want nil", values[0]) + } +} diff --git a/pkg/lang/string_bytes_test.go b/pkg/lang/string_bytes_test.go index babf1dad..d3d66d1d 100644 --- a/pkg/lang/string_bytes_test.go +++ b/pkg/lang/string_bytes_test.go @@ -5,16 +5,15 @@ import ( "testing" ) -func TestStringCollectionOperationsUseBytes(t *testing.T) { +func TestStringCollectionOperationsUseUnicodeCodePoints(t *testing.T) { s := "aé" want := []any{ NewChar('a'), - NewChar(rune(0xc3)), - NewChar(rune(0xa9)), + NewChar('é'), } - if got := Count(s); got != len(s) { - t.Fatalf("Count(%q) = %d, want %d", s, got, len(s)) + if got := Count(s); got != len(want) { + t.Fatalf("Count(%q) = %d, want %d", s, got, len(want)) } var fromSeq []any diff --git a/pkg/lang/stringseq.go b/pkg/lang/stringseq.go index 77fa5886..c0aed1e3 100644 --- a/pkg/lang/stringseq.go +++ b/pkg/lang/stringseq.go @@ -1,12 +1,13 @@ package lang type ( - // StringSeq exposes the bytes of an immutable Go string as Char values. + // StringSeq exposes the Unicode code points of an immutable Go string as + // Char values, matching Clojure's character sequence semantics. StringSeq struct { meta IPersistentMap hash, hasheq uint32 - str string + str []rune i int } ) @@ -19,13 +20,14 @@ var ( ) func NewStringSeq(s string, i int) *StringSeq { - if len(s) == 0 || i >= len(s) { + runes := []rune(s) + if len(runes) == 0 || i >= len(runes) { return nil } - return &StringSeq{str: s, i: i} + return &StringSeq{str: runes, i: i} } -func newStringSeq(s string, i int) *StringSeq { +func newStringSeq(s []rune, i int) *StringSeq { if len(s) == 0 || i >= len(s) { return nil } @@ -60,7 +62,7 @@ func (s *StringSeq) Cons(o any) Conser { } func (s *StringSeq) First() any { - return NewChar(rune(s.str[s.i])) + return NewChar(s.str[s.i]) } func (s *StringSeq) Next() ISeq { @@ -117,7 +119,7 @@ func (s *StringSeq) Drop(n int) Sequential { func (s *StringSeq) ReduceInit(f IFn, init any) any { acc := init for i := s.i; i < len(s.str); i++ { - acc = f.Invoke(acc, NewChar(rune(s.str[i]))) + acc = f.Invoke(acc, NewChar(s.str[i])) if IsReduced(acc) { return acc.(IDeref).Deref() } diff --git a/pkg/lang/struct.go b/pkg/lang/struct.go index 4faae061..baf3a28a 100644 --- a/pkg/lang/struct.go +++ b/pkg/lang/struct.go @@ -3,10 +3,13 @@ package lang import ( "fmt" "io" + "math" "reflect" "regexp" "sync" "unicode" + + "github.com/glojurelang/glojure/pkg/pkgmap" ) type fomKey struct { @@ -36,6 +39,13 @@ type FieldOrMethodResolver interface { // responsible for argument-count validation and type coercion. type StringMethod func(s string, rest ...any) any +// patternSplitter is the common surface of the hosted java.util.regex.Pattern +// bridge. Its overloaded Java split method is represented by two Go methods. +type patternSplitter interface { + Split(string) []string + SplitLimit(string, int) []string +} + var stringMethods = map[string]StringMethod{} // RegisterStringMethod registers fn as the implementation of the given @@ -63,7 +73,23 @@ func lookupStringMethod(name string) (StringMethod, bool) { // Method results are cached and wrapped as FnFunc so that subsequent // Apply calls use the IFn fast path instead of reflection. func FieldOrMethod(v interface{}, name string) (interface{}, bool) { + // The ported clojure.core make-array form retains Java's static + // Array/newInstance call. Its class receiver has no Go value, so bridge the + // static compatibility registration before ordinary nil reflection. + if v == nil && (name == "newInstance" || name == "NewInstance") { + if method, found := pkgmap.Get("Array.newInstance"); found { + return method, true + } + } switch value := v.(type) { + case *Class: + if value != nil { + for _, methodName := range []string{name, lowerInitial(name)} { + if method, found := pkgmap.Get(value.JavaName + "." + methodName); found { + return method, true + } + } + } case *Var: switch name { case "getRawRoot", "GetRawRoot": @@ -78,6 +104,24 @@ func FieldOrMethod(v interface{}, name string) (interface{}, bool) { return FnFunc0(func() any { return value.Name() }), true } } + if splitter, ok := v.(patternSplitter); ok && (name == "split" || name == "Split") { + return FnFunc(func(args ...any) any { + switch len(args) { + case 1: + return splitter.Split(ToString(args[0])) + case 2: + limit, ok := AsInt(args[1]) + if !ok { + panic(NewIllegalArgumentError(fmt.Sprintf( + "split limit must be an integer, got %T", args[1]))) + } + return splitter.SplitLimit(ToString(args[0]), limit) + default: + panic(NewIllegalArgumentError(fmt.Sprintf( + "split: wrong number of arguments (%d)", len(args)))) + } + }), true + } // java.lang.Class.getName maps to reflect.Type.Name in the hosted runtime. // Handle it before ordinary reflection because reflect.Type's concrete // implementation exposes Name, not GetName. @@ -86,6 +130,45 @@ func FieldOrMethod(v interface{}, name string) (interface{}, bool) { return FnFunc0(func() any { return typ.String() }), true } } + if name == "getComponentType" || name == "GetComponentType" { + if typ, ok := ReflectType(v); ok { + return FnFunc0(func() any { + if typ.Kind() != reflect.Array && typ.Kind() != reflect.Slice { + return nil + } + component := typ.Elem() + // Go's byte is uint8, while the JVM byte primitive is signed. + // Present either storage representation as java.lang.Byte.TYPE. + if component.Kind() == reflect.Uint8 { + return reflect.TypeOf(int8(0)) + } + return component + }), true + } + } + if name == "isArray" || name == "IsArray" { + if typ, ok := ReflectType(v); ok { + return FnFunc0(func() any { + return typ.Kind() == reflect.Array || typ.Kind() == reflect.Slice + }), true + } + } + if name == "isInfinite" || name == "IsInfinite" { + switch number := v.(type) { + case float64: + return FnFunc0(func() any { return math.IsInf(number, 0) }), true + case float32: + return FnFunc0(func() any { return math.IsInf(float64(number), 0) }), true + } + } + if name == "isNaN" || name == "IsNaN" { + switch number := v.(type) { + case float64: + return FnFunc0(func() any { return math.IsNaN(number) }), true + case float32: + return FnFunc0(func() any { return math.IsNaN(float64(number)) }), true + } + } if resolver, ok := v.(FieldOrMethodResolver); ok { if result, found := resolver.ResolveFieldOrMethod(name); found { return result, true @@ -112,6 +195,13 @@ func FieldOrMethod(v interface{}, name string) (interface{}, bool) { return FnFunc(func(args ...any) any { return fn(s, args...) }), true } } + if name == "toString" || name == "ToString" { + switch v.(type) { + case int, int8, int16, int32, int64, + uint, uint8, uint16, uint32, uint64, float32, float64: + return FnFunc0(func() any { return fmt.Sprint(v) }), true + } + } // Go's fmt.Stringer is the hosted equivalent of Java's Object.toString. // Most runtime values expose String rather than a separately named @@ -134,6 +224,13 @@ func FieldOrMethod(v interface{}, name string) (interface{}, bool) { } return nil }), true + case "getStackTrace", "GetStackTrace", "StackTrace": + // Hosted Go errors do not expose JVM program counters as + // StackTraceElement values. Return the faithful empty Java-array + // shape until a richer frame mapper is available. + return FnFunc0(func() any { return []any{} }), true + case "setStackTrace", "SetStackTrace": + return FnFunc1(func(any) any { return nil }), true } } @@ -194,6 +291,15 @@ func FieldOrMethod(v interface{}, name string) (interface{}, bool) { return nil, false } +func lowerInitial(value string) string { + if value == "" { + return value + } + runes := []rune(value) + runes[0] = unicode.ToLower(runes[0]) + return string(runes) +} + type errorUnwrapper interface { Unwrap() error } @@ -207,6 +313,76 @@ func unwrapError(err error) error { func directProtocolMethod(v interface{}, name string) (IFn, bool) { switch name { + case "Read": + // java.io.Reader.read() returns the next Unicode code point or -1 at + // EOF. Go's io.Reader reserves Read for a byte-buffer argument, so + // bridge the zero-argument JVM shape through io.RuneReader before + // falling back to ordinary reflected Go method dispatch. + if reader, ok := v.(io.RuneReader); ok { + return FnFunc(func(args ...any) any { + if len(args) != 0 { + panic(NewIllegalArgumentError(fmt.Sprintf( + "read: wrong number of arguments (%d)", len(args)))) + } + rn, _, err := reader.ReadRune() + if err == io.EOF { + return -1 + } + if err != nil { + panic(err) + } + return int(rn) + }), true + } + case "Write": + // java.io.OutputStream.write is overloaded for both byte[] and int. + // Go byte writers expose the scalar overload as WriteByte while their + // Write method accepts only []byte, so bridge both JVM shapes here. + if byteWriter, ok := v.(io.ByteWriter); ok { + return FnFunc(func(args ...any) any { + if len(args) != 1 { + panic(NewIllegalArgumentError(fmt.Sprintf( + "write: wrong number of arguments (%d)", len(args)))) + } + if IsNumber(args[0]) { + if err := byteWriter.WriteByte(byte(MustAsInt(args[0]))); err != nil { + panic(err) + } + return nil + } + writer, ok := v.(io.Writer) + if !ok { + panic(fmt.Errorf("write: %T is not a byte-array writer", v)) + } + bytes, err := coerceGoValue(reflect.TypeOf([]byte{}), args[0]) + if err != nil { + panic(err) + } + if _, err := writer.Write(bytes.Interface().([]byte)); err != nil { + panic(err) + } + return nil + }), true + } + case "Reduce": + reducer, canReduce := v.(IReduce) + reducerInit, canReduceInit := v.(IReduceInit) + if canReduce || canReduceInit { + return FnFunc(func(args ...any) any { + switch len(args) { + case 1: + if canReduce { + return reducer.Reduce(MustHostCast[IFn](args[0])) + } + case 2: + if canReduceInit { + return reducerInit.ReduceInit(MustHostCast[IFn](args[0]), args[1]) + } + } + panic(NewIllegalArgumentError(fmt.Sprintf( + "reduce: wrong number of arguments (%d)", len(args)))) + }), true + } case "Conj": if transient, ok := v.(Conjer); ok { return FnFunc1(func(value any) any { diff --git a/pkg/lang/struct_test.go b/pkg/lang/struct_test.go index 0938847e..e5479ae5 100644 --- a/pkg/lang/struct_test.go +++ b/pkg/lang/struct_test.go @@ -1,6 +1,7 @@ package lang import ( + "math" "reflect" "testing" ) @@ -69,6 +70,21 @@ func TestFieldOrMethodDifferentReceiversCached(t *testing.T) { } } +func TestFieldOrMethodDispatchesReduceArities(t *testing.T) { + vector := NewVector(int64(1), int64(2), int64(3)) + reduce, ok := FieldOrMethod(vector, "reduce") + if !ok { + t.Fatal("reduce method was not resolved") + } + add := FnFunc2(func(a, b any) any { return a.(int64) + b.(int64) }) + if got := Apply1(reduce, add); got != int64(6) { + t.Fatalf("reduce without init = %v, want 6", got) + } + if got := Apply2(reduce, add, int64(4)); got != int64(10) { + t.Fatalf("reduce with init = %v, want 10", got) + } +} + func TestFieldOrMethodReturnsField(t *testing.T) { r := &testReceiver{Value: 42} v, ok := FieldOrMethod(r, "value") @@ -289,3 +305,18 @@ func TestTransientProtocolMethodsResolveDirectlyAndCache(t *testing.T) { t.Fatalf("cached Conj resolution allocated %v objects per call, want 0", got) } } + +func TestJavaClassAndFloatingPointMethods(t *testing.T) { + isArray, ok := FieldOrMethod(reflect.TypeOf([]int8{}), "isArray") + if !ok || Apply0(isArray) != true { + t.Fatal("byte[] Class.isArray was not true") + } + isInfinite, ok := FieldOrMethod(math.Inf(1), "isInfinite") + if !ok || Apply0(isInfinite) != true { + t.Fatal("Double.isInfinite was not true") + } + isNaN, ok := FieldOrMethod(float64(0), "isNaN") + if !ok || Apply0(isNaN) != false { + t.Fatal("Double.isNaN was not false") + } +} diff --git a/pkg/lang/subvector.go b/pkg/lang/subvector.go index f0b6b82c..478f7be7 100644 --- a/pkg/lang/subvector.go +++ b/pkg/lang/subvector.go @@ -14,6 +14,8 @@ var ( _ APersistentVector = (*SubVector)(nil) _ IObj = (*SubVector)(nil) _ IPersistentVector = (*SubVector)(nil) + _ IReduce = (*SubVector)(nil) + _ IReduceInit = (*SubVector)(nil) ) func NewSubVector(meta IPersistentMap, v IPersistentVector, start, end int) *SubVector { @@ -168,6 +170,31 @@ func (v *SubVector) HashEq() uint32 { return apersistentVectorHashEq(&v.hasheq, v) } +func (v *SubVector) ReduceInit(f IFn, init any) any { + result := init + for index := 0; index < v.Count(); index++ { + result = f.Invoke(result, v.Nth(index)) + if IsReduced(result) { + return result.(IDeref).Deref() + } + } + return result +} + +func (v *SubVector) Reduce(f IFn) any { + if v.Count() == 0 { + return f.Invoke() + } + result := v.Nth(0) + for index := 1; index < v.Count(); index++ { + result = f.Invoke(result, v.Nth(index)) + if IsReduced(result) { + return result.(IDeref).Deref() + } + } + return result +} + func (v *SubVector) Compare(other any) int { otherVec, ok := other.(IPersistentVector) if !ok { diff --git a/pkg/lang/subvector_test.go b/pkg/lang/subvector_test.go new file mode 100644 index 00000000..867ded3a --- /dev/null +++ b/pkg/lang/subvector_test.go @@ -0,0 +1,17 @@ +package lang + +import "testing" + +func TestSubVectorReduce(t *testing.T) { + vector := NewVector(int64(1), int64(2), int64(3), int64(4)) + subvector := NewSubVector(nil, vector, 1, 4) + add := FnFunc2(func(left, right any) any { + return left.(int64) + right.(int64) + }) + if got := subvector.ReduceInit(add, int64(0)); got != int64(9) { + t.Fatalf("ReduceInit = %v, want 9", got) + } + if got := subvector.Reduce(add); got != int64(9) { + t.Fatalf("Reduce = %v, want 9", got) + } +} diff --git a/pkg/lang/taggedliteral.go b/pkg/lang/taggedliteral.go new file mode 100644 index 00000000..a1b735c8 --- /dev/null +++ b/pkg/lang/taggedliteral.go @@ -0,0 +1,71 @@ +package lang + +import ( + "fmt" + "reflect" + + "github.com/glojurelang/glojure/pkg/pkgmap" +) + +// TaggedLiteral is the portable representation returned for an EDN reader tag. +type TaggedLiteral struct { + tag *Symbol + form any + meta IPersistentMap +} + +var _ ILookup = (*TaggedLiteral)(nil) +var _ IObj = (*TaggedLiteral)(nil) + +func NewTaggedLiteral(tag, form any) any { + return &TaggedLiteral{tag: MustHostCast[*Symbol](tag), form: form} +} + +func (t *TaggedLiteral) Tag() *Symbol { return t.tag } +func (t *TaggedLiteral) Form() any { return t.form } + +func (t *TaggedLiteral) ValAt(key any) any { + return t.ValAtDefault(key, nil) +} + +func (t *TaggedLiteral) ValAtDefault(key, notFound any) any { + if keyword, ok := key.(Keyword); ok { + switch keyword.Name() { + case "tag": + return t.tag + case "form": + return t.form + } + } + return notFound +} + +func (t *TaggedLiteral) Meta() IPersistentMap { return t.meta } + +func (t *TaggedLiteral) WithMeta(meta IPersistentMap) any { + if t.meta == meta { + return t + } + copy := *t + copy.meta = meta + return © +} + +func (t *TaggedLiteral) Equals(other any) bool { + value, ok := other.(*TaggedLiteral) + return ok && Equals(t.tag, value.tag) && Equals(t.form, value.form) +} + +func (t *TaggedLiteral) Equiv(other any) bool { return t.Equals(other) } + +func (t *TaggedLiteral) String() string { + return fmt.Sprintf("#%s %s", t.tag, PrintString(t.form)) +} + +func init() { + class := NewClass(reflect.TypeOf((*TaggedLiteral)(nil)), + "clojure.lang.TaggedLiteral") + pkgmap.SetHostClassPackage("TaggedLiteral", "clojure.lang") + pkgmap.SetHostClass("TaggedLiteral", class) + pkgmap.Set("clojure.lang.TaggedLiteral.create", FnFunc2(NewTaggedLiteral)) +} diff --git a/pkg/lang/taggedliteral_test.go b/pkg/lang/taggedliteral_test.go new file mode 100644 index 00000000..fd9c11fd --- /dev/null +++ b/pkg/lang/taggedliteral_test.go @@ -0,0 +1,17 @@ +package lang + +import "testing" + +func TestTaggedLiteralLookupAndEquality(t *testing.T) { + tag := NewSymbol("demo/value") + literal := NewTaggedLiteral(tag, 42).(*TaggedLiteral) + if got := literal.ValAt(NewKeyword("tag")); got != tag { + t.Fatalf(":tag = %v, want %v", got, tag) + } + if got := literal.ValAt(NewKeyword("form")); got != 42 { + t.Fatalf(":form = %v, want 42", got) + } + if !literal.Equals(NewTaggedLiteral(tag, 42)) { + t.Fatal("equal tagged literals did not compare equal") + } +} diff --git a/pkg/lang/type.go b/pkg/lang/type.go index dbc370e6..f09c9067 100644 --- a/pkg/lang/type.go +++ b/pkg/lang/type.go @@ -24,6 +24,13 @@ func HasType(target any, v interface{}) bool { if v == nil { return false } + if recordType, ok := target.(*RecordType); ok { + record, isRecord := v.(RecordValue) + return isRecord && record.RecordType() == recordType + } + if class, ok := target.(*Class); ok { + return class.accepts(v) + } t, ok := ReflectType(target) if !ok { return false @@ -61,6 +68,18 @@ func IsInstance[T any](v interface{}) bool { return ok } -func TypeOf(v interface{}) reflect.Type { +func TypeOf(v interface{}) any { + if record, ok := v.(RecordValue); ok { + return record.RecordType() + } + // Both Go regexp values and gojava's richer Pattern wrapper represent + // java.util.regex.Pattern. Protocol dispatch must therefore see one hosted + // class for regex literals and Pattern/compile results. + if _, ok := v.(interface { + Pattern() string + Split(string) []string + }); ok { + return reflect.TypeOf((*regexp.Regexp)(nil)) + } return reflect.TypeOf(v) } diff --git a/pkg/lang/type_test.go b/pkg/lang/type_test.go index 0fbbd987..ed45052b 100644 --- a/pkg/lang/type_test.go +++ b/pkg/lang/type_test.go @@ -21,6 +21,25 @@ func TestIsInstance(t *testing.T) { } } +func TestHasTypeRecordDescriptor(t *testing.T) { + recordType := InternRecordType("test", "TypedRecord", "value") + if !HasType(recordType, NewRecord(recordType, 1)) { + t.Fatal("record descriptor did not recognize its record") + } + otherType := InternRecordType("test", "OtherRecord", "value") + if HasType(recordType, NewRecord(otherType, 1)) { + t.Fatal("record descriptor recognized a different record") + } +} + +func TestTypeOfReturnsRecordIdentity(t *testing.T) { + recordType := InternRecordType("test", "TypeOfRecord", "value") + record := NewRecord(recordType, 1) + if got := TypeOf(record); got != recordType { + t.Fatalf("TypeOf(record) = %v, want %v", got, recordType) + } +} + func TestHasTypeAcceptsClass(t *testing.T) { class := NewClass(reflect.TypeOf(""), "java.lang.String") if !HasType(class, "value") { @@ -30,3 +49,25 @@ func TestHasTypeAcceptsClass(t *testing.T) { t.Fatal("Class wrapper matched the wrong host value") } } + +func TestHasTypeAcceptsClassAliases(t *testing.T) { + class := NewClassWithTypes( + "example.Integer", + reflect.TypeOf(int(0)), + reflect.TypeOf(int32(0)), + ) + if !HasType(class, int(1)) || !HasType(class, int32(1)) { + t.Fatal("Class wrapper did not match all accepted host types") + } + if HasType(class, int64(1)) { + t.Fatal("Class wrapper matched an unregistered host type") + } +} + +func TestClassEqualsUnderlyingReflectType(t *testing.T) { + typeOfSymbol := reflect.TypeOf((*Symbol)(nil)) + class := NewClass(typeOfSymbol, "clojure.lang.Symbol") + if !Equals(class, typeOfSymbol) || !Equals(typeOfSymbol, class) { + t.Fatal("Class wrapper and its underlying reflect.Type were not equal") + } +} diff --git a/pkg/lang/vector.go b/pkg/lang/vector.go index 94cb2b08..5f4b5cb0 100644 --- a/pkg/lang/vector.go +++ b/pkg/lang/vector.go @@ -85,6 +85,24 @@ func (v *Vector) Length() int { return v.Count() } +func (v *Vector) IndexOf(value any) int { + for index := 0; index < v.Count(); index++ { + if Equals(v.Nth(index), value) { + return index + } + } + return -1 +} + +func (v *Vector) LastIndexOf(value any) int { + for index := v.Count() - 1; index >= 0; index-- { + if Equals(v.Nth(index), value) { + return index + } + } + return -1 +} + func (v *Vector) Cons(x any) Conser { storage := &vectorUpdateStorage{} storage.attrs = newVectorAttrs(v.Meta()) @@ -137,7 +155,7 @@ func (v *Vector) EntryAt(key any) IMapEntry { return nil } val := v.NthDefault(kInt, notFound) - if val == notFound { + if Identical(val, notFound) { return nil } return &MapEntry{ diff --git a/pkg/lang/vector_test.go b/pkg/lang/vector_test.go index cfc07b36..c2c56fd7 100644 --- a/pkg/lang/vector_test.go +++ b/pkg/lang/vector_test.go @@ -207,17 +207,17 @@ func TestNthStringASCII(t *testing.T) { } } -// TestNthStringMultibyte verifies strings use byte-oriented indexing. +// TestNthStringMultibyte verifies strings use Unicode character indexing. func TestNthStringMultibyte(t *testing.T) { - s := "héllo" // 'é' is 2 bytes (U+00E9) - for i, want := range []byte(s) { + s := "héllo" + for i, want := range []rune(s) { got, ok := Nth(s, i) if !ok { t.Errorf("Nth(%q, %d): ok=false, want true", s, i) continue } - if got != NewChar(rune(want)) { - t.Errorf("Nth(%q, %d) = %v, want %v", s, i, got, NewChar(rune(want))) + if got != NewChar(want) { + t.Errorf("Nth(%q, %d) = %v, want %v", s, i, got, NewChar(want)) } } } @@ -246,13 +246,13 @@ func TestCharAtASCII(t *testing.T) { } } -// TestCharAtMultibyte verifies CharAt uses byte-oriented indexing. +// TestCharAtMultibyte verifies CharAt uses Unicode character indexing. func TestCharAtMultibyte(t *testing.T) { s := "café" - for i, want := range []byte(s) { + for i, want := range []rune(s) { got := CharAt(s, i) - if got != NewChar(rune(want)) { - t.Errorf("CharAt(%q, %d) = %v, want %v", s, i, got, NewChar(rune(want))) + if got != NewChar(want) { + t.Errorf("CharAt(%q, %d) = %v, want %v", s, i, got, NewChar(want)) } } } @@ -315,3 +315,16 @@ func TestGoSliceStringMatchesReflect(t *testing.T) { } } } + +func TestVectorIndexOf(t *testing.T) { + vector := NewVector(NewKeyword("mut"), NewKeyword("lit"), NewKeyword("mut")) + if got := vector.IndexOf(NewKeyword("lit")); got != 1 { + t.Fatalf("IndexOf = %d, want 1", got) + } + if got := vector.LastIndexOf(NewKeyword("mut")); got != 2 { + t.Fatalf("LastIndexOf = %d, want 2", got) + } + if got := vector.IndexOf(NewKeyword("missing")); got != -1 { + t.Fatalf("missing IndexOf = %d, want -1", got) + } +} diff --git a/pkg/reader/reader.go b/pkg/reader/reader.go index 2481d830..f7640b97 100644 --- a/pkg/reader/reader.go +++ b/pkg/reader/reader.go @@ -12,8 +12,9 @@ import ( "sync" "unicode" + "github.com/glojurelang/glojure/pkg/javacompat/date" + juuid "github.com/glojurelang/glojure/pkg/javacompat/uuid" "github.com/glojurelang/glojure/pkg/lang" - "github.com/google/uuid" ) var ( @@ -463,6 +464,17 @@ func (r *Reader) read(eofOK bool, stopRune rune) (expr any, err error) { if err != nil { return nil, err } + if obj, ok := val.(lang.IObj); ok { + merged := obj.Meta() + if merged == nil { + merged = lang.NewMap() + } + for seq := meta.Seq(); seq != nil; seq = seq.Next() { + entry := seq.First().(lang.IMapEntry) + merged = lang.Assoc(merged, entry.Key(), entry.Val()).(lang.IPersistentMap) + } + return obj.WithMeta(merged), nil + } return lang.WithMeta(val, meta) default: r.rs.UnreadRune() @@ -579,7 +591,7 @@ func (r *Reader) readString() (interface{}, error) { } } - str, err := strconv.Unquote(`"` + str + `"`) + str, err := strconv.Unquote(`"` + normalizeSurrogateEscapes(str) + `"`) if err != nil { return nil, r.error("invalid string: %w", err) } @@ -587,6 +599,27 @@ func (r *Reader) readString() (interface{}, error) { return str, nil } +func normalizeSurrogateEscapes(value string) string { + var result strings.Builder + for index := 0; index < len(value); { + if index+12 <= len(value) && value[index] == '\\' && value[index+1] == 'u' && + value[index+6] == '\\' && value[index+7] == 'u' { + high, highErr := strconv.ParseUint(value[index+2:index+6], 16, 16) + low, lowErr := strconv.ParseUint(value[index+8:index+12], 16, 16) + if highErr == nil && lowErr == nil && high >= 0xD800 && high <= 0xDBFF && + low >= 0xDC00 && low <= 0xDFFF { + codepoint := 0x10000 + ((high - 0xD800) << 10) + (low - 0xDC00) + fmt.Fprintf(&result, "\\U%08X", codepoint) + index += 12 + continue + } + } + result.WriteByte(value[index]) + index++ + } + return result.String() +} + func (r *Reader) nextID() int { id := r.argCounter r.argCounter++ @@ -714,13 +747,20 @@ func (r *Reader) readRegex() (interface{}, error) { } } - re, err := regexp.Compile(str) + re, err := regexp.Compile(translateJavaRegex(str)) if err != nil { return nil, r.error("invalid regex: %w", err) } return re, nil } +func translateJavaRegex(pattern string) string { + // RE2 supports Unicode properties but not Java's POSIX-style XDigit + // property alias or the \e escape. Preserve their Java meanings. + pattern = strings.ReplaceAll(pattern, `\p{XDigit}`, `[0-9A-Fa-f]`) + return strings.ReplaceAll(pattern, `\e`, `\x1b`) +} + func (r *Reader) readChar() (interface{}, error) { var char string for { @@ -733,7 +773,15 @@ func (r *Reader) readChar() (interface{}, error) { } // TODO: helper for non-char/non-symbol runes - if unicode.IsSpace(rn) || (len(char) > 0 && isSyntaxRune(rn)) { + if unicode.IsSpace(rn) { + if len(char) == 0 { + char = string(rn) + } else { + r.rs.UnreadRune() + } + break + } + if len(char) > 0 && isSyntaxRune(rn) { r.rs.UnreadRune() break } @@ -1027,11 +1075,22 @@ func (r *Reader) readDispatch(eofOK bool, stopRune rune) (interface{}, error) { if !ok { return nil, r.error("#uuid requires a string argument") } - u, err := uuid.Parse(s) - if err != nil { - return nil, r.error("invalid UUID string: %s", s) + return juuid.FromString(s), nil + } + if tagSym.Name() == "inst" && tagSym.Namespace() == "" { + return date.ParseInstantDate(form), nil + } + // Match Clojure's *default-data-reader-fn* fallback. Embedding + // runtimes bind this Var for per-read :default handlers used by + // clojure.edn and portable configuration libraries. + if core := lang.FindNamespace(lang.SymbolCoreNamespace); core != nil { + if vr := core.FindInternedVar(lang.NewSymbol("*default-data-reader-fn*")); vr != nil { + if value := vr.Deref(); value != nil { + if fn, ok := value.(lang.IFn); ok { + return fn.Invoke(tagSym, form), nil + } + } } - return u, nil } // Return as a tagged literal vector [tag form] return lang.NewVector(tagSym, form), nil diff --git a/pkg/reader/reader_test.go b/pkg/reader/reader_test.go index 32440a01..74df7835 100644 --- a/pkg/reader/reader_test.go +++ b/pkg/reader/reader_test.go @@ -5,6 +5,7 @@ import ( "math" "os" "path/filepath" + "regexp" "strings" "testing" @@ -107,6 +108,20 @@ func TestAutoResolvedKeywordAlias(t *testing.T) { } } +func TestAdjacentMetadataMerges(t *testing.T) { + r := New(strings.NewReader("^:private ^:dynamic *value*")) + value, err := r.ReadOne() + if err != nil { + t.Fatal(err) + } + meta := value.(lang.IMeta).Meta() + for _, key := range []string{"private", "dynamic"} { + if got := meta.ValAt(lang.NewKeyword(key)); got != true { + t.Fatalf("metadata %s = %v, want true", key, got) + } + } +} + func TestReadErrors(t *testing.T) { type testCase struct { name string @@ -221,3 +236,49 @@ func TestEnableFeature(t *testing.T) { t.Fatalf("enabled reader feature selected %s", got) } } + +func TestJavaXDigitRegex(t *testing.T) { + r := New(strings.NewReader(`#"^\p{XDigit}+$"`)) + value, err := r.ReadOne() + if err != nil { + t.Fatal(err) + } + pattern := value.(*regexp.Regexp) + if !pattern.MatchString("01aF") || pattern.MatchString("xyz") { + t.Fatalf("translated XDigit pattern behaved unexpectedly: %s", pattern) + } +} + +func TestJavaEscapeRegex(t *testing.T) { + r := New(strings.NewReader(`#"\e\[.*?m"`)) + value, err := r.ReadOne() + if err != nil { + t.Fatal(err) + } + pattern := value.(*regexp.Regexp) + if !pattern.MatchString("\x1b[31m") { + t.Fatalf("translated escape pattern did not match: %s", pattern) + } +} + +func TestStringAcceptsUTF16SurrogatePairEscapes(t *testing.T) { + r := New(strings.NewReader(`"smiling face: \uD83D\uDE03"`)) + value, err := r.ReadOne() + if err != nil { + t.Fatal(err) + } + if got, want := value, "smiling face: 😃"; got != want { + t.Fatalf("string = %q, want %q", got, want) + } +} + +func TestSpaceCharacterLiteral(t *testing.T) { + r := New(strings.NewReader("\\ ")) + value, err := r.ReadOne() + if err != nil { + t.Fatal(err) + } + if value != lang.NewChar(' ') { + t.Fatalf("space literal = %#v", value) + } +} diff --git a/pkg/repl/ioctl_bsd.go b/pkg/repl/ioctl_bsd.go new file mode 100644 index 00000000..8a0c2386 --- /dev/null +++ b/pkg/repl/ioctl_bsd.go @@ -0,0 +1,10 @@ +//go:build dragonfly || freebsd || netbsd || openbsd + +package repl + +import "golang.org/x/sys/unix" + +const ( + ioctlGetTermios = unix.TIOCGETA + ioctlSetTermios = unix.TIOCSETA +) diff --git a/pkg/repl/options.go b/pkg/repl/options.go index 235808e3..97fa413e 100644 --- a/pkg/repl/options.go +++ b/pkg/repl/options.go @@ -7,15 +7,18 @@ import ( "github.com/glojurelang/glojure/pkg/nrepl" ) +const defaultShareBaseURL = "https://gloathub.org/repl" + type options struct { - stdin io.Reader - stdout io.Writer - namespace string - env lang.Environment - nreplClient *nrepl.Client - nreplServer *nrepl.Server - historyFile string - historyFmt string // "json" (default) or "jline" + stdin io.Reader + stdout io.Writer + namespace string + env lang.Environment + nreplClient *nrepl.Client + nreplServer *nrepl.Server + historyFile string + historyFmt string // "json" (default) or "jline" + shareBaseURL string } // Option is a functional option for the REPL. @@ -58,3 +61,10 @@ func WithHistoryFile(path, format string) Option { o.historyFmt = format } } + +// WithShareBaseURL sets the URL used when sharing REPL expressions. +func WithShareBaseURL(baseURL string) Option { + return func(o *options) { + o.shareBaseURL = baseURL + } +} diff --git a/pkg/repl/repl.go b/pkg/repl/repl.go index 5c0f9db4..e236bea6 100644 --- a/pkg/repl/repl.go +++ b/pkg/repl/repl.go @@ -336,7 +336,7 @@ func Start(opts ...Option) { if len(exprs) == 0 { return } - url, err := shareURL(exprs) + url, err := shareURL(exprs, o.shareBaseURL) if err != nil { rl.Hint.SetTemporary(err.Error()) hintActive = true @@ -686,14 +686,12 @@ func copyToClipboard(text string) { } } -const shareBaseURL = "https://gloathub.org/repl" - -func shareURL(exprs []string) (string, error) { +func shareURL(exprs []string, baseURL string) (string, error) { data, err := json.Marshal(exprs) if err != nil { return "", err } - return shareBaseURL + "#s:" + base64.StdEncoding.EncodeToString(data), nil + return baseURL + "#s:" + base64.StdEncoding.EncodeToString(data), nil } func shareClipboardText(exprs []string) string { @@ -736,7 +734,6 @@ func isURLLikeInput(text string) bool { text = strings.TrimSpace(text) return strings.HasPrefix(text, "http://") || strings.HasPrefix(text, "https://") || - strings.HasPrefix(text, shareBaseURL+"#s:") || strings.HasPrefix(text, "#s:") } diff --git a/pkg/repl/repl_common.go b/pkg/repl/repl_common.go index 58303603..d8759227 100644 --- a/pkg/repl/repl_common.go +++ b/pkg/repl/repl_common.go @@ -20,9 +20,10 @@ type EvalFunc func(*options, interface{}) (string, error) func initOptions(opts []Option) options { o := options{ - stdin: os.Stdin, - stdout: os.Stdout, - namespace: "user", + stdin: os.Stdin, + stdout: os.Stdout, + namespace: "user", + shareBaseURL: defaultShareBaseURL, } for _, opt := range opts { opt(&o) diff --git a/pkg/repl/repl_test.go b/pkg/repl/repl_test.go index c083be33..4fccca03 100644 --- a/pkg/repl/repl_test.go +++ b/pkg/repl/repl_test.go @@ -95,7 +95,8 @@ func TestRemoteDocHasDetail(t *testing.T) { } func TestShareURL(t *testing.T) { - got, err := shareURL([]string{"(def a 1)", "(+ a 2)"}) + expressions := []string{"(def a 1)", "(+ a 2)"} + got, err := shareURL(expressions, defaultShareBaseURL) if err != nil { t.Fatalf("shareURL() error = %v", err) } @@ -104,10 +105,28 @@ func TestShareURL(t *testing.T) { if got != want { t.Fatalf("shareURL() = %q, want %q", got, want) } + + got, err = shareURL(expressions, "https://gobb.site/repl/") + if err != nil { + t.Fatalf("shareURL() custom base error = %v", err) + } + want = "https://gobb.site/repl/#s:WyIoZGVmIGEgMSkiLCIoKyBhIDIpIl0=" + if got != want { + t.Fatalf("shareURL() custom base = %q, want %q", got, want) + } +} + +func TestWithShareBaseURL(t *testing.T) { + var opts options + WithShareBaseURL("https://gobb.site/repl/")(&opts) + if opts.shareBaseURL != "https://gobb.site/repl/" { + t.Fatalf("WithShareBaseURL() set %q", opts.shareBaseURL) + } } func TestShareExpressionsFromURL(t *testing.T) { - url, err := shareURL([]string{"(def a 1)", "(+ a 2)"}) + url, err := shareURL( + []string{"(def a 1)", "(+ a 2)"}, defaultShareBaseURL) if err != nil { t.Fatalf("shareURL() error = %v", err) } diff --git a/pkg/runtime/envinit.go b/pkg/runtime/envinit.go index 5bfe1f8e..6a8193ec 100644 --- a/pkg/runtime/envinit.go +++ b/pkg/runtime/envinit.go @@ -226,5 +226,7 @@ func NewEnvironment(opts ...EvalOption) lang.Environment { return ReadEval(string(buf), WithFilename(fname)) }), true) + installGrenadineHost() + return env } diff --git a/pkg/runtime/evalast.go b/pkg/runtime/evalast.go index f2c51f71..f0a13031 100644 --- a/pkg/runtime/evalast.go +++ b/pkg/runtime/evalast.go @@ -375,8 +375,13 @@ func (c *evalCompiler) MaybeResolveIn(ns *lang.Namespace, sym *lang.Symbol) inte } return n.FindInternedVar(lang.NewSymbol(sym.Name())) case strings.Index(sym.Name(), ".") > 0 && !strings.HasSuffix(sym.Name(), ".") || sym.Name()[0] == '[': - // TODO: what case does this correspond to? should we be looking for imports here? - // previously: panic(fmt.Errorf("can't resolve class %s in ns %s", sym, ns)) + name := sym.Name() + if separator := strings.LastIndex(name, "."); separator >= 0 { + name = name[separator+1:] + } + if class, found := pkgmap.HostClass(name); found { + return class + } return nil case sym.Equals(SymNS): return lang.VarNS @@ -474,8 +479,10 @@ func (env *environment) EvalASTHostCall(n *ast.Node) (interface{}, error) { return nil, fmt.Errorf("no such field or method on %v (%T): %s", tgtVal, tgtVal, method) } } - // if the field is not a function, return an error - if reflect.TypeOf(methodVal).Kind() != reflect.Func { + // Hosted compatibility values may resolve methods directly as Clojure IFns + // rather than Go function values. + _, callable := methodVal.(lang.IFn) + if !callable && (methodVal == nil || reflect.TypeOf(methodVal).Kind() != reflect.Func) { return nil, errors.New("not a method: " + lang.ToString(tgtVal) + "." + method.Name()) } diff --git a/pkg/runtime/grenadine_host.go b/pkg/runtime/grenadine_host.go new file mode 100644 index 00000000..11a41f4a --- /dev/null +++ b/pkg/runtime/grenadine_host.go @@ -0,0 +1,325 @@ +package runtime + +import ( + "archive/zip" + "bytes" + "crypto/sha1" + "crypto/sha256" + "encoding/hex" + "fmt" + "io" + "net/http" + "os" + "os/exec" + "path/filepath" + "strings" + "time" + + "github.com/glojurelang/glojure/pkg/lang" +) + +var grenadineHTTPClient = &http.Client{Timeout: 45 * time.Second} + +func installGrenadineHost() { + ns := lang.FindOrCreateNamespace(lang.NewSymbol("glojure.deps.host")) + lang.InternVar(ns, lang.NewSymbol("host"), lang.FnFunc0(func() any { + return grenadineHost() + }), true) +} + +func grenadineHost() lang.IPersistentMap { + return lang.NewMap( + lang.NewKeyword("http-get"), lang.FnFunc1(func(rawURL any) any { + return grenadineHTTPGet(rawURL.(string)) + }), + lang.NewKeyword("read-bytes"), lang.FnFunc1(func(path any) any { + data, err := os.ReadFile(path.(string)) + if err != nil { + panic(err) + } + return data + }), + lang.NewKeyword("write-bytes!"), lang.FnFunc2(func(path, data any) any { + if err := os.WriteFile(path.(string), data.([]byte), 0o644); err != nil { + panic(err) + } + return nil + }), + lang.NewKeyword("bytes->utf8"), lang.FnFunc1(func(data any) any { + return string(data.([]byte)) + }), + lang.NewKeyword("utf8->bytes"), lang.FnFunc1(func(text any) any { + return []byte(text.(string)) + }), + lang.NewKeyword("digest"), lang.FnFunc2(func(algorithm, data any) any { + return grenadineDigest(algorithm.(lang.Keyword), data.([]byte)) + }), + lang.NewKeyword("byte-count"), lang.FnFunc1(func(data any) any { + return int64(len(data.([]byte))) + }), + lang.NewKeyword("exists?"), lang.FnFunc1(func(path any) any { + _, err := os.Stat(path.(string)) + return err == nil + }), + lang.NewKeyword("directory?"), lang.FnFunc1(func(path any) any { + info, err := os.Stat(path.(string)) + return err == nil && info.IsDir() + }), + lang.NewKeyword("regular-file?"), lang.FnFunc1(func(path any) any { + info, err := os.Stat(path.(string)) + return err == nil && info.Mode().IsRegular() + }), + lang.NewKeyword("canonical-path"), lang.FnFunc1(func(path any) any { + return grenadineCanonicalPath(path.(string)) + }), + lang.NewKeyword("absolute-path"), lang.FnFunc1(func(path any) any { + return grenadineCanonicalPath(path.(string)) + }), + lang.NewKeyword("find-files"), lang.FnFunc2(func(root, predicate any) any { + return grenadineFindFiles(root.(string), predicate.(lang.IFn)) + }), + lang.NewKeyword("run-process"), lang.FnFunc1(func(options any) any { + return grenadineRunProcess(options.(lang.IPersistentMap)) + }), + lang.NewKeyword("mkdirs!"), lang.FnFunc1(func(path any) any { + if err := os.MkdirAll(path.(string), 0o755); err != nil { + panic(err) + } + return nil + }), + lang.NewKeyword("atomic-move!"), lang.FnFunc2(func(source, destination any) any { + if err := grenadineAtomicMove(source.(string), destination.(string)); err != nil { + panic(err) + } + return nil + }), + lang.NewKeyword("delete!"), lang.FnFunc1(func(path any) any { + if err := os.RemoveAll(path.(string)); err != nil { + panic(err) + } + return nil + }), + lang.NewKeyword("delete-tree!"), lang.FnFunc1(func(path any) any { + if err := os.RemoveAll(path.(string)); err != nil { + panic(err) + } + return nil + }), + lang.NewKeyword("extract-jar!"), lang.FnFunc2(func(jar, destination any) any { + if err := grenadineExtractJar(jar.(string), destination.(string)); err != nil { + panic(err) + } + return destination + }), + lang.NewKeyword("home-dir"), lang.FnFunc0(func() any { + home, err := os.UserHomeDir() + if err != nil { + panic(err) + } + return home + }), + lang.NewKeyword("getenv"), lang.FnFunc1(func(name any) any { + return os.Getenv(name.(string)) + }), + ) +} + +func grenadineCanonicalPath(path string) string { + real, err := filepath.EvalSymlinks(path) + if err != nil { + real = path + } + absolute, err := filepath.Abs(real) + if err != nil { + panic(err) + } + return filepath.Clean(absolute) +} + +func grenadineFindFiles(root string, predicate lang.IFn) any { + paths := []any{} + err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() { + canonical := grenadineCanonicalPath(path) + if RT.BooleanCast(predicate.Invoke(canonical)) { + paths = append(paths, canonical) + } + } + return nil + }) + if err != nil { + panic(err) + } + return lang.NewVector(paths...) +} + +func grenadineStrings(value any) []string { + values := []string{} + for seq := lang.Seq(value); seq != nil; seq = seq.Next() { + values = append(values, seq.First().(string)) + } + return values +} + +func grenadineRunProcess(options lang.IPersistentMap) lang.IPersistentMap { + args := grenadineStrings(lang.Get(options, lang.NewKeyword("args"))) + if len(args) == 0 { + panic(fmt.Errorf("grenadine: run-process requires :args")) + } + command := exec.Command(args[0], args[1:]...) + if dir := lang.Get(options, lang.NewKeyword("dir")); !lang.IsNil(dir) { + command.Dir = dir.(string) + } + command.Env = os.Environ() + if environment := lang.Get(options, lang.NewKeyword("env")); !lang.IsNil(environment) { + for seq := lang.Seq(environment); seq != nil; seq = seq.Next() { + entry := seq.First().(*lang.MapEntry) + command.Env = append(command.Env, + fmt.Sprintf("%s=%s", entry.Key(), entry.Val())) + } + } + var stdout, stderr bytes.Buffer + command.Stdout, command.Stderr = &stdout, &stderr + err := command.Run() + exit := int64(0) + if err != nil { + exit = 1 + if exitError, ok := err.(*exec.ExitError); ok { + exit = int64(exitError.ExitCode()) + } else if stderr.Len() == 0 { + stderr.WriteString(err.Error()) + } + } + return lang.NewMap( + lang.NewKeyword("exit"), exit, + lang.NewKeyword("out"), stdout.String(), + lang.NewKeyword("err"), stderr.String(), + ) +} + +func grenadineHTTPGet(rawURL string) lang.IPersistentMap { + request, err := http.NewRequest(http.MethodGet, rawURL, nil) + if err != nil { + return grenadineHTTPResponse(0, nil) + } + request.Header.Set("User-Agent", "glojure-grenadine/"+Version) + response, err := grenadineHTTPClient.Do(request) + if err != nil { + return grenadineHTTPResponse(0, nil) + } + defer response.Body.Close() + body, err := io.ReadAll(response.Body) + if err != nil { + return grenadineHTTPResponse(0, nil) + } + return grenadineHTTPResponse(response.StatusCode, body) +} + +func grenadineHTTPResponse(status int, body []byte) lang.IPersistentMap { + return lang.NewMap( + lang.NewKeyword("status"), int64(status), + lang.NewKeyword("headers"), lang.NewMap(), + lang.NewKeyword("body"), body, + ) +} + +func grenadineDigest(algorithm lang.Keyword, data []byte) string { + switch algorithm.Name() { + case "sha1": + sum := sha1.Sum(data) + return hex.EncodeToString(sum[:]) + case "sha256": + sum := sha256.Sum256(data) + return hex.EncodeToString(sum[:]) + default: + panic(fmt.Errorf("grenadine: unsupported digest algorithm %s", algorithm)) + } +} + +func grenadineAtomicMove(source, destination string) error { + if err := os.Remove(destination); err != nil && !os.IsNotExist(err) { + return err + } + return os.Rename(source, destination) +} + +func grenadineExtractJar(jar, destination string) (err error) { + marker := filepath.Join(destination, ".grenadine-complete") + if _, err := os.Stat(marker); err == nil { + return nil + } + + temporary := destination + ".part" + if err := os.RemoveAll(temporary); err != nil { + return err + } + defer func() { + if err != nil { + _ = os.RemoveAll(temporary) + } + }() + if err := os.MkdirAll(temporary, 0o755); err != nil { + return err + } + + archive, err := zip.OpenReader(jar) + if err != nil { + return err + } + defer archive.Close() + + for _, entry := range archive.File { + if err := grenadineExtractEntry(entry, temporary); err != nil { + return err + } + } + if err := os.WriteFile(filepath.Join(temporary, ".grenadine-complete"), nil, 0o644); err != nil { + return err + } + if err := os.RemoveAll(destination); err != nil { + return err + } + return os.Rename(temporary, destination) +} + +func grenadineExtractEntry(entry *zip.File, root string) error { + if entry.Mode()&os.ModeSymlink != 0 { + return fmt.Errorf("grenadine: refusing symlink in jar: %s", entry.Name) + } + name := filepath.Clean(filepath.FromSlash(entry.Name)) + if name == "." { + return nil + } + if filepath.IsAbs(name) || name == ".." || strings.HasPrefix(name, ".."+string(filepath.Separator)) { + return fmt.Errorf("grenadine: refusing path outside jar root: %s", entry.Name) + } + target := filepath.Join(root, name) + relative, err := filepath.Rel(root, target) + if err != nil || relative == ".." || strings.HasPrefix(relative, ".."+string(filepath.Separator)) { + return fmt.Errorf("grenadine: refusing path outside jar root: %s", entry.Name) + } + if entry.FileInfo().IsDir() { + return os.MkdirAll(target, 0o755) + } + if err := os.MkdirAll(filepath.Dir(target), 0o755); err != nil { + return err + } + source, err := entry.Open() + if err != nil { + return err + } + defer source.Close() + destination, err := os.OpenFile(target, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0o644) + if err != nil { + return err + } + _, copyErr := io.Copy(destination, source) + closeErr := destination.Close() + if copyErr != nil { + return copyErr + } + return closeErr +} diff --git a/pkg/runtime/grenadine_host_test.go b/pkg/runtime/grenadine_host_test.go new file mode 100644 index 00000000..78920103 --- /dev/null +++ b/pkg/runtime/grenadine_host_test.go @@ -0,0 +1,100 @@ +package runtime + +import ( + "archive/zip" + "bytes" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/glojurelang/glojure/pkg/lang" +) + +func TestGrenadineDigest(t *testing.T) { + data := []byte("grenadine") + if got := grenadineDigest(lang.NewKeyword("sha256"), data); got != "f5d1611232b9b6a31561d4f43f839a36fd3cf71ff9fac86e5c6946ae96545090" { + t.Fatalf("sha256 = %q", got) + } +} + +func TestGrenadineRunProcess(t *testing.T) { + result := grenadineRunProcess(lang.NewMap( + lang.NewKeyword("args"), lang.NewVector("sh", "-c", "printf %s \"$GRENADINE_HOST_TEST\""), + lang.NewKeyword("env"), lang.NewMap("GRENADINE_HOST_TEST", "works"), + )) + if got := lang.Get(result, lang.NewKeyword("exit")); got != int64(0) { + t.Fatalf("exit = %v, stderr = %q", got, lang.Get(result, lang.NewKeyword("err"))) + } + if got := lang.Get(result, lang.NewKeyword("out")); got != "works" { + t.Fatalf("stdout = %q", got) + } +} + +func TestGrenadineFindFiles(t *testing.T) { + dir := t.TempDir() + if err := os.WriteFile(filepath.Join(dir, "pom.xml"), nil, 0o644); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(dir, "ignored.txt"), nil, 0o644); err != nil { + t.Fatal(err) + } + value := grenadineFindFiles(dir, lang.FnFunc1(func(path any) any { + return strings.HasSuffix(path.(string), "/pom.xml") + })) + seq := lang.Seq(value) + if seq == nil || !strings.HasSuffix(seq.First().(string), "/pom.xml") || seq.Next() != nil { + t.Fatalf("find-files = %v", value) + } +} + +func TestGrenadineExtractJar(t *testing.T) { + dir := t.TempDir() + jar := filepath.Join(dir, "library.jar") + writeTestJar(t, jar, "example/core.clj", "(ns example.core)\n") + destination := filepath.Join(dir, "extracted") + if err := grenadineExtractJar(jar, destination); err != nil { + t.Fatal(err) + } + got, err := os.ReadFile(filepath.Join(destination, "example", "core.clj")) + if err != nil { + t.Fatal(err) + } + if string(got) != "(ns example.core)\n" { + t.Fatalf("source = %q", got) + } + if _, err := os.Stat(filepath.Join(destination, ".grenadine-complete")); err != nil { + t.Fatal(err) + } +} + +func TestGrenadineExtractJarRejectsTraversal(t *testing.T) { + dir := t.TempDir() + jar := filepath.Join(dir, "library.jar") + writeTestJar(t, jar, "../outside.clj", "bad") + if err := grenadineExtractJar(jar, filepath.Join(dir, "extracted")); err == nil { + t.Fatal("expected traversal error") + } + if _, err := os.Stat(filepath.Join(dir, "outside.clj")); !os.IsNotExist(err) { + t.Fatalf("outside path was created: %v", err) + } +} + +func writeTestJar(t *testing.T, path, name, contents string) { + t.Helper() + var data bytes.Buffer + archive := zip.NewWriter(&data) + entry, err := archive.Create(name) + if err != nil { + t.Fatal(err) + } + if _, err := entry.Write([]byte(contents)); err != nil { + t.Fatal(err) + } + if err := archive.Close(); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(path, data.Bytes(), 0o644); err != nil { + t.Fatal(err) + } +} diff --git a/pkg/runtime/rtcompat.go b/pkg/runtime/rtcompat.go index 51718a7b..2967ca7d 100644 --- a/pkg/runtime/rtcompat.go +++ b/pkg/runtime/rtcompat.go @@ -27,6 +27,9 @@ var ( loadPath = []fs.FS{} loadPathLock sync.Mutex + sourceTransformer lang.IFn + sourceTransformerLock sync.RWMutex + useAot = func() bool { // default to true gua := strings.ToLower(os.Getenv("GLOJURE_USE_AOT")) @@ -36,6 +39,15 @@ var ( warnNotAot = os.Getenv("GLOJURE_WARN_NOT_AOT") == "1" ) +// SetSourceTransformer installs an embedding-specific source rewrite applied +// to dynamically loaded namespace resources before they are read. Passing nil +// removes the transformer. +func SetSourceTransformer(transformer lang.IFn) { + sourceTransformerLock.Lock() + sourceTransformer = transformer + sourceTransformerLock.Unlock() +} + func init() { stdlibPath := os.Getenv("GLOJURE_STDLIB_PATH") if stdlibPath != "" { @@ -352,7 +364,19 @@ func (rt *RTMethods) Load(scriptBase string) { if warnNotAot { fmt.Fprintf(os.Stderr, "WARNING: loading %s (not AOT)\n", filename) } - ReadEval(string(buf), WithFilename(filename)) + code := string(buf) + sourceTransformerLock.RLock() + transformer := sourceTransformer + sourceTransformerLock.RUnlock() + if transformer != nil { + transformed := lang.Apply2(transformer, filename, code) + var ok bool + code, ok = transformed.(string) + if !ok { + panic(fmt.Errorf("source transformer returned %T, want string", transformed)) + } + } + ReadEval(code, WithFilename(filename)) // if compileFiles is set, compile the namespace to a .go file compileFiles := VarCompileFiles.Get().(bool) diff --git a/pkg/stdlib/clojure/core.glj b/pkg/stdlib/clojure/core.glj index 734e3d6e..0e46ee22 100644 --- a/pkg/stdlib/clojure/core.glj +++ b/pkg/stdlib/clojure/core.glj @@ -6904,7 +6904,7 @@ fails, attempts to require sym's namespace and retries." (defn uuid? "Return true if x is a java.util.UUID" {:added "1.9"} - [x] (instance? github.com:google:uuid.UUID x)) + [x] (github.com:glojurelang:glojure:pkg:javacompat:uuid.IsUUID x)) (defn random-uuid {:doc "Returns a pseudo-randomly generated java.util.UUID instance (i.e. type 4). @@ -7827,7 +7827,7 @@ fails, attempts to require sym's namespace and retries." "Return true if the value is the data representation of a tagged literal" {:added "1.7"} [value] - (instance? clojure.lang.TaggedLiteral value)) + (instance? github.com:glojurelang:glojure:pkg:lang.*TaggedLiteral value)) (defn tagged-literal "Construct a data representation of a tagged literal from a diff --git a/pkg/stdlib/clojure/core/async/loader.go b/pkg/stdlib/clojure/core/async/loader.go index 3c260b06..ce0d7e58 100644 --- a/pkg/stdlib/clojure/core/async/loader.go +++ b/pkg/stdlib/clojure/core/async/loader.go @@ -420,6 +420,9 @@ func LoadNS() { { // refer vars from clojure.core srcNS := lang.FindOrCreateNamespace(sym_clojure_DOT_core) ns.ReferAllSnapshot(srcNS, []string{ + "*loaded-libs*", + "*loading-verbosely*", + "*pending-paths*", "-protocols", ">0?", ">1?", diff --git a/pkg/stdlib/clojure/core/loader.go b/pkg/stdlib/clojure/core/loader.go index fe5976b5..c35dd648 100644 --- a/pkg/stdlib/clojure/core/loader.go +++ b/pkg/stdlib/clojure/core/loader.go @@ -5,19 +5,21 @@ package core import ( errors6 "errors" fmt "fmt" + filesystem9 "github.com/glojurelang/glojure/pkg/javacompat/filesystem" + uuid17 "github.com/glojurelang/glojure/pkg/javacompat/uuid" lang "github.com/glojurelang/glojure/pkg/lang" pkgmap5 "github.com/glojurelang/glojure/pkg/pkgmap" runtime "github.com/glojurelang/glojure/pkg/runtime" - uuid11 "github.com/google/uuid" + uuid12 "github.com/google/uuid" math4 "math" big7 "math/big" - rand14 "math/rand" - url15 "net/url" + rand15 "math/rand" + url16 "net/url" reflect "reflect" - regexp13 "regexp" - runtime12 "runtime" - strconv10 "strconv" - strings9 "strings" + regexp14 "regexp" + runtime13 "runtime" + strconv11 "strconv" + strings10 "strings" sync "sync" time8 "time" ) @@ -4858,7 +4860,7 @@ func LoadNS() { tmp1 := lang.NewAtom(lang.NewMap(sym_CollReduce, tmp2, sym_InternalReduce, tmp14, sym_IKVReduce, tmp22, sym_Datafiable, tmp25, sym_Navigable, tmp29)) var_clojure_DOT_core__DASH_protocols = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core__DASH_protocols.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_doc, "Private store of protocols. Go's reflection capabilities\n don't yet support a native interface-based implementation, so\n protocols are implemented in Glojure as maps from type to protocol\n method implementations.", kw_file, "clojure/core_deftype.glj", kw_line, int(21), kw_column, int(3), kw_end_DASH_line, int(26), kw_end_DASH_column, int(12), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core_deftype.glj", kw_line, int(21), kw_column, int(3), kw_end_DASH_line, int(26), kw_end_DASH_column, int(12), kw_private, true, kw_doc, "Private store of protocols. Go's reflection capabilities\n don't yet support a native interface-based implementation, so\n protocols are implemented in Glojure as maps from type to protocol\n method implementations.", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // >0? @@ -4874,7 +4876,7 @@ func LoadNS() { aotDirectFn12 = tmp1 var_clojure_DOT_core__GT_0_QMARK_ = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core__GT_0_QMARK_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(965), kw_column, int(7), kw_end_DASH_line, int(965), kw_end_DASH_column, int(19), kw_arglists, lang.NewList(lang.NewVector(sym_n)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(965), kw_column, int(7), kw_end_DASH_line, int(965), kw_end_DASH_column, int(19), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_n)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // >1? @@ -4890,7 +4892,7 @@ func LoadNS() { aotDirectFn13 = tmp1 var_clojure_DOT_core__GT_1_QMARK_ = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core__GT_1_QMARK_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(964), kw_column, int(7), kw_end_DASH_line, int(964), kw_end_DASH_column, int(19), kw_arglists, lang.NewList(lang.NewVector(sym_n)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(964), kw_column, int(7), kw_end_DASH_line, int(964), kw_end_DASH_column, int(19), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_n)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // *1 @@ -4898,7 +4900,7 @@ func LoadNS() { tmp0 := sym__STAR_1 var_clojure_DOT_core__STAR_1 = ns.Intern(tmp0) var_clojure_DOT_core__STAR_1.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core.glj", kw_line, int(6325), kw_column, int(6), kw_end_DASH_line, int(6328), kw_end_DASH_column, int(3), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(6325), kw_column, int(6), kw_end_DASH_line, int(6328), kw_end_DASH_column, int(3), kw_doc, "bound in a repl thread to the most recent value printed", kw_added, "1.0", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_1.SetDynamic() } @@ -4907,7 +4909,7 @@ func LoadNS() { tmp0 := sym__STAR_2 var_clojure_DOT_core__STAR_2 = ns.Intern(tmp0) var_clojure_DOT_core__STAR_2.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core.glj", kw_line, int(6330), kw_column, int(6), kw_end_DASH_line, int(6333), kw_end_DASH_column, int(3), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(6330), kw_column, int(6), kw_end_DASH_line, int(6333), kw_end_DASH_column, int(3), kw_doc, "bound in a repl thread to the second most recent value printed", kw_added, "1.0", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_2.SetDynamic() } @@ -4916,7 +4918,7 @@ func LoadNS() { tmp0 := sym__STAR_3 var_clojure_DOT_core__STAR_3 = ns.Intern(tmp0) var_clojure_DOT_core__STAR_3.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core.glj", kw_line, int(6335), kw_column, int(6), kw_end_DASH_line, int(6338), kw_end_DASH_column, int(3), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(6335), kw_column, int(6), kw_end_DASH_line, int(6338), kw_end_DASH_column, int(3), kw_doc, "bound in a repl thread to the third most recent value printed", kw_added, "1.0", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_3.SetDynamic() } @@ -4965,7 +4967,7 @@ func LoadNS() { tmp0 := sym__STAR_data_DASH_readers_STAR_ var_clojure_DOT_core__STAR_data_DASH_readers_STAR_ = ns.InternWithValue(tmp0, lang.NewMap(), true) var_clojure_DOT_core__STAR_data_DASH_readers_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_added, "1.4", kw_dynamic, true, kw_file, "clojure/core.glj", kw_line, int(7857), kw_column, int(6), kw_end_DASH_line, int(7857), kw_end_DASH_column, int(49), kw_doc, "Map from reader tag symbols to data reader Vars.\n\n When Clojure starts, it searches for files named 'data_readers.clj'\n and 'data_readers.cljc' at the root of the classpath. Each such file\n must contain a literal map of symbols, like this:\n\n {foo/bar my.project.foo/bar\n foo/baz my.project/baz}\n\n The first symbol in each pair is a tag that will be recognized by\n the Clojure reader. The second symbol in the pair is the\n fully-qualified name of a Var which will be invoked by the reader to\n parse the form following the tag. For example, given the\n data_readers.clj file above, the Clojure reader would parse this\n form:\n\n #foo/bar [1 2 3]\n\n by invoking the Var #'my.project.foo/bar on the vector [1 2 3]. The\n data reader function is invoked on the form AFTER it has been read\n as a normal Clojure data structure by the reader.\n\n Reader tags without namespace qualifiers are reserved for\n Clojure. Default reader tags are defined in\n clojure.core/default-data-readers but may be overridden in\n data_readers.clj, data_readers.cljc, or by rebinding this Var.", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(7857), kw_column, int(6), kw_end_DASH_line, int(7857), kw_end_DASH_column, int(49), kw_added, "1.4", kw_dynamic, true, kw_doc, "Map from reader tag symbols to data reader Vars.\n\n When Clojure starts, it searches for files named 'data_readers.clj'\n and 'data_readers.cljc' at the root of the classpath. Each such file\n must contain a literal map of symbols, like this:\n\n {foo/bar my.project.foo/bar\n foo/baz my.project/baz}\n\n The first symbol in each pair is a tag that will be recognized by\n the Clojure reader. The second symbol in the pair is the\n fully-qualified name of a Var which will be invoked by the reader to\n parse the form following the tag. For example, given the\n data_readers.clj file above, the Clojure reader would parse this\n form:\n\n #foo/bar [1 2 3]\n\n by invoking the Var #'my.project.foo/bar on the vector [1 2 3]. The\n data reader function is invoked on the form AFTER it has been read\n as a normal Clojure data structure by the reader.\n\n Reader tags without namespace qualifiers are reserved for\n Clojure. Default reader tags are defined in\n clojure.core/default-data-readers but may be overridden in\n data_readers.clj, data_readers.cljc, or by rebinding this Var.", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_data_DASH_readers_STAR_.SetDynamic() } @@ -4974,7 +4976,7 @@ func LoadNS() { tmp0 := sym__STAR_default_DASH_data_DASH_reader_DASH_fn_STAR_ var_clojure_DOT_core__STAR_default_DASH_data_DASH_reader_DASH_fn_STAR_ = ns.InternWithValue(tmp0, nil, true) var_clojure_DOT_core__STAR_default_DASH_data_DASH_reader_DASH_fn_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_added, "1.5", kw_dynamic, true, kw_file, "clojure/core.glj", kw_line, int(7886), kw_column, int(6), kw_end_DASH_line, int(7886), kw_end_DASH_column, int(59), kw_doc, "When no data reader is found for a tag and *default-data-reader-fn*\n is non-nil, it will be called with two arguments,\n the tag and the value. If *default-data-reader-fn* is nil (the\n default), an exception will be thrown for the unknown tag.", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(7886), kw_column, int(6), kw_end_DASH_line, int(7886), kw_end_DASH_column, int(59), kw_added, "1.5", kw_dynamic, true, kw_doc, "When no data reader is found for a tag and *default-data-reader-fn*\n is non-nil, it will be called with two arguments,\n the tag and the value. If *default-data-reader-fn* is nil (the\n default), an exception will be thrown for the unknown tag.", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_default_DASH_data_DASH_reader_DASH_fn_STAR_.SetDynamic() } @@ -4983,7 +4985,7 @@ func LoadNS() { tmp0 := sym__STAR_e var_clojure_DOT_core__STAR_e = ns.Intern(tmp0) var_clojure_DOT_core__STAR_e.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core.glj", kw_line, int(6340), kw_column, int(6), kw_end_DASH_line, int(6343), kw_end_DASH_column, int(3), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(6340), kw_column, int(6), kw_end_DASH_line, int(6343), kw_end_DASH_column, int(3), kw_doc, "bound in a repl thread to the most recent exception caught by the repl", kw_added, "1.0", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_e.SetDynamic() } @@ -5024,7 +5026,7 @@ func LoadNS() { tmp0 := sym__STAR_loaded_DASH_libs_STAR_ var_clojure_DOT_core__STAR_loaded_DASH_libs_STAR_ = ns.InternWithValue(tmp0, lang.NewRef(lang.NewSet()), true) var_clojure_DOT_core__STAR_loaded_DASH_libs_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core.glj", kw_line, int(5874), kw_column, int(10), kw_end_DASH_line, int(5877), kw_end_DASH_column, int(15), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(5874), kw_column, int(10), kw_end_DASH_line, int(5877), kw_end_DASH_column, int(15), kw_private, true, kw_doc, "A ref to a sorted set of symbols representing loaded libs", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_loaded_DASH_libs_STAR_.SetDynamic() } @@ -5033,7 +5035,7 @@ func LoadNS() { tmp0 := sym__STAR_loading_DASH_verbosely_STAR_ var_clojure_DOT_core__STAR_loading_DASH_verbosely_STAR_ = ns.InternWithValue(tmp0, false, true) var_clojure_DOT_core__STAR_loading_DASH_verbosely_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core.glj", kw_line, int(5884), kw_column, int(10), kw_end_DASH_line, int(5887), kw_end_DASH_column, int(21), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(5884), kw_column, int(10), kw_end_DASH_line, int(5887), kw_end_DASH_column, int(21), kw_private, true, kw_doc, "True while a verbose load is pending", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_loading_DASH_verbosely_STAR_.SetDynamic() } @@ -5050,7 +5052,7 @@ func LoadNS() { tmp0 := sym__STAR_pending_DASH_paths_STAR_ var_clojure_DOT_core__STAR_pending_DASH_paths_STAR_ = ns.InternWithValue(tmp0, lang.NewList(), true) var_clojure_DOT_core__STAR_pending_DASH_paths_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core.glj", kw_line, int(5879), kw_column, int(10), kw_end_DASH_line, int(5882), kw_end_DASH_column, int(17), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(5879), kw_column, int(10), kw_end_DASH_line, int(5882), kw_end_DASH_column, int(17), kw_private, true, kw_doc, "A stack of paths currently being loaded by this thread", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_pending_DASH_paths_STAR_.SetDynamic() } @@ -5067,7 +5069,7 @@ func LoadNS() { tmp0 := sym__STAR_print_DASH_length_STAR_ var_clojure_DOT_core__STAR_print_DASH_length_STAR_ = ns.InternWithValue(tmp0, nil, true) var_clojure_DOT_core__STAR_print_DASH_length_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core_print.glj", kw_line, int(14), kw_column, int(6), kw_end_DASH_line, int(23), kw_end_DASH_column, int(15), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core_print.glj", kw_line, int(14), kw_column, int(6), kw_end_DASH_line, int(23), kw_end_DASH_column, int(15), kw_doc, "*print-length* controls how many items of each collection the\n printer will print. If it is bound to logical false, there is no\n limit. Otherwise, it must be bound to an integer indicating the maximum\n number of items of each collection to print. If a collection contains\n more items, the printer will print items up to the limit followed by\n '...' to represent the remaining items. The root binding is nil\n indicating no limit.", kw_added, "1.0", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_print_DASH_length_STAR_.SetDynamic() } @@ -5076,7 +5078,7 @@ func LoadNS() { tmp0 := sym__STAR_print_DASH_level_STAR_ var_clojure_DOT_core__STAR_print_DASH_level_STAR_ = ns.InternWithValue(tmp0, nil, true) var_clojure_DOT_core__STAR_print_DASH_level_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core_print.glj", kw_line, int(25), kw_column, int(6), kw_end_DASH_line, int(35), kw_end_DASH_column, int(14), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core_print.glj", kw_line, int(25), kw_column, int(6), kw_end_DASH_line, int(35), kw_end_DASH_column, int(14), kw_doc, "*print-level* controls how many levels deep the printer will\n print nested objects. If it is bound to logical false, there is no\n limit. Otherwise, it must be bound to an integer indicating the maximum\n level to print. Each argument to print is at level 0; if an argument is a\n collection, its items are at level 1; and so on. If an object is a\n collection and is at a level greater than or equal to the value bound to\n *print-level*, the printer prints '#' to represent it. The root binding\n is nil indicating no limit.", kw_added, "1.0", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_print_DASH_level_STAR_.SetDynamic() } @@ -5093,7 +5095,7 @@ func LoadNS() { tmp0 := sym__STAR_print_DASH_namespace_DASH_maps_STAR_ var_clojure_DOT_core__STAR_print_DASH_namespace_DASH_maps_STAR_ = ns.InternWithValue(tmp0, false, true) var_clojure_DOT_core__STAR_print_DASH_namespace_DASH_maps_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core_print.glj", kw_line, int(39), kw_column, int(6), kw_end_DASH_line, int(44), kw_end_DASH_column, int(23), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core_print.glj", kw_line, int(39), kw_column, int(6), kw_end_DASH_line, int(44), kw_end_DASH_column, int(23), kw_doc, "*print-namespace-maps* controls whether the printer will print\n namespace map literal syntax. It defaults to false, but the REPL binds\n to true.", kw_added, "1.9", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_print_DASH_namespace_DASH_maps_STAR_.SetDynamic() } @@ -5118,7 +5120,7 @@ func LoadNS() { tmp0 := sym__STAR_repl_STAR_ var_clojure_DOT_core__STAR_repl_STAR_ = ns.InternWithValue(tmp0, false, true) var_clojure_DOT_core__STAR_repl_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core.glj", kw_line, int(6345), kw_column, int(6), kw_end_DASH_line, int(6348), kw_end_DASH_column, int(8), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(6345), kw_column, int(6), kw_end_DASH_line, int(6348), kw_end_DASH_column, int(8), kw_doc, "Bound to true in a repl thread", kw_added, "1.12", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_repl_STAR_.SetDynamic() } @@ -5135,7 +5137,7 @@ func LoadNS() { tmp0 := sym__STAR_verbose_DASH_defrecords_STAR_ var_clojure_DOT_core__STAR_verbose_DASH_defrecords_STAR_ = ns.InternWithValue(tmp0, false, true) var_clojure_DOT_core__STAR_verbose_DASH_defrecords_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/core_print.glj", kw_line, int(37), kw_column, int(6), kw_end_DASH_line, int(37), kw_end_DASH_column, int(35), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMap(kw_file, "clojure/core_print.glj", kw_line, int(37), kw_column, int(6), kw_end_DASH_line, int(37), kw_end_DASH_column, int(35), kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core__STAR_verbose_DASH_defrecords_STAR_.SetDynamic() } @@ -5288,12 +5290,8 @@ func LoadNS() { _ = v3 var v4 any = rest _ = v4 - tmp5, _ := lang.FieldOrMethod(v2, "alter") - if reflect.TypeOf(tmp5).Kind() != reflect.Func { - panic(lang.NewIllegalArgumentError(fmt.Sprintf("alter is not a function"))) - } - tmp6 := lang.Apply2(tmp5, v3, v4) - return tmp6 + tmp5 := v2.(interface{ Alter(lang.IFn, lang.ISeq) any }).Alter(lang.MustHostCast[lang.IFn](v3), lang.MustHostCast[lang.ISeq](v4)) + return tmp5 }), 2, ) @@ -5488,7 +5486,7 @@ func LoadNS() { aotDirectFn36 = tmp1 var_clojure_DOT_core_array = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_array.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(3493), kw_column, int(7), kw_end_DASH_line, int(3494), kw_end_DASH_column, int(7), kw_arglists, lang.NewList(lang.NewVector(sym__AMP_, sym_items)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(3493), kw_column, int(7), kw_end_DASH_line, int(3494), kw_end_DASH_column, int(7), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym__AMP_, sym_items)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // array-map @@ -5587,7 +5585,7 @@ func LoadNS() { aotDirectFn39 = tmp1 var_clojure_DOT_core_aset_DASH_boolean = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_aset_DASH_boolean.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Sets the value at the index/indices. Works on arrays of boolean. Returns val.", kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(4013), kw_column, int(3), kw_end_DASH_line, int(4015), kw_end_DASH_column, int(14), kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4013), kw_column, int(3), kw_end_DASH_line, int(4015), kw_end_DASH_column, int(14), kw_doc, "Sets the value at the index/indices. Works on arrays of boolean. Returns val.", kw_added, "1.0", kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // aset-byte @@ -5639,7 +5637,7 @@ func LoadNS() { aotDirectFn40 = tmp1 var_clojure_DOT_core_aset_DASH_byte = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_aset_DASH_byte.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Sets the value at the index/indices. Works on arrays of byte. Returns val.", kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(4033), kw_column, int(3), kw_end_DASH_line, int(4035), kw_end_DASH_column, int(11), kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4033), kw_column, int(3), kw_end_DASH_line, int(4035), kw_end_DASH_column, int(11), kw_doc, "Sets the value at the index/indices. Works on arrays of byte. Returns val.", kw_added, "1.0", kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // aset-char @@ -5691,7 +5689,7 @@ func LoadNS() { aotDirectFn41 = tmp1 var_clojure_DOT_core_aset_DASH_char = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_aset_DASH_char.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Sets the value at the index/indices. Works on arrays of char. Returns val.", kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(4038), kw_column, int(3), kw_end_DASH_line, int(4040), kw_end_DASH_column, int(11), kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4038), kw_column, int(3), kw_end_DASH_line, int(4040), kw_end_DASH_column, int(11), kw_doc, "Sets the value at the index/indices. Works on arrays of char. Returns val.", kw_added, "1.0", kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // aset-double @@ -5743,7 +5741,7 @@ func LoadNS() { aotDirectFn42 = tmp1 var_clojure_DOT_core_aset_DASH_double = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_aset_DASH_double.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Sets the value at the index/indices. Works on arrays of double. Returns val.", kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(4023), kw_column, int(3), kw_end_DASH_line, int(4025), kw_end_DASH_column, int(13), kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4023), kw_column, int(3), kw_end_DASH_line, int(4025), kw_end_DASH_column, int(13), kw_doc, "Sets the value at the index/indices. Works on arrays of double. Returns val.", kw_added, "1.0", kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // aset-float @@ -5795,7 +5793,7 @@ func LoadNS() { aotDirectFn43 = tmp1 var_clojure_DOT_core_aset_DASH_float = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_aset_DASH_float.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Sets the value at the index/indices. Works on arrays of float. Returns val.", kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(4018), kw_column, int(3), kw_end_DASH_line, int(4020), kw_end_DASH_column, int(12), kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4018), kw_column, int(3), kw_end_DASH_line, int(4020), kw_end_DASH_column, int(12), kw_doc, "Sets the value at the index/indices. Works on arrays of float. Returns val.", kw_added, "1.0", kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // aset-int @@ -5847,7 +5845,7 @@ func LoadNS() { aotDirectFn44 = tmp1 var_clojure_DOT_core_aset_DASH_int = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_aset_DASH_int.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Sets the value at the index/indices. Works on arrays of int. Returns val.", kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(4003), kw_column, int(3), kw_end_DASH_line, int(4005), kw_end_DASH_column, int(10), kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4003), kw_column, int(3), kw_end_DASH_line, int(4005), kw_end_DASH_column, int(10), kw_doc, "Sets the value at the index/indices. Works on arrays of int. Returns val.", kw_added, "1.0", kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // aset-long @@ -5899,7 +5897,7 @@ func LoadNS() { aotDirectFn45 = tmp1 var_clojure_DOT_core_aset_DASH_long = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_aset_DASH_long.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Sets the value at the index/indices. Works on arrays of long. Returns val.", kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(4008), kw_column, int(3), kw_end_DASH_line, int(4010), kw_end_DASH_column, int(11), kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4008), kw_column, int(3), kw_end_DASH_line, int(4010), kw_end_DASH_column, int(11), kw_doc, "Sets the value at the index/indices. Works on arrays of long. Returns val.", kw_added, "1.0", kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // aset-short @@ -5951,7 +5949,7 @@ func LoadNS() { aotDirectFn46 = tmp1 var_clojure_DOT_core_aset_DASH_short = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_aset_DASH_short.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Sets the value at the index/indices. Works on arrays of short. Returns val.", kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(4028), kw_column, int(3), kw_end_DASH_line, int(4030), kw_end_DASH_column, int(12), kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4028), kw_column, int(3), kw_end_DASH_line, int(4030), kw_end_DASH_column, int(12), kw_doc, "Sets the value at the index/indices. Works on arrays of short. Returns val.", kw_added, "1.0", kw_arglists, lang.NewList(lang.NewVector(sym_array, sym_idx, sym_val), lang.NewVector(sym_array, sym_idx, sym_idx2, sym__AMP_, sym_idxv)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // assert-valid-fdecl @@ -6026,7 +6024,7 @@ func LoadNS() { }) var_clojure_DOT_core_assert_DASH_valid_DASH_fdecl = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_assert_DASH_valid_DASH_fdecl.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_dynamic, true, kw_file, "clojure/core.glj", kw_line, int(7565), kw_column, int(8), kw_end_DASH_line, int(7565), kw_end_DASH_column, int(42), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_fdecl)), kw_doc, "A good fdecl looks like (([a] ...) ([a b] ...)) near the end of defn.", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(7565), kw_column, int(8), kw_end_DASH_line, int(7565), kw_end_DASH_column, int(42), kw_dynamic, true, kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_fdecl)), kw_doc, "A good fdecl looks like (([a] ...) ([a b] ...)) near the end of defn.", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) var_clojure_DOT_core_assert_DASH_valid_DASH_fdecl.SetDynamic() } @@ -6105,7 +6103,7 @@ func LoadNS() { aotDirectFn47 = tmp1 var_clojure_DOT_core_assoc = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_assoc.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_map, sym_key, sym_val), lang.NewVector(sym_map, sym_key, sym_val, sym__AMP_, sym_kvs)), kw_doc, "assoc[iate]. When applied to a map, returns a new map of the\n same (hashed/sorted) type, that contains the mapping of key(s) to\n val(s). When applied to a vector, returns a new vector that\n contains val at index. Note - index must be <= (count vector).", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(183), kw_column, int(2), kw_end_DASH_line, int(190), kw_end_DASH_column, int(6), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(183), kw_column, int(2), kw_end_DASH_line, int(190), kw_end_DASH_column, int(6), kw_arglists, lang.NewList(lang.NewVector(sym_map, sym_key, sym_val), lang.NewVector(sym_map, sym_key, sym_val, sym__AMP_, sym_kvs)), kw_doc, "assoc[iate]. When applied to a map, returns a new map of the\n same (hashed/sorted) type, that contains the mapping of key(s) to\n val(s). When applied to a vector, returns a new vector that\n contains val at index. Note - index must be <= (count vector).", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // assoc! @@ -6503,7 +6501,7 @@ func LoadNS() { aotDirectFn54 = tmp1 var_clojure_DOT_core_await1 = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_await1.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_static, true, kw_file, "clojure/core.glj", kw_line, int(3306), kw_column, int(7), kw_end_DASH_line, int(3306), kw_end_DASH_column, int(21), kw_arglists, lang.NewList(lang.NewVector(sym_a)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(3306), kw_column, int(7), kw_end_DASH_line, int(3306), kw_end_DASH_column, int(21), kw_static, true, kw_arglists, lang.NewList(lang.NewVector(sym_a)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // await-for @@ -7355,7 +7353,7 @@ func LoadNS() { aotDirectFn78 = tmp1 var_clojure_DOT_core_butlast = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_butlast.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_doc, "Return a seq of all but the last item in coll, in linear time", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(274), kw_column, int(2), kw_end_DASH_line, int(278), kw_end_DASH_column, int(8), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(274), kw_column, int(2), kw_end_DASH_line, int(278), kw_end_DASH_column, int(8), kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_doc, "Return a seq of all but the last item in coll, in linear time", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // bytes? @@ -7473,7 +7471,7 @@ func LoadNS() { var_clojure_DOT_core_char_DASH_escape_DASH_string = ns.InternWithValue(tmp0, lang.NewMap(lang.NewChar(10), "\\n", lang.NewChar(9), "\\t", lang.NewChar(13), "\\r", lang.NewChar(34), "\\\"", lang.NewChar(92), "\\\\", lang.NewChar(12), "\\f", lang.NewChar(8), "\\b"), true) var_clojure_DOT_core_char_DASH_escape_DASH_string.SetMetaLazy(func() lang.IPersistentMap { tmp1 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp1, kw_doc, "Returns escape string for char or nil if none", kw_added, "1.0", kw_file, "clojure/core_print.glj", kw_line, int(214), kw_column, int(6), kw_end_DASH_line, int(217), kw_end_DASH_column, int(20), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core_print.glj", kw_line, int(214), kw_column, int(6), kw_end_DASH_line, int(217), kw_end_DASH_column, int(20), kw_tag, tmp1, kw_doc, "Returns escape string for char or nil if none", kw_added, "1.0", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // char-name-string @@ -7482,7 +7480,7 @@ func LoadNS() { var_clojure_DOT_core_char_DASH_name_DASH_string = ns.InternWithValue(tmp0, lang.NewMap(lang.NewChar(10), "newline", lang.NewChar(9), "tab", lang.NewChar(32), "space", lang.NewChar(8), "backspace", lang.NewChar(12), "formfeed", lang.NewChar(13), "return"), true) var_clojure_DOT_core_char_DASH_name_DASH_string.SetMetaLazy(func() lang.IPersistentMap { tmp1 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp1, kw_doc, "Returns name string for char or nil if none", kw_added, "1.0", kw_file, "clojure/core_print.glj", kw_line, int(335), kw_column, int(6), kw_end_DASH_line, int(338), kw_end_DASH_column, int(17), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core_print.glj", kw_line, int(335), kw_column, int(6), kw_end_DASH_line, int(338), kw_end_DASH_column, int(17), kw_tag, tmp1, kw_doc, "Returns name string for char or nil if none", kw_added, "1.0", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // char? @@ -7503,7 +7501,7 @@ func LoadNS() { aotDirectFn88 = tmp1 var_clojure_DOT_core_char_QMARK_ = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_char_QMARK_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_doc, "Return true if x is a Character", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(155), kw_column, int(2), kw_end_DASH_line, int(159), kw_end_DASH_column, int(6), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(155), kw_column, int(2), kw_end_DASH_line, int(159), kw_end_DASH_column, int(6), kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_doc, "Return true if x is a Character", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // chunk @@ -7519,7 +7517,8 @@ func LoadNS() { aotDirectFn92 = tmp1 var_clojure_DOT_core_chunk = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_chunk.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_static, true, kw_file, "clojure/core.glj", kw_line, int(693), kw_column, int(7), kw_end_DASH_line, int(693), kw_end_DASH_column, int(41), kw_arglists, lang.NewList(lang.NewVector(sym_b)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + tmp2 := reflect.TypeOf((*lang.IChunk)(nil)).Elem() + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(693), kw_column, int(7), kw_end_DASH_line, int(693), kw_end_DASH_column, int(41), kw_tag, tmp2, kw_static, true, kw_arglists, lang.NewList(lang.NewVector(sym_b)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // chunk-append @@ -7541,7 +7540,7 @@ func LoadNS() { aotDirectFn93 = tmp1 var_clojure_DOT_core_chunk_DASH_append = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_chunk_DASH_append.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_static, true, kw_file, "clojure/core.glj", kw_line, int(690), kw_column, int(7), kw_end_DASH_line, int(690), kw_end_DASH_column, int(27), kw_arglists, lang.NewList(lang.NewVector(sym_b, sym_x)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(690), kw_column, int(7), kw_end_DASH_line, int(690), kw_end_DASH_column, int(27), kw_static, true, kw_arglists, lang.NewList(lang.NewVector(sym_b, sym_x)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // chunk-buffer @@ -7557,7 +7556,8 @@ func LoadNS() { aotDirectFn94 = tmp1 var_clojure_DOT_core_chunk_DASH_buffer = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_chunk_DASH_buffer.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_static, true, kw_file, "clojure/core.glj", kw_line, int(687), kw_column, int(7), kw_end_DASH_line, int(687), kw_end_DASH_column, int(53), kw_arglists, lang.NewList(lang.NewVector(sym_capacity)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + tmp2 := reflect.TypeOf((*lang.ChunkBuffer)(nil)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(687), kw_column, int(7), kw_end_DASH_line, int(687), kw_end_DASH_column, int(53), kw_tag, tmp2, kw_static, true, kw_arglists, lang.NewList(lang.NewVector(sym_capacity)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // chunk-cons @@ -7583,7 +7583,7 @@ func LoadNS() { aotDirectFn95 = tmp1 var_clojure_DOT_core_chunk_DASH_cons = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_chunk_DASH_cons.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_static, true, kw_file, "clojure/core.glj", kw_line, int(705), kw_column, int(7), kw_end_DASH_line, int(705), kw_end_DASH_column, int(25), kw_arglists, lang.NewList(lang.NewVector(sym_chunk, sym_rest)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(705), kw_column, int(7), kw_end_DASH_line, int(705), kw_end_DASH_column, int(25), kw_static, true, kw_arglists, lang.NewList(lang.NewVector(sym_chunk, sym_rest)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // chunk-first @@ -7599,7 +7599,8 @@ func LoadNS() { aotDirectFn96 = tmp1 var_clojure_DOT_core_chunk_DASH_first = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_chunk_DASH_first.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_static, true, kw_file, "clojure/core.glj", kw_line, int(696), kw_column, int(7), kw_end_DASH_line, int(696), kw_end_DASH_column, int(48), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + tmp2 := reflect.TypeOf((*lang.IChunk)(nil)).Elem() + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(696), kw_column, int(7), kw_end_DASH_line, int(696), kw_end_DASH_column, int(48), kw_tag, tmp2, kw_static, true, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // chunk-next @@ -7615,7 +7616,8 @@ func LoadNS() { aotDirectFn97 = tmp1 var_clojure_DOT_core_chunk_DASH_next = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_chunk_DASH_next.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_static, true, kw_file, "clojure/core.glj", kw_line, int(702), kw_column, int(7), kw_end_DASH_line, int(702), kw_end_DASH_column, int(71), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + tmp2 := reflect.TypeOf((*lang.ISeq)(nil)).Elem() + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(702), kw_column, int(7), kw_end_DASH_line, int(702), kw_end_DASH_column, int(71), kw_tag, tmp2, kw_static, true, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // chunk-rest @@ -7631,7 +7633,8 @@ func LoadNS() { aotDirectFn98 = tmp1 var_clojure_DOT_core_chunk_DASH_rest = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_chunk_DASH_rest.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_static, true, kw_file, "clojure/core.glj", kw_line, int(699), kw_column, int(7), kw_end_DASH_line, int(699), kw_end_DASH_column, int(71), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + tmp2 := reflect.TypeOf((*lang.ISeq)(nil)).Elem() + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(699), kw_column, int(7), kw_end_DASH_line, int(699), kw_end_DASH_column, int(71), kw_tag, tmp2, kw_static, true, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // chunked-seq? @@ -7647,7 +7650,7 @@ func LoadNS() { aotDirectFn99 = tmp1 var_clojure_DOT_core_chunked_DASH_seq_QMARK_ = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_chunked_DASH_seq_QMARK_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_static, true, kw_file, "clojure/core.glj", kw_line, int(710), kw_column, int(7), kw_end_DASH_line, int(710), kw_end_DASH_column, int(27), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(710), kw_column, int(7), kw_end_DASH_line, int(710), kw_end_DASH_column, int(27), kw_static, true, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // class @@ -8132,7 +8135,7 @@ func LoadNS() { aotDirectFn113 = tmp1 var_clojure_DOT_core_conj = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_conj.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(), lang.NewVector(sym_coll), lang.NewVector(sym_coll, sym_x), lang.NewVector(sym_coll, sym_x, sym__AMP_, sym_xs)), kw_doc, "conj[oin]. Returns a new collection with the xs\n 'added'. (conj nil item) returns (item).\n (conj coll) returns coll. (conj) returns [].\n The 'addition' may happen at different 'places' depending\n on the concrete type.", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(75), kw_column, int(2), kw_end_DASH_line, int(83), kw_end_DASH_column, int(5), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(75), kw_column, int(2), kw_end_DASH_line, int(83), kw_end_DASH_column, int(5), kw_arglists, lang.NewList(lang.NewVector(), lang.NewVector(sym_coll), lang.NewVector(sym_coll, sym_x), lang.NewVector(sym_coll, sym_x, sym__AMP_, sym_xs)), kw_doc, "conj[oin]. Returns a new collection with the xs\n 'added'. (conj nil item) returns (item).\n (conj coll) returns coll. (conj) returns [].\n The 'addition' may happen at different 'places' depending\n on the concrete type.", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // conj! @@ -8192,7 +8195,7 @@ func LoadNS() { aotDirectFn115 = tmp1 var_clojure_DOT_core_cons = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_cons.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_x, sym_seq)), kw_doc, "Returns a new seq where x is the first element and seq is\n the rest.", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(23), kw_column, int(2), kw_end_DASH_line, int(29), kw_end_DASH_column, int(5), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(23), kw_column, int(2), kw_end_DASH_line, int(29), kw_end_DASH_column, int(5), kw_arglists, lang.NewList(lang.NewVector(sym_x, sym_seq)), kw_doc, "Returns a new seq where x is the first element and seq is\n the rest.", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // constantly @@ -8764,7 +8767,7 @@ func LoadNS() { aotDirectFn134 = tmp1 var_clojure_DOT_core_deref_DASH_future = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_deref_DASH_future.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(2304), kw_column, int(7), kw_end_DASH_line, int(2304), kw_end_DASH_column, int(28), kw_arglists, lang.NewList(lang.NewVector(sym_fut), lang.NewVector(sym_fut, sym_timeout_DASH_ms, sym_timeout_DASH_val)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(2304), kw_column, int(7), kw_end_DASH_line, int(2304), kw_end_DASH_column, int(28), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_fut), lang.NewVector(sym_fut, sym_timeout_DASH_ms, sym_timeout_DASH_val)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // derive @@ -10190,7 +10193,7 @@ func LoadNS() { aotDirectFn153 = tmp1 var_clojure_DOT_core_elide_DASH_top_DASH_frames = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_elide_DASH_top_DASH_frames.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(4851), kw_column, int(7), kw_end_DASH_line, int(4851), kw_end_DASH_column, int(32), kw_arglists, lang.NewList(lang.NewVector(sym_ex, sym_class_DASH_name)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4851), kw_column, int(7), kw_end_DASH_line, int(4851), kw_end_DASH_column, int(32), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_ex, sym_class_DASH_name)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // empty @@ -11748,7 +11751,7 @@ func LoadNS() { aotDirectFn174 = tmp1 var_clojure_DOT_core_ffirst = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_ffirst.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Same as (first (first x))", kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(100), kw_column, int(2), kw_end_DASH_line, int(104), kw_end_DASH_column, int(7), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(100), kw_column, int(2), kw_end_DASH_line, int(104), kw_end_DASH_column, int(7), kw_doc, "Same as (first (first x))", kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // file-seq @@ -11769,13 +11772,9 @@ func LoadNS() { tmp4 = lang.FnFunc1(func(p0 any) any { v5 := p0 _ = v5 - tmp6, _ := lang.FieldOrMethod(v5, "listFiles") - if reflect.TypeOf(tmp6).Kind() != reflect.Func { - panic(lang.NewIllegalArgumentError(fmt.Sprintf("listFiles is not a function"))) - } - tmp7 := lang.Apply0(tmp6) - tmp8 := aotDirectFn447(tmp7) - return tmp8 + tmp6 := v5.(interface{ ListFiles() []*filesystem9.File }).ListFiles() + tmp7 := aotDirectFn447(tmp6) + return tmp7 }) tmp5 := aotDirectFn522(tmp3, tmp4, v2) return tmp5 @@ -12039,7 +12038,7 @@ func LoadNS() { aotDirectFn177 = tmp1 var_clojure_DOT_core_filter_DASH_key = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_filter_DASH_key.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_static, true, kw_file, "clojure/core.glj", kw_line, int(4172), kw_column, int(7), kw_end_DASH_line, int(4174), kw_end_DASH_column, int(12), kw_arglists, lang.NewList(lang.NewVector(sym_keyfn, sym_pred, sym_amap)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4172), kw_column, int(7), kw_end_DASH_line, int(4174), kw_end_DASH_column, int(12), kw_private, true, kw_static, true, kw_arglists, lang.NewList(lang.NewVector(sym_keyfn, sym_pred, sym_amap)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // filterv @@ -12218,7 +12217,7 @@ func LoadNS() { aotDirectFn183 = tmp1 var_clojure_DOT_core_first = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_first.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_doc, "Returns the first item in the collection. Calls seq on its\n argument. If coll is nil, returns nil.", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(49), kw_column, int(2), kw_end_DASH_line, int(54), kw_end_DASH_column, int(6), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(49), kw_column, int(2), kw_end_DASH_line, int(54), kw_end_DASH_column, int(6), kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_doc, "Returns the first item in the collection. Calls seq on its\n argument. If coll is nil, returns nil.", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // float? @@ -12286,7 +12285,7 @@ func LoadNS() { aotDirectFn192 = tmp1 var_clojure_DOT_core_fnext = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_fnext.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Same as (first (next x))", kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(114), kw_column, int(2), kw_end_DASH_line, int(118), kw_end_DASH_column, int(6), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(114), kw_column, int(2), kw_end_DASH_line, int(118), kw_end_DASH_column, int(6), kw_doc, "Same as (first (next x))", kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // fnil @@ -12865,7 +12864,7 @@ func LoadNS() { tmp0 := sym_global_DASH_hierarchy var_clojure_DOT_core_global_DASH_hierarchy = ns.InternWithValue(tmp0, lang.NewMap(kw_parents, lang.NewMap(), kw_descendants, lang.NewMap(), kw_ancestors, lang.NewMap()), true) var_clojure_DOT_core_global_DASH_hierarchy.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(5565), kw_column, int(6), kw_end_DASH_line, int(5566), kw_end_DASH_column, int(21), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMap(kw_file, "clojure/core.glj", kw_line, int(5565), kw_column, int(6), kw_end_DASH_line, int(5566), kw_end_DASH_column, int(21), kw_private, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // group-by @@ -13202,7 +13201,7 @@ func LoadNS() { tmp1 = lang.FnFunc1(func(p0 any) any { v2 := p0 _ = v2 - tmp3 := aotDirectFn225(nil, v2) + tmp3 := lang.IsInstance[lang.Indexed](v2) return tmp3 }) aotDirectFn221 = tmp1 @@ -13253,7 +13252,7 @@ func LoadNS() { _ = v3 v4 := p1 _ = v4 - tmp5 := lang.Apply2(lang.HasType, v3, v4) + tmp5 := lang.HasType(v3, v4) return tmp5 }) v2 = tmp1 @@ -13262,7 +13261,7 @@ func LoadNS() { aotDirectFn225 = tmp1 var_clojure_DOT_core_instance_QMARK_ = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_instance_QMARK_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_c, sym_x)), kw_doc, "Evaluates x and tests if it is an instance of the type\n t. Returns true or false", kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(141), kw_column, int(2), kw_end_DASH_line, int(145), kw_end_DASH_column, int(10), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(141), kw_column, int(2), kw_end_DASH_line, int(145), kw_end_DASH_column, int(10), kw_arglists, lang.NewList(lang.NewVector(sym_c, sym_x)), kw_doc, "Evaluates x and tests if it is an instance of the type\n t. Returns true or false", kw_added, "1.0", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // int? @@ -13749,7 +13748,7 @@ func LoadNS() { aotDirectFn235 = tmp1 var_clojure_DOT_core_into1 = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_into1.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(3452), kw_column, int(7), kw_end_DASH_line, int(3452), kw_end_DASH_column, int(21), kw_arglists, lang.NewList(lang.NewVector(sym_to, sym_from)), kw_doc, "Returns a new coll consisting of to-coll with all of the items of\n from-coll conjoined.", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(3452), kw_column, int(7), kw_end_DASH_line, int(3452), kw_end_DASH_column, int(21), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_to, sym_from)), kw_doc, "Returns a new coll consisting of to-coll with all of the items of\n from-coll conjoined.", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // into-array @@ -14952,7 +14951,7 @@ func LoadNS() { aotDirectFn248 = tmp1 var_clojure_DOT_core_last = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_last.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_doc, "Return the last item in coll, in linear time", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(264), kw_column, int(2), kw_end_DASH_line, int(268), kw_end_DASH_column, int(5), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(264), kw_column, int(2), kw_end_DASH_line, int(268), kw_end_DASH_column, int(5), kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_doc, "Return the last item in coll, in linear time", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // libspec? @@ -15262,7 +15261,7 @@ func LoadNS() { tmp0 := sym_list var_clojure_DOT_core_list = ns.InternWithValue(tmp0, lang.NewList, true) var_clojure_DOT_core_list.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym__AMP_, sym_items)), kw_doc, "Creates a new list containing the items.", kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(17), kw_column, int(2), kw_end_DASH_line, int(20), kw_end_DASH_column, int(6), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(17), kw_column, int(2), kw_end_DASH_line, int(20), kw_end_DASH_column, int(6), kw_arglists, lang.NewList(lang.NewVector(sym__AMP_, sym_items)), kw_doc, "Creates a new list containing the items.", kw_added, "1.0", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // list? @@ -15398,7 +15397,7 @@ func LoadNS() { { // let // let binding "path" var tmp15 any - tmp16 := lang.Apply2(strings9.HasPrefix, v13, "/") + tmp16 := lang.Apply2(strings10.HasPrefix, v13, "/") if lang.IsTruthy(tmp16) { tmp15 = v13 } else { @@ -15442,7 +15441,7 @@ func LoadNS() { tmp38 := aotDirectFn346() _ = tmp38 }() - tmp39 := lang.Apply2(strings9.TrimPrefix, v21, "/") + tmp39 := lang.Apply2(strings10.TrimPrefix, v21, "/") tmp40, _ := lang.FieldOrMethod(runtime.RT, "Load") if reflect.TypeOf(tmp40).Kind() != reflect.Func { panic(lang.NewIllegalArgumentError(fmt.Sprintf("Load is not a function"))) @@ -15518,7 +15517,7 @@ func LoadNS() { { // let // let binding "path" var tmp25 any - tmp26 := lang.Apply2(strings9.HasPrefix, v23, "/") + tmp26 := lang.Apply2(strings10.HasPrefix, v23, "/") if lang.IsTruthy(tmp26) { tmp25 = v23 } else { @@ -15562,7 +15561,7 @@ func LoadNS() { tmp48 := aotDirectFn346() _ = tmp48 }() - tmp49 := lang.Apply2(strings9.TrimPrefix, v31, "/") + tmp49 := lang.Apply2(strings10.TrimPrefix, v31, "/") tmp50, _ := lang.FieldOrMethod(runtime.RT, "Load") if reflect.TypeOf(tmp50).Kind() != reflect.Func { panic(lang.NewIllegalArgumentError(fmt.Sprintf("Load is not a function"))) @@ -16231,7 +16230,7 @@ func LoadNS() { var v7 any = tmp6 _ = v7 // let binding "dimarray" - tmp8 := reflect.TypeOf(int64(0)) + tmp8 := reflect.TypeOf(int(0)) tmp9 := lang.NewClass(tmp8, "java.lang.Integer") tmp10, ok := lang.FieldOrMethod(tmp9, "TYPE") if !ok { @@ -16541,7 +16540,7 @@ func LoadNS() { aotDirectFn274 = tmp1 var_clojure_DOT_core_map_QMARK_ = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_map_QMARK_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_doc, "Return true if x implements IPersistentMap", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(169), kw_column, int(2), kw_end_DASH_line, int(173), kw_end_DASH_column, int(5), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(169), kw_column, int(2), kw_end_DASH_line, int(173), kw_end_DASH_column, int(5), kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_doc, "Return true if x implements IPersistentMap", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // max @@ -16881,7 +16880,7 @@ func LoadNS() { tmp0 := sym_max_DASH_mask_DASH_bits var_clojure_DOT_core_max_DASH_mask_DASH_bits = ns.InternWithValue(tmp0, int64(13), true) var_clojure_DOT_core_max_DASH_mask_DASH_bits.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(6658), kw_column, int(6), kw_end_DASH_line, int(6658), kw_end_DASH_column, int(28), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMap(kw_file, "clojure/core.glj", kw_line, int(6658), kw_column, int(6), kw_end_DASH_line, int(6658), kw_end_DASH_column, int(28), kw_private, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // max-switch-table-size @@ -16889,7 +16888,7 @@ func LoadNS() { tmp0 := sym_max_DASH_switch_DASH_table_DASH_size var_clojure_DOT_core_max_DASH_switch_DASH_table_DASH_size = ns.InternWithValue(tmp0, int64(8192), true) var_clojure_DOT_core_max_DASH_switch_DASH_table_DASH_size.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(6659), kw_column, int(6), kw_end_DASH_line, int(6659), kw_end_DASH_column, int(36), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMap(kw_file, "clojure/core.glj", kw_line, int(6659), kw_column, int(6), kw_end_DASH_line, int(6659), kw_end_DASH_column, int(36), kw_private, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // maybe-min-hash @@ -17619,7 +17618,7 @@ func LoadNS() { aotDirectFn285 = tmp1 var_clojure_DOT_core_meta = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_meta.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_obj)), kw_doc, "Returns the metadata of obj, returns nil if there is no metadata.", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(204), kw_column, int(2), kw_end_DASH_line, int(208), kw_end_DASH_column, int(5), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(204), kw_column, int(2), kw_end_DASH_line, int(208), kw_end_DASH_column, int(5), kw_arglists, lang.NewList(lang.NewVector(sym_obj)), kw_doc, "Returns the metadata of obj, returns nil if there is no metadata.", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // methods @@ -18303,7 +18302,7 @@ func LoadNS() { aotDirectFn294 = tmp1 var_clojure_DOT_core_nary_DASH_inline = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_nary_DASH_inline.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(950), kw_column, int(7), kw_end_DASH_line, int(950), kw_end_DASH_column, int(27), kw_arglists, lang.NewList(lang.NewVector(sym_op), lang.NewVector(sym_op, sym_unchecked_DASH_op)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(950), kw_column, int(7), kw_end_DASH_line, int(950), kw_end_DASH_column, int(27), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_op), lang.NewVector(sym_op, sym_unchecked_DASH_op)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // nat-int? @@ -18427,7 +18426,7 @@ func LoadNS() { var_clojure_DOT_core_next = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_next.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf((*lang.ISeq)(nil)).Elem() - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_tag, tmp2, kw_doc, "Returns a seq of the items after the first. Calls seq on its\n argument. If there are no more items, returns nil.", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(57), kw_column, int(2), kw_end_DASH_line, int(63), kw_end_DASH_column, int(5), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(57), kw_column, int(2), kw_end_DASH_line, int(63), kw_end_DASH_column, int(5), kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_tag, tmp2, kw_doc, "Returns a seq of the items after the first. Calls seq on its\n argument. If there are no more items, returns nil.", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // nfirst @@ -18449,7 +18448,7 @@ func LoadNS() { aotDirectFn300 = tmp1 var_clojure_DOT_core_nfirst = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_nfirst.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Same as (next (first x))", kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(107), kw_column, int(2), kw_end_DASH_line, int(111), kw_end_DASH_column, int(7), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(107), kw_column, int(2), kw_end_DASH_line, int(111), kw_end_DASH_column, int(7), kw_doc, "Same as (next (first x))", kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // nil? @@ -18501,7 +18500,7 @@ func LoadNS() { aotDirectFn302 = tmp1 var_clojure_DOT_core_nnext = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_nnext.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Same as (next (next x))", kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(121), kw_column, int(2), kw_end_DASH_line, int(125), kw_end_DASH_column, int(6), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(121), kw_column, int(2), kw_end_DASH_line, int(125), kw_end_DASH_column, int(6), kw_doc, "Same as (next (next x))", kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // normalize-slurp-opts @@ -18614,7 +18613,7 @@ func LoadNS() { var_clojure_DOT_core_not_DASH_any_QMARK_ = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_not_DASH_any_QMARK_.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf(false) - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_doc, "Returns false if (pred x) is logical true for any x in coll,\n else true.", kw_arglists, lang.NewList(lang.NewVector(sym_pred, sym_coll)), kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(2704), kw_column, int(2), kw_end_DASH_line, int(2709), kw_end_DASH_column, int(9), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(2704), kw_column, int(2), kw_end_DASH_line, int(2709), kw_end_DASH_column, int(9), kw_tag, tmp2, kw_doc, "Returns false if (pred x) is logical true for any x in coll,\n else true.", kw_arglists, lang.NewList(lang.NewVector(sym_pred, sym_coll)), kw_added, "1.0", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // not-empty @@ -18699,7 +18698,7 @@ func LoadNS() { var_clojure_DOT_core_not_DASH_every_QMARK_ = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_not_DASH_every_QMARK_.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf(false) - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_doc, "Returns false if (pred x) is logical true for every x in\n coll, else true.", kw_arglists, lang.NewList(lang.NewVector(sym_pred, sym_coll)), kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(2685), kw_column, int(2), kw_end_DASH_line, int(2690), kw_end_DASH_column, int(11), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(2685), kw_column, int(2), kw_end_DASH_line, int(2690), kw_end_DASH_column, int(11), kw_tag, tmp2, kw_doc, "Returns false if (pred x) is logical true for every x in\n coll, else true.", kw_arglists, lang.NewList(lang.NewVector(sym_pred, sym_coll)), kw_added, "1.0", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // ns @@ -19762,7 +19761,7 @@ func LoadNS() { var tmp5 any { // let // let binding "result__3647__auto__" - tmp6 := lang.Apply2(strconv10.ParseFloat, v2, int64(64)) + tmp6 := lang.Apply2(strconv11.ParseFloat, v2, int64(64)) var v7 any = tmp6 _ = v7 var tmp8 any @@ -19801,7 +19800,7 @@ func LoadNS() { var tmp5 any { // let // let binding "result__3646__auto__" - tmp6 := lang.Apply3(strconv10.ParseInt, v2, int64(10), int64(64)) + tmp6 := lang.Apply3(strconv11.ParseInt, v2, int64(10), int64(64)) var v7 any = tmp6 _ = v7 var tmp8 any @@ -19853,7 +19852,7 @@ func LoadNS() { var tmp7 any { // let // let binding "vec__686" - tmp8 := lang.Apply1(uuid11.Parse, v2) + tmp8 := lang.Apply1(uuid12.Parse, v2) var v9 any = tmp8 _ = v9 // let binding "uuid" @@ -21497,7 +21496,7 @@ func LoadNS() { aotDirectFn356 = tmp1 var_clojure_DOT_core_preserving_DASH_reduced = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_preserving_DASH_reduced.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(7701), kw_column, int(7), kw_end_DASH_line, int(7701), kw_end_DASH_column, int(34), kw_arglists, lang.NewList(lang.NewVector(sym_rf)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(7701), kw_column, int(7), kw_end_DASH_line, int(7701), kw_end_DASH_column, int(34), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_rf)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // print-ctor @@ -21535,7 +21534,7 @@ func LoadNS() { tmp0 := sym_print_DASH_initialized var_clojure_DOT_core_print_DASH_initialized = ns.InternWithValue(tmp0, true, true) var_clojure_DOT_core_print_DASH_initialized.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_private, true, kw_file, "clojure/core_print.glj", kw_line, int(520), kw_column, int(6), kw_end_DASH_line, int(520), kw_end_DASH_column, int(39), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMap(kw_file, "clojure/core_print.glj", kw_line, int(520), kw_column, int(6), kw_end_DASH_line, int(520), kw_end_DASH_column, int(39), kw_private, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // print-map @@ -22379,7 +22378,7 @@ func LoadNS() { tmp0 := sym_rand var tmp1 lang.ArityFn aotDirectFn380Arity0 = lang.FnFunc0(func() any { - tmp2 := rand14.Float64() + tmp2 := rand15.Float64() return tmp2 }) aotDirectFn380Arity1 = lang.FnFunc1(func(p0 any) any { @@ -22496,7 +22495,7 @@ func LoadNS() { var tmp2 any { // let // let binding "result" - tmp3 := lang.Apply0(uuid11.NewRandom) + tmp3 := lang.Apply0(uuid12.NewRandom) var v4 any = tmp3 _ = v4 // let binding "v" @@ -22770,7 +22769,7 @@ func LoadNS() { v2 := p0 _ = v2 var tmp3 any - tmp4 := lang.IsInstance[*regexp13.Regexp](v2) + tmp4 := lang.IsInstance[*regexp14.Regexp](v2) if lang.IsTruthy(tmp4) { tmp3 = v2 } else { @@ -22782,7 +22781,7 @@ func LoadNS() { aotDirectFn393 = tmp1 var_clojure_DOT_core_re_DASH_pattern = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_re_DASH_pattern.SetMetaLazy(func() lang.IPersistentMap { - tmp2 := reflect.TypeOf((*regexp13.Regexp)(nil)) + tmp2 := reflect.TypeOf((*regexp14.Regexp)(nil)) return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4913), kw_column, int(7), kw_end_DASH_line, int(4913), kw_end_DASH_column, int(16), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Returns an instance of java.util.regex.Pattern, for use, e.g. in\n re-matcher.", kw_tag, tmp2, kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } @@ -23020,7 +23019,7 @@ func LoadNS() { aotDirectFn404 = tmp1 var_clojure_DOT_core_reduce1 = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_reduce1.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(925), kw_column, int(7), kw_end_DASH_line, int(926), kw_end_DASH_column, int(9), kw_arglists, lang.NewList(lang.NewVector(sym_f, sym_coll), lang.NewVector(sym_f, sym_val, sym_coll)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(925), kw_column, int(7), kw_end_DASH_line, int(926), kw_end_DASH_column, int(9), kw_static, true, kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_f, sym_coll), lang.NewVector(sym_f, sym_val, sym_coll)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // reduced @@ -23379,12 +23378,8 @@ func LoadNS() { _ = v2 v3 := p1 _ = v3 - tmp4, _ := lang.FieldOrMethod(v2, "set") - if reflect.TypeOf(tmp4).Kind() != reflect.Func { - panic(lang.NewIllegalArgumentError(fmt.Sprintf("set is not a function"))) - } - tmp5 := lang.Apply1(tmp4, v3) - return tmp5 + tmp4 := v2.(interface{ Set(any) any }).Set(v3) + return tmp4 }) aotDirectFn412 = tmp1 var_clojure_DOT_core_ref_DASH_set = ns.InternWithValue(tmp0, tmp1, true) @@ -24394,7 +24389,7 @@ func LoadNS() { var_clojure_DOT_core_rest = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_rest.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf((*lang.ISeq)(nil)).Elem() - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_tag, tmp2, kw_doc, "Returns a possibly empty seq of the items after the first. Calls seq on its\n argument.", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(66), kw_column, int(2), kw_end_DASH_line, int(72), kw_end_DASH_column, int(5), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(66), kw_column, int(2), kw_end_DASH_line, int(72), kw_end_DASH_column, int(5), kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_tag, tmp2, kw_doc, "Returns a possibly empty seq of the items after the first. Calls seq on its\n argument.", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // restart-agent @@ -24491,7 +24486,7 @@ func LoadNS() { tmp4 := aotDirectFn438(v2) var v5 any = tmp4 _ = v5 - tmp6 := lang.Apply2(strings9.LastIndex, v5, "/") + tmp6 := lang.Apply2(strings10.LastIndex, v5, "/") tmp7 := aotDirectFn499Arity3(v5, int64(0), tmp6) tmp3 = tmp7 } // end let @@ -24511,8 +24506,8 @@ func LoadNS() { v2 := p0 _ = v2 tmp3 := aotDirectFn292(v2) - tmp4 := lang.Apply3(strings9.ReplaceAll, tmp3, "-", "_") - tmp5 := lang.Apply3(strings9.ReplaceAll, tmp4, ".", "/") + tmp4 := lang.Apply3(strings10.ReplaceAll, tmp3, "-", "_") + tmp5 := lang.Apply3(strings10.ReplaceAll, tmp4, ".", "/") tmp6 := aotDirectFn490.Invoke2(lang.NewChar(47), tmp5) return tmp6 }) @@ -24590,7 +24585,7 @@ func LoadNS() { aotDirectFn442 = tmp1 var_clojure_DOT_core_second = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_second.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Same as (first (next x))", kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(93), kw_column, int(2), kw_end_DASH_line, int(97), kw_end_DASH_column, int(7), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(93), kw_column, int(2), kw_end_DASH_line, int(97), kw_end_DASH_column, int(7), kw_doc, "Same as (first (next x))", kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // select-keys @@ -24724,7 +24719,7 @@ func LoadNS() { var_clojure_DOT_core_seq = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_seq.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf((*lang.ISeq)(nil)).Elem() - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_doc, "Returns a seq on the collection. If the collection is\n empty, returns nil. (seq nil) returns nil. seq also works on\n Strings, native Java arrays (of reference types) and any objects\n that implement Iterable. Note that seqs cache values, thus seq\n should not be used on any Iterable whose iterator repeatedly\n returns the same mutable object.", kw_tag, tmp2, kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(128), kw_column, int(2), kw_end_DASH_line, int(138), kw_end_DASH_column, int(4), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(128), kw_column, int(2), kw_end_DASH_line, int(138), kw_end_DASH_column, int(4), kw_arglists, lang.NewList(lang.NewVector(sym_coll)), kw_doc, "Returns a seq on the collection. If the collection is\n empty, returns nil. (seq nil) returns nil. seq also works on\n Strings, native Java arrays (of reference types) and any objects\n that implement Iterable. Note that seqs cache values, thus seq\n should not be used on any Iterable whose iterator repeatedly\n returns the same mutable object.", kw_tag, tmp2, kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // seq-to-map-for-destructuring @@ -24778,7 +24773,7 @@ func LoadNS() { aotDirectFn449 = tmp1 var_clojure_DOT_core_seq_QMARK_ = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_seq_QMARK_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_doc, "Return true if x implements ISeq", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(148), kw_column, int(2), kw_end_DASH_line, int(152), kw_end_DASH_column, int(5), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(148), kw_column, int(2), kw_end_DASH_line, int(152), kw_end_DASH_column, int(5), kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_doc, "Return true if x implements ISeq", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // seqable? @@ -25430,7 +25425,7 @@ func LoadNS() { aotDirectFn462 = tmp1 var_clojure_DOT_core_setup_DASH_reference = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_setup_DASH_reference.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(2051), kw_column, int(7), kw_end_DASH_line, int(2052), kw_end_DASH_column, int(17), kw_arglists, lang.NewList(lang.NewVector(sym_r, sym_options)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(2051), kw_column, int(7), kw_end_DASH_line, int(2052), kw_end_DASH_column, int(17), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_r, sym_options)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // shift-mask @@ -25714,7 +25709,7 @@ func LoadNS() { if lang.IsTruthy(tmp16) { var tmp17 any tmp18 := v14.(interface{ Name() string }).Name() - tmp19 := lang.Apply2(strings9.Index, tmp18, ".") + tmp19 := lang.Apply2(strings10.Index, tmp18, ".") tmp20 := lang.Equiv(tmp19, int64(-1)) if lang.IsTruthy(tmp20) { var tmp21 any @@ -25815,7 +25810,7 @@ func LoadNS() { aotDirectFn469 = tmp1 var_clojure_DOT_core_sigs = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_sigs.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(225), kw_column, int(2), kw_end_DASH_line, int(226), kw_end_DASH_column, int(5), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMap(kw_file, "clojure/core.glj", kw_line, int(225), kw_column, int(2), kw_end_DASH_line, int(226), kw_end_DASH_column, int(5), kw_private, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // simple-ident? @@ -27150,7 +27145,7 @@ func LoadNS() { } return tmp7 }) - tmp5 := reflect.TypeOf((*strings9.Builder)(nil)).Elem() + tmp5 := reflect.TypeOf((*strings10.Builder)(nil)).Elem() tmp6 := lang.NewHostInstance(tmp5) tmp7 := aotDirectFn115(v2, v3) tmp8 := lang.Apply2(tmp4, tmp6, tmp7) @@ -27396,7 +27391,7 @@ func LoadNS() { aotDirectFn495 = tmp1 var_clojure_DOT_core_string_QMARK_ = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_string_QMARK_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_doc, "Return true if x is a String", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(162), kw_column, int(2), kw_end_DASH_line, int(166), kw_end_DASH_column, int(8), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(162), kw_column, int(2), kw_end_DASH_line, int(166), kw_end_DASH_column, int(8), kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_doc, "Return true if x is a String", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // strip-ns @@ -27767,7 +27762,8 @@ func LoadNS() { tmp0 := sym_system_DASH_newline var_clojure_DOT_core_system_DASH_newline = ns.InternWithValue(tmp0, "\n", true) var_clojure_DOT_core_system_DASH_newline.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(3752), kw_column, int(6), kw_end_DASH_line, int(3752), kw_end_DASH_column, int(40), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + tmp1 := reflect.TypeOf("") + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(3752), kw_column, int(6), kw_end_DASH_line, int(3752), kw_end_DASH_column, int(40), kw_tag, tmp1, kw_private, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // tagged-literal @@ -27799,7 +27795,7 @@ func LoadNS() { tmp1 = lang.FnFunc1(func(p0 any) any { v2 := p0 _ = v2 - tmp3 := aotDirectFn225(nil, v2) + tmp3 := lang.IsInstance[*lang.TaggedLiteral](v2) return tmp3 }) aotDirectFn508 = tmp1 @@ -28221,7 +28217,7 @@ func LoadNS() { tmp1 := lang.NewAtom(lang.NewSet()) var_clojure_DOT_core_tapset = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_tapset.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(7945), kw_column, int(10), kw_end_DASH_line, int(7945), kw_end_DASH_column, int(25), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMap(kw_file, "clojure/core.glj", kw_line, int(7945), kw_column, int(10), kw_end_DASH_line, int(7945), kw_end_DASH_column, int(25), kw_private, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // test @@ -28779,12 +28775,8 @@ func LoadNS() { _ = v2 v3 := p1 _ = v3 - tmp4, _ := lang.FieldOrMethod(lang.Numbers, "unchecked_int_add") - if reflect.TypeOf(tmp4).Kind() != reflect.Func { - panic(lang.NewIllegalArgumentError(fmt.Sprintf("unchecked_int_add is not a function"))) - } - tmp5 := lang.Apply2(tmp4, v2, v3) - return tmp5 + tmp4 := lang.Numbers.Unchecked_int_add(v2, v3) + return tmp4 }) aotDirectFn526 = tmp1 var_clojure_DOT_core_unchecked_DASH_add_DASH_int = ns.InternWithValue(tmp0, tmp1, true) @@ -28962,12 +28954,8 @@ func LoadNS() { tmp1 = lang.FnFunc1(func(p0 any) any { v2 := p0 _ = v2 - tmp3, _ := lang.FieldOrMethod(lang.Numbers, "unchecked_int_dec") - if reflect.TypeOf(tmp3).Kind() != reflect.Func { - panic(lang.NewIllegalArgumentError(fmt.Sprintf("unchecked_int_dec is not a function"))) - } - tmp4 := lang.Apply1(tmp3, v2) - return tmp4 + tmp3 := lang.Numbers.Unchecked_int_dec(v2) + return tmp3 }) aotDirectFn530 = tmp1 var_clojure_DOT_core_unchecked_DASH_dec_DASH_int = ns.InternWithValue(tmp0, tmp1, true) @@ -29188,12 +29176,8 @@ func LoadNS() { tmp1 = lang.FnFunc1(func(p0 any) any { v2 := p0 _ = v2 - tmp3, _ := lang.FieldOrMethod(lang.Numbers, "unchecked_int_inc") - if reflect.TypeOf(tmp3).Kind() != reflect.Func { - panic(lang.NewIllegalArgumentError(fmt.Sprintf("unchecked_int_inc is not a function"))) - } - tmp4 := lang.Apply1(tmp3, v2) - return tmp4 + tmp3 := lang.Numbers.Unchecked_int_inc(v2) + return tmp3 }) aotDirectFn535 = tmp1 var_clojure_DOT_core_unchecked_DASH_inc_DASH_int = ns.InternWithValue(tmp0, tmp1, true) @@ -29376,12 +29360,8 @@ func LoadNS() { _ = v2 v3 := p1 _ = v3 - tmp4, _ := lang.FieldOrMethod(lang.Numbers, "unchecked_int_multiply") - if reflect.TypeOf(tmp4).Kind() != reflect.Func { - panic(lang.NewIllegalArgumentError(fmt.Sprintf("unchecked_int_multiply is not a function"))) - } - tmp5 := lang.Apply2(tmp4, v2, v3) - return tmp5 + tmp4 := lang.Numbers.Unchecked_int_multiply(v2, v3) + return tmp4 }) aotDirectFn539 = tmp1 var_clojure_DOT_core_unchecked_DASH_multiply_DASH_int = ns.InternWithValue(tmp0, tmp1, true) @@ -29466,12 +29446,8 @@ func LoadNS() { tmp1 = lang.FnFunc1(func(p0 any) any { v2 := p0 _ = v2 - tmp3, _ := lang.FieldOrMethod(lang.Numbers, "unchecked_int_negate") - if reflect.TypeOf(tmp3).Kind() != reflect.Func { - panic(lang.NewIllegalArgumentError(fmt.Sprintf("unchecked_int_negate is not a function"))) - } - tmp4 := lang.Apply1(tmp3, v2) - return tmp4 + tmp3 := lang.Numbers.Unchecked_int_negate(v2) + return tmp3 }) aotDirectFn541 = tmp1 var_clojure_DOT_core_unchecked_DASH_negate_DASH_int = ns.InternWithValue(tmp0, tmp1, true) @@ -29513,12 +29489,8 @@ func LoadNS() { _ = v2 v3 := p1 _ = v3 - tmp4, _ := lang.FieldOrMethod(lang.Numbers, "unchecked_int_remainder") - if reflect.TypeOf(tmp4).Kind() != reflect.Func { - panic(lang.NewIllegalArgumentError(fmt.Sprintf("unchecked_int_remainder is not a function"))) - } - tmp5 := lang.Apply2(tmp4, v2, v3) - return tmp5 + tmp4 := lang.Numbers.Unchecked_int_remainder(v2, v3) + return tmp4 }) aotDirectFn542 = tmp1 var_clojure_DOT_core_unchecked_DASH_remainder_DASH_int = ns.InternWithValue(tmp0, tmp1, true) @@ -29664,12 +29636,8 @@ func LoadNS() { _ = v2 v3 := p1 _ = v3 - tmp4, _ := lang.FieldOrMethod(lang.Numbers, "unchecked_int_subtract") - if reflect.TypeOf(tmp4).Kind() != reflect.Func { - panic(lang.NewIllegalArgumentError(fmt.Sprintf("unchecked_int_subtract is not a function"))) - } - tmp5 := lang.Apply2(tmp4, v2, v3) - return tmp5 + tmp4 := lang.Numbers.Unchecked_int_subtract(v2, v3) + return tmp4 }) aotDirectFn545 = tmp1 var_clojure_DOT_core_unchecked_DASH_subtract_DASH_int = ns.InternWithValue(tmp0, tmp1, true) @@ -30192,7 +30160,7 @@ func LoadNS() { tmp1 = lang.FnFunc1(func(p0 any) any { v2 := p0 _ = v2 - tmp3 := lang.IsInstance[url15.URL](v2) + tmp3 := lang.IsInstance[url16.URL](v2) return tmp3 }) aotDirectFn553 = tmp1 @@ -30208,7 +30176,7 @@ func LoadNS() { tmp1 = lang.FnFunc1(func(p0 any) any { v2 := p0 _ = v2 - tmp3 := lang.IsInstance[uuid11.UUID](v2) + tmp3 := lang.Apply1(uuid17.IsUUID, v2) return tmp3 }) aotDirectFn555 = tmp1 @@ -30495,7 +30463,7 @@ func LoadNS() { aotDirectFn564 = tmp1 var_clojure_DOT_core_vector_QMARK_ = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_vector_QMARK_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_doc, "Return true if x implements IPersistentVector", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(176), kw_column, int(2), kw_end_DASH_line, int(180), kw_end_DASH_column, int(8), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(176), kw_column, int(2), kw_end_DASH_line, int(180), kw_end_DASH_column, int(8), kw_arglists, lang.NewList(lang.NewVector(sym_x)), kw_doc, "Return true if x implements IPersistentVector", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // volatile! @@ -31398,7 +31366,7 @@ func LoadNS() { aotDirectFn569 = tmp1 var_clojure_DOT_core_with_DASH_meta = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_with_DASH_meta.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_arglists, lang.NewList(lang.NewVector(sym_obj, sym_m)), kw_doc, "Returns an object of the same type and value as obj, with\n map m as its metadata.", kw_added, "1.0", kw_static, true, kw_file, "clojure/core.glj", kw_line, int(213), kw_column, int(2), kw_end_DASH_line, int(218), kw_end_DASH_column, int(10), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(213), kw_column, int(2), kw_end_DASH_line, int(218), kw_end_DASH_column, int(10), kw_arglists, lang.NewList(lang.NewVector(sym_obj, sym_m)), kw_doc, "Returns an object of the same type and value as obj, with\n map m as its metadata.", kw_added, "1.0", kw_static, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // with-open @@ -35341,7 +35309,7 @@ func LoadNS() { ) var_clojure_DOT_core_assert_DASH_args = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_assert_DASH_args.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(1838), kw_column, int(11), kw_end_DASH_line, int(1838), kw_end_DASH_column, int(38), kw_arglists, lang.NewList(lang.NewVector(sym__AMP_, sym_pairs)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core), kw_macro, true) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(1838), kw_column, int(11), kw_end_DASH_line, int(1838), kw_end_DASH_column, int(38), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym__AMP_, sym_pairs)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core), kw_macro, true) }) } // binding @@ -37471,7 +37439,7 @@ func LoadNS() { aotDirectFn91 = tmp1 var_clojure_DOT_core_check_DASH_valid_DASH_options = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_check_DASH_valid_DASH_options.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(1717), kw_column, int(7), kw_end_DASH_line, int(1717), kw_end_DASH_column, int(35), kw_arglists, lang.NewList(lang.NewVector(sym_options, sym__AMP_, sym_valid_DASH_keys)), kw_doc, "Throws an exception if the given option map contains keys not listed\n as valid, else returns nil.", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(1717), kw_column, int(7), kw_end_DASH_line, int(1717), kw_end_DASH_column, int(35), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_options, sym__AMP_, sym_valid_DASH_keys)), kw_doc, "Throws an exception if the given option map contains keys not listed\n as valid, else returns nil.", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // comp @@ -38490,7 +38458,7 @@ func LoadNS() { }) var_clojure_DOT_core_def_DASH_aset = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_def_DASH_aset.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(3992), kw_column, int(3), kw_end_DASH_line, int(3993), kw_end_DASH_column, int(10), kw_arglists, lang.NewList(lang.NewVector(sym_name, sym_method, sym_coerce)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core), kw_macro, true) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(3992), kw_column, int(3), kw_end_DASH_line, int(3993), kw_end_DASH_column, int(10), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_name, sym_method, sym_coerce)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core), kw_macro, true) }) } // definline @@ -38843,7 +38811,7 @@ func LoadNS() { ) var_clojure_DOT_core_defmacro = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_defmacro.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Like defn, but the resulting function name is declared as a\n macro and will be used as a macro by the compiler when it is\n called.", kw_arglists, lang.NewList(lang.NewVector(sym_name, sym_doc_DASH_string_QMARK_, sym_attr_DASH_map_QMARK_, lang.NewVector(sym_params_STAR_), sym_body), lang.NewVector(sym_name, sym_doc_DASH_string_QMARK_, sym_attr_DASH_map_QMARK_, lang.NewList(lang.NewVector(sym_params_STAR_), sym_body), sym__PLUS_, sym_attr_DASH_map_QMARK_)), kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(447), kw_column, int(2), kw_end_DASH_line, int(453), kw_end_DASH_column, int(9), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core), kw_macro, true) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(447), kw_column, int(2), kw_end_DASH_line, int(453), kw_end_DASH_column, int(9), kw_doc, "Like defn, but the resulting function name is declared as a\n macro and will be used as a macro by the compiler when it is\n called.", kw_arglists, lang.NewList(lang.NewVector(sym_name, sym_doc_DASH_string_QMARK_, sym_attr_DASH_map_QMARK_, lang.NewVector(sym_params_STAR_), sym_body), lang.NewVector(sym_name, sym_doc_DASH_string_QMARK_, sym_attr_DASH_map_QMARK_, lang.NewList(lang.NewVector(sym_params_STAR_), sym_body), sym__PLUS_, sym_attr_DASH_map_QMARK_)), kw_added, "1.0", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core), kw_macro, true) }) } // defmethod @@ -39322,7 +39290,7 @@ func LoadNS() { } var_clojure_DOT_core_defn = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_defn.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Same as (def name (fn [params* ] exprs*)) or (def\n name (fn ([params* ] exprs*)+)) with any doc-string or attrs added\n to the var metadata. prepost-map defines a map with optional keys\n :pre and :post that contain collections of pre or post conditions.", kw_arglists, lang.NewList(lang.NewVector(sym_name, sym_doc_DASH_string_QMARK_, sym_attr_DASH_map_QMARK_, lang.NewVector(sym_params_STAR_), sym_prepost_DASH_map_QMARK_, sym_body), lang.NewVector(sym_name, sym_doc_DASH_string_QMARK_, sym_attr_DASH_map_QMARK_, lang.NewList(lang.NewVector(sym_params_STAR_), sym_prepost_DASH_map_QMARK_, sym_body), sym__PLUS_, sym_attr_DASH_map_QMARK_)), kw_added, "1.0", kw_file, "clojure/core.glj", kw_line, int(286), kw_column, int(2), kw_end_DASH_line, int(293), kw_end_DASH_column, int(5), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core), kw_macro, true) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(286), kw_column, int(2), kw_end_DASH_line, int(293), kw_end_DASH_column, int(5), kw_doc, "Same as (def name (fn [params* ] exprs*)) or (def\n name (fn ([params* ] exprs*)+)) with any doc-string or attrs added\n to the var metadata. prepost-map defines a map with optional keys\n :pre and :post that contain collections of pre or post conditions.", kw_arglists, lang.NewList(lang.NewVector(sym_name, sym_doc_DASH_string_QMARK_, sym_attr_DASH_map_QMARK_, lang.NewVector(sym_params_STAR_), sym_prepost_DASH_map_QMARK_, sym_body), lang.NewVector(sym_name, sym_doc_DASH_string_QMARK_, sym_attr_DASH_map_QMARK_, lang.NewList(lang.NewVector(sym_params_STAR_), sym_prepost_DASH_map_QMARK_, sym_body), sym__PLUS_, sym_attr_DASH_map_QMARK_)), kw_added, "1.0", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core), kw_macro, true) }) } // defonce @@ -44166,128 +44134,130 @@ func LoadNS() { tmp26 := runtime.RT.Get(v16, kw_initk, nil) var v27 any = tmp26 _ = v27 - tmp28 := checkDerefVar(var_clojure_DOT_core_seq) - tmp29 := lang.NewVector(nil) - var tmp30 lang.FnFunc1 + tmp28 := reflect.TypeOf((*lang.Seqable)(nil)).Elem() + tmp29 := lang.NewClass(tmp28, "clojure.lang.Seqable") + tmp30 := checkDerefVar(var_clojure_DOT_core_seq) + tmp31 := lang.NewVector(nil) + var tmp32 lang.FnFunc1 { // function next - var v31 lang.FnFunc1 - tmp30 = lang.FnFunc1(func(p0 any) any { - v32 := p0 - _ = v32 - var tmp33 any - tmp34 := lang.Apply1(v19, v32) - if lang.IsTruthy(tmp34) { - tmp35 := lang.Apply1(v22, v32) - var tmp36 any + var v33 lang.FnFunc1 + tmp32 = lang.FnFunc1(func(p0 any) any { + v34 := p0 + _ = v34 + var tmp35 any + tmp36 := lang.Apply1(v19, v34) + if lang.IsTruthy(tmp36) { + tmp37 := lang.Apply1(v22, v34) + var tmp38 any { // let // let binding "temp__0__auto__" - tmp37 := lang.Apply1(v25, v32) - var v38 any = tmp37 - _ = v38 - var tmp39 any - tmp40 := lang.Identical(v38, nil) - if lang.IsTruthy(tmp40) { + tmp39 := lang.Apply1(v25, v34) + var v40 any = tmp39 + _ = v40 + var tmp41 any + tmp42 := lang.Identical(v40, nil) + if lang.IsTruthy(tmp42) { } else { - var tmp41 any + var tmp43 any { // let // let binding "k" - var v42 any = v38 - _ = v42 - var tmp43 lang.FnFunc0 - tmp43 = lang.FnFunc0(func() any { - tmp44 := lang.Apply1(v2, v42) - tmp45 := lang.Apply1(v31, tmp44) - return tmp45 + var v44 any = v40 + _ = v44 + var tmp45 lang.FnFunc0 + tmp45 = lang.FnFunc0(func() any { + tmp46 := lang.Apply1(v2, v44) + tmp47 := lang.Apply1(v33, tmp46) + return tmp47 }) - tmp44 := lang.Apply1(lang.NewLazySeq, tmp43) - tmp41 = tmp44 + tmp46 := lang.Apply1(lang.NewLazySeq, tmp45) + tmp43 = tmp46 } // end let - tmp39 = tmp41 + tmp41 = tmp43 } - tmp36 = tmp39 + tmp38 = tmp41 } // end let - tmp37 := aotDirectFn115(tmp35, tmp36) - tmp33 = tmp37 + tmp39 := aotDirectFn115(tmp37, tmp38) + tmp35 = tmp39 } else { } - return tmp33 + return tmp35 }) - v31 = tmp30 - _ = v31 + v33 = tmp32 + _ = v33 } - tmp31 := lang.Apply1(v2, v27) - tmp32 := lang.Apply1(tmp30, tmp31) - tmp33 := lang.Apply2(tmp28, tmp29, tmp32) - tmp34 := reflect.TypeOf((*lang.IReduceInit)(nil)).Elem() - tmp35 := lang.NewVector(nil, nil, nil) - var tmp36 any + tmp33 := lang.Apply1(v2, v27) + tmp34 := lang.Apply1(tmp32, tmp33) + tmp35 := lang.Apply2(tmp30, tmp31, tmp34) + tmp36 := reflect.TypeOf((*lang.IReduceInit)(nil)).Elem() + tmp37 := lang.NewVector(nil, nil, nil) + var tmp38 any { // let // let binding "acc" - var v37 any = nil - _ = v37 - // let binding "ret" - tmp38 := lang.Apply1(v2, v27) - var v39 any = tmp38 + var v39 any = nil _ = v39 + // let binding "ret" + tmp40 := lang.Apply1(v2, v27) + var v41 any = tmp40 + _ = v41 for { - var tmp40 any - tmp41 := lang.Apply1(v19, v39) - if lang.IsTruthy(tmp41) { - var tmp42 any + var tmp42 any + tmp43 := lang.Apply1(v19, v41) + if lang.IsTruthy(tmp43) { + var tmp44 any { // let // let binding "acc" - tmp43 := lang.Apply1(v22, v39) - tmp44 := lang.Apply2(nil, v37, tmp43) - var v45 any = tmp44 - _ = v45 - var tmp46 any - tmp47 := lang.IsReduced(v45) - if lang.IsTruthy(tmp47) { - tmp48 := aotDirectFn132Arity1(v45) - tmp46 = tmp48 + tmp45 := lang.Apply1(v22, v41) + tmp46 := lang.Apply2(nil, v39, tmp45) + var v47 any = tmp46 + _ = v47 + var tmp48 any + tmp49 := lang.IsReduced(v47) + if lang.IsTruthy(tmp49) { + tmp50 := aotDirectFn132Arity1(v47) + tmp48 = tmp50 } else { - var tmp49 any + var tmp51 any { // let // let binding "temp__0__auto__" - tmp50 := lang.Apply1(v25, v39) - var v51 any = tmp50 - _ = v51 - var tmp52 any - tmp53 := lang.Identical(v51, nil) - if lang.IsTruthy(tmp53) { - tmp52 = v45 + tmp52 := lang.Apply1(v25, v41) + var v53 any = tmp52 + _ = v53 + var tmp54 any + tmp55 := lang.Identical(v53, nil) + if lang.IsTruthy(tmp55) { + tmp54 = v47 } else { - var tmp54 any + var tmp56 any { // let // let binding "k" - var v55 any = v51 - _ = v55 - var tmp56 any = v45 - tmp58 := lang.Apply1(v2, v55) - var tmp57 any = tmp58 - v37 = tmp56 - v39 = tmp57 + var v57 any = v53 + _ = v57 + var tmp58 any = v47 + tmp60 := lang.Apply1(v2, v57) + var tmp59 any = tmp60 + v39 = tmp58 + v41 = tmp59 continue } // end let - tmp52 = tmp54 + tmp54 = tmp56 } - tmp49 = tmp52 + tmp51 = tmp54 } // end let - tmp46 = tmp49 + tmp48 = tmp51 } - tmp42 = tmp46 + tmp44 = tmp48 } // end let - tmp40 = tmp42 + tmp42 = tmp44 } else { - tmp40 = v37 + tmp42 = v39 } - tmp36 = tmp40 + tmp38 = tmp42 break } } // end let - tmp37 := aotDirectFn402Arity2(tmp35, tmp36) - tmp38 := lang.Apply4(nil, nil, tmp33, tmp34, tmp37) - tmp4 = tmp38 + tmp39 := aotDirectFn402Arity2(tmp37, tmp38) + tmp40 := lang.Apply4(nil, tmp29, tmp35, tmp36, tmp39) + tmp4 = tmp40 } // end let return tmp4 }), @@ -44502,7 +44472,7 @@ func LoadNS() { if lang.IsTruthy(v6) { tmp8 := aotDirectFn292(v3) tmp9 := runtime.RT.IntCast(lang.NewChar(46)) - tmp10 := lang.Apply2(strings9.Index, tmp8, tmp9) + tmp10 := lang.Apply2(strings10.Index, tmp8, tmp9) tmp11 := lang.Numbers.IsPos(tmp10) tmp7 = tmp11 } else { @@ -46366,7 +46336,7 @@ func LoadNS() { aotDirectFn279 = tmp1 var_clojure_DOT_core_maybe_DASH_destructured = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_core_maybe_DASH_destructured.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "clojure/core.glj", kw_line, int(4571), kw_column, int(7), kw_end_DASH_line, int(4572), kw_end_DASH_column, int(20), kw_arglists, lang.NewList(lang.NewVector(sym_params, sym_body)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) + return lang.NewMapUniqueKeys(kw_file, "clojure/core.glj", kw_line, int(4571), kw_column, int(7), kw_end_DASH_line, int(4572), kw_end_DASH_column, int(20), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_params, sym_body)), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_core)) }) } // memfn @@ -46790,7 +46760,7 @@ func LoadNS() { var tmp4 any { // let // let binding "n" - tmp5 := lang.Apply0(runtime12.NumCPU) + tmp5 := lang.Apply0(runtime13.NumCPU) tmp6 := lang.Numbers.Add(int64(2), tmp5) var v7 any = tmp6 _ = v7 @@ -48397,7 +48367,7 @@ func LoadNS() { var tmp3 any { // let // let binding "s__0__auto__" - tmp4 := reflect.TypeOf((*strings9.Builder)(nil)).Elem() + tmp4 := reflect.TypeOf((*strings10.Builder)(nil)).Elem() tmp5 := lang.NewHostInstance(tmp4) var v6 any = tmp5 _ = v6 @@ -48491,7 +48461,7 @@ func LoadNS() { var tmp3 any { // let // let binding "s__0__auto__" - tmp4 := reflect.TypeOf((*strings9.Builder)(nil)).Elem() + tmp4 := reflect.TypeOf((*strings10.Builder)(nil)).Elem() tmp5 := lang.NewHostInstance(tmp4) var v6 any = tmp5 _ = v6 @@ -48579,7 +48549,7 @@ func LoadNS() { var tmp3 any { // let // let binding "s__0__auto__" - tmp4 := reflect.TypeOf((*strings9.Builder)(nil)).Elem() + tmp4 := reflect.TypeOf((*strings10.Builder)(nil)).Elem() tmp5 := lang.NewHostInstance(tmp4) var v6 any = tmp5 _ = v6 @@ -48673,7 +48643,7 @@ func LoadNS() { var tmp3 any { // let // let binding "s__0__auto__" - tmp4 := reflect.TypeOf((*strings9.Builder)(nil)).Elem() + tmp4 := reflect.TypeOf((*strings10.Builder)(nil)).Elem() tmp5 := lang.NewHostInstance(tmp4) var v6 any = tmp5 _ = v6 @@ -49219,7 +49189,7 @@ func LoadNS() { return tmp43 }) tmp1.AddMethod(tmp37, tmp38) - tmp39 := reflect.TypeOf((*regexp13.Regexp)(nil)) + tmp39 := reflect.TypeOf((*regexp14.Regexp)(nil)) var tmp40 lang.FnFunc2 tmp40 = lang.FnFunc2(func(p0, p1 any) any { v41 := p0 @@ -50397,7 +50367,7 @@ func LoadNS() { return tmp37 }) tmp1.AddMethod(tmp32, tmp33) - tmp34 := reflect.TypeOf((*regexp13.Regexp)(nil)) + tmp34 := reflect.TypeOf((*regexp14.Regexp)(nil)) var tmp35 lang.FnFunc2 tmp35 = lang.FnFunc2(func(p0, p1 any) any { v36 := p0 @@ -50944,7 +50914,7 @@ func LoadNS() { var v6 any = tmp5 _ = v6 // let binding "sw" - tmp7 := reflect.TypeOf((*strings9.Builder)(nil)).Elem() + tmp7 := reflect.TypeOf((*strings10.Builder)(nil)).Elem() tmp8 := lang.NewHostInstance(tmp7) var v9 any = tmp8 _ = v9 diff --git a/pkg/stdlib/clojure/core/protocols/loader.go b/pkg/stdlib/clojure/core/protocols/loader.go index 859e1134..5d918414 100644 --- a/pkg/stdlib/clojure/core/protocols/loader.go +++ b/pkg/stdlib/clojure/core/protocols/loader.go @@ -207,6 +207,9 @@ func LoadNS() { { // refer vars from clojure.core srcNS := lang.FindOrCreateNamespace(sym_clojure_DOT_core) ns.ReferAllSnapshot(srcNS, []string{ + "*loaded-libs*", + "*loading-verbosely*", + "*pending-paths*", "-protocols", ">0?", ">1?", diff --git a/pkg/stdlib/clojure/string/loader.go b/pkg/stdlib/clojure/string/loader.go index bd369ac2..7c557636 100644 --- a/pkg/stdlib/clojure/string/loader.go +++ b/pkg/stdlib/clojure/string/loader.go @@ -335,6 +335,9 @@ func LoadNS() { { // refer vars from clojure.core srcNS := lang.FindOrCreateNamespace(sym_clojure_DOT_core) ns.ReferAllSnapshot(srcNS, []string{ + "*loaded-libs*", + "*loading-verbosely*", + "*pending-paths*", "-protocols", ">0?", ">1?", @@ -546,7 +549,7 @@ func LoadNS() { var_clojure_DOT_string_capitalize = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_capitalize.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(172), kw_column, int(7), kw_end_DASH_line, int(172), kw_end_DASH_column, int(27), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Converts first character of the string to upper-case, all other\n characters to lower-case.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(172), kw_column, int(7), kw_end_DASH_line, int(172), kw_end_DASH_column, int(27), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Converts first character of the string to upper-case, all other\n characters to lower-case.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // check-string @@ -803,7 +806,7 @@ func LoadNS() { var_clojure_DOT_string_escape = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_escape.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(254), kw_column, int(7), kw_end_DASH_line, int(254), kw_end_DASH_column, int(23), kw_arglists, lang.NewList(lang.NewVector(sym_s, sym_cmap)), kw_doc, "Return a new string, using cmap to escape each character ch\n from s as follows:\n\n If (cmap ch) is nil, append ch to the new string.\n If (cmap ch) is non-nil, append (str (cmap ch)) instead.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(254), kw_column, int(7), kw_end_DASH_line, int(254), kw_end_DASH_column, int(23), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_s, sym_cmap)), kw_doc, "Return a new string, using cmap to escape each character ch\n from s as follows:\n\n If (cmap ch) is nil, append ch to the new string.\n If (cmap ch) is non-nil, append (str (cmap ch)) instead.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // includes? @@ -1024,7 +1027,7 @@ func LoadNS() { var_clojure_DOT_string_lower_DASH_case = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_lower_DASH_case.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(189), kw_column, int(7), kw_end_DASH_line, int(189), kw_end_DASH_column, int(27), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Converts string to all lower-case.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(189), kw_column, int(7), kw_end_DASH_line, int(189), kw_end_DASH_column, int(27), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Converts string to all lower-case.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // re-quote-replacement @@ -1042,7 +1045,7 @@ func LoadNS() { var_clojure_DOT_string_re_DASH_quote_DASH_replacement = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_re_DASH_quote_DASH_replacement.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(30), kw_column, int(7), kw_end_DASH_line, int(30), kw_end_DASH_column, int(37), kw_arglists, lang.NewList(lang.NewVector(sym_replacement)), kw_doc, "Given a replacement string that you wish to be a literal\n replacement for a pattern match in replace or replace-first, do the\n necessary escaping of special characters in the replacement.", kw_added, "1.5", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(30), kw_column, int(7), kw_end_DASH_line, int(30), kw_end_DASH_column, int(37), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_replacement)), kw_doc, "Given a replacement string that you wish to be a literal\n replacement for a pattern match in replace or replace-first, do the\n necessary escaping of special characters in the replacement.", kw_added, "1.5", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // replace @@ -1108,7 +1111,7 @@ func LoadNS() { var_clojure_DOT_string_replace = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_replace.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(53), kw_column, int(7), kw_end_DASH_line, int(53), kw_end_DASH_column, int(24), kw_arglists, lang.NewList(lang.NewVector(sym_s, sym_match, sym_replacement)), kw_doc, "Replaces all instance of match with replacement in s.\n\n match/replacement can be:\n\n string / string\n char / char\n pattern / (string or function of match).\n\n See also replace-first.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern. If you wish your replacement\n string r to be used literally, use (re-quote-replacement r) as the\n replacement argument. See also documentation for\n java.util.regex.Matcher's appendReplacement method.\n\n Example:\n (glojure.string/replace \"Almost Pig Latin\" #\"\\b(\\w)(\\w+)\\b\" \"$2$1ay\")\n -> \"lmostAay igPay atinLay\"", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(53), kw_column, int(7), kw_end_DASH_line, int(53), kw_end_DASH_column, int(24), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_s, sym_match, sym_replacement)), kw_doc, "Replaces all instance of match with replacement in s.\n\n match/replacement can be:\n\n string / string\n char / char\n pattern / (string or function of match).\n\n See also replace-first.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern. If you wish your replacement\n string r to be used literally, use (re-quote-replacement r) as the\n replacement argument. See also documentation for\n java.util.regex.Matcher's appendReplacement method.\n\n Example:\n (glojure.string/replace \"Almost Pig Latin\" #\"\\b(\\w)(\\w+)\\b\" \"$2$1ay\")\n -> \"lmostAay igPay atinLay\"", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // replace-by @@ -1302,7 +1305,7 @@ func LoadNS() { var_clojure_DOT_string_replace_DASH_first = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_replace_DASH_first.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(115), kw_column, int(7), kw_end_DASH_line, int(115), kw_end_DASH_column, int(30), kw_arglists, lang.NewList(lang.NewVector(sym_s, sym_match, sym_replacement)), kw_doc, "Replaces the first instance of match with replacement in s.\n\n match/replacement can be:\n\n char / char\n string / string\n pattern / (string or function of match).\n\n See also replace.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern. If you wish your replacement\n string r to be used literally, use (re-quote-replacement r) as the\n replacement argument. See also documentation for\n java.util.regex.Matcher's appendReplacement method.\n\n Example:\n (glojure.string/replace-first \"swap first two words\"\n #\"(\\w+)(\\s+)(\\w+)\" \"$3$2$1\")\n -> \"first swap two words\"", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(115), kw_column, int(7), kw_end_DASH_line, int(115), kw_end_DASH_column, int(30), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_s, sym_match, sym_replacement)), kw_doc, "Replaces the first instance of match with replacement in s.\n\n match/replacement can be:\n\n char / char\n string / string\n pattern / (string or function of match).\n\n See also replace.\n\n The replacement is literal (i.e. none of its characters are treated\n specially) for all cases above except pattern / string.\n\n For pattern / string, $1, $2, etc. in the replacement string are\n substituted with the string that matched the corresponding\n parenthesized group in the pattern. If you wish your replacement\n string r to be used literally, use (re-quote-replacement r) as the\n replacement argument. See also documentation for\n java.util.regex.Matcher's appendReplacement method.\n\n Example:\n (glojure.string/replace-first \"swap first two words\"\n #\"(\\w+)(\\s+)(\\w+)\" \"$3$2$1\")\n -> \"first swap two words\"", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // replace-first-by @@ -1478,7 +1481,7 @@ func LoadNS() { var_clojure_DOT_string_reverse = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_reverse.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(23), kw_column, int(7), kw_end_DASH_line, int(23), kw_end_DASH_column, int(24), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Returns s with its characters reversed.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(23), kw_column, int(7), kw_end_DASH_line, int(23), kw_end_DASH_column, int(24), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Returns s with its characters reversed.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // split @@ -1586,7 +1589,7 @@ func LoadNS() { var_clojure_DOT_string_trim = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_trim.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(212), kw_column, int(7), kw_end_DASH_line, int(212), kw_end_DASH_column, int(21), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Removes whitespace from both ends of string.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(212), kw_column, int(7), kw_end_DASH_line, int(212), kw_end_DASH_column, int(21), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Removes whitespace from both ends of string.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // trim-newline @@ -1603,7 +1606,7 @@ func LoadNS() { var_clojure_DOT_string_trim_DASH_newline = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_trim_DASH_newline.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(230), kw_column, int(7), kw_end_DASH_line, int(230), kw_end_DASH_column, int(29), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Removes all trailing newline \\n or return \\r characters from\n string. Similar to Perl's chomp.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(230), kw_column, int(7), kw_end_DASH_line, int(230), kw_end_DASH_column, int(29), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Removes all trailing newline \\n or return \\r characters from\n string. Similar to Perl's chomp.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // triml @@ -1620,7 +1623,7 @@ func LoadNS() { var_clojure_DOT_string_triml = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_triml.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(218), kw_column, int(7), kw_end_DASH_line, int(218), kw_end_DASH_column, int(22), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Removes whitespace from the left side of string.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(218), kw_column, int(7), kw_end_DASH_line, int(218), kw_end_DASH_column, int(22), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Removes whitespace from the left side of string.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // trimr @@ -1637,7 +1640,7 @@ func LoadNS() { var_clojure_DOT_string_trimr = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_trimr.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(224), kw_column, int(7), kw_end_DASH_line, int(224), kw_end_DASH_column, int(22), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Removes whitespace from the right side of string.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(224), kw_column, int(7), kw_end_DASH_line, int(224), kw_end_DASH_column, int(22), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Removes whitespace from the right side of string.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // upper-case @@ -1656,7 +1659,7 @@ func LoadNS() { var_clojure_DOT_string_upper_DASH_case = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_upper_DASH_case.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(183), kw_column, int(7), kw_end_DASH_line, int(183), kw_end_DASH_column, int(27), kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Converts string to all upper-case.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(183), kw_column, int(7), kw_end_DASH_line, int(183), kw_end_DASH_column, int(27), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_s)), kw_doc, "Converts string to all upper-case.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } // join @@ -1694,7 +1697,7 @@ func LoadNS() { var_clojure_DOT_string_join = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_string_join.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf("") - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "clojure/string.glj", kw_line, int(163), kw_column, int(7), kw_end_DASH_line, int(163), kw_end_DASH_column, int(21), kw_arglists, lang.NewList(lang.NewVector(sym_coll), lang.NewVector(sym_separator, sym_coll)), kw_doc, "Returns a string of all elements in coll, as returned by (seq coll),\n separated by an optional separator.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) + return lang.NewMapUniqueKeys(kw_file, "clojure/string.glj", kw_line, int(163), kw_column, int(7), kw_end_DASH_line, int(163), kw_end_DASH_column, int(21), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_coll), lang.NewVector(sym_separator, sym_coll)), kw_doc, "Returns a string of all elements in coll, as returned by (seq coll),\n separated by an optional separator.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_string)) }) } } diff --git a/pkg/stdlib/clojure/template/loader.go b/pkg/stdlib/clojure/template/loader.go index 121b5f88..b71099d2 100644 --- a/pkg/stdlib/clojure/template/loader.go +++ b/pkg/stdlib/clojure/template/loader.go @@ -145,6 +145,9 @@ func LoadNS() { { // refer vars from clojure.core srcNS := lang.FindOrCreateNamespace(sym_clojure_DOT_core) ns.ReferAllSnapshot(srcNS, []string{ + "*loaded-libs*", + "*loading-verbosely*", + "*pending-paths*", "-protocols", ">0?", ">1?", diff --git a/pkg/stdlib/clojure/test/loader.go b/pkg/stdlib/clojure/test/loader.go index 1280697e..51a68eec 100644 --- a/pkg/stdlib/clojure/test/loader.go +++ b/pkg/stdlib/clojure/test/loader.go @@ -676,6 +676,9 @@ func LoadNS() { { // refer vars from clojure.core srcNS := lang.FindOrCreateNamespace(sym_clojure_DOT_core) ns.ReferAllSnapshot(srcNS, []string{ + "*loaded-libs*", + "*loading-verbosely*", + "*pending-paths*", "-protocols", ">0?", ">1?", @@ -753,7 +756,7 @@ func LoadNS() { tmp0 := sym__STAR_initial_DASH_report_DASH_counters_STAR_ var_clojure_DOT_test__STAR_initial_DASH_report_DASH_counters_STAR_ = ns.InternWithValue(tmp0, lang.NewMap(kw_test, int64(0), kw_pass, int64(0), kw_fail, int64(0), kw_error, int64(0)), true) var_clojure_DOT_test__STAR_initial_DASH_report_DASH_counters_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/test.glj", kw_line, int(263), kw_column, int(6), kw_end_DASH_line, int(263), kw_end_DASH_column, int(40), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) + return lang.NewMap(kw_file, "clojure/test.glj", kw_line, int(263), kw_column, int(6), kw_end_DASH_line, int(263), kw_end_DASH_column, int(40), kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) }) var_clojure_DOT_test__STAR_initial_DASH_report_DASH_counters_STAR_.SetDynamic() } @@ -762,7 +765,7 @@ func LoadNS() { tmp0 := sym__STAR_load_DASH_tests_STAR_ var_clojure_DOT_test__STAR_load_DASH_tests_STAR_ = ns.InternWithValue(tmp0, true, true) var_clojure_DOT_test__STAR_load_DASH_tests_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/test.glj", kw_line, int(244), kw_column, int(10), kw_end_DASH_line, int(249), kw_end_DASH_column, int(14), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) + return lang.NewMapUniqueKeys(kw_file, "clojure/test.glj", kw_line, int(244), kw_column, int(10), kw_end_DASH_line, int(249), kw_end_DASH_column, int(14), kw_doc, "True by default. If set to false, no test functions will\n be created by deftest, set-test, or with-test. Use this to omit\n tests when compiling or loading production code.", kw_added, "1.1", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) }) var_clojure_DOT_test__STAR_load_DASH_tests_STAR_.SetDynamic() } @@ -771,7 +774,7 @@ func LoadNS() { tmp0 := sym__STAR_report_DASH_counters_STAR_ var_clojure_DOT_test__STAR_report_DASH_counters_STAR_ = ns.InternWithValue(tmp0, nil, true) var_clojure_DOT_test__STAR_report_DASH_counters_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/test.glj", kw_line, int(261), kw_column, int(6), kw_end_DASH_line, int(261), kw_end_DASH_column, int(32), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) + return lang.NewMap(kw_file, "clojure/test.glj", kw_line, int(261), kw_column, int(6), kw_end_DASH_line, int(261), kw_end_DASH_column, int(32), kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) }) var_clojure_DOT_test__STAR_report_DASH_counters_STAR_.SetDynamic() } @@ -780,7 +783,7 @@ func LoadNS() { tmp0 := sym__STAR_stack_DASH_trace_DASH_depth_STAR_ var_clojure_DOT_test__STAR_stack_DASH_trace_DASH_depth_STAR_ = ns.InternWithValue(tmp0, nil, true) var_clojure_DOT_test__STAR_stack_DASH_trace_DASH_depth_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/test.glj", kw_line, int(251), kw_column, int(6), kw_end_DASH_line, int(256), kw_end_DASH_column, int(20), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) + return lang.NewMapUniqueKeys(kw_file, "clojure/test.glj", kw_line, int(251), kw_column, int(6), kw_end_DASH_line, int(256), kw_end_DASH_column, int(20), kw_doc, "The maximum depth of stack traces to print when an Exception\n is thrown during a test. Defaults to nil, which means print the\n complete stack trace.", kw_added, "1.1", kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) }) var_clojure_DOT_test__STAR_stack_DASH_trace_DASH_depth_STAR_.SetDynamic() } @@ -789,7 +792,7 @@ func LoadNS() { tmp0 := sym__STAR_test_DASH_out_STAR_ var_clojure_DOT_test__STAR_test_DASH_out_STAR_ = ns.InternWithValue(tmp0, nil, true) var_clojure_DOT_test__STAR_test_DASH_out_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/test.glj", kw_line, int(270), kw_column, int(6), kw_end_DASH_line, int(270), kw_end_DASH_column, int(32), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) + return lang.NewMap(kw_file, "clojure/test.glj", kw_line, int(270), kw_column, int(6), kw_end_DASH_line, int(270), kw_end_DASH_column, int(32), kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) }) var_clojure_DOT_test__STAR_test_DASH_out_STAR_.SetDynamic() } @@ -798,7 +801,7 @@ func LoadNS() { tmp0 := sym__STAR_testing_DASH_contexts_STAR_ var_clojure_DOT_test__STAR_testing_DASH_contexts_STAR_ = ns.InternWithValue(tmp0, lang.NewList(), true) var_clojure_DOT_test__STAR_testing_DASH_contexts_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/test.glj", kw_line, int(268), kw_column, int(6), kw_end_DASH_line, int(268), kw_end_DASH_column, int(33), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) + return lang.NewMap(kw_file, "clojure/test.glj", kw_line, int(268), kw_column, int(6), kw_end_DASH_line, int(268), kw_end_DASH_column, int(33), kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) }) var_clojure_DOT_test__STAR_testing_DASH_contexts_STAR_.SetDynamic() } @@ -807,7 +810,7 @@ func LoadNS() { tmp0 := sym__STAR_testing_DASH_vars_STAR_ var_clojure_DOT_test__STAR_testing_DASH_vars_STAR_ = ns.InternWithValue(tmp0, lang.NewList(), true) var_clojure_DOT_test__STAR_testing_DASH_vars_STAR_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_dynamic, true, kw_file, "clojure/test.glj", kw_line, int(266), kw_column, int(6), kw_end_DASH_line, int(266), kw_end_DASH_column, int(29), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) + return lang.NewMap(kw_file, "clojure/test.glj", kw_line, int(266), kw_column, int(6), kw_end_DASH_line, int(266), kw_end_DASH_column, int(29), kw_dynamic, true, kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) }) var_clojure_DOT_test__STAR_testing_DASH_vars_STAR_.SetDynamic() } @@ -3135,7 +3138,7 @@ func LoadNS() { tmp1.AddMethod(kw_end_DASH_test_DASH_var, tmp10) var_clojure_DOT_test_report = ns.InternWithValue(tmp0, tmp1, true) var_clojure_DOT_test_report.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Generic reporting function, may be overridden to plug in\n different report formats (e.g., TAP, JUnit). Assertions such as\n 'is' call 'report' to indicate results. The argument given to\n 'report' will be a map with a :type key. See the documentation at\n the top of test_is.clj for more information on the types of\n arguments for 'report'.", kw_dynamic, true, kw_added, "1.1", kw_file, "clojure/test.glj", kw_line, int(324), kw_column, int(3), kw_end_DASH_line, int(332), kw_end_DASH_column, int(8), kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) + return lang.NewMapUniqueKeys(kw_file, "clojure/test.glj", kw_line, int(324), kw_column, int(3), kw_end_DASH_line, int(332), kw_end_DASH_column, int(8), kw_doc, "Generic reporting function, may be overridden to plug in\n different report formats (e.g., TAP, JUnit). Assertions such as\n 'is' call 'report' to indicate results. The argument given to\n 'report' will be a map with a :type key. See the documentation at\n the top of test_is.clj for more information on the types of\n arguments for 'report'.", kw_dynamic, true, kw_added, "1.1", kw_ns, lang.FindOrCreateNamespace(sym_clojure_DOT_test)) }) var_clojure_DOT_test_report.SetDynamic() } diff --git a/pkg/stdlib/clojure/uuid/loader.go b/pkg/stdlib/clojure/uuid/loader.go index a3ea4e14..f063b5e8 100644 --- a/pkg/stdlib/clojure/uuid/loader.go +++ b/pkg/stdlib/clojure/uuid/loader.go @@ -91,6 +91,9 @@ func LoadNS() { { // refer vars from clojure.core srcNS := lang.FindOrCreateNamespace(sym_clojure_DOT_core) ns.ReferAllSnapshot(srcNS, []string{ + "*loaded-libs*", + "*loading-verbosely*", + "*pending-paths*", "-protocols", ">0?", ">1?", diff --git a/pkg/stdlib/clojure/walk/loader.go b/pkg/stdlib/clojure/walk/loader.go index 7dac0ffb..e1d3cfd1 100644 --- a/pkg/stdlib/clojure/walk/loader.go +++ b/pkg/stdlib/clojure/walk/loader.go @@ -279,6 +279,9 @@ func LoadNS() { { // refer vars from clojure.core srcNS := lang.FindOrCreateNamespace(sym_clojure_DOT_core) ns.ReferAllSnapshot(srcNS, []string{ + "*loaded-libs*", + "*loading-verbosely*", + "*pending-paths*", "-protocols", ">0?", ">1?", diff --git a/pkg/stdlib/clojurestar/deps.cljc b/pkg/stdlib/clojurestar/deps.cljc new file mode 100644 index 00000000..8b196cb2 --- /dev/null +++ b/pkg/stdlib/clojurestar/deps.cljc @@ -0,0 +1,63 @@ +(ns clojurestar.deps + "Dialect-neutral dynamic dependency loading." + (:require [grenadine.require-deps :as required] + #?(:gobb [gobb.deps :as implementation] + :glj [glojure.deps :as implementation] + :jolt [jolt.deps :as implementation]))) + +(defn add-deps + "Add the dependencies in a deps.edn map to the running dialect. + + This portable facade deliberately returns nil. Use the dialect-specific + dependency namespace when backend-specific options or results are needed." + [deps-map] + (implementation/add-deps deps-map) + nil) + +(defn require-deps* + "Acquire and load one or more dependency libspec values. + + An optional leading map accepts :mvn/local-repo and :gitlibs/dir; + :cache-dir remains a compatibility alias for source-file caches. Libspecs + support :as and an explicit :refer vector. Dependencies are prepared and + required from left to right." + [& arguments] + (let [[options libspecs] + (if (map? (first arguments)) + [(required/parse-options (first arguments)) (rest arguments)] + [{} arguments])] + (when (empty? libspecs) + (throw + (ex-info "require-deps requires at least one libspec vector" + {:type :clojurestar.deps/invalid-require}))) + (doseq [libspec libspecs] + (let [{:keys [coordinate] alias-symbol :as refer-symbols :refer} + (required/parse-libspec libspec) + namespace-symbol + #?(:jolt + (if-let [prepare (resolve 'jolt.deps/prepare-required!)] + (prepare coordinate options) + (throw + (ex-info "Jolt does not provide require-deps support" + {:type :clojurestar.deps/unsupported-runtime}))) + :default + (implementation/prepare-required! coordinate options))] + (when alias-symbol + (alias alias-symbol namespace-symbol)) + (when refer-symbols + (refer namespace-symbol :only refer-symbols)))) + nil)) + +(defmacro require-deps + "Acquire and load dependencies using require-style libspec syntax. + + Literal libspec vectors are treated as data automatically. Already quoted + vectors and expressions that evaluate to libspecs remain supported." + [& arguments] + (cons `require-deps* + (map + (fn [argument] + (if (vector? argument) + (list 'quote argument) + argument)) + arguments))) diff --git a/pkg/stdlib/glojure/deps.clj b/pkg/stdlib/glojure/deps.clj new file mode 100644 index 00000000..fbf7f116 --- /dev/null +++ b/pkg/stdlib/glojure/deps.clj @@ -0,0 +1,168 @@ +(ns glojure.deps + "Glojure dependency facade backed by Grenadine. + + Installed JARs are safely extracted and their source roots are appended with + `clojure.core/add-load-path`." + (:require [clojure.string :as str] + [grenadine.require-deps :as required] + [grenadine.gitlibs :as gitlibs] + [grenadine.runtime :as runtime] + [grenadine.xml :as xml] + [glojure.deps.host :as host])) + +(defonce ^:private basis (atom {:libs {} :classpath {} :classpath-roots [] + :grenadine/loaded {}})) + +(defonce ^:private required-state + (atom {:coordinates {} :namespaces {}})) + +(defn current-basis [] (runtime/current-basis basis)) + +(defn- add-roots! + [roots] + (let [add-load-path (resolve 'clojure.core/add-load-path)] + (when-not add-load-path + (throw (ex-info "Glojure does not expose clojure.core/add-load-path" + {:type :grenadine.runtime/missing-load-path-hook}))) + (doseq [root roots] (add-load-path root)))) + +(defn- environment-option + [runtime-host name] + (let [value ((:getenv runtime-host) name)] + (when (seq value) value))) + +(defn add-libs + ([libs] (add-libs libs nil)) + ([libs opts] + (let [opts (or opts {}) + runtime-host (or (:host opts) (host/host)) + maven-repository + (environment-option runtime-host "GLOJURE_MAVEN_REPOSITORY") + gitlibs-cache + (environment-option runtime-host "GLOJURE_GITLIBS_DIR")] + (runtime/add-libs! basis add-roots! libs + (cond-> (assoc opts + :host runtime-host + :xml-parser (or (:xml-parser opts) + xml/parse)) + (and (nil? (:local-repo opts)) maven-repository) + (assoc :local-repo maven-repository) + + (and (nil? (:gitlibs-dir opts)) gitlibs-cache) + (assoc :gitlibs-dir gitlibs-cache)))))) + +(defn add-lib + ([lib coordinate] (add-lib lib coordinate nil)) + ([lib coordinate opts] (add-libs {lib coordinate} opts))) + +(defn add-deps + ([deps-map] (add-deps deps-map nil)) + ([deps-map opts] + (add-libs (or (:deps deps-map) {}) + (cond-> (or opts {}) + (:mvn/local-repo deps-map) + (assoc :local-repo (:mvn/local-repo deps-map)) + + (:mvn/repos deps-map) + (assoc :repos (:mvn/repos deps-map)) + + (:gitlibs/dir deps-map) + (assoc :gitlibs-dir (:gitlibs/dir deps-map)))))) + +(defn sync-deps + ([] (sync-deps "deps.edn" nil)) + ([path] (sync-deps path nil)) + ([path opts] + (let [index (max (or (str/last-index-of path "/") -1) + (or (str/last-index-of path "\\") -1))] + (add-deps (read-string (slurp path)) + (assoc (or opts {}) :base-dir + (if (neg? index) "." (subs path 0 index))))))) + +(defn- required-host + [] + (let [runtime-host (host/host)] + {:home-dir (:home-dir runtime-host) + :gitlibs-dir + #(gitlibs/gitlibs-dir + {:host runtime-host + :gitlibs-dir + (environment-option runtime-host "GLOJURE_GITLIBS_DIR")}) + :file-exists? (:regular-file? runtime-host) + :mkdirs! (:mkdirs! runtime-host) + :delete! (:delete! runtime-host) + :atomic-move! (:atomic-move! runtime-host) + :read-text + (fn [path] + ((:bytes->utf8 runtime-host) ((:read-bytes runtime-host) path))) + :download! + (fn [url path] + (let [{:keys [status body]} ((:http-get runtime-host) url)] + (when (and (<= 200 status 299) body) + ((:write-bytes! runtime-host) path body) + true)))})) + +(defn- read-first-form + [source] + (binding [*read-eval* false] + (read-string source))) + +(defn- loaded-namespace + [identity] + (get-in @required-state [:coordinates identity])) + +(defn- load-required! + [coordinate namespace-symbol load!] + (let [identity (:identity coordinate) + loaded-coordinate (get-in @required-state + [:namespaces namespace-symbol])] + (cond + (= identity (:identity loaded-coordinate)) namespace-symbol + loaded-coordinate + (required/namespace-conflict! namespace-symbol loaded-coordinate coordinate) + :else + (do + (load!) + (swap! required-state + (fn [state] + (-> state + (assoc-in [:coordinates identity] namespace-symbol) + (assoc-in [:namespaces namespace-symbol] coordinate)))) + namespace-symbol)))) + +(defn prepare-required! + "Internal hook used by clojurestar.deps/require-deps." + [coordinate options] + (or + (loaded-namespace (:identity coordinate)) + (case (:provider coordinate) + :mvn + (load-required! + coordinate (:namespace coordinate) + #(do + (add-libs {(:lib coordinate) {:mvn/version (:version coordinate)}} + (when-let [repository (:mvn/local-repo options)] + {:local-repo repository})) + (require (:namespace coordinate)))) + + :gist + (let [{:keys [path source]} + (required/acquire-gist! (required-host) options coordinate) + namespace-symbol + (required/gist-namespace coordinate (read-first-form source))] + (load-required! coordinate namespace-symbol + #(let [caller (ns-name *ns*)] + (try + (load-file path) + (finally (in-ns caller)))))) + + :github + (let [{:keys [path source]} + (required/acquire-github! (required-host) options coordinate) + namespace-symbol + (required/github-namespace coordinate (read-first-form source))] + (load-required! coordinate namespace-symbol + #(let [caller (ns-name *ns*)] + (try + (load-file path) + (finally (in-ns caller))))))))) diff --git a/pkg/stdlib/glojure/deps/host.clj b/pkg/stdlib/glojure/deps/host.clj new file mode 100644 index 00000000..534f30d4 --- /dev/null +++ b/pkg/stdlib/glojure/deps/host.clj @@ -0,0 +1,2 @@ +(ns glojure.deps.host + "Native effects used by the Grenadine-backed glojure.deps facade.") diff --git a/pkg/stdlib/glojure/go/io/loader.go b/pkg/stdlib/glojure/go/io/loader.go index 50549948..ef8f3d55 100644 --- a/pkg/stdlib/glojure/go/io/loader.go +++ b/pkg/stdlib/glojure/go/io/loader.go @@ -281,6 +281,9 @@ func LoadNS() { { // refer vars from clojure.core srcNS := lang.FindOrCreateNamespace(sym_clojure_DOT_core) ns.ReferAllSnapshot(srcNS, []string{ + "*loaded-libs*", + "*loading-verbosely*", + "*pending-paths*", "-protocols", ">0?", ">1?", @@ -426,7 +429,7 @@ func LoadNS() { tmp1 := reflect.TypeOf([]uint8(nil)) var_glojure_DOT_go_DOT_io_byte_DASH_array_DASH_type = ns.InternWithValue(tmp0, tmp1, true) var_glojure_DOT_go_DOT_io_byte_DASH_array_DASH_type.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Type object for a Go primitive byte slice.", kw_private, true, kw_file, "glojure/go/io.glj", kw_line, int(16), kw_column, int(5), kw_end_DASH_line, int(19), kw_end_DASH_column, int(16), kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) + return lang.NewMapUniqueKeys(kw_file, "glojure/go/io.glj", kw_line, int(16), kw_column, int(5), kw_end_DASH_line, int(19), kw_end_DASH_column, int(16), kw_doc, "Type object for a Go primitive byte slice.", kw_private, true, kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) }) } // do-copy @@ -529,7 +532,7 @@ func LoadNS() { tmp1.AddMethod(lang.NewVector(tmp3, tmp4), tmp5) var_glojure_DOT_go_DOT_io_do_DASH_copy = ns.InternWithValue(tmp0, tmp1, true) var_glojure_DOT_go_DOT_io_do_DASH_copy.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_doc, "Internal helper for copy", kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_input, sym_output, sym_opts)), kw_file, "glojure/go/io.glj", kw_line, int(296), kw_column, int(3), kw_end_DASH_line, int(299), kw_end_DASH_column, int(9), kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) + return lang.NewMapUniqueKeys(kw_file, "glojure/go/io.glj", kw_line, int(296), kw_column, int(3), kw_end_DASH_line, int(299), kw_end_DASH_column, int(9), kw_doc, "Internal helper for copy", kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym_input, sym_output, sym_opts)), kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) }) } // make-input-stream @@ -636,7 +639,7 @@ func LoadNS() { tmp1.AddMethod(tmp9, tmp10) var_glojure_DOT_go_DOT_io_make_DASH_input_DASH_stream = ns.InternWithValue(tmp0, tmp1, true) var_glojure_DOT_go_DOT_io_make_DASH_input_DASH_stream.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_added, "1.2", kw_file, "glojure/go/io.glj", kw_line, int(86), kw_column, int(4), kw_end_DASH_line, int(86), kw_end_DASH_column, int(36), kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) + return lang.NewMap(kw_file, "glojure/go/io.glj", kw_line, int(86), kw_column, int(4), kw_end_DASH_line, int(86), kw_end_DASH_column, int(36), kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) }) } // make-output-stream @@ -743,7 +746,7 @@ func LoadNS() { tmp1.AddMethod(tmp9, tmp10) var_glojure_DOT_go_DOT_io_make_DASH_output_DASH_stream = ns.InternWithValue(tmp0, tmp1, true) var_glojure_DOT_go_DOT_io_make_DASH_output_DASH_stream.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_added, "1.2", kw_file, "glojure/go/io.glj", kw_line, int(87), kw_column, int(4), kw_end_DASH_line, int(87), kw_end_DASH_column, int(37), kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) + return lang.NewMap(kw_file, "glojure/go/io.glj", kw_line, int(87), kw_column, int(4), kw_end_DASH_line, int(87), kw_end_DASH_column, int(37), kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) }) } // make-reader @@ -830,7 +833,7 @@ func LoadNS() { tmp1.AddMethod(tmp7, tmp8) var_glojure_DOT_go_DOT_io_make_DASH_reader = ns.InternWithValue(tmp0, tmp1, true) var_glojure_DOT_go_DOT_io_make_DASH_reader.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_added, "1.2", kw_file, "glojure/go/io.glj", kw_line, int(84), kw_column, int(4), kw_end_DASH_line, int(84), kw_end_DASH_column, int(30), kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) + return lang.NewMap(kw_file, "glojure/go/io.glj", kw_line, int(84), kw_column, int(4), kw_end_DASH_line, int(84), kw_end_DASH_column, int(30), kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) }) } // make-writer @@ -917,7 +920,7 @@ func LoadNS() { tmp1.AddMethod(tmp7, tmp8) var_glojure_DOT_go_DOT_io_make_DASH_writer = ns.InternWithValue(tmp0, tmp1, true) var_glojure_DOT_go_DOT_io_make_DASH_writer.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_added, "1.2", kw_file, "glojure/go/io.glj", kw_line, int(85), kw_column, int(4), kw_end_DASH_line, int(85), kw_end_DASH_column, int(30), kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) + return lang.NewMap(kw_file, "glojure/go/io.glj", kw_line, int(85), kw_column, int(4), kw_end_DASH_line, int(85), kw_end_DASH_column, int(30), kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) }) } { @@ -1738,7 +1741,7 @@ func LoadNS() { tmp1 := lang.NewAtom(lang.NewMap(kw_multis, lang.NewMap(kw_make_DASH_reader, tmp2, kw_make_DASH_writer, tmp10, kw_make_DASH_input_DASH_stream, tmp18, kw_make_DASH_output_DASH_stream, tmp28), kw_on_DASH_interface, true, kw_sigs, lang.NewList(lang.NewList(sym_make_DASH_reader, lang.NewVector(sym_x, sym_opts), "Creates an io.Reader. See also IOFactory docs."), lang.NewList(sym_make_DASH_writer, lang.NewVector(sym_x, sym_opts), "Creates an io.Reader. See also IOFactory docs."), lang.NewList(sym_make_DASH_input_DASH_stream, lang.NewVector(sym_x, sym_opts), "Creates a BufferedInputStream. See also IOFactory docs."), lang.NewList(sym_make_DASH_output_DASH_stream, lang.NewVector(sym_x, sym_opts), "Creates a BufferedOutputStream. See also IOFactory docs.")))) var_glojure_DOT_go_DOT_io_IOFactory = ns.InternWithValue(tmp0, tmp1, true) var_glojure_DOT_go_DOT_io_IOFactory.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMap(kw_added, "1.2", kw_file, "glojure/go/io.glj", kw_line, int(72), kw_column, int(14), kw_end_DASH_line, int(72), kw_end_DASH_column, int(38), kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) + return lang.NewMap(kw_file, "glojure/go/io.glj", kw_line, int(72), kw_column, int(14), kw_end_DASH_line, int(72), kw_end_DASH_column, int(38), kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) }) } // default-streams-impl @@ -1978,7 +1981,7 @@ func LoadNS() { ) var_glojure_DOT_go_DOT_io_go_DASH_try_BANG_ = ns.InternWithValue(tmp0, tmp1, true) var_glojure_DOT_go_DOT_io_go_DASH_try_BANG_.SetMetaLazy(func() lang.IPersistentMap { - return lang.NewMapUniqueKeys(kw_private, true, kw_file, "glojure/go/io.glj", kw_line, int(21), kw_column, int(11), kw_end_DASH_line, int(21), kw_end_DASH_column, int(27), kw_arglists, lang.NewList(lang.NewVector(sym__AMP_, sym_call)), kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io), kw_macro, true) + return lang.NewMapUniqueKeys(kw_file, "glojure/go/io.glj", kw_line, int(21), kw_column, int(11), kw_end_DASH_line, int(21), kw_end_DASH_column, int(27), kw_private, true, kw_arglists, lang.NewList(lang.NewVector(sym__AMP_, sym_call)), kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io), kw_macro, true) }) } // reader @@ -2013,7 +2016,7 @@ func LoadNS() { var_glojure_DOT_go_DOT_io_reader = ns.InternWithValue(tmp0, tmp1, true) var_glojure_DOT_go_DOT_io_reader.SetMetaLazy(func() lang.IPersistentMap { tmp2 := reflect.TypeOf((*io4.Reader)(nil)).Elem() - return lang.NewMapUniqueKeys(kw_tag, tmp2, kw_file, "glojure/go/io.glj", kw_line, int(89), kw_column, int(7), kw_end_DASH_line, int(89), kw_end_DASH_column, int(23), kw_arglists, lang.NewList(lang.NewVector(sym_x, sym__AMP_, sym_opts)), kw_doc, "Attempts to coerce its argument into an open io.Reader.\n\n Default implementations are provided for Reader, BufferedReader,\n InputStream, File, URI, URL, Socket, byte slices, rune slices,\n and string.\n\n If argument is a string, it tries to resolve it first as a URI, then\n as a local file name. URIs with a 'file' protocol are converted to\n local file names.\n\n Should be used inside with-open to ensure the io.Reader is properly\n closed.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) + return lang.NewMapUniqueKeys(kw_file, "glojure/go/io.glj", kw_line, int(89), kw_column, int(7), kw_end_DASH_line, int(89), kw_end_DASH_column, int(23), kw_tag, tmp2, kw_arglists, lang.NewList(lang.NewVector(sym_x, sym__AMP_, sym_opts)), kw_doc, "Attempts to coerce its argument into an open io.Reader.\n\n Default implementations are provided for Reader, BufferedReader,\n InputStream, File, URI, URL, Socket, byte slices, rune slices,\n and string.\n\n If argument is a string, it tries to resolve it first as a URI, then\n as a local file name. URIs with a 'file' protocol are converted to\n local file names.\n\n Should be used inside with-open to ensure the io.Reader is properly\n closed.", kw_added, "1.2", kw_ns, lang.FindOrCreateNamespace(sym_glojure_DOT_go_DOT_io)) }) } } diff --git a/pkg/stdlib/glojure/go/types/loader.go b/pkg/stdlib/glojure/go/types/loader.go index ed6dc513..7ce9e686 100644 --- a/pkg/stdlib/glojure/go/types/loader.go +++ b/pkg/stdlib/glojure/go/types/loader.go @@ -203,6 +203,9 @@ func LoadNS() { { // refer vars from clojure.core srcNS := lang.FindOrCreateNamespace(sym_clojure_DOT_core) ns.ReferAllSnapshot(srcNS, []string{ + "*loaded-libs*", + "*loading-verbosely*", + "*pending-paths*", "-protocols", ">0?", ">1?", diff --git a/pkg/stdlib/grenadine/basis.cljc b/pkg/stdlib/grenadine/basis.cljc new file mode 100644 index 00000000..2070c9f0 --- /dev/null +++ b/pkg/stdlib/grenadine/basis.cljc @@ -0,0 +1,513 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +; which can be found in the file epl-v10.html at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. +; +; Portable adaptation of clojure.tools.deps basis and manifest-extension +; organization at v0.31.1642. +; Grenadine adaptations Copyright 2026 Ingy döt Net, under EPL 1.0. +; See Provenance.md for the exact source mapping and changes. + +(ns grenadine.basis + "Portable mixed-coordinate resolution and tools.deps-shaped bases." + (:require [clojure.string :as str] + [grenadine.coordinate :as coordinate] + [grenadine.expander :as expander] + [grenadine.gitlibs :as gitlibs] + [grenadine.graph :as graph] + [grenadine.lock :as lock] + [grenadine.pom :as pom] + [grenadine.repo :as repo])) + +(defn- join-path [base path] + (if (or (nil? path) (= "" path)) + base + (str (str/replace base #"/+$" "") "/" path))) + +(defn- parent-path [path] + (if-let [index (str/last-index-of path "/")] + (subs path 0 index) + ".")) + +(defn- read-text [host path] + ((:bytes->utf8 host) ((:read-bytes host) path))) + +(defn- read-edn [host path] + ((or (:read-edn host) read-string) (read-text host path))) + +(defn- canonical [host path] + ((or (:canonical-path host) (:absolute-path host) identity) path)) + +(defn- relative-to [root path] + (let [root (str/replace root #"/+$" "") + prefix (str root "/")] + (cond + (= root path) "" + (str/starts-with? path prefix) (subs path (count prefix)) + :else path))) + +(defn- safe-deps-root + [host root relative] + (let [root (canonical host root) + nested (canonical host (join-path root relative)) + prefix (str (str/replace root #"/+$" "") "/")] + (when-not (or (= root nested) (str/starts-with? nested prefix)) + (throw (ex-info (str ":deps/root escapes dependency root: " relative) + {:type :grenadine.basis/unsafe-deps-root + :root root :deps/root relative}))) + nested)) + +(defn- pom-lib + [group artifact classifier] + (coordinate/lib-symbol group artifact classifier)) + +(defn- pom-deps + [model] + (into [] + (keep + (fn [{:keys [group artifact classifier version scope optional exclusions]}] + (when (and group artifact version + (not (#{"test" "provided" "system"} scope)) + (not optional)) + [(pom-lib group artifact classifier) + (cond-> {:mvn/version version} + (seq exclusions) + (assoc :exclusions + (set (map #(symbol (:group %) (:artifact %)) + exclusions))))]))) + (:deps model))) + +(defn- raw-pom-deps + [text opts] + (let [raw (pom/parse-pom text opts) + properties (:properties raw) + interpolate #(pom/interpolate-string % properties)] + (into [] + (keep + (fn [{:keys [group artifact classifier version scope optional exclusions]}] + (let [group (interpolate group) + artifact (interpolate artifact) + classifier (interpolate classifier) + version (interpolate version)] + (when (and group artifact version + (not (#{"test" "provided" "system"} scope)) + (not optional) + (not (str/includes? version "${"))) + [(pom-lib group artifact classifier) + (cond-> {:mvn/version version} + (seq exclusions) + (assoc :exclusions + (set (map #(symbol (:group %) (:artifact %)) + exclusions))))])))) + (:dependencies raw)))) + +(defn- normalize-deps + [deps base-dir opts] + (when (and (some? deps) (not (map? deps))) + (throw (ex-info ":deps must be a map" + {:type :grenadine.basis/invalid-deps :deps deps}))) + (into [] + (map (fn [[lib coord]] + [lib (when coord + (coordinate/canonicalize + lib coord (assoc opts :base-dir base-dir)))])) + (or deps {}))) + +(defn- detect-directory-manifest + [lib coord root opts] + (let [host (:host opts) + requested (:deps/manifest coord) + deps-path (join-path root "deps.edn") + pom-path (join-path root "pom.xml") + manifest + (cond + (= requested :deps) :deps + (= requested :pom) :pom + requested + (throw (ex-info (str "Unsupported :deps/manifest for " lib ": " requested) + {:type :grenadine.basis/unsupported-manifest + :lib lib :manifest requested})) + ((:exists? host) deps-path) :deps + ((:exists? host) pom-path) :pom + :else nil)] + (when-not manifest + (throw (ex-info (str "Dependency has neither deps.edn nor pom.xml: " root) + {:type :grenadine.basis/missing-manifest + :lib lib :root root}))) + (case manifest + :deps + (do + (when-not ((:exists? host) deps-path) + (throw (ex-info (str "Missing deps.edn: " deps-path) + {:type :grenadine.basis/missing-manifest-file + :lib lib :path deps-path}))) + (let [data (read-edn host deps-path)] + (when (and (contains? data :deps) (not (map? (:deps data)))) + (throw (ex-info (str ":deps must be a map in " deps-path) + {:type :grenadine.basis/invalid-deps + :lib lib :path deps-path}))) + {:manifest :deps + :root root + :data data + :children (normalize-deps (:deps data) root opts) + :paths (mapv #(canonical host (join-path root %)) + (or (:paths data) ["src"]))})) + + :pom + (do + (when-not ((:exists? host) pom-path) + (throw (ex-info (str "Missing pom.xml: " pom-path) + {:type :grenadine.basis/missing-manifest-file + :lib lib :path pom-path}))) + {:manifest :pom + :root root + :children (normalize-deps + (into {} (raw-pom-deps (read-text host pom-path) opts)) + root opts) + :paths (mapv #(canonical host (join-path root %)) + ["src/main/java" "src/main/clojure" + "src/main/resources"])})))) + +(defn- local-jar-info + [lib coord opts] + (let [host (:host opts) + jar (:local/root coord) + bytes ((:read-bytes host) jar) + digest ((:digest host) :sha256 bytes) + destination (str jar ".grenadine/" digest)] + ((:extract-jar! host) jar destination) + (let [find-files (:find-files host) + poms (when find-files + (find-files destination + #(and (str/includes? % "/META-INF/") + (str/ends-with? % "/pom.xml")))) + pom-path (first poms)] + {:manifest :jar + :root jar + :source-root destination + :children (if pom-path + (normalize-deps + (into {} (raw-pom-deps (read-text host pom-path) opts)) + (parent-path jar) opts) + []) + :paths [jar]}))) + +(defn- coordinate-engine + [opts] + (let [host (:host opts) + cache (atom {}) + pom-fn + (or (:pom-fn opts) + (let [fetch-pom (or (:fetch-pom opts) (repo/pom-fetcher opts)) + poms (atom {})] + (fn [coords] + (if-let [entry (find @poms coords)] + (val entry) + (let [value (pom/effective-pom coords fetch-pom opts)] + (swap! poms assoc coords value) + value))))) + info + (fn info [lib coord] + (let [key [lib (coordinate/dep-id coord)]] + (if-let [entry (find @cache key)] + (val entry) + (let [value + (case (coordinate/coordinate-type coord) + :mvn + (let [[group artifact classifier] + (coordinate/split-lib lib) + coords (cond-> + {:group group :artifact artifact + :version (:mvn/version coord)} + classifier + (assoc :classifier classifier))] + {:manifest :mvn + :children (normalize-deps + (into {} (pom-deps (pom-fn coords))) + (:base-dir opts) opts)}) + + :git + (let [checkout + (gitlibs/checkout-dir lib (:git/sha coord) opts) + present? ((:exists? host) (str checkout "/.git")) + checkout (gitlibs/procure! (:git/url coord) lib + (:git/sha coord) opts) + _ (when (and (not present?) + (:on-install-coordinate opts)) + ((:on-install-coordinate opts) + {:lib lib :coordinate coord})) + root (if-let [relative (:deps/root coord)] + (safe-deps-root host checkout relative) + checkout)] + (assoc (detect-directory-manifest lib coord root opts) + :checkout checkout + :cached? present?)) + + :local + (let [root (:local/root coord)] + (if ((:directory? host) root) + (let [effective + (if-let [relative (:deps/root coord)] + (safe-deps-root host root relative) + root)] + (assoc (detect-directory-manifest lib coord effective opts) + :cached? true)) + (assoc (local-jar-info lib coord opts) :cached? true))))] + (swap! cache assoc key value) + value))))] + {:info info :pom-fn pom-fn})) + +(defn- selected-paths + [trace lib coord] + (let [id (coordinate/dep-id coord) + paths (get-in trace [:vmap lib :paths id])] + (or paths #{}))) + +(defn- parents-data + [trace libs] + (into {} + (map + (fn [[lib coord]] + (let [paths (selected-paths trace lib coord)] + [lib {:parents (set (map vec paths)) + :dependents (vec (distinct (keep peek paths)))}]))) + libs)) + +(defn- classpath-lib-order + [lib-map] + (->> lib-map + (mapcat + (fn [[lib {:keys [parents]}]] + (map #(conj (vec %) lib) parents))) + sort + (sort-by count) + (map peek) + distinct + vec)) + +(defn- maven-resolution + [libs] + {:selected + (into {} + (keep + (fn [[lib coord]] + (when (= :mvn (coordinate/coordinate-type coord)) + (let [[group artifact classifier] + (coordinate/split-lib lib)] + [(coordinate/lib-key group artifact classifier) + {:coords (cond-> + {:group group :artifact artifact + :version (:mvn/version coord)} + classifier (assoc :classifier classifier))}])))) + libs)}) + +(defn calc-basis + "Calculate a tools.deps-shaped basis from an already merged deps map." + [deps-map {:keys [host resolve-args classpath-args base-dir] :as opts}] + (when-not host + (throw (ex-info "calc-basis requires :host" + {:type :grenadine.basis/missing-host}))) + (let [base-dir (or base-dir ".") + opts (assoc opts :base-dir base-dir) + {:keys [info pom-fn]} (coordinate-engine opts) + deps (merge (:deps deps-map) (:extra-deps resolve-args)) + top (normalize-deps deps base-dir opts) + canonical-map + (fn [m] (into {} (normalize-deps m base-dir opts))) + expansion + (expander/expand-deps + top + {:coord-id (fn [_ coord] (coordinate/dep-id coord)) + :coord-deps (fn [lib coord] (:children (info lib coord))) + :base-lib coordinate/base-lib + :provided-libs (set (:provided-libs opts)) + :compare-versions + (fn [lib left right] + (coordinate/compare-coordinates lib left right opts)) + :known-coordinate? (fn [coord] (some? coord)) + :override-deps (canonical-map (:override-deps resolve-args)) + :default-deps (canonical-map (:default-deps resolve-args)) + :trace? true + :fail-on-incomparable? true}) + libs + (if (and (not= :tools-deps (:mediation opts :tools-deps)) + (every? #(= :mvn (coordinate/coordinate-type (second %))) top)) + (let [legacy + (graph/resolve-graph + (into {} top) + {:pom-fn pom-fn + :mediation (:mediation opts) + :provided-libs (:provided-libs opts)})] + (into {} + (map + (fn [[_ occurrence]] + (let [{:keys [group artifact classifier version]} + (:coords occurrence)] + [(coordinate/lib-symbol group artifact classifier) + {:mvn/version version}]))) + (:selected legacy))) + (:libs expansion)) + resolution (maven-resolution libs) + initial-lock (lock/emit-lock resolution + (assoc opts :pom-fn pom-fn)) + fetched (if (false? (:fetch-artifacts? opts)) + {:lock initial-lock :fetched [] :cached [] + :failed [] :warnings []} + (repo/fetch-lock! initial-lock opts)) + _ (when (seq (:failed fetched)) + (throw (ex-info "Failed to install Maven artifacts" + {:type :grenadine.basis/install-failed + :failed (:failed fetched)}))) + final-lock (:lock fetched) + artifacts + (into {} + (map (fn [{:keys [group artifact classifier] :as entry}] + [(coordinate/lib-symbol group artifact classifier) entry])) + (:artifacts final-lock)) + parent-data (parents-data (:trace expansion) libs) + expansion-libs (filter #(contains? libs %) (:order expansion)) + lib-map + (into {} + (map + (fn [lib] + (let [coord (get libs lib) + type (coordinate/coordinate-type coord) + details (info lib coord) + artifact (get artifacts lib) + paths + (case type + :mvn (if artifact + [(str (canonical host (repo/local-repo opts)) + "/" (:path artifact))] + []) + :git (:paths details) + :local (:paths details))] + [lib (merge (cond-> coord + (not= type :mvn) + (assoc :deps/root (:root details))) + {:deps/manifest (:manifest details) + :paths (vec paths)} + (cond-> (get parent-data lib) + (empty? (get-in parent-data [lib :dependents])) + (dissoc :dependents)))])) + expansion-libs)) + ordered-libs (classpath-lib-order lib-map) + extra-paths (:extra-paths classpath-args) + project-paths (or (:replace-paths classpath-args) + (:paths deps-map) + []) + project-roots + (mapv #(canonical host (join-path base-dir %)) + (concat extra-paths project-paths)) + overrides (:classpath-overrides classpath-args) + dependency-roots + (mapcat + (fn [lib] + (if-let [override (get overrides lib)] + [(canonical host (join-path base-dir override))] + (get-in lib-map [lib :paths]))) + ordered-libs) + classpath-roots (vec (distinct (concat project-roots dependency-roots))) + path-key-map + (into {} + (map-indexed + (fn [index root] + [root {:path-key (if (< index (count extra-paths)) + :extra-paths :paths)}]) + project-roots)) + lib-path-map + (into {} + (mapcat + (fn [[lib data]] + (map (fn [path] [path {:lib-name lib}]) (:paths data))) + lib-map)) + source-extraction + (when (:source-roots? opts) + (repo/prepare-source-roots! final-lock opts)) + non-maven-source-roots + (when (:source-roots? opts) + (mapcat + (fn [lib] + (let [coord (get libs lib) + type (coordinate/coordinate-type coord) + details (info lib coord)] + (case type + :mvn [] + :git (:paths details) + :local (if (= :jar (:manifest details)) + [(:source-root details)] + (:paths details))))) + ordered-libs)) + lock-v2 + (assoc final-lock + :lock/version 2 + :libs + (mapv + (fn [lib] + (let [coord (get libs lib) + type (coordinate/coordinate-type coord) + details (info lib coord) + artifact (get artifacts lib) + classpath + (case type + :mvn (if artifact + [{:type :mvn :path (:path artifact)}] + []) + :git (mapv (fn [path] + {:type :git + :path (relative-to (:checkout details) + path)}) + (:paths details)) + :local (mapv (fn [path] {:type :local :path path}) + (:paths details)))] + {:lib lib + :coord coord + :deps/manifest (:manifest details) + :classpath classpath})) + ordered-libs)) + fetched-libs + (set (map #(coordinate/lib-symbol (:group %) (:artifact %) + (:classifier %)) + (:fetched fetched))) + cached-libs + (set (map #(coordinate/lib-symbol (:group %) (:artifact %) + (:classifier %)) + (:cached fetched))) + installed-libs + (vec + (filter + (fn [lib] + (let [coord (get libs lib)] + (case (coordinate/coordinate-type coord) + :mvn (contains? fetched-libs lib) + :git (not (:cached? (info lib coord))) + :local false))) + ordered-libs)) + already-libs + (vec + (filter + (fn [lib] + (let [coord (get libs lib)] + (case (coordinate/coordinate-type coord) + :mvn (contains? cached-libs lib) + :git (:cached? (info lib coord)) + :local true))) + ordered-libs))] + (merge deps-map + {:libs lib-map + :classpath (merge path-key-map lib-path-map) + :classpath-roots classpath-roots + :grenadine/lock lock-v2 + :grenadine/fetched (:fetched fetched) + :grenadine/cached (:cached fetched) + :grenadine/installed-libs installed-libs + :grenadine/already-libs already-libs + :grenadine/warnings + (vec (concat (:warnings expansion) (:warnings fetched))) + :grenadine/resolution expansion + :grenadine/source-roots + (vec (concat (:roots source-extraction) + non-maven-source-roots))}))) diff --git a/pkg/stdlib/grenadine/coordinate.cljc b/pkg/stdlib/grenadine/coordinate.cljc new file mode 100644 index 00000000..3b0db430 --- /dev/null +++ b/pkg/stdlib/grenadine/coordinate.cljc @@ -0,0 +1,236 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +; which can be found in the file epl-v10.html at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. +; +; Portable adaptation of clojure.tools.deps extension and coordinate logic +; at v0.31.1642, plus canonicalization behavior from tools.deps.edn v0.9.48. +; Grenadine adaptations Copyright 2026 Ingy döt Net, under EPL 1.0. +; See Provenance.md for the exact source mapping and changes. + +(ns grenadine.coordinate + "Coordinate recognition and canonicalization shared by every resolver host." + (:require [clojure.string :as str] + [grenadine.gitlibs :as gitlibs] + [grenadine.repo :as repo] + [grenadine.version :as version])) + +(def coordinate-keysets + {:mvn #{:mvn/version} + :git #{:git/url :git/sha :git/tag :sha :tag} + :local #{:local/root}}) + +(defn coordinate-type + [coordinate] + (when-not (map? coordinate) + (throw (ex-info (str "Coordinate must be a map: " (pr-str coordinate)) + {:type :grenadine.coordinate/invalid-coordinate + :coordinate coordinate}))) + (let [keys (set (keys coordinate)) + matches + (->> coordinate-keysets + (keep (fn [[type identifying]] + (when (seq (filter keys identifying)) type))) + vec)] + (case (count matches) + 1 (first matches) + 0 (throw (ex-info (str "Coordinate has no recognized type: " + (pr-str coordinate)) + {:type :grenadine.coordinate/unknown-coordinate + :coordinate coordinate})) + (throw (ex-info (str "Coordinate type is ambiguous: " + (pr-str coordinate)) + {:type :grenadine.coordinate/ambiguous-coordinate + :coordinate coordinate + :matches matches}))))) + +(defn split-lib + [lib] + (let [[group raw-artifact] + (cond + (symbol? lib) [(namespace lib) (name lib)] + (string? lib) + (if-let [slash (str/index-of lib "/")] + [(subs lib 0 slash) (subs lib (inc slash))] + [nil lib]) + :else + (throw (ex-info (str "Library name must be a symbol or string: " + (pr-str lib)) + {:type :grenadine.coordinate/invalid-lib :lib lib}))) + classifier-index (str/index-of raw-artifact "$") + artifact (if classifier-index + (subs raw-artifact 0 classifier-index) + raw-artifact) + classifier (when classifier-index + (subs raw-artifact (inc classifier-index)))] + [(or group artifact) artifact classifier])) + +(defn artifact-name + [artifact classifier] + (str artifact (when classifier (str "$" classifier)))) + +(defn lib-key + [group artifact classifier] + [group (artifact-name artifact classifier)]) + +(defn lib-symbol + [group artifact classifier] + (symbol group (artifact-name artifact classifier))) + +(defn base-lib + "Remove a Maven classifier while preserving the library's spelling." + [lib] + (if (symbol? lib) + (let [raw-name (name lib) + classifier-index (str/index-of raw-name "$") + base-name (if classifier-index + (subs raw-name 0 classifier-index) + raw-name)] + (if-let [lib-namespace (namespace lib)] + (symbol lib-namespace base-name) + (symbol base-name))) + (if-let [classifier-index (str/index-of lib "$")] + (subs lib 0 classifier-index) + lib))) + +(def git-url-hosts + [["io.github." "https://github.com/" ".git"] + ["com.github." "https://github.com/" ".git"] + ["io.gitlab." "https://gitlab.com/" ".git"] + ["com.gitlab." "https://gitlab.com/" ".git"] + ["io.bitbucket." "https://bitbucket.org/" ".git"] + ["org.bitbucket." "https://bitbucket.org/" ".git"] + ["org.codeberg." "https://codeberg.org/" ".git"] + ["page.codeberg." "https://codeberg.org/" ".git"] + ["com.beanstalkapp." "https://" ".git"] + ["io.beanstalkapp." "https://" ".git"] + ["ht.sr." "https://git.sr.ht/" ""]]) + +(defn infer-git-url + [lib] + (when-let [lib-ns (namespace lib)] + (some + (fn [[prefix url-prefix suffix]] + (when (str/starts-with? lib-ns prefix) + (let [owner (subs lib-ns (count prefix))] + (if (str/includes? prefix "beanstalkapp") + (str url-prefix owner ".beanstalkapp.com/" (name lib) suffix) + (str url-prefix owner "/" (name lib) suffix))))) + git-url-hosts))) + +(defn- full-sha? [value] + (and (string? value) + (= 40 (count value)) + (boolean (re-matches #"[0-9a-fA-F]{40}" value)))) + +(defn- join-path [base path] + (if (or (nil? path) (= "" path)) + base + (str (str/replace base #"/+$" "") "/" path))) + +(defn canonical-local-root + [root base-dir host] + (let [candidate + (if (or (str/starts-with? root "/") + (boolean (re-matches #"[A-Za-z]:[\\/].*" root))) + root + (join-path (or base-dir ".") root)) + canonical ((or (:canonical-path host) (:absolute-path host) identity) + candidate)] + (when-not ((:exists? host) canonical) + (throw (ex-info (str "Local dependency does not exist: " canonical) + {:type :grenadine.coordinate/missing-local-root + :root canonical}))) + canonical)) + +(defn canonicalize + "Return a canonical coordinate. Git canonicalization may fetch its mirror." + [lib coordinate {:keys [host base-dir] :as opts}] + (case (coordinate-type coordinate) + :mvn + (let [v (:mvn/version coordinate)] + (when-not (and (string? v) (seq v)) + (throw (ex-info (str "Maven coordinate requires :mvn/version: " lib) + {:type :grenadine.coordinate/invalid-maven + :lib lib :coordinate coordinate}))) + (if (version/version-range? v) + (assoc coordinate :mvn/version + (or (version/exact-range-version v) + (repo/resolve-version-range + (let [[group artifact] (split-lib lib)] + {:group group :artifact artifact}) + v opts))) + coordinate)) + + :git + (let [coordinate (cond-> coordinate + (:sha coordinate) (assoc :git/sha (:sha coordinate)) + (:tag coordinate) (assoc :git/tag (:tag coordinate))) + coordinate (dissoc coordinate :sha :tag) + url (or (:git/url coordinate) (infer-git-url lib)) + sha (:git/sha coordinate) + tag (:git/tag coordinate)] + (when-not url + (throw (ex-info (str "Git coordinate has no URL and none can be inferred: " lib) + {:type :grenadine.coordinate/missing-git-url + :lib lib :coordinate coordinate}))) + (when-not (and (string? sha) (seq sha)) + (throw (ex-info (str "Git coordinate requires :git/sha: " lib) + {:type :grenadine.coordinate/missing-git-sha + :lib lib :coordinate coordinate}))) + (when (and (not tag) (not (full-sha? sha))) + (throw (ex-info (str "Git SHA must be complete unless paired with :git/tag: " lib) + {:type :grenadine.coordinate/incomplete-git-sha + :lib lib :coordinate coordinate}))) + (let [revision (or tag sha) + full (gitlibs/resolve-revision url revision opts)] + (when-not (str/starts-with? (str/lower-case full) + (str/lower-case sha)) + (throw (ex-info (str "Git SHA does not match resolved revision: " lib) + {:type :grenadine.coordinate/git-sha-mismatch + :lib lib :coordinate coordinate :resolved full}))) + (assoc coordinate :git/url url :git/sha full))) + + :local + (let [root (:local/root coordinate)] + (when-not (and (string? root) (seq root)) + (throw (ex-info (str "Local coordinate requires :local/root: " lib) + {:type :grenadine.coordinate/invalid-local + :lib lib :coordinate coordinate}))) + (assoc coordinate :local/root + (canonical-local-root root base-dir host))))) + +(defn dep-id + [coordinate] + (case (coordinate-type coordinate) + :mvn [:mvn (:mvn/version coordinate)] + :git [:git (:git/url coordinate) (:git/sha coordinate)] + :local [:local (:local/root coordinate)])) + +(defn compare-coordinates + [lib left right opts] + (let [left-type (coordinate-type left) + right-type (coordinate-type right)] + (when-not (= left-type right-type) + (throw (ex-info (str "Coordinate types are incomparable for " lib) + {:type :grenadine.coordinate/incomparable + :lib lib :left left :right right}))) + (case left-type + :mvn (version/compare-versions (:mvn/version left) (:mvn/version right)) + :git (do + (when-not (= (:git/url left) (:git/url right)) + (throw (ex-info (str "Git URLs are incomparable for " lib) + {:type :grenadine.coordinate/incomparable + :lib lib :left left :right right}))) + (gitlibs/compare-revisions (:git/url left) + (:git/sha left) + (:git/sha right) + opts)) + :local (if (= (:local/root left) (:local/root right)) + 0 + (throw (ex-info (str "Local roots are incomparable for " lib) + {:type :grenadine.coordinate/incomparable + :lib lib :left left :right right})))))) diff --git a/pkg/stdlib/grenadine/core.cljc b/pkg/stdlib/grenadine/core.cljc new file mode 100644 index 00000000..3cb1f62a --- /dev/null +++ b/pkg/stdlib/grenadine/core.cljc @@ -0,0 +1,67 @@ +(ns grenadine.core + "Portable Maven, Git, and local dependency resolution." + (:require [grenadine.basis :as basis] + [grenadine.expander :as expander] + [grenadine.graph :as graph] + [grenadine.lock :as lock] + [grenadine.pom :as pom] + [grenadine.repo :as repo])) + +(defn parse-pom + "Parse POM XML with the `:xml-parser` function in `opts`." + ([xml-source] + (parse-pom xml-source {})) + ([xml-source opts] + (pom/parse-pom xml-source opts))) + +(def interpolate pom/interpolate-string) +(def expand-deps expander/expand-deps) +(def emit-lock lock/emit-lock) +(def lock->classpath lock/lock->classpath) +(def fetch-lock! repo/fetch-lock!) +(def prepare-source-roots! repo/prepare-source-roots!) +(def calc-basis basis/calc-basis) + +(defn- cached-pom-provider + [opts] + (let [fetch-pom (or (:fetch-pom opts) (repo/pom-fetcher opts)) + cache (atom {})] + (fn [coords] + (let [key [(:group coords) (:artifact coords) (:version coords)]] + (if-let [cached (get @cache key)] + cached + (let [effective (pom/effective-pom coords fetch-pom opts)] + (swap! cache assoc key effective) + effective)))))) + +(defn effective-pom + "Build an effective POM using `:fetch-pom`, a coordinate-to-POM function." + [coords opts] + ((cached-pom-provider opts) coords)) + +(defn resolve-graph + "Resolve deps using an explicit `:pom-fn` or a repository-backed provider." + [deps opts] + (graph/resolve-graph + deps + (if (:pom-fn opts) + opts + (assoc opts :pom-fn (cached-pom-provider opts))))) + +(defn install! + "Resolve and install deps, returning classpath, lock, and warnings. + + Pass `:source-roots? true` to also extract and return portable Clojure source + roots for non-JVM runtimes." + [deps opts] + (let [result (basis/calc-basis {:deps deps} opts)] + {:classpath (:classpath-roots result) + :fetched (:grenadine/fetched result) + :cached (:grenadine/cached result) + :installed-libs (:grenadine/installed-libs result) + :already-libs (:grenadine/already-libs result) + :source-roots (:grenadine/source-roots result) + :lock (:grenadine/lock result) + :resolution (:grenadine/resolution result) + :basis result + :warnings (:grenadine/warnings result)})) diff --git a/pkg/stdlib/grenadine/expander.cljc b/pkg/stdlib/grenadine/expander.cljc new file mode 100644 index 00000000..a42eb824 --- /dev/null +++ b/pkg/stdlib/grenadine/expander.cljc @@ -0,0 +1,372 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +; which can be found in the file epl-v10.html at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. +; +; Portable adaptation of clojure.tools.deps at v0.31.1642. +; Grenadine adaptations Copyright 2026 Ingy döt Net and contributors, +; under EPL 1.0. +; See Provenance.md for the exact source mapping and changes. + +(ns grenadine.expander + "Portable tools.deps-style dependency tree expansion. + + Coordinate behavior is supplied with functions, so Maven, Git, local, and + test coordinates can share the same traversal and selection algorithm.") + +(defn- intersection + [left right] + (set (filter right left))) + +(defn- difference + [left right] + (set (remove right left))) + +(defn- excluded? + [base-lib exclusions path lib] + (let [lib (base-lib lib)] + (loop [search path] + (when (seq search) + (if (get-in exclusions [search lib]) + true + (recur (pop search))))))) + +(defn- update-excl + "Update exclusions and cuts for a new coordinate, another occurrence of an + existing coordinate, or an omitted coordinate." + [lib coord coord-id use-path include? reason exclusions cuts] + (let [coordinate-exclusions + (when (contains? coord :exclusions) + (set (:exclusions coord)))] + (cond + include? + (if (nil? coordinate-exclusions) + {:exclusions exclusions + :cuts cuts + :child-predicate (constantly true)} + {:exclusions (assoc exclusions use-path coordinate-exclusions) + :cuts (assoc cuts [lib coord-id] coordinate-exclusions) + :child-predicate + (fn [child] + (not (contains? coordinate-exclusions child)))}) + + (= reason :same-version) + (let [prior-cut (set (get cuts [lib coord-id])) + new-cut (intersection (set coordinate-exclusions) prior-cut)] + {:exclusions + (if (seq coordinate-exclusions) + (assoc exclusions use-path coordinate-exclusions) + exclusions) + :cuts (assoc cuts [lib coord-id] new-cut) + :child-predicate (difference prior-cut new-cut)}) + + :else + {:exclusions exclusions :cuts cuts}))) + +(defn- add-version + [version-map lib coord path coord-id] + (-> (or version-map {}) + (assoc-in [lib :versions coord-id] coord) + (update-in + [lib :paths] + (fn [paths] + (merge-with into {coord-id #{path}} paths))))) + +(defn- select-version + [version-map lib coord-id direct?] + (update-in version-map [lib] merge + (cond-> {:select coord-id} + direct? (assoc :top true)))) + +(defn- selected-version + [version-map lib] + (get-in version-map [lib :select])) + +(defn- selected-coord + [version-map lib] + (get-in version-map [lib :versions (selected-version version-map lib)])) + +(defn- selected-paths + [version-map lib] + (get-in version-map [lib :paths (selected-version version-map lib)])) + +(defn- parent-missing? + [version-map parent-path] + (loop [path parent-path alternatives nil] + (if (seq path) + (let [lib (last path) + parent (vec (butlast path)) + {:keys [paths select]} (get version-map lib) + selected-paths (get paths select)] + (if (contains? selected-paths parent) + (recur parent + (concat alternatives + (remove #(= parent %) selected-paths))) + (if (seq alternatives) + (recur (first alternatives) (rest alternatives)) + true))) + false))) + +(defn- path-prefix? + [prefix path] + (= prefix (vec (take (count prefix) path)))) + +(defn- deselect-orphans + [version-map omitted-paths] + (reduce + (fn [result [lib {:keys [select paths]}]] + (let [paths-to-selected (get paths select)] + (if (every? + (fn [path] + (some #(path-prefix? % path) omitted-paths)) + paths-to-selected) + (update-in result [lib] dissoc :select) + result))) + version-map + version-map)) + +(defn- warn! + [warnings on-warning warning] + (swap! warnings conj warning) + (when on-warning (on-warning warning))) + +(defn- not-comparable! + [lib candidate selected warnings on-warning error] + (warn! warnings on-warning + {:warning :versions-not-comparable + :lib lib + :selected selected + :candidate candidate + ;; the message alone: warnings are data that hosts render with + ;; pr-str, so an exception's printed form would drag in its class + ;; name and ex-data — and on Glojure it carries no message at all + :message (ex-message error)}) + false) + +(defn- newer? + [lib candidate selected compare-versions warnings on-warning + fail-on-incomparable?] + ;; Glojure resolves neither Exception nor Throwable; `go/any` is the catch-all + ;; it takes, the same split grenadine.test-support/throws? already makes. + #?(:glj + (try + (pos? (compare-versions lib candidate selected)) + (catch go/any error + (if fail-on-incomparable? + (throw error) + (not-comparable! lib candidate selected warnings on-warning error)))) + + :default + (try + (pos? (compare-versions lib candidate selected)) + (catch Exception error + (if fail-on-incomparable? + (throw error) + (not-comparable! lib candidate selected warnings on-warning error)))))) + +(defn- include-coord? + "Decide whether to select a coordinate and return the reason and updated + version map. This is the portable counterpart of tools.deps/include-coord?." + [version-map lib coord coord-id path exclusions + base-lib compare-versions warnings on-warning fail-on-incomparable?] + (cond + (empty? path) + {:include? true + :reason :new-top-dep + :version-map + (-> version-map + (add-version lib coord path coord-id) + (select-version lib coord-id true))} + + (excluded? base-lib exclusions path lib) + {:include? false :reason :excluded :version-map version-map} + + (get-in version-map [lib :top]) + {:include? false :reason :use-top :version-map version-map} + + (parent-missing? version-map path) + {:include? false :reason :parent-omitted :version-map version-map} + + (nil? (selected-version version-map lib)) + {:include? true + :reason :new-dep + :version-map + (-> version-map + (add-version lib coord path coord-id) + (select-version lib coord-id false))} + + (= coord-id (selected-version version-map lib)) + {:include? false + :reason :same-version + :version-map (add-version version-map lib coord path coord-id)} + + (newer? lib coord (selected-coord version-map lib) + compare-versions warnings on-warning fail-on-incomparable?) + {:include? true + :reason :newer-version + :version-map + (-> version-map + (add-version lib coord path coord-id) + (deselect-orphans + (set (map #(conj % lib) (selected-paths version-map lib)))) + (select-version lib coord-id false))} + + :else + {:include? false :reason :older-version :version-map version-map})) + +(defn- next-path + [pending queue index] + (if-let [path (first pending)] + {:path path + :pending (next pending) + :queue queue + :index index} + (if (< index (count queue)) + (let [item (nth queue index) + index (inc index)] + (if (:grenadine.expander/children item) + (let [{:keys [children parent-path child-predicate]} item + paths + (->> children + (filter (fn [[lib _]] (child-predicate lib))) + (map #(conj parent-path %)))] + (recur paths queue index)) + {:path item + :pending nil + :queue queue + :index index})) + {:path nil :pending nil :queue queue :index index}))) + +(defn- selected-libraries + [version-map] + (reduce + (fn [result [lib {:keys [select versions]}]] + (if select + (assoc result lib (get versions select)) + result)) + {} + version-map)) + +(defn expand-deps + "Expand dependencies with tools.deps-compatible version selection. + + Required options are `:coord-id`, `:coord-deps`, and `:compare-versions`. + Optional coordinate maps `:override-deps` and `:default-deps` are applied at + every occurrence. `:provided-libs` names host-supplied libraries that are + satisfied without selecting their coordinates or expanding their children. + The result contains selected `:libs`, stable inclusion `:order`, collected + `:warnings`, and, with `:trace?`, a tools.deps-shaped `:trace` containing + `:log` and `:vmap`." + [deps {:keys [coord-id coord-deps compare-versions known-coordinate? + base-lib override-deps default-deps trace? on-warning + fail-on-incomparable? provided-libs] + :or {known-coordinate? some? + base-lib identity + override-deps {} + default-deps {} + provided-libs #{}}}] + (when-not (and (ifn? coord-id) + (ifn? coord-deps) + (ifn? compare-versions)) + (throw + (ex-info "expand-deps requires coordinate functions" + {:type :grenadine.expander/missing-coordinate-function}))) + (let [warnings (atom []) + dependency-cache (atom {})] + (loop [pending nil + queue (mapv vector deps) + index 0 + version-map nil + exclusions nil + cuts nil + order [] + trace []] + (let [{:keys [path pending queue index]} + (next-path pending queue index)] + (if path + (let [[lib original-coordinate] (peek path) + parents (pop path) + use-path (conj parents lib) + coordinate + (or (get override-deps lib) + original-coordinate + (get default-deps lib))] + (if (contains? provided-libs (base-lib lib)) + (recur pending queue index version-map exclusions cuts + order + (if trace? + (conj trace + {:path (vec parents) + :lib lib + :coord coordinate + :orig-coord original-coordinate + :include false + :reason :provided}) + trace)) + (if (or (nil? coordinate) + (not (known-coordinate? coordinate))) + (do + (warn! warnings on-warning + {:warning :unsupported-coordinate + :lib lib + :coordinate coordinate}) + (recur pending queue index version-map exclusions cuts + order trace)) + (let [id (coord-id lib coordinate) + decision + (include-coord? + version-map lib coordinate id parents exclusions + base-lib compare-versions warnings on-warning + fail-on-incomparable?) + include? (:include? decision) + version-map (:version-map decision) + reason (:reason decision) + update + (update-excl + lib coordinate id use-path include? reason + exclusions cuts) + child-predicate (:child-predicate update) + children + (when child-predicate + (if-let [cached + (find @dependency-cache [lib id])] + (val cached) + (let [value (vec (coord-deps lib coordinate))] + (swap! dependency-cache assoc [lib id] value) + value))) + queue + (if child-predicate + (conj queue + {:grenadine.expander/children true + :children children + :parent-path use-path + :child-predicate child-predicate}) + queue) + trace + (if trace? + (conj trace + {:path (vec parents) + :lib lib + :coord coordinate + :orig-coord original-coordinate + :coord-id id + :include (boolean include?) + :reason reason}) + trace)] + (recur pending queue index version-map + (:exclusions update) (:cuts update) + (if include? (conj order lib) order) + trace))))) + (let [version-map + (reduce + (fn [result [lib entry]] + (if (:select entry) result (dissoc result lib))) + version-map + version-map)] + {:libs (selected-libraries version-map) + :order (vec (distinct order)) + :warnings @warnings + :trace (when trace? {:log trace :vmap version-map})})))))) diff --git a/pkg/stdlib/grenadine/gitlibs.cljc b/pkg/stdlib/grenadine/gitlibs.cljc new file mode 100644 index 00000000..c7de6fdb --- /dev/null +++ b/pkg/stdlib/grenadine/gitlibs.cljc @@ -0,0 +1,176 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) +; which can be found in the file epl-v10.html at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. +; +; Portable adaptation of org.clojure/tools.gitlibs at v2.6.217. +; Grenadine adaptations Copyright 2026 Ingy döt Net, under EPL 1.0. +; See Provenance.md for the exact source mapping and changes. + +(ns grenadine.gitlibs + "Portable tools.gitlibs-compatible Git cache operations." + (:require [clojure.string :as str])) + +(defn gitlibs-dir + "Resolve the Git cache directory. + + Explicit :gitlibs-dir wins, followed by GRENADINE_GITLIBS_DIR, GITLIBS, + and ~/.gitlibs." + [{:keys [host gitlibs-dir]}] + (or gitlibs-dir + (let [getenv (:getenv host)] + (when getenv + (let [value (getenv "GRENADINE_GITLIBS_DIR")] + (when (seq value) value)))) + (let [getenv (:getenv host)] + (when getenv + (let [value (getenv "GITLIBS")] + (when (seq value) value)))) + (str ((:home-dir host)) "/.gitlibs"))) + +(defn- git-command [{:keys [host]}] + (or (let [getenv (:getenv host)] + (when getenv + (let [value (getenv "GITLIBS_COMMAND")] + (when (seq value) value)))) + "git")) + +(defn clean-url + "Convert a Git URL into the tools.gitlibs mirror-cache relative path." + [url] + (let [[scheme host path] + (cond + (str/starts-with? url "file://") + ["file" nil (-> url (subs 7) + (str/replace #"^([^/])" "REL/$1"))] + + (str/includes? url "://") + (let [[_ scheme host path] + (re-matches + #"([a-z0-9+.-]+)://(?:(?:(?:[^@]+?)@)?([^/]+?)(?::[0-9]*)?)?(/[^:]+)" + url)] + [scheme host path]) + + (str/includes? url ":") + (let [[_ host path] + (re-matches #"(?:(?:[^@]+?)@)?(.+?):([^:]+)" url)] + ["ssh" host path]) + + :else + ["file" nil (str/replace url #"^([^/])" "REL/$1")]) + clean-path (-> path + (str/replace #"[.]git/?$" "") + (str/replace "~" "_TILDE_")) + parts (->> (concat [scheme host] (str/split clean-path #"/")) + (remove str/blank?) + (map #(get {"." "_DOT_" ".." "_DOTDOT_"} % %)))] + (str/join "/" parts))) + +(defn mirror-dir [url opts] + (str (gitlibs-dir opts) "/_repos/" (clean-url url))) + +(defn lib-dir [lib opts] + (str (gitlibs-dir opts) "/libs/" (namespace lib) "/" (name lib))) + +(defn checkout-dir [lib sha opts] + (str (lib-dir lib opts) "/" sha)) + +(defn- run + [opts args] + (let [host (:host opts) + run-process (:run-process host)] + (when-not run-process + (throw (ex-info "Git coordinates are not supported by this host" + {:type :grenadine.gitlibs/unsupported-host}))) + (let [result + (run-process + {:args (into [(git-command opts)] args) + :env {"GIT_TERMINAL_PROMPT" "0"}})] + result))) + +(defn- git-run! + [opts args message] + (let [{:keys [exit err] :as result} (run opts args)] + (when-not (zero? exit) + (throw (ex-info (str message (when (seq (str/trim err)) + (str ": " (str/trim err)))) + {:type :grenadine.gitlibs/git-failed + :args args + :exit exit + :err err}))) + result)) + +(defn ensure-mirror! + [url opts] + (let [host (:host opts) + mirror (mirror-dir url opts) + config (str mirror "/config")] + (when-not ((:exists? host) config) + ((:mkdirs! host) (subs mirror 0 (str/last-index-of mirror "/"))) + (git-run! opts ["clone" "--quiet" "--mirror" url mirror] + (str "Unable to clone " url))) + mirror)) + +(defn fetch! + [url opts] + (let [mirror (ensure-mirror! url opts)] + (git-run! opts ["--git-dir" mirror "fetch" "--quiet" "--all" "--tags" "--prune"] + (str "Unable to fetch " url)) + mirror)) + +(defn- parse-revision + [mirror revision opts] + (let [{:keys [exit out]} + (run opts ["--git-dir" mirror "rev-parse" (str revision "^{commit}")])] + (when (zero? exit) (str/trim out)))) + +(defn resolve-revision + "Resolve a SHA, SHA prefix, or tag to a full commit SHA." + [url revision opts] + (let [mirror (ensure-mirror! url opts)] + (or (parse-revision mirror revision opts) + (do (fetch! url opts) + (parse-revision mirror revision opts)) + (throw (ex-info (str "Unable to resolve Git revision " revision + " in " url) + {:type :grenadine.gitlibs/revision-not-found + :url url :revision revision}))))) + +(defn procure! + "Ensure a tools.gitlibs-layout checkout and return its canonical path." + [url lib sha opts] + (let [host (:host opts) + mirror (ensure-mirror! url opts) + checkout (checkout-dir lib sha opts)] + (when-not ((:exists? host) (str checkout "/.git")) + ((:mkdirs! host) (lib-dir lib opts)) + (when ((:exists? host) checkout) + ((or (:delete-tree! host) (:delete! host)) checkout)) + (git-run! opts ["--git-dir" mirror "worktree" "add" "--force" "--detach" + checkout sha] + (str "Unable to check out " lib " at " sha)) + (git-run! opts ["-C" checkout "submodule" "update" "--init" "--recursive" + "--quiet"] + (str "Unable to update submodules for " lib))) + ((or (:canonical-path host) identity) checkout))) + +(defn compare-revisions + "Compare two full SHAs by ancestry. Descendants sort after ancestors." + [url left right opts] + (if (= left right) + 0 + (let [mirror (ensure-mirror! url opts) + ancestor? + (fn [a b] + (= 0 (:exit (run opts ["--git-dir" mirror "merge-base" + "--is-ancestor" a b]))))] + (cond + (ancestor? left right) -1 + (ancestor? right left) 1 + :else + (throw (ex-info "Git revisions have no ancestry relationship" + {:type :grenadine.gitlibs/unrelated-revisions + :url url :left left :right right})))))) diff --git a/pkg/stdlib/grenadine/graph.cljc b/pkg/stdlib/grenadine/graph.cljc new file mode 100644 index 00000000..20a89c75 --- /dev/null +++ b/pkg/stdlib/grenadine/graph.cljc @@ -0,0 +1,351 @@ +(ns grenadine.graph + "Pure path-aware dependency graph traversal and version mediation." + (:require [grenadine.coordinate :as coordinate] + [grenadine.expander :as expander] + [grenadine.version :as version])) + +(defn- split-lib + [lib] + (coordinate/split-lib lib)) + +(defn- ga + [{:keys [group artifact classifier]}] + (coordinate/lib-key group artifact classifier)) + +(defn- base-ga + [{:keys [group artifact]}] + [group artifact]) + +(defn- gav + [{:keys [version] :as coordinate}] + (conj (ga coordinate) version)) + +(defn- coord-order + [{:keys [version] :as coordinate}] + (conj (ga coordinate) version)) + +(defn- normalize-exclusions + [exclusions] + (set + (map + (fn [exclusion] + (if (map? exclusion) + (base-ga exclusion) + (let [[group artifact] (split-lib exclusion)] + [group artifact]))) + exclusions))) + +(defn- normalize-provided-libs + [provided-libs] + (set + (map + (fn [lib] + (let [[group artifact] (split-lib lib)] + [group artifact])) + provided-libs))) + +(defn- root-coordinates + [deps] + (->> deps + (map + (fn [entry] + (let [[lib coordinate] entry + [group artifact classifier] (split-lib lib) + version (:mvn/version coordinate)] + (when-not version + (throw + (ex-info (str "Dependency requires :mvn/version: " lib) + {:type :grenadine.graph/unsupported-coordinate + :lib lib + :coordinate coordinate}))) + {:coords (cond-> {:group group :artifact artifact :version version} + classifier (assoc :classifier classifier)) + :edge-exclusions + (normalize-exclusions (:exclusions coordinate #{}))}))) + (sort-by #(coord-order (:coords %))) + vec)) + +(defn- kept-scope? + [scope] + (or (nil? scope) + (= scope "compile") + (= scope "runtime"))) + +(defn- occurrence + [state order] + {:coords (:coords state) + :depth (:depth state) + :order order + :via (:via state) + :scope (or (:scope state) "compile") + :direct? (zero? (:depth state))}) + +(defn- omitted + [state reason] + {:coords (:coords state) + :via (:via state) + :reason reason}) + +(defn- enumerate + [deps {:keys [pom-fn include-optional? exclusions provided-libs]}] + (when-not pom-fn + (throw (ex-info "resolve-graph requires :pom-fn" + {:type :grenadine.graph/missing-pom-fn}))) + (let [global-exclusions (normalize-exclusions exclusions) + provided-libs (normalize-provided-libs provided-libs) + initial + (mapv + (fn [{:keys [coords edge-exclusions]}] + {:coords coords + :depth 0 + :via [coords] + :blocked global-exclusions + :edge-exclusions edge-exclusions + :scope "compile"}) + (root-coordinates deps))] + (loop [queue initial + index 0 + order 0 + occurrences [] + graph {} + omitted-items [] + warnings []] + (if (= index (count queue)) + {:occurrences occurrences + :graph graph + :omitted omitted-items + :warnings warnings} + (let [state (nth queue index) + coords (:coords state) + path-gavs (set (map gav (butlast (:via state))))] + (cond + (contains? provided-libs (base-ga coords)) + (recur queue (inc index) order occurrences graph + (conj omitted-items (omitted state :provided)) + warnings) + + (contains? (:blocked state) (base-ga coords)) + (recur queue (inc index) order occurrences graph + (conj omitted-items (omitted state :excluded)) + warnings) + + (not (kept-scope? (:scope state))) + (recur queue (inc index) order occurrences graph + (conj omitted-items (omitted state :scope)) + warnings) + + (and (:optional state) (not include-optional?)) + (recur queue (inc index) order occurrences graph + (conj omitted-items (omitted state :optional)) + warnings) + + (contains? path-gavs (gav coords)) + (recur queue (inc index) order occurrences graph + (conj omitted-items (omitted state :cycle)) + warnings) + + :else + (let [pom (pom-fn coords) + children (:deps pom) + child-blocked + (into (:blocked state) (:edge-exclusions state)) + next-states + (mapv + (fn [dependency] + (let [child-coords + (select-keys dependency + [:group :artifact :classifier :version])] + {:coords child-coords + :depth (inc (:depth state)) + :via (conj (:via state) child-coords) + :blocked child-blocked + :edge-exclusions + (normalize-exclusions (:exclusions dependency #{})) + :scope (:scope dependency) + :optional (:optional dependency)})) + children)] + (recur + (into queue next-states) + (inc index) + (inc order) + (conj occurrences (occurrence state order)) + (assoc graph (gav coords) (mapv :coords next-states)) + omitted-items + warnings)))))))) + +(defn- nearer + [left right] + (if (neg? (compare [(:depth left) (:order left)] + [(:depth right) (:order right)])) + left + right)) + +(defn- newer + [left right] + (let [comparison + (version/compare-versions + (get-in left [:coords :version]) + (get-in right [:coords :version]))] + (cond + (pos? comparison) left + (neg? comparison) right + (< (:order left) (:order right)) left + :else right))) + +(defn- choose + [mode candidates] + (case mode + :nearest (reduce nearer candidates) + :newest (reduce newer candidates) + :tools-deps + (let [direct (filter :direct? candidates)] + (if (seq direct) + (reduce nearer direct) + (reduce newer candidates))) + (throw (ex-info (str "Unknown mediation mode: " mode) + {:type :grenadine.graph/invalid-mediation + :mediation mode})))) + +(defn- select-occurrences + [mode occurrences] + (into {} + (map + (fn [entry] + [(key entry) (choose mode (val entry))]) + (group-by #(ga (:coords %)) occurrences)))) + +(defn- selected-signature + [selected] + (into {} + (map (fn [entry] [(key entry) (gav (:coords (val entry)))]) + selected))) + +(defn- active-occurrence? + [selected candidate] + (every? + (fn [coords] + (= (gav coords) + (some-> (get selected (ga coords)) :coords gav))) + (:via candidate))) + +(defn- mediate + [mode occurrences] + (loop [selected (select-occurrences mode occurrences)] + (let [active (filter #(active-occurrence? selected %) occurrences) + next-selected (select-occurrences mode active)] + (if (= (selected-signature selected) + (selected-signature next-selected)) + {:selected next-selected :active (vec active)} + (recur next-selected))))) + +(defn- tools-coordinate + [coordinate] + (cond-> (select-keys coordinate [:group :artifact :classifier :version]) + (seq (:exclusions coordinate)) + (assoc :exclusions (normalize-exclusions (:exclusions coordinate))))) + +(defn- tools-deps-expansion + [deps {:keys [pom-fn include-optional? exclusions provided-libs]}] + (let [global-exclusions (normalize-exclusions exclusions) + provided-libs (normalize-provided-libs provided-libs) + roots + (->> (root-coordinates deps) + (remove #(or (contains? global-exclusions (base-ga (:coords %))) + (contains? provided-libs (base-ga (:coords %))))) + (mapv + (fn [{:keys [coords edge-exclusions]}] + [(ga coords) + (cond-> coords + (seq edge-exclusions) + (assoc :exclusions edge-exclusions))])))] + (expander/expand-deps + roots + {:coord-id (fn [_ coordinate] (gav coordinate)) + :known-coordinate? + (fn [coordinate] + (and (map? coordinate) (seq (:version coordinate)))) + :compare-versions + (fn [_ left right] + (version/compare-versions (:version left) (:version right))) + :coord-deps + (fn [_ coordinate] + (->> (:deps (pom-fn coordinate)) + (filter #(and (kept-scope? (:scope %)) + (or include-optional? (not (:optional %))) + (not (contains? global-exclusions (base-ga %))) + (not (contains? provided-libs (base-ga %))))) + (mapv (fn [dependency] + [(ga dependency) (tools-coordinate dependency)]))))}))) + +(defn- expanded-selection + [occurrences libraries] + (into + {} + (map + (fn [[key coordinate]] + (let [matches + (filter #(= (gav coordinate) (gav (:coords %))) occurrences) + selected + (if (seq matches) + (reduce nearer matches) + {:coords (select-keys coordinate + [:group :artifact :classifier :version]) + :depth 0 + :order 0 + :via [(select-keys coordinate + [:group :artifact :classifier :version])] + :scope "compile" + :direct? true})] + [key selected])) + libraries))) + +(defn- tools-deps-mediate + [occurrences expansion] + (let [selected (expanded-selection occurrences (:libs expansion))] + {:selected selected + :active (vec (filter #(active-occurrence? selected %) occurrences)) + :warnings (:warnings expansion)})) + +(defn resolve-graph + "Resolve Maven dependency occurrences and mediate versions. + + `deps` is a deps.edn-style dependency map. `:pom-fn` must return an effective + POM. The result's `:selected` map is keyed by `[group artifact]`, where a + classifier is represented as `artifact$classifier`." + [deps opts] + (let [enumerated (enumerate deps opts) + mode (:mediation opts :newest) + mediated + (if (= mode :tools-deps) + (tools-deps-mediate + (:occurrences enumerated) + (tools-deps-expansion deps opts)) + (mediate mode (:occurrences enumerated))) + selected (:selected mediated) + active (:active mediated) + grouped (group-by #(ga (:coords %)) (:occurrences enumerated)) + conflicts + (mapcat + (fn [entry] + (let [key (key entry) + winner (get selected key)] + (->> (val entry) + (remove #(= (gav (:coords %)) (gav (:coords winner)))) + (map #(assoc (select-keys % [:coords :via]) + :reason :version-conflict))))) + grouped)] + {:selected selected + :graph + (into {} + (filter + (fn [entry] + (let [version (peek (key entry)) + lib-key (pop (key entry))] + (= version + (get-in selected + [lib-key :coords :version]))))) + (:graph enumerated)) + :omitted (vec (concat (:omitted enumerated) conflicts)) + :warnings (vec (concat (:warnings enumerated) + (:warnings mediated))) + :occurrences active})) diff --git a/pkg/stdlib/grenadine/lock.cljc b/pkg/stdlib/grenadine/lock.cljc new file mode 100644 index 00000000..2cc9969e --- /dev/null +++ b/pkg/stdlib/grenadine/lock.cljc @@ -0,0 +1,88 @@ +(ns grenadine.lock + "Pure Grenadine lockfile construction." + (:require [clojure.string :as str] + [grenadine.gitlibs :as gitlibs] + [grenadine.version :as version])) + +(def default-repos + [{:id "central" :url "https://repo.maven.apache.org/maven2/"} + {:id "clojars" :url "https://repo.clojars.org/"}]) + +(defn artifact-path + [{:keys [group artifact version classifier]}] + (let [directory (str (str/replace group "." "/") + "/" artifact "/" + (version/snapshot-base-version version) "/") + filename (str artifact "-" version + (when classifier (str "-" classifier)) + ".jar")] + (str directory filename))) + +(defn- repo-url + [repo] + (if (map? repo) (:url repo) repo)) + +(defn- gav + [{:keys [group artifact version classifier]}] + [group (str artifact (when classifier (str "$" classifier))) version]) + +(defn emit-lock + "Convert a resolution into stable lockfile data. + + `:pom-fn` identifies graph-only `pom` packaging. `:repo-fn` may choose a + repository index for each coordinate and defaults to the first repository. + `:integrity` is an optional GAV-keyed map containing :sha256 and :size." + [resolution {:keys [repos pom-fn repo-fn integrity] + :or {repos default-repos + repo-fn (fn [_] 0)}}] + (let [repo-urls (mapv repo-url repos) + artifacts + (->> (:selected resolution) + vals + (map :coords) + (sort-by (juxt :group :artifact :classifier :version)) + (keep + (fn [coords] + (let [pom (when pom-fn (pom-fn coords)) + packaging (or (:packaging pom) "jar")] + (when (not= packaging "pom") + (merge + {:group (:group coords) + :artifact (:artifact coords) + :version (:version coords) + :packaging packaging + :path (artifact-path coords) + :repo (repo-fn coords)} + (select-keys coords [:classifier]) + (select-keys (get integrity (gav coords)) + [:sha256 :size])))))) + vec)] + {:lock/version 1 + :repos repo-urls + :artifacts artifacts})) + +(defn lock->classpath + "Return local artifact paths without touching the filesystem." + [lock {:keys [local-repo] :as opts}] + (let [local-repo + (loop [value local-repo] + (if (and (seq value) + (= \/ (nth value (dec (count value))))) + (recur (subs value 0 (dec (count value)))) + value))] + (if (= 2 (:lock/version lock)) + (vec + (mapcat + (fn [{:keys [lib coord classpath]}] + (map + (fn [{:keys [type path]}] + (case type + :mvn (str local-repo "/" path) + :git (str (gitlibs/checkout-dir lib (:git/sha coord) opts) + (when (seq path) (str "/" path))) + :local path)) + classpath)) + (:libs lock))) + (mapv #(str local-repo + "/" (:path %)) + (:artifacts lock))))) diff --git a/pkg/stdlib/grenadine/pom.cljc b/pkg/stdlib/grenadine/pom.cljc new file mode 100644 index 00000000..9e4bd1c5 --- /dev/null +++ b/pkg/stdlib/grenadine/pom.cljc @@ -0,0 +1,353 @@ +;; This portable effective-POM implementation is tested against Apache Maven +;; behavior but does not embed Maven Model Builder source. See Provenance.md. +(ns grenadine.pom + "Pure Maven POM normalization and effective-model construction." + (:require [clojure.string :as str] + [grenadine.xml-tree :as xml])) + +(defn- elements + [node tag] + (xml/elements node tag)) + +(defn- element + [node tag] + (xml/element node tag)) + +(defn- text + [node] + (xml/text node)) + +(defn- field + [node tag] + (text (element node tag))) + +(defn- present + [m key value] + (if (nil? value) m (assoc m key value))) + +(defn- parse-exclusion + [node] + {:group (field node :groupId) + :artifact (field node :artifactId)}) + +(defn- parse-dependency + [node] + (let [exclusions-node (element node :exclusions) + exclusions + (if exclusions-node + (->> (elements exclusions-node :exclusion) + (map parse-exclusion) + (remove #(or (nil? (:group %)) (nil? (:artifact %)))) + set) + #{})] + (-> {:group (field node :groupId) + :artifact (field node :artifactId) + :exclusions exclusions} + (present :version (field node :version)) + (present :scope (field node :scope)) + (present :type (field node :type)) + (present :classifier (field node :classifier)) + (present :optional + (when-let [value (field node :optional)] + (= "true" (str/lower-case value))))))) + +(defn- parse-dependencies + [node] + (if node + (mapv parse-dependency (elements node :dependency)) + [])) + +(defn- parse-properties + [node] + (if node + (reduce + (fn [result child] + (if (map? child) + (assoc result (name (:tag child)) (or (text child) "")) + result)) + {} + (:content node)) + {})) + +(defn parse-pom + "Parse POM XML into a canonical raw model. No inheritance or interpolation is + performed here." + ([xml-source] + (parse-pom xml-source {})) + ([xml-source opts] + (let [project (xml/parse xml-source opts)] + (when-not (xml/tag? project :project) + (throw (ex-info "POM document root must be " + {:type :grenadine.pom/not-project + :tag (:tag project)}))) + (let [parent-node (element project :parent) + parent + (when parent-node + {:group (field parent-node :groupId) + :artifact (field parent-node :artifactId) + :version (field parent-node :version)}) + management-node + (some-> (element project :dependencyManagement) + (element :dependencies))] + {:model-version (field project :modelVersion) + :declared-coords + {:group (field project :groupId) + :artifact (field project :artifactId) + :version (field project :version)} + :parent parent + :packaging (or (field project :packaging) "jar") + :properties (parse-properties (element project :properties)) + :dependency-management (parse-dependencies management-node) + :dependencies + (parse-dependencies (element project :dependencies))})))) + +(defn- coords-key + [{:keys [group artifact version]}] + (str group "/" artifact "@" version)) + +(defn- unresolved-property? + [value] + (and (string? value) (str/includes? value "${"))) + +(defn- find-property-end + [value offset] + (loop [i offset] + (cond + (= i (count value)) nil + (= \} (nth value i)) i + :else (recur (inc i))))) + +(declare interpolate-value) + +(defn- property-value + [properties key trail] + (if (some #(= key %) trail) + (throw + (ex-info (str "Property interpolation cycle: " + (str/join " -> " (conj trail key))) + {:type :grenadine.pom/property-cycle + :properties (conj trail key)})) + (when-let [value (get properties key)] + (interpolate-value value properties (conj trail key))))) + +(defn- interpolate-value + [value properties trail] + (if (not (string? value)) + value + (loop [i 0 piece-start 0 pieces []] + (if (= i (count value)) + (apply str (conj pieces (subs value piece-start))) + (if (and (= \$ (nth value i)) + (< (inc i) (count value)) + (= \{ (nth value (inc i)))) + (if-let [end (find-property-end value (+ i 2))] + (let [key (subs value (+ i 2) end) + replacement (property-value properties key trail)] + (recur (inc end) + (inc end) + (conj pieces + (subs value piece-start i) + (if (nil? replacement) + (subs value i (inc end)) + replacement)))) + (recur (inc i) piece-start pieces)) + (recur (inc i) piece-start pieces)))))) + +(defn interpolate-string + "Interpolate Maven-style `${name}` references in a string. Unknown + properties remain visible so callers can distinguish them from empty values." + [value properties] + (interpolate-value value properties [])) + +(defn- interpolate-map + [m properties] + (reduce + (fn [result entry] + (let [key (key entry) + value (val entry)] + (assoc result key + (cond + (string? value) (interpolate-string value properties) + (set? value) (set (map #(interpolate-map % properties) value)) + :else value)))) + {} + m)) + +(defn- dep-key + [{:keys [group artifact type classifier]}] + [group artifact (or type "jar") classifier]) + +(defn- merge-ordered + "Merge ordered dependency vectors by Maven identity. A later declaration + replaces the earlier value without moving its position." + [base additions] + (reduce + (fn [result dependency] + (let [key (dep-key dependency) + index (first + (keep-indexed + (fn [i existing] + (when (= key (dep-key existing)) i)) + result))] + (if (nil? index) + (conj result dependency) + (assoc result index dependency)))) + (vec base) + additions)) + +(defn- builtin-properties + [coords parent packaging] + (merge + {"project.groupId" (:group coords) + "pom.groupId" (:group coords) + "groupId" (:group coords) + "project.artifactId" (:artifact coords) + "pom.artifactId" (:artifact coords) + "artifactId" (:artifact coords) + "project.version" (:version coords) + "pom.version" (:version coords) + "version" (:version coords) + "project.packaging" packaging + "pom.packaging" packaging} + (when parent + {"project.parent.groupId" (get-in parent [:coords :group]) + "project.parent.artifactId" (get-in parent [:coords :artifact]) + "project.parent.version" (get-in parent [:coords :version]) + "parent.groupId" (get-in parent [:coords :group]) + "parent.artifactId" (get-in parent [:coords :artifact]) + "parent.version" (get-in parent [:coords :version])}))) + +(defn- assert-resolved-coordinate + [context dependency] + (doseq [key [:group :artifact :version]] + (let [value (get dependency key)] + (when (or (nil? value) (unresolved-property? value)) + (throw + (ex-info (str "Unresolved " (name key) " in " context) + {:type :grenadine.pom/unresolved-coordinate + :context context + :field key + :dependency dependency}))))) + dependency) + +(declare effective-pom*) + +(defn- import-boms + [management fetch-pom path opts] + (reduce + (fn [result dependency] + (if (and (= "import" (:scope dependency)) + (= "pom" (or (:type dependency) "jar"))) + (let [coords (select-keys dependency [:group :artifact :version]) + bom (effective-pom* coords fetch-pom path opts)] + (merge-ordered result (vals (:dep-management bom)))) + result)) + [] + management)) + +(defn- apply-management + [management dependency] + (if-let [managed (get management (dep-key dependency))] + (let [explicit-exclusions (:exclusions dependency) + merged (merge managed dependency)] + (assoc merged :exclusions + (if (seq explicit-exclusions) + explicit-exclusions + (:exclusions managed #{})))) + dependency)) + +(defn- effective-pom* + [coords fetch-pom path opts] + (let [identity (coords-key coords)] + (when (some #(= identity %) path) + (throw + (ex-info (str "POM parent/BOM cycle: " + (str/join " -> " (conj path identity))) + {:type :grenadine.pom/model-cycle + :coordinates (conj path identity)}))) + (let [raw-source (fetch-pom coords) + raw (if (string? raw-source) + (parse-pom raw-source opts) + raw-source)] + (when-not raw + (throw (ex-info (str "POM not found: " identity) + {:type :grenadine.pom/not-found + :coords coords}))) + (let [next-path (conj path identity) + parent-coords (:parent raw) + parent (when parent-coords + (effective-pom* + (assert-resolved-coordinate "parent" parent-coords) + fetch-pom + next-path + opts)) + declared (:declared-coords raw) + preliminary-coords + {:group (or (:group declared) (get-in parent [:coords :group])) + :artifact (:artifact declared) + :version (or (:version declared) (get-in parent [:coords :version]))} + inherited-properties (or (:properties parent) {}) + raw-properties (merge inherited-properties (:properties raw)) + properties-with-builtins + (merge raw-properties + (builtin-properties preliminary-coords + parent + (:packaging raw))) + coords + (assert-resolved-coordinate + "project" + (interpolate-map preliminary-coords properties-with-builtins)) + all-properties + (merge raw-properties + (builtin-properties coords parent (:packaging raw))) + properties + (reduce + (fn [result entry] + (assoc result + (key entry) + (interpolate-string (val entry) all-properties))) + {} + raw-properties) + interpolation-context + (merge properties (builtin-properties coords parent (:packaging raw))) + declared-management + (mapv #(interpolate-map % interpolation-context) + (:dependency-management raw)) + imported-management + (import-boms declared-management fetch-pom next-path opts) + parent-management (or (:dep-management parent) {}) + management-entries + (merge-ordered + (vals parent-management) + (concat imported-management + (remove #(= "import" (:scope %)) + declared-management))) + management + (into {} (map (fn [dependency] + [(dep-key dependency) dependency]) + management-entries)) + declared-dependencies + (mapv + (fn [dependency] + (->> (interpolate-map dependency interpolation-context) + (apply-management management) + (assert-resolved-coordinate "dependency"))) + (:dependencies raw)) + dependencies + (merge-ordered (or (:deps parent) []) declared-dependencies)] + {:coords coords + :packaging + (interpolate-string (:packaging raw) interpolation-context) + :properties properties + :dep-management management + :deps dependencies})))) + +(defn effective-pom + "Build an effective POM for `coords`. + + `fetch-pom` is a pure lookup function from coordinate map to either XML text + or a canonical raw model returned by `parse-pom`." + ([coords fetch-pom] + (effective-pom coords fetch-pom {})) + ([coords fetch-pom opts] + (effective-pom* coords fetch-pom [] opts))) diff --git a/pkg/stdlib/grenadine/repo.cljc b/pkg/stdlib/grenadine/repo.cljc new file mode 100644 index 00000000..c6d44f51 --- /dev/null +++ b/pkg/stdlib/grenadine/repo.cljc @@ -0,0 +1,383 @@ +(ns grenadine.repo + "Effectful Maven repository operations expressed through a host function map." + (:require [clojure.string :as str] + [grenadine.lock :as lock] + [grenadine.version :as version] + [grenadine.xml-tree :as xml])) + +(defn- require-host + [host keys] + (doseq [key keys] + (when-not (fn? (get host key)) + (throw (ex-info (str "Host is missing " key) + {:type :grenadine.repo/incomplete-host + :key key})))) + host) + +(defn local-repo + "Return the Maven local repository path. + + An explicit `:local-repo` wins, followed by + `GRENADINE_MAVEN_REPOSITORY`, then `$HOME/.m2/repository`." + [{:keys [host local-repo]}] + (or local-repo + (let [getenv (:getenv host) + configured (when (fn? getenv) + (getenv "GRENADINE_MAVEN_REPOSITORY"))] + (when (seq configured) configured)) + (str ((:home-dir host)) "/.m2/repository"))) + +(defn- trim-trailing-slashes + [value] + (loop [value value] + (if (and (seq value) (= \/ (nth value (dec (count value))))) + (recur (subs value 0 (dec (count value)))) + value))) + +(defn- parent-path + [path] + (if-let [slash (str/last-index-of path "/")] + (subs path 0 slash) + ".")) + +(defn- pom-path + [{:keys [group artifact version]}] + (str (str/replace group "." "/") + "/" artifact "/" (version/snapshot-base-version version) "/" + artifact "-" version ".pom")) + +(defn- remote-url + [repo path] + (str (trim-trailing-slashes + (if (map? repo) (:url repo) repo)) + "/" path)) + +(defn- child-elements + [node tag] + (xml/elements node tag)) + +(defn- child-element + [node tag] + (xml/element node tag)) + +(defn- element-text + [node] + (xml/text node)) + +(defn- metadata-data + [source opts] + (let [metadata (xml/parse source opts) + versioning (child-element metadata :versioning) + release (element-text (child-element versioning :release)) + latest (element-text (child-element versioning :latest)) + versions-node (child-element versioning :versions) + versions + (->> (child-elements versions-node :version) + (keep element-text) + vec)] + {:release release :latest latest :versions versions})) + +(defn- metadata-version + [source opts] + (let [{:keys [release latest versions]} (metadata-data source opts)] + (or release + latest + (reduce + (fn [selected candidate] + (if (or (nil? selected) (version/newer? candidate selected)) + candidate + selected)) + nil + (remove #(str/ends-with? (str/upper-case %) "-SNAPSHOT") + versions))))) + +(defn resolve-version-range + "Resolve a Maven version range to the highest matching repository version." + [{:keys [group artifact] :as coords} range-spec + {:keys [host repos] :as opts}] + (require-host host [:http-get :bytes->utf8]) + (let [path (str (str/replace group "." "/") + "/" artifact "/maven-metadata.xml") + repos (or repos lock/default-repos) + parsed-range (version/parse-version-range range-spec) + candidates + (mapcat + (fn [repository] + (let [url (remote-url repository path) + response ((:http-get host) url)] + (if (= 200 (:status response)) + (try + (:versions + (metadata-data ((:bytes->utf8 host) (:body response)) opts)) + (catch Exception error + (throw + (ex-info (str "Invalid Maven metadata for " + group "/" artifact) + {:type :grenadine.repo/invalid-metadata + :coords coords + :url url} + error)))) + []))) + repos) + matching (filter #(version/in-range? % parsed-range) + (distinct candidates)) + selected + (reduce + (fn [current candidate] + (if (or (nil? current) (version/newer? candidate current)) + candidate + current)) + nil + matching)] + (or selected + (throw + (ex-info (str "No Maven version satisfies " group "/" artifact + " " range-spec) + {:type :grenadine.repo/version-range-not-found + :coords coords + :range range-spec}))))) + +(defn latest-version + "Return the latest Maven release for a group/artifact coordinate. + + Repositories are tried in order. Metadata `release` wins, followed by + `latest`, then the highest listed non-SNAPSHOT version." + [{:keys [group artifact] :as coords} {:keys [host repos] :as opts}] + (require-host host [:http-get :bytes->utf8]) + (let [path (str (str/replace group "." "/") + "/" artifact "/maven-metadata.xml") + repos (or repos lock/default-repos)] + (loop [remaining repos] + (if-let [repository (first remaining)] + (let [url (remote-url repository path) + response ((:http-get host) url)] + (if (= 200 (:status response)) + (let [candidate + (try + (metadata-version ((:bytes->utf8 host) (:body response)) + opts) + (catch Exception error + (throw + (ex-info (str "Invalid Maven metadata for " + group "/" artifact) + {:type :grenadine.repo/invalid-metadata + :coords coords + :url url} + error))))] + (if candidate + candidate + (recur (next remaining)))) + (recur (next remaining)))) + (throw + (ex-info (str "No Maven release found for " group "/" artifact) + {:type :grenadine.repo/version-not-found + :coords coords})))))) + +(defn- successful? + [response] + (= 200 (:status response))) + +(defn- write-atomically! + [host target bytes] + (let [temporary (str target ".grenadine.part")] + ((:mkdirs! host) (parent-path target)) + (when ((:exists? host) temporary) + ((:delete! host) temporary)) + ((:write-bytes! host) temporary bytes) + ((:atomic-move! host) temporary target))) + +(defn pom-fetcher + "Return a coordinate-to-POM-text function backed by local Maven cache and + ordered HTTP repositories." + [{:keys [host repos] :as opts}] + (require-host host + [:http-get :read-bytes :write-bytes! :bytes->utf8 + :exists? :mkdirs! :atomic-move! :delete! :home-dir]) + (let [base (trim-trailing-slashes (local-repo opts)) + repos (or repos lock/default-repos)] + (fn [coords] + (let [relative (pom-path coords) + target (str base "/" relative)] + (if ((:exists? host) target) + ((:bytes->utf8 host) ((:read-bytes host) target)) + (loop [remaining repos] + (when-let [repo (first remaining)] + (let [response ((:http-get host) (remote-url repo relative))] + (if (successful? response) + (do + (write-atomically! host target (:body response)) + ((:bytes->utf8 host) (:body response))) + (recur (next remaining))))))))))) + +(defn- first-word + [value] + (let [value (str/trim value) + end (first + (keep-indexed + (fn [i c] (when (or (= c \space) (= c \tab)) i)) + value))] + (if end (subs value 0 end) value))) + +(defn- sha1-sidecar + [host url] + (let [response ((:http-get host) (str url ".sha1"))] + (when (successful? response) + (let [value (first-word + ((:bytes->utf8 host) (:body response)))] + (when (seq value) (str/lower-case value)))))) + +(defn- integrity + [host bytes] + {:sha256 (str/lower-case ((:digest host) :sha256 bytes)) + :size ((:byte-count host) bytes)}) + +(defn- verify-bytes + [host artifact bytes remote-sha1] + (let [actual (integrity host bytes) + expected-sha256 (some-> (:sha256 artifact) str/lower-case) + actual-sha1 + (when (and (nil? expected-sha256) remote-sha1) + (str/lower-case ((:digest host) :sha1 bytes))) + valid? + (cond + expected-sha256 (= expected-sha256 (:sha256 actual)) + remote-sha1 (= remote-sha1 actual-sha1) + :else true)] + {:valid? valid? + :actual actual + :verified-by + (cond expected-sha256 :sha256 remote-sha1 :sha1 :else nil)})) + +(defn- artifact-url + [lock artifact] + (when-let [repo (get (:repos lock) (:repo artifact))] + (remote-url repo (:path artifact)))) + +(defn- fetch-artifact + [host lock artifact] + (let [preferred (:repo artifact) + indices (concat [preferred] + (remove #(= preferred %) + (range (count (:repos lock)))))] + (loop [remaining indices last-response nil] + (if-let [repo-index (first remaining)] + (if-let [repo (get (:repos lock) repo-index)] + (let [url (remote-url repo (:path artifact)) + response ((:http-get host) url)] + (if (successful? response) + {:repo repo-index :url url :response response} + (recur (next remaining) response))) + (recur (next remaining) last-response)) + {:response last-response})))) + +(defn fetch-lock! + "Install every artifact in a lock. + + Existing SHA-256 values are mandatory when supplied. Otherwise a remote + SHA-1 sidecar is used when available. The returned `:lock` is enriched with + computed SHA-256 and size values even though those fields remain optional in + accepted input locks." + [lock {:keys [host on-install] :as opts}] + (require-host host + [:http-get :read-bytes :write-bytes! :bytes->utf8 + :digest :byte-count :exists? :mkdirs! :atomic-move! + :delete! :home-dir]) + (let [base (trim-trailing-slashes (local-repo opts))] + (loop [remaining (:artifacts lock) + enriched [] + fetched [] + cached [] + failed [] + warnings []] + (if-let [artifact (first remaining)] + (let [target (str base "/" (:path artifact)) + present? ((:exists? host) target) + download (when-not present? + (fetch-artifact host lock artifact)) + url (or (:url download) (artifact-url lock artifact)) + response (:response download) + artifact (if-let [repo-index (:repo download)] + (assoc artifact :repo repo-index) + artifact) + bytes (if present? + ((:read-bytes host) target) + (when (successful? response) (:body response)))] + (if (nil? bytes) + (recur (next remaining) enriched fetched cached + (conj failed + {:artifact artifact + :reason (if url :download-failed :missing-repository) + :status (:status response)}) + warnings) + (let [remote-sha1 + (when (and (nil? (:sha256 artifact)) + (not present?) + url) + (sha1-sidecar host url)) + verification + (verify-bytes host artifact bytes remote-sha1)] + (if-not (:valid? verification) + (recur (next remaining) enriched fetched cached + (conj failed + {:artifact artifact + :reason :checksum-mismatch + :actual (:actual verification)}) + warnings) + (do + (when-not present? + (write-atomically! host target bytes) + (when (fn? on-install) + (on-install artifact))) + (recur + (next remaining) + (conj enriched (merge artifact (:actual verification))) + (if present? fetched (conj fetched artifact)) + (if present? (conj cached artifact) cached) + failed + (if (or present? (:verified-by verification)) + warnings + (conj warnings + {:artifact artifact + :warning :unverified-artifact})))))))) + {:lock (assoc lock :artifacts enriched) + :fetched fetched + :cached cached + :failed failed + :warnings warnings})))) + +(defn prepare-source-roots! + "Extract installed JARs into digest-keyed source directories. + + The host owns safe, atomic ZIP extraction. Returns roots in lock order. + When `:source-libs` is supplied, only those library symbols are extracted." + [lock {:keys [host source-libs] :as opts}] + (require-host host + [:read-bytes :digest :exists? :extract-jar! :home-dir]) + (let [base (trim-trailing-slashes (local-repo opts)) + artifacts + (if source-libs + (filter + (fn [{:keys [group artifact classifier]}] + (contains? source-libs + (symbol group + (str artifact + (when classifier + (str "$" classifier)))))) + (:artifacts lock)) + (:artifacts lock))] + (loop [remaining artifacts roots [] failed []] + (if-let [artifact (first remaining)] + (let [jar (str base "/" (:path artifact))] + (if-not ((:exists? host) jar) + (recur (next remaining) + roots + (conj failed {:artifact artifact :reason :missing-artifact})) + (let [bytes ((:read-bytes host) jar) + sha256 (or (:sha256 artifact) + ((:digest host) :sha256 bytes)) + destination (str jar ".grenadine/" sha256)] + ((:extract-jar! host) jar destination) + (recur (next remaining) + (conj roots destination) + failed)))) + {:roots roots :failed failed})))) diff --git a/pkg/stdlib/grenadine/require_deps.cljc b/pkg/stdlib/grenadine/require_deps.cljc new file mode 100644 index 00000000..2b6a0da1 --- /dev/null +++ b/pkg/stdlib/grenadine/require_deps.cljc @@ -0,0 +1,370 @@ +(ns grenadine.require-deps + "Portable parsing and source-file acquisition for clojurestar.deps/require-deps." + (:require [clojure.string :as str])) + +(defn- fail! + [message data] + (throw (ex-info message (assoc data :type :clojurestar.deps/invalid-require)))) + +(defn- nonblank-string? + [value] + (and (string? value) (not (str/blank? value)))) + +(defn- safe-part? + [value] + (and (nonblank-string? value) + (boolean (re-matches #"[A-Za-z0-9_.-]+" value)) + (not (#{"." ".."} value)))) + +(defn- safe-owner? + [value] + (and (nonblank-string? value) + (boolean (re-matches #"[A-Za-z0-9-]+" value)))) + +(defn- safe-gist-id? + [value] + (and (nonblank-string? value) + (boolean (re-matches #"[A-Fa-f0-9]+" value)))) + +(defn- safe-filename? + [value] + (and (safe-part? value) + (boolean (re-matches #"[A-Za-z0-9_.-]+\.cljc?" value)))) + +(defn- full-sha? + [value] + (and (string? value) + (boolean (re-matches #"[A-Fa-f0-9]{40}" value)))) + +(defn- unqualified-symbol? + [value] + (and (symbol? value) + (nil? (namespace value)) + (not (str/blank? (name value))))) + +(defn- namespace-symbol? + [value] + (and (unqualified-symbol? value) + (boolean (re-matches #"[A-Za-z0-9_][A-Za-z0-9_.-]*" (name value))))) + +(defn- parse-revision + [coordinate body] + (let [at (str/last-index-of body "@")] + (if (nil? at) + [body nil] + (let [base (subs body 0 at) + revision (subs body (inc at))] + (when (str/includes? base "@") + (fail! (str "Malformed Gist coordinate: " coordinate) + {:coordinate coordinate})) + (when-not (full-sha? revision) + (fail! "Pinned Gist revisions must be full 40-character commit SHAs" + {:coordinate coordinate :revision revision})) + [base revision])))) + +(defn- parse-gist + [coordinate body] + (let [[body suffix-revision] (parse-revision coordinate body) + parts (str/split body #"/" -1) + slash-revision? (and (nil? suffix-revision) + (= 4 (count parts))) + [owner id third fourth] parts + revision (if slash-revision? third suffix-revision) + filename (if slash-revision? fourth third)] + (when-not (or (<= 2 (count parts) 3) slash-revision?) + (fail! (str "Malformed Gist coordinate: " coordinate) + {:coordinate coordinate})) + (when (and slash-revision? + (not (full-sha? revision))) + (fail! "Pinned Gist revisions must be full 40-character commit SHAs" + {:coordinate coordinate :revision revision})) + (when-not (and (safe-owner? owner) + (safe-gist-id? id) + (or (nil? filename) (safe-filename? filename))) + (fail! (str "Malformed or unsafe Gist coordinate: " coordinate) + {:coordinate coordinate})) + {:provider :gist + :owner owner + :id id + :filename filename + :revision revision + :coordinate coordinate + :identity [:gist owner id filename revision]})) + +(defn- parse-github + [coordinate body] + (let [[owner repo & tail] (str/split body #"/" -1) + [revision path-parts] + (if (= "blob" (first tail)) + [(second tail) (drop 2 tail)] + [(first tail) (rest tail)]) + filename (last path-parts) + path (str/join "/" path-parts)] + (when-not (and (safe-owner? owner) + (safe-part? repo) + (safe-part? revision) + (seq path-parts) + (every? safe-part? path-parts) + (safe-filename? filename)) + (fail! (str "Malformed or unsafe GitHub coordinate: " coordinate) + {:coordinate coordinate})) + {:provider :github + :owner owner + :repo repo + :revision revision + :path path + :filename filename + :coordinate coordinate + :identity [:github owner repo revision path]})) + +(defn- parse-maven + [coordinate] + (let [[_ group artifact version namespace-name] + (re-matches #"mvn:([^/@]+)/([^/@]+)@([^/]+)/([^/]+)" coordinate) + namespace-symbol (when namespace-name (symbol namespace-name))] + (when-not (and (safe-part? group) + (safe-part? artifact) + (nonblank-string? version) + (not (str/includes? version "@")) + (namespace-symbol? namespace-symbol)) + (fail! (str "Malformed Maven require coordinate: " coordinate) + {:coordinate coordinate})) + {:provider :mvn + :lib (symbol group artifact) + :version version + :namespace namespace-symbol + :coordinate coordinate + :identity [:mvn group artifact version namespace-name]})) + +(defn parse-coordinate + "Parse a supported require coordinate into portable data." + [coordinate] + (when-not (nonblank-string? coordinate) + (fail! "A require coordinate must be a non-empty string" + {:coordinate coordinate})) + (cond + (str/starts-with? coordinate "mvn:") + (parse-maven coordinate) + + (str/starts-with? coordinate "gist:") + (parse-gist coordinate (subs coordinate 5)) + + (str/starts-with? coordinate "github:") + (parse-github coordinate (subs coordinate 7)) + + :else + (if-let [[_ owner id] + (re-matches #"https://gist\.github\.com/([^/]+)/([^/]+)/?" coordinate)] + (parse-gist coordinate (str owner "/" id)) + (fail! (str "Unsupported require coordinate: " coordinate) + {:coordinate coordinate})))) + +(defn parse-libspec + "Validate a require-deps libspec vector." + [libspec] + (when-not (and (vector? libspec) (seq libspec)) + (fail! "A require-deps libspec must be a non-empty vector" + {:libspec libspec})) + (let [coordinate (parse-coordinate (first libspec)) + option-forms (rest libspec)] + (when (odd? (count option-forms)) + (fail! "Libspec options must be keyword/value pairs" + {:libspec libspec})) + (loop [forms option-forms result {:coordinate coordinate} seen #{}] + (if (empty? forms) + result + (let [[option value & more] forms] + (when-not (keyword? option) + (fail! "Libspec option names must be keywords" + {:libspec libspec :option option})) + (when (contains? seen option) + (fail! (str "Duplicate libspec option: " option) + {:libspec libspec :option option})) + (case option + :as + (if (unqualified-symbol? value) + (recur more (assoc result :as value) (conj seen option)) + (fail! ":as requires an unqualified alias symbol" + {:libspec libspec :alias value})) + + :refer + (cond + (= :all value) + (fail! ":refer :all is not supported" + {:libspec libspec :refer value}) + + (and (vector? value) + (seq value) + (every? unqualified-symbol? value) + (= (count value) (count (distinct value)))) + (recur more (assoc result :refer value) (conj seen option)) + + :else + (fail! ":refer requires a vector of unqualified symbols" + {:libspec libspec :refer value})) + + (fail! (str "Unsupported libspec option: " option) + {:libspec libspec :option option}))))))) + +(defn parse-options + "Validate the optional leading require-deps options map." + [options] + (let [options (or options {}) + supported #{:mvn/local-repo :gitlibs/dir :cache-dir}] + (when-not (map? options) + (fail! "require-deps options must be a map" {:options options})) + (when-let [unknown (first (remove supported (keys options)))] + (fail! (str "Unsupported require-deps option: " unknown) + {:options options :option unknown})) + (doseq [option supported + :let [value (get options option)] + :when (contains? options option)] + (when-not (nonblank-string? value) + (fail! (str option " must be a non-empty string") + {:options options :option option :value value}))) + options)) + +(defn gist-raw-url + "Return the raw.githubusercontent.com URL for a parsed Gist coordinate." + [{:keys [owner id filename revision] :as coordinate}] + (when-not (= :gist (:provider coordinate)) + (fail! "Expected a parsed Gist coordinate" {:coordinate coordinate})) + (str "https://gist.githubusercontent.com/" owner "/" id "/raw" + (when revision (str "/" revision)) + (when filename (str "/" filename)))) + +(defn github-raw-url + "Return the raw.githubusercontent.com URL for a parsed GitHub coordinate." + [{:keys [owner repo revision path] :as coordinate}] + (when-not (= :github (:provider coordinate)) + (fail! "Expected a parsed GitHub coordinate" {:coordinate coordinate})) + (str "https://raw.githubusercontent.com/" owner "/" repo "/" + revision "/" path)) + +(defn cache-root + "Resolve source-file caches under the effective Gitlibs-compatible root." + [host options] + (or (:gitlibs/dir options) + (:cache-dir options) + (when-let [gitlibs-dir (:gitlibs-dir host)] + (gitlibs-dir)) + (let [getenv (:getenv host)] + (when getenv + (let [value (getenv "GRENADINE_GITLIBS_DIR")] + (when (seq value) value)))) + (let [getenv (:getenv host)] + (when getenv + (let [value (getenv "GITLIBS")] + (when (seq value) value)))) + (when-let [home ((:home-dir host))] + (str home "/.gitlibs")) + (fail! "Unable to determine the Gitlibs cache directory" + {:option :gitlibs/dir}))) + +(defn gist-cache-path + "Return the persistent cache file for a parsed Gist coordinate." + [host options {:keys [owner id filename revision] :as coordinate}] + (when-not (= :gist (:provider coordinate)) + (fail! "Expected a parsed Gist coordinate" {:coordinate coordinate})) + (str (cache-root host options) "/gist/" owner "/" id "/" + (or revision "latest") "/" (or filename "source.clj"))) + +(defn github-cache-path + "Return the persistent cache file for a parsed GitHub coordinate." + [host options {:keys [owner repo revision path] :as coordinate}] + (when-not (= :github (:provider coordinate)) + (fail! "Expected a parsed GitHub coordinate" {:coordinate coordinate})) + (str (cache-root host options) "/github/" owner "/" repo "/" + revision "/" path)) + +(defn- parent-path + [path] + (subs path 0 (str/last-index-of path "/"))) + +(defn- acquire-http-source! + [host coordinate target url immutable? source-label failure-type] + (let [pinned? immutable? + cached? ((:file-exists? host) target)] + (if (and pinned? cached?) + {:path target :source ((:read-text host) target) :cached? true} + (let [temporary (str target ".grenadine.part")] + ((:mkdirs! host) (parent-path target)) + ((:delete! host) temporary) + (try + (when-not ((:download! host) url temporary) + (throw + (ex-info (str "Unable to download " source-label " source: " + (:coordinate coordinate)) + {:type failure-type + :coordinate (:coordinate coordinate) + :url url}))) + ((:atomic-move! host) temporary target) + {:path target :source ((:read-text host) target) :cached? false} + (finally + ((:delete! host) temporary))))))) + +(defn acquire-gist! + "Acquire a Gist through a runtime host and return its cache path and source. + + HOST supplies :home-dir, :file-exists?, :mkdirs!, :download!, :read-text, + :atomic-move!, and :delete!. Pinned files reuse persistent cache; latest + files are fetched by the first preparation in every process." + [host options coordinate] + (acquire-http-source! + host coordinate + (gist-cache-path host options coordinate) + (gist-raw-url coordinate) + (some? (:revision coordinate)) + "Gist" + :clojurestar.deps/gist-http-failure)) + +(defn acquire-github! + "Acquire one GitHub source file through raw.githubusercontent.com. + + Full commit SHAs reuse persistent cache. Named refs are refreshed when + acquisition is requested in a new process." + [host options coordinate] + (acquire-http-source! + host coordinate + (github-cache-path host options coordinate) + (github-raw-url coordinate) + (full-sha? (:revision coordinate)) + "GitHub" + :clojurestar.deps/github-http-failure)) + +(defn- source-namespace + [coordinate first-form source-label failure-type] + (let [namespace-symbol + (when (and (seq? first-form) + (= 'ns (first first-form)) + (symbol? (second first-form))) + (second first-form))] + (when-not namespace-symbol + (throw + (ex-info (str "A selected " source-label + " file must begin with an ns form") + {:type failure-type + :coordinate (:coordinate coordinate)}))) + namespace-symbol)) + +(defn gist-namespace + "Extract and validate the namespace from a Gist's first source form." + [coordinate first-form] + (source-namespace coordinate first-form "Gist" + :clojurestar.deps/gist-missing-ns)) + +(defn github-namespace + "Extract and validate the namespace from a GitHub source file's first form." + [coordinate first-form] + (source-namespace coordinate first-form "GitHub" + :clojurestar.deps/github-missing-ns)) + +(defn namespace-conflict! + [namespace-symbol loaded-coordinate requested-coordinate] + (throw + (ex-info (str "Namespace " namespace-symbol + " is already loaded from another coordinate") + {:type :clojurestar.deps/namespace-conflict + :namespace namespace-symbol + :loaded-coordinate loaded-coordinate + :requested-coordinate requested-coordinate}))) diff --git a/pkg/stdlib/grenadine/runtime.cljc b/pkg/stdlib/grenadine/runtime.cljc new file mode 100644 index 00000000..2f9e63a1 --- /dev/null +++ b/pkg/stdlib/grenadine/runtime.cljc @@ -0,0 +1,79 @@ +(ns grenadine.runtime + "Shared add-only behavior for non-JVM runtime facades." + (:require [grenadine.core :as grenadine])) + +(def host-provided-libs + "Libraries supplied by a Clojure-compatible host runtime. Their coordinates + are satisfied without artifact acquisition or transitive expansion." + '#{org.clojure/clojure org.clojure/clojurescript}) + +(defn current-basis + [basis] + (dissoc @basis :grenadine/loaded)) + +(defn- missing-libs + [basis libs] + (reduce + (fn [result [lib coordinate]] + (if (contains? (:grenadine/loaded @basis) lib) + result + (assoc result lib coordinate))) + {} + libs)) + +(defn- retained-warnings + [basis libs] + (->> libs + (keep + (fn [[lib requested]] + (when-let [loaded (get-in @basis [:grenadine/loaded lib])] + (when (not= loaded requested) + {:warning :loaded-lib-not-upgraded + :lib lib + :loaded loaded + :requested requested})))) + vec)) + +(defn add-libs! + "Resolve libraries, extract their Clojure sources, and append the roots. + + `add-roots!` is the runtime's load-path mutation hook. `opts` must provide a + Grenadine host map unless `:install-fn` is supplied for embedding or tests." + [basis add-roots! libs opts] + (let [provided-libs (into host-provided-libs (:provided-libs opts)) + missing (apply dissoc (missing-libs basis libs) provided-libs) + retained (retained-warnings basis libs)] + (if (empty? missing) + {:classpath [] + :source-roots [] + :lock nil + :warnings retained} + (let [install-fn (or (:install-fn opts) grenadine/install!) + result (install-fn missing + (-> opts + (dissoc :install-fn) + (assoc :source-roots? true + :provided-libs provided-libs + :mediation + (or (:mediation opts) + :tools-deps)))) + roots (vec (:source-roots result))] + (when (seq roots) + (add-roots! roots)) + (when-let [new-basis (:basis result)] + (let [current @basis] + (swap! basis merge + (assoc (dissoc new-basis :libs :classpath :classpath-roots) + :libs (merge (:libs current) (:libs new-basis)) + :classpath (merge (:classpath current) + (:classpath new-basis)) + :classpath-roots + (vec (distinct + (concat (:classpath-roots current) + (:classpath-roots new-basis)))))))) + (when-not (:basis result) + (swap! basis merge {:libs (merge (:libs @basis) missing)})) + (swap! basis merge + {:grenadine/loaded + (merge (:grenadine/loaded @basis) missing)}) + (update result :warnings into retained))))) diff --git a/pkg/stdlib/grenadine/source.cljc b/pkg/stdlib/grenadine/source.cljc new file mode 100644 index 00000000..0bddb1f3 --- /dev/null +++ b/pkg/stdlib/grenadine/source.cljc @@ -0,0 +1,47 @@ +(ns grenadine.source + "Recognize and load deps configuration from HTTP URLs." + (:require [clojure.string :as str])) + +(defn remote? + "Return true when source is an HTTP or HTTPS URL." + [source] + (let [source (str/lower-case source)] + (or (str/starts-with? source "http://") + (str/starts-with? source "https://")))) + +(defn- github-blob? + [url] + (boolean + (re-find #"(?i)^https?://github[.]com/[^/]+/[^/]+/blob/.+" url))) + +(defn- add-raw-query + [url] + (let [fragment-index (str/index-of url "#") + base (if fragment-index (subs url 0 fragment-index) url) + fragment (if fragment-index (subs url fragment-index) "") + separator (if (str/includes? base "?") "&" "?")] + (str base separator "raw=1" fragment))) + +(defn request-url + "Return the URL to fetch, requesting raw content for GitHub blob pages." + [url] + (if (github-blob? url) + (add-raw-query url) + url)) + +(defn fetch-text + "Fetch an HTTP source and decode its successful response as UTF-8." + [host source] + (let [response ((:http-get host) (request-url source)) + status (:status response)] + (cond + (= 200 status) + ((:bytes->utf8 host) (:body response)) + + (or (nil? status) (zero? status)) + (throw (ex-info (str "cannot read " source ": request failed") + {:source source :status status})) + + :else + (throw (ex-info (str "cannot read " source ": HTTP " status) + {:source source :status status}))))) diff --git a/pkg/stdlib/grenadine/version.cljc b/pkg/stdlib/grenadine/version.cljc new file mode 100644 index 00000000..d189bea9 --- /dev/null +++ b/pkg/stdlib/grenadine/version.cljc @@ -0,0 +1,346 @@ +; Licensed to the Apache Software Foundation (ASF) under one or more +; contributor license agreements. See the NOTICE file distributed with this +; work for additional information regarding copyright ownership. The ASF +; licenses this file to you under the Apache License, Version 2.0 (the +; "License"); you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +; WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +; License for the specific language governing permissions and limitations +; under the License. +; +; Portable adaptation of Apache Maven ComparableVersion.java and +; VersionRange.java from maven-3.9.16. Grenadine adaptations Copyright 2026 +; Ingy döt Net. See Provenance.md for the exact source mapping and changes. + +(ns grenadine.version + "Portable Maven-style version ordering." + (:require [clojure.string :as str])) + +(def ^:private qualifier-aliases + {"a" "alpha" + "b" "beta" + "m" "milestone" + "cr" "rc" + "ga" "" + "final" "" + "release" ""}) + +(def ^:private qualifier-order + {"alpha" 0 + "beta" 1 + "milestone" 2 + "rc" 3 + "snapshot" 4 + "" 5 + "sp" 6}) + +(defn- char-code + [c] + #?(:cljs (.charCodeAt c 0) + :default (int (if (string? c) (first c) c)))) + +(defn- digit? + [c] + (let [n (char-code c)] + (<= 48 n 57))) + +(defn- normalize-number + [value] + (loop [i 0] + (if (and (< i (dec (count value))) + (= \0 (nth value i))) + (recur (inc i)) + (subs value i)))) + +(defn- token + [value numeric? separator] + (if numeric? + {:kind :number :value (normalize-number value) :separator separator} + (let [value (str/lower-case value)] + {:kind :qualifier + :value (get qualifier-aliases value value) + :separator separator}))) + +(defn- tokenize + [version] + (loop [i 0 + start 0 + numeric? nil + current-separator nil + next-separator nil + result []] + (if (= i (count version)) + (let [result + (if (< start i) + (conj result + (token (subs version start i) + numeric? + current-separator)) + result)] + ;; ComparableVersion treats 1-1 as the normalized form 1.0-1. + (if (and (= 2 (count result)) + (= :number (:kind (first result))) + (= :number (:kind (second result))) + (= :hyphen (:separator (second result)))) + [(first result) + {:kind :number :value "0" :separator :dot} + (second result)] + result)) + (let [c (nth version i) + separator? (or (= c \.) (= c \-)) + current-numeric? (digit? c)] + (cond + separator? + (recur (inc i) + (inc i) + nil + nil + (if (= c \-) :hyphen :dot) + (if (< start i) + (conj result + (token (subs version start i) + numeric? + current-separator)) + result)) + + (nil? numeric?) + (recur (inc i) + start + current-numeric? + next-separator + nil + result) + + (= numeric? current-numeric?) + (recur (inc i) + start + numeric? + current-separator + next-separator + result) + + :else + (recur (inc i) + i + current-numeric? + :transition + nil + (conj result + (token (subs version start i) + numeric? + current-separator)))))))) + +(defn- zero-token? + [item] + (or (and (= :number (:kind item)) (= "0" (:value item))) + (and (= :qualifier (:kind item)) (= "" (:value item))))) + +(defn- normalize-tokens + [items] + (loop [items (vec items)] + (if (and (seq items) (zero-token? (peek items))) + (recur (pop items)) + items))) + +(defn- compare-number + [left right] + (let [length-comparison (compare (count left) (count right))] + (if (zero? length-comparison) + (compare left right) + length-comparison))) + +(defn- qualifier-key + [value] + (if-let [rank (get qualifier-order value)] + [0 rank ""] + [1 0 value])) + +(defn- compare-qualifier + [left right] + (compare (qualifier-key left) (qualifier-key right))) + +(defn- compare-item + [left right] + (cond + (nil? left) + (cond + (nil? right) 0 + (= :number (:kind right)) + (- (compare-number (:value right) "0")) + :else + (- (compare-qualifier (:value right) ""))) + + (nil? right) + (- (compare-item right left)) + + (= (:kind left) (:kind right)) + (if (= :number (:kind left)) + (let [number-comparison + (compare-number (:value left) (:value right))] + (if (zero? number-comparison) + (compare + (if (= :hyphen (:separator left)) 0 1) + (if (= :hyphen (:separator right)) 0 1)) + number-comparison)) + (compare-qualifier (:value left) (:value right))) + + (= :number (:kind left)) 1 + :else -1)) + +(defn compare-versions + "Compare two Maven version strings, returning a negative number, zero, or a + positive number. + + This covers Maven's numeric segments, digit/letter transitions, standard + qualifier aliases, qualifier ordering, and arbitrary-length numeric fields." + [left right] + (let [left-items (normalize-tokens (tokenize left)) + right-items (normalize-tokens (tokenize right)) + limit (max (count left-items) (count right-items))] + (loop [i 0] + (if (= i limit) + 0 + (let [comparison + (compare-item (get left-items i) (get right-items i))] + (if (zero? comparison) + (recur (inc i)) + comparison)))))) + +(defn- range-error + [spec message] + (throw (ex-info (str "Invalid Maven version range " (pr-str spec) + ": " message) + {:type :grenadine.version/invalid-range + :range spec}))) + +(defn- whitespace? + [character] + (contains? #{\space \tab \newline \return} character)) + +(defn- skip-whitespace + [value index] + (loop [index index] + (if (and (< index (count value)) + (whitespace? (nth value index))) + (recur (inc index)) + index))) + +(defn- closing-index + [value start] + (loop [index start] + (when (< index (count value)) + (let [character (nth value index)] + (if (or (= character \]) (= character \))) + index + (recur (inc index))))))) + +(defn- interval + [spec opener closer content] + (let [comma (str/index-of content ",")] + (if (nil? comma) + (do + (when-not (and (= opener \[) (= closer \]) (seq (str/trim content))) + (range-error spec "an exact range must use [version]")) + (let [version (str/trim content)] + {:lower version :lower-inclusive? true + :upper version :upper-inclusive? true})) + (do + (when (str/index-of (subs content (inc comma)) ",") + (range-error spec "an interval must contain one comma")) + (let [lower (str/trim (subs content 0 comma)) + upper (str/trim (subs content (inc comma)))] + (when (and (empty? lower) (empty? upper)) + (range-error spec "an interval must have at least one bound")) + {:lower (when (seq lower) lower) + :lower-inclusive? (= opener \[) + :upper (when (seq upper) upper) + :upper-inclusive? (= closer \])}))))) + +(defn parse-version-range + "Parse a Maven version range into one or more intervals." + [spec] + (when-not (and (string? spec) (seq (str/trim spec))) + (range-error spec "the range must be a non-empty string")) + (let [value (str/trim spec)] + (loop [index 0 result []] + (let [index (skip-whitespace value index)] + (if (= index (count value)) + (if (seq result) + result + (range-error spec "no intervals were found")) + (let [index + (if (seq result) + (do + (when-not (= \, (nth value index)) + (range-error spec "intervals must be comma-separated")) + (let [next-index (skip-whitespace value (inc index))] + (when (= next-index (count value)) + (range-error spec "the range ends after a separator")) + next-index)) + index) + opener (nth value index)] + (when-not (or (= opener \[) (= opener \()) + (range-error spec "an interval must start with [ or (")) + (let [end (closing-index value (inc index))] + (when-not end + (range-error spec "an interval is missing its closing bracket")) + (let [closer (nth value end) + content (subs value (inc index) end)] + (recur (inc end) + (conj result (interval spec opener closer content))))))))))) + +(defn version-range? + [value] + (when (string? value) + (let [value (str/trim value)] + (and (seq value) + (let [first-character (nth value 0)] + (or (= first-character \[) (= first-character \())))))) + +(defn- bound-matches? + [candidate bound inclusive? lower?] + (if (nil? bound) + true + (let [comparison (compare-versions candidate bound)] + (if lower? + (if inclusive? (not (neg? comparison)) (pos? comparison)) + (if inclusive? (not (pos? comparison)) (neg? comparison)))))) + +(defn in-range? + "Return true when a concrete version satisfies a parsed or textual range." + [candidate range] + (let [intervals (if (string? range) (parse-version-range range) range)] + (boolean + (some + (fn [{:keys [lower lower-inclusive? upper upper-inclusive?]}] + (and (bound-matches? candidate lower lower-inclusive? true) + (bound-matches? candidate upper upper-inclusive? false))) + intervals)))) + +(defn exact-range-version + "Return the concrete version represented by `[version]`, otherwise nil." + [range] + (let [intervals (if (string? range) (parse-version-range range) range) + item (first intervals)] + (when (and (= 1 (count intervals)) + (:lower-inclusive? item) + (:upper-inclusive? item) + (= (:lower item) (:upper item))) + (:lower item)))) + +(defn snapshot-base-version + "Return the Maven base-version directory for a timestamped snapshot." + [value] + (if-let [[_ base] + (re-matches #"^(.*)-[0-9]{8}[.][0-9]{6}-[0-9]+$" value)] + (str base "-SNAPSHOT") + value)) + +(defn newer? + [left right] + (pos? (compare-versions left right))) diff --git a/pkg/stdlib/grenadine/xml.cljc b/pkg/stdlib/grenadine/xml.cljc new file mode 100644 index 00000000..b65f0852 --- /dev/null +++ b/pkg/stdlib/grenadine/xml.cljc @@ -0,0 +1,306 @@ +(ns grenadine.xml + "A strict, portable XML parser for Maven POM files. + + The parser intentionally implements a small XML subset. It accepts the + constructs used by POMs and rejects declarations that could resolve external + content. The result has the same element shape as clojure.data.xml: + {:tag keyword, :attrs map, :content vector}." + (:require [clojure.string :as str])) + +(defn- position + [source offset] + (loop [i 0 line 1 column 1] + (if (= i offset) + {:offset offset :line line :column column} + (if (= "\n" (nth source i)) + (recur (inc i) (inc line) 1) + (recur (inc i) line (inc column)))))) + +(defn- xml-error + [source offset message] + (throw + (ex-info message + (merge {:type :grenadine.xml/parse-error} + (position source offset))))) + +(defn- starts-at? + [source offset token] + (let [token (vec (re-seq #"(?s)." token)) + end (+ offset (count token))] + (and (<= end (count source)) + (= token (subvec source offset end))))) + +(defn- source-slice + [source start end] + (apply str (subvec source start end))) + +(defn- whitespace? + [c] + (contains? #{" " "\t" "\n" "\r"} c)) + +(defn- skip-whitespace + [source offset] + (loop [i offset] + (if (and (< i (count source)) (whitespace? (nth source i))) + (recur (inc i)) + i))) + +(defn- char-code + [c] + #?(:cljs (.charCodeAt c 0) + :default (int (if (string? c) (first c) c)))) + +(defn- ascii-letter? + [c] + (let [n (char-code c)] + (or (<= 65 n 90) (<= 97 n 122)))) + +(defn- ascii-digit? + [c] + (let [n (char-code c)] + (<= 48 n 57))) + +(defn- name-start? + [c] + (or (ascii-letter? c) (= c "_") (= c ":"))) + +(defn- name-char? + [c] + (or (name-start? c) + (ascii-digit? c) + (= c "-") + (= c "."))) + +(defn- parse-name + [source offset] + (when (or (= offset (count source)) + (not (name-start? (nth source offset)))) + (xml-error source offset "Expected an XML name")) + (loop [i (inc offset)] + (if (and (< i (count source)) (name-char? (nth source i))) + (recur (inc i)) + [(source-slice source offset i) i]))) + +(defn- local-keyword + [name] + (let [colon (str/last-index-of name ":")] + (keyword (if colon (subs name (inc colon)) name)))) + +(defn- digit-value + [c radix] + (let [n (char-code c) + value (cond + (<= 48 n 57) (- n 48) + (<= 65 n 70) (+ 10 (- n 65)) + (<= 97 n 102) (+ 10 (- n 97)) + :else -1)] + (if (< value radix) value -1))) + +(defn- parse-integer + [source offset text radix] + (when (empty? text) + (xml-error source offset "Empty numeric character reference")) + (reduce + (fn [value c] + (let [digit (digit-value c radix)] + (when (neg? digit) + (xml-error source offset "Invalid numeric character reference")) + (+ (* value radix) digit))) + 0 + text)) + +(defn- codepoint->string + [source offset value] + (when (or (zero? value) + (> value 1114111) + (<= 55296 value 57343)) + (xml-error source offset "Invalid XML character reference")) + (if (<= value 65535) + (str (char value)) + (let [n (- value 65536)] + (str (char (+ 55296 (quot n 1024))) + (char (+ 56320 (mod n 1024))))))) + +(def ^:private named-entities + {"amp" "&" + "apos" "'" + "gt" ">" + "lt" "<" + "quot" "\""}) + +(defn- find-char + [source offset target] + (loop [i offset] + (cond + (= i (count source)) nil + (= target (nth source i)) i + :else (recur (inc i))))) + +(defn- decode-entity + [source offset entity] + (cond + (str/starts-with? entity "#x") + (codepoint->string + source offset (parse-integer source offset (subs entity 2) 16)) + + (str/starts-with? entity "#") + (codepoint->string + source offset (parse-integer source offset (subs entity 1) 10)) + + :else + (if-let [value (get named-entities entity)] + value + (xml-error source offset (str "Unknown XML entity: &" entity ";"))))) + +(defn- decode-text + [source start end] + (loop [i start pieces [] piece-start start] + (if (= i end) + (apply str (conj pieces (source-slice source piece-start end))) + (if (= "&" (nth source i)) + (let [semi (find-char source (inc i) ";")] + (when (or (nil? semi) (> semi end)) + (xml-error source i "Unterminated XML entity")) + (recur (inc semi) + (conj pieces + (source-slice source piece-start i) + (decode-entity source i + (source-slice source (inc i) semi))) + (inc semi))) + (recur (inc i) pieces piece-start))))) + +(defn- parse-attribute + [source offset] + (let [[name after-name] (parse-name source offset) + equals-at (skip-whitespace source after-name)] + (when (or (= equals-at (count source)) + (not= "=" (nth source equals-at))) + (xml-error source equals-at "Expected '=' after XML attribute name")) + (let [quote-at (skip-whitespace source (inc equals-at))] + (when (= quote-at (count source)) + (xml-error source quote-at "Expected quoted XML attribute value")) + (let [quote-char (nth source quote-at)] + (when (and (not= quote-char "\"") (not= quote-char "'")) + (xml-error source quote-at "Expected quoted XML attribute value")) + (if-let [end (find-char source (inc quote-at) quote-char)] + [(local-keyword name) + (decode-text source (inc quote-at) end) + (inc end) + name] + (xml-error source quote-at "Unterminated XML attribute value")))))) + +(defn- parse-open-tag + [source offset] + (let [[name after-name] (parse-name source offset)] + (loop [i (skip-whitespace source after-name) attrs {}] + (cond + (= i (count source)) + (xml-error source i "Unterminated XML start tag") + + (starts-at? source i "/>") + [{:tag (local-keyword name) :attrs attrs :content []} (+ i 2) true] + + (= ">" (nth source i)) + [{:tag (local-keyword name) :attrs attrs :content []} (inc i) false] + + :else + (let [[key value next-i raw-name] (parse-attribute source i) + namespace-declaration? + (or (= raw-name "xmlns") + (str/starts-with? raw-name "xmlns:"))] + (when (and (not namespace-declaration?) (contains? attrs key)) + (xml-error source i (str "Duplicate XML attribute: " key))) + (recur (skip-whitespace source next-i) + (if namespace-declaration? + attrs + (assoc attrs key value)))))))) + +(defn- find-token + [source offset token] + (loop [i offset] + (cond + (> (+ i (count token)) (count source)) nil + (starts-at? source i token) i + :else (recur (inc i))))) + +(defn- append-content + [stack roots value] + (if (seq stack) + [(update-in stack [(dec (count stack)) :content] conj value) roots] + (if (and (string? value) (str/blank? value)) + [stack roots] + [stack (conj roots value)]))) + +(defn parse + "Parse `source` as strict POM-oriented XML. + + Returns one element map. Whitespace outside the document element is ignored." + [source] + (let [source (vec (re-seq #"(?s)." source))] + (loop [i 0 stack [] roots []] + (if (= i (count source)) + (cond + (seq stack) + (xml-error source i + (str "Unclosed XML element: " (:tag (peek stack)))) + + (not= 1 (count roots)) + (xml-error source i "XML must contain exactly one document element") + + (not (map? (first roots))) + (xml-error source i "XML document root must be an element") + + :else + (first roots)) + (if (= "<" (nth source i)) + (cond + (starts-at? source i "")] + (recur (+ end 3) stack roots) + (xml-error source i "Unterminated XML comment")) + + (starts-at? source i "")] + (recur (+ end 2) stack roots) + (xml-error source i "Unterminated XML processing instruction")) + + (starts-at? source i "")] + (let [text (source-slice source (+ i 9) end) + [next-stack next-roots] + (append-content stack roots text)] + (recur (+ end 3) next-stack next-roots)) + (xml-error source i "Unterminated XML CDATA section")) + + (starts-at? source i "" (nth source close))) + (xml-error source close "Malformed XML closing tag")) + (when (empty? stack) + (xml-error source i "Closing tag without an open element")) + (let [node (peek stack)] + (when (not= (local-keyword name) (:tag node)) + (xml-error source i + (str "Mismatched XML closing tag: " name))) + (let [[next-stack next-roots] + (append-content (pop stack) roots node)] + (recur (inc close) next-stack next-roots)))) + + (starts-at? source i "