From d73a906759dd91d153e1aa525c1f81c7941b417a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Sun, 2 Aug 2026 21:37:14 -0400 Subject: [PATCH 01/31] Support JVM branches selected by :clj fallback --- pkg/javacompat/boolean/boolean.go | 11 ++++++++- pkg/javacompat/boolean/boolean_test.go | 17 ++++++++++++++ pkg/javacompat/classes/classes.go | 4 ++++ pkg/javacompat/classes/classes_test.go | 4 ++-- pkg/javacompat/integer/integer.go | 6 ++++- pkg/javacompat/uuid/uuid.go | 7 +++++- pkg/javacompat/uuid/uuid_test.go | 21 ++++++++++++++++- pkg/lang/class.go | 32 ++++++++++++++++++++++++-- pkg/lang/equals_test.go | 11 +++++++++ pkg/lang/list.go | 27 ++++++++++++++++++++++ pkg/lang/numbers.go | 13 ++++++++++- pkg/lang/numbers_cast_test.go | 16 +++++++++++++ pkg/lang/struct.go | 19 +++++++++++++++ pkg/lang/struct_test.go | 15 ++++++++++++ pkg/lang/type.go | 3 +++ pkg/lang/type_test.go | 14 +++++++++++ 16 files changed, 211 insertions(+), 9 deletions(-) create mode 100644 pkg/javacompat/boolean/boolean_test.go create mode 100644 pkg/lang/numbers_cast_test.go 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..c64d1bd9 100644 --- a/pkg/javacompat/classes/classes.go +++ b/pkg/javacompat/classes/classes.go @@ -16,6 +16,9 @@ func register(name, javaPackage string, typ reflect.Type) { func init() { register("Object", "java.lang", reflect.TypeOf((*any)(nil)).Elem()) + register("Byte", "java.lang", 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("Set", "java.util", reflect.TypeOf((*lang.IPersistentSet)(nil)).Elem()) register("List", "java.util", reflect.TypeOf((*lang.Sequential)(nil)).Elem()) @@ -40,6 +43,7 @@ func init() { 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()) diff --git a/pkg/javacompat/classes/classes_test.go b/pkg/javacompat/classes/classes_test.go index 4c81be93..2a068bac 100644 --- a/pkg/javacompat/classes/classes_test.go +++ b/pkg/javacompat/classes/classes_test.go @@ -8,10 +8,10 @@ import ( func TestCommonClassesAreRegistered(t *testing.T) { for _, name := range []string{ - "Object", "Comparable", "Set", "List", "Map", "Keyword", "IDeref", "Associative", + "Object", "Byte", "Short", "Float", "Comparable", "Set", "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", } { diff --git a/pkg/javacompat/integer/integer.go b/pkg/javacompat/integer/integer.go index 9adfea2e..4443c8d3 100644 --- a/pkg/javacompat/integer/integer.go +++ b/pkg/javacompat/integer/integer.go @@ -97,7 +97,11 @@ 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() { diff --git a/pkg/javacompat/uuid/uuid.go b/pkg/javacompat/uuid/uuid.go index 3f269c8b..2e692615 100644 --- a/pkg/javacompat/uuid/uuid.go +++ b/pkg/javacompat/uuid/uuid.go @@ -14,6 +14,7 @@ import ( 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" @@ -64,7 +65,11 @@ func register(jvmName, goName string, v any) { pkgmap.Set(pkg+"."+goName, v) pkgmap.Set("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() { diff --git a/pkg/javacompat/uuid/uuid_test.go b/pkg/javacompat/uuid/uuid_test.go index 4641bd9d..3390e408 100644 --- a/pkg/javacompat/uuid/uuid_test.go +++ b/pkg/javacompat/uuid/uuid_test.go @@ -1,6 +1,12 @@ 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()) { @@ -10,3 +16,16 @@ func TestIsUUID(t *testing.T) { 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/class.go b/pkg/lang/class.go index 99e924bf..85bb92aa 100644 --- a/pkg/lang/class.go +++ b/pkg/lang/class.go @@ -16,7 +16,8 @@ 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 } var hostConstructors sync.Map @@ -24,7 +25,34 @@ var hostConstructors sync.Map // 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. ...)` 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/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/numbers.go b/pkg/lang/numbers.go index 3444e08e..292c0021 100644 --- a/pkg/lang/numbers.go +++ b/pkg/lang/numbers.go @@ -1034,8 +1034,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..9f2787e3 --- /dev/null +++ b/pkg/lang/numbers_cast_test.go @@ -0,0 +1,16 @@ +package lang + +import "testing" + +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/struct.go b/pkg/lang/struct.go index 4faae061..1aed98f2 100644 --- a/pkg/lang/struct.go +++ b/pkg/lang/struct.go @@ -207,6 +207,25 @@ func unwrapError(err error) error { func directProtocolMethod(v interface{}, name string) (IFn, bool) { switch name { + 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..9335777e 100644 --- a/pkg/lang/struct_test.go +++ b/pkg/lang/struct_test.go @@ -69,6 +69,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") diff --git a/pkg/lang/type.go b/pkg/lang/type.go index dbc370e6..e36f0002 100644 --- a/pkg/lang/type.go +++ b/pkg/lang/type.go @@ -24,6 +24,9 @@ func HasType(target any, v interface{}) bool { if v == nil { return false } + if class, ok := target.(*Class); ok { + return class.accepts(v) + } t, ok := ReflectType(target) if !ok { return false diff --git a/pkg/lang/type_test.go b/pkg/lang/type_test.go index 0fbbd987..5738a6e1 100644 --- a/pkg/lang/type_test.go +++ b/pkg/lang/type_test.go @@ -30,3 +30,17 @@ 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") + } +} From f9129baf1822c8ec8113aa96020fa47c8e56cb4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Sun, 2 Aug 2026 21:41:18 -0400 Subject: [PATCH 02/31] Builds for v0.7.5 --- pkg/gen/gljimports/gljimports_darwin_amd64.go | 2 + pkg/gen/gljimports/gljimports_darwin_arm64.go | 2 + .../gljimports/gljimports_dragonfly_amd64.go | 2 + pkg/gen/gljimports/gljimports_freebsd_386.go | 2 + .../gljimports/gljimports_freebsd_amd64.go | 2 + .../gljimports/gljimports_freebsd_arm64.go | 2 + pkg/gen/gljimports/gljimports_js_wasm.go | 2 + pkg/gen/gljimports/gljimports_linux_386.go | 2 + pkg/gen/gljimports/gljimports_linux_amd64.go | 2 + pkg/gen/gljimports/gljimports_linux_arm.go | 2 + pkg/gen/gljimports/gljimports_linux_arm64.go | 2 + .../gljimports/gljimports_linux_ppc64le.go | 2 + .../gljimports/gljimports_linux_riscv64.go | 2 + pkg/gen/gljimports/gljimports_linux_s390x.go | 2 + pkg/gen/gljimports/gljimports_netbsd_amd64.go | 2 + pkg/gen/gljimports/gljimports_netbsd_arm64.go | 2 + .../gljimports/gljimports_openbsd_amd64.go | 2 + .../gljimports/gljimports_openbsd_arm64.go | 2 + pkg/gen/gljimports/gljimports_plan9_386.go | 2 + pkg/gen/gljimports/gljimports_plan9_amd64.go | 2 + pkg/gen/gljimports/gljimports_plan9_arm.go | 2 + pkg/gen/gljimports/gljimports_wasip1_wasm.go | 2 + pkg/gen/gljimports/gljimports_windows_386.go | 2 + .../gljimports/gljimports_windows_amd64.go | 2 + pkg/gen/gljimports/gljimports_windows_arm.go | 2 + .../gljimports/gljimports_windows_arm64.go | 2 + pkg/stdlib/clojure/core/loader.go | 257 +++++++++--------- 27 files changed, 180 insertions(+), 129 deletions(-) diff --git a/pkg/gen/gljimports/gljimports_darwin_amd64.go b/pkg/gen/gljimports/gljimports_darwin_amd64.go index 3a20686a..6e89272c 100644 --- a/pkg/gen/gljimports/gljimports_darwin_amd64.go +++ b/pkg/gen/gljimports/gljimports_darwin_amd64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_darwin_arm64.go b/pkg/gen/gljimports/gljimports_darwin_arm64.go index f12feeb3..d6bed217 100644 --- a/pkg/gen/gljimports/gljimports_darwin_arm64.go +++ b/pkg/gen/gljimports/gljimports_darwin_arm64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_dragonfly_amd64.go b/pkg/gen/gljimports/gljimports_dragonfly_amd64.go index c5d95fab..3df9af88 100644 --- a/pkg/gen/gljimports/gljimports_dragonfly_amd64.go +++ b/pkg/gen/gljimports/gljimports_dragonfly_amd64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_freebsd_386.go b/pkg/gen/gljimports/gljimports_freebsd_386.go index c29f3a34..c62be7c9 100644 --- a/pkg/gen/gljimports/gljimports_freebsd_386.go +++ b/pkg/gen/gljimports/gljimports_freebsd_386.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_freebsd_amd64.go b/pkg/gen/gljimports/gljimports_freebsd_amd64.go index 87f07c38..ee6a5870 100644 --- a/pkg/gen/gljimports/gljimports_freebsd_amd64.go +++ b/pkg/gen/gljimports/gljimports_freebsd_amd64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_freebsd_arm64.go b/pkg/gen/gljimports/gljimports_freebsd_arm64.go index f72c171c..4b61d0c8 100644 --- a/pkg/gen/gljimports/gljimports_freebsd_arm64.go +++ b/pkg/gen/gljimports/gljimports_freebsd_arm64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_js_wasm.go b/pkg/gen/gljimports/gljimports_js_wasm.go index 646a42ac..e2855814 100644 --- a/pkg/gen/gljimports/gljimports_js_wasm.go +++ b/pkg/gen/gljimports/gljimports_js_wasm.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_linux_386.go b/pkg/gen/gljimports/gljimports_linux_386.go index 00816b05..49588589 100644 --- a/pkg/gen/gljimports/gljimports_linux_386.go +++ b/pkg/gen/gljimports/gljimports_linux_386.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_linux_amd64.go b/pkg/gen/gljimports/gljimports_linux_amd64.go index 47b723db..38d78c9a 100644 --- a/pkg/gen/gljimports/gljimports_linux_amd64.go +++ b/pkg/gen/gljimports/gljimports_linux_amd64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_linux_arm.go b/pkg/gen/gljimports/gljimports_linux_arm.go index 3e82ee7d..99cb89ae 100644 --- a/pkg/gen/gljimports/gljimports_linux_arm.go +++ b/pkg/gen/gljimports/gljimports_linux_arm.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_linux_arm64.go b/pkg/gen/gljimports/gljimports_linux_arm64.go index 620e79e3..b4e9a8e9 100644 --- a/pkg/gen/gljimports/gljimports_linux_arm64.go +++ b/pkg/gen/gljimports/gljimports_linux_arm64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_linux_ppc64le.go b/pkg/gen/gljimports/gljimports_linux_ppc64le.go index a473b8ca..d316c46a 100644 --- a/pkg/gen/gljimports/gljimports_linux_ppc64le.go +++ b/pkg/gen/gljimports/gljimports_linux_ppc64le.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_linux_riscv64.go b/pkg/gen/gljimports/gljimports_linux_riscv64.go index ba8e0e42..ebee425d 100644 --- a/pkg/gen/gljimports/gljimports_linux_riscv64.go +++ b/pkg/gen/gljimports/gljimports_linux_riscv64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_linux_s390x.go b/pkg/gen/gljimports/gljimports_linux_s390x.go index e5b03f30..4423f65a 100644 --- a/pkg/gen/gljimports/gljimports_linux_s390x.go +++ b/pkg/gen/gljimports/gljimports_linux_s390x.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_netbsd_amd64.go b/pkg/gen/gljimports/gljimports_netbsd_amd64.go index 8b48d1df..f9ede3ae 100644 --- a/pkg/gen/gljimports/gljimports_netbsd_amd64.go +++ b/pkg/gen/gljimports/gljimports_netbsd_amd64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_netbsd_arm64.go b/pkg/gen/gljimports/gljimports_netbsd_arm64.go index 5e1ebe1f..77d2c566 100644 --- a/pkg/gen/gljimports/gljimports_netbsd_arm64.go +++ b/pkg/gen/gljimports/gljimports_netbsd_arm64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_openbsd_amd64.go b/pkg/gen/gljimports/gljimports_openbsd_amd64.go index 5d2f458d..bb349bab 100644 --- a/pkg/gen/gljimports/gljimports_openbsd_amd64.go +++ b/pkg/gen/gljimports/gljimports_openbsd_amd64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_openbsd_arm64.go b/pkg/gen/gljimports/gljimports_openbsd_arm64.go index f40d8c94..8395b553 100644 --- a/pkg/gen/gljimports/gljimports_openbsd_arm64.go +++ b/pkg/gen/gljimports/gljimports_openbsd_arm64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_plan9_386.go b/pkg/gen/gljimports/gljimports_plan9_386.go index 115052d9..a9e4851d 100644 --- a/pkg/gen/gljimports/gljimports_plan9_386.go +++ b/pkg/gen/gljimports/gljimports_plan9_386.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_plan9_amd64.go b/pkg/gen/gljimports/gljimports_plan9_amd64.go index c3ab8dea..dcc39f3d 100644 --- a/pkg/gen/gljimports/gljimports_plan9_amd64.go +++ b/pkg/gen/gljimports/gljimports_plan9_amd64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_plan9_arm.go b/pkg/gen/gljimports/gljimports_plan9_arm.go index 3824c65b..409bd012 100644 --- a/pkg/gen/gljimports/gljimports_plan9_arm.go +++ b/pkg/gen/gljimports/gljimports_plan9_arm.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_wasip1_wasm.go b/pkg/gen/gljimports/gljimports_wasip1_wasm.go index 6220a280..5aa2a575 100644 --- a/pkg/gen/gljimports/gljimports_wasip1_wasm.go +++ b/pkg/gen/gljimports/gljimports_wasip1_wasm.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_windows_386.go b/pkg/gen/gljimports/gljimports_windows_386.go index b80cd247..0db16442 100644 --- a/pkg/gen/gljimports/gljimports_windows_386.go +++ b/pkg/gen/gljimports/gljimports_windows_386.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_windows_amd64.go b/pkg/gen/gljimports/gljimports_windows_amd64.go index f0637d11..370c82b7 100644 --- a/pkg/gen/gljimports/gljimports_windows_amd64.go +++ b/pkg/gen/gljimports/gljimports_windows_amd64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_windows_arm.go b/pkg/gen/gljimports/gljimports_windows_arm.go index a6d70d61..ceddfcc2 100644 --- a/pkg/gen/gljimports/gljimports_windows_arm.go +++ b/pkg/gen/gljimports/gljimports_windows_arm.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/gen/gljimports/gljimports_windows_arm64.go b/pkg/gen/gljimports/gljimports_windows_arm64.go index 731e0b9c..19f5dc7a 100644 --- a/pkg/gen/gljimports/gljimports_windows_arm64.go +++ b/pkg/gen/gljimports/gljimports_windows_arm64.go @@ -741,6 +741,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) @@ -904,6 +905,7 @@ 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) diff --git a/pkg/stdlib/clojure/core/loader.go b/pkg/stdlib/clojure/core/loader.go index fe5976b5..ec8b548a 100644 --- a/pkg/stdlib/clojure/core/loader.go +++ b/pkg/stdlib/clojure/core/loader.go @@ -5,19 +5,20 @@ package core import ( errors6 "errors" fmt "fmt" + filesystem9 "github.com/glojurelang/glojure/pkg/javacompat/filesystem" 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" ) @@ -11769,13 +11770,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 @@ -13202,7 +13199,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 +13250,7 @@ func LoadNS() { _ = v3 v4 := p1 _ = v4 - tmp5 := lang.Apply2(lang.HasType, v3, v4) + tmp5 := lang.HasType(v3, v4) return tmp5 }) v2 = tmp1 @@ -15398,7 +15395,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 +15439,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 +15515,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 +15559,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 +16228,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 { @@ -19762,7 +19759,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 +19798,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 +19850,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" @@ -22379,7 +22376,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 +22493,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 +22767,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 +22779,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)) }) } @@ -24491,7 +24488,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 +24508,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 }) @@ -25714,7 +25711,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 @@ -27150,7 +27147,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) @@ -30192,7 +30189,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 +30205,7 @@ func LoadNS() { tmp1 = lang.FnFunc1(func(p0 any) any { v2 := p0 _ = v2 - tmp3 := lang.IsInstance[uuid11.UUID](v2) + tmp3 := lang.IsInstance[uuid12.UUID](v2) return tmp3 }) aotDirectFn555 = tmp1 @@ -44166,128 +44163,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 +44501,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 { @@ -46790,7 +46789,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 +48396,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 +48490,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 +48578,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 +48672,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 +49218,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 +50396,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 +50943,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 From 2f413b5fe0a8c100ffdb13fa51d68a1c1965a3c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 3 Aug 2026 00:05:52 -0400 Subject: [PATCH 03/31] Merge adjacent reader metadata --- pkg/reader/reader.go | 11 +++++++++++ pkg/reader/reader_test.go | 14 ++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/pkg/reader/reader.go b/pkg/reader/reader.go index 2481d830..509f7149 100644 --- a/pkg/reader/reader.go +++ b/pkg/reader/reader.go @@ -463,6 +463,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() diff --git a/pkg/reader/reader_test.go b/pkg/reader/reader_test.go index 32440a01..a9065ce8 100644 --- a/pkg/reader/reader_test.go +++ b/pkg/reader/reader_test.go @@ -107,6 +107,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 From f8ccbe5bc15531e336fb8ef3dd71124403179589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 3 Aug 2026 00:14:01 -0400 Subject: [PATCH 04/31] Support octal character literals --- pkg/lang/char.go | 12 ++++++++++++ pkg/lang/char_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 pkg/lang/char_test.go diff --git a/pkg/lang/char.go b/pkg/lang/char.go index de6fd754..03efdb23 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 { 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) + } + } +} From f2096b8c00aa416d67cbe3ea9f4d2201877b4d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 3 Aug 2026 01:51:18 -0400 Subject: [PATCH 05/31] Expand hosted runtime compatibility --- pkg/javacompat/base64/base64.go | 88 ++++++++++++ pkg/javacompat/base64/base64_test.go | 13 ++ pkg/javacompat/date/date.go | 20 +++ pkg/javacompat/date/date_test.go | 13 ++ pkg/javacompat/filesystem/filesystem.go | 1 + pkg/javacompat/filesystem/filesystem_test.go | 9 ++ pkg/javacompat/nio/nio.go | 129 ++++++++++++++++++ pkg/javacompat/nio/nio_test.go | 16 +++ pkg/javacompat/streams/streams.go | 123 ++++++++++++++++- pkg/javacompat/streams/streams_test.go | 66 +++++++++ pkg/javacompat/stringbuilder/stringbuilder.go | 5 + .../stringbuilder/stringbuilder_test.go | 3 +- pkg/javacompat/throwable/throwable.go | 15 +- pkg/javacompat/throwable/throwable_test.go | 17 +++ pkg/javacompat/uuid/uuid.go | 1 + pkg/lang/bigdecimal.go | 86 +++++++++++- pkg/lang/bigdecimal_test.go | 24 ++++ pkg/lang/equal.go | 12 ++ pkg/lang/equal_typed_test.go | 15 ++ pkg/lang/persistentqueue.go | 117 ++++++++++++++++ pkg/lang/persistentqueue_test.go | 22 +++ pkg/lang/record.go | 28 ++++ pkg/lang/struct.go | 51 +++++++ pkg/lang/taggedliteral.go | 71 ++++++++++ pkg/lang/taggedliteral_test.go | 17 +++ pkg/lang/type.go | 4 + pkg/lang/type_test.go | 11 ++ pkg/reader/reader.go | 22 ++- pkg/stdlib/clojure/core.glj | 2 +- pkg/stdlib/clojure/core/loader.go | 2 +- scripts/rewrite-core/rewrite.clj | 6 + 31 files changed, 992 insertions(+), 17 deletions(-) create mode 100644 pkg/javacompat/base64/base64.go create mode 100644 pkg/javacompat/base64/base64_test.go create mode 100644 pkg/javacompat/nio/nio.go create mode 100644 pkg/javacompat/nio/nio_test.go create mode 100644 pkg/javacompat/throwable/throwable_test.go create mode 100644 pkg/lang/bigdecimal_test.go create mode 100644 pkg/lang/equal_typed_test.go create mode 100644 pkg/lang/persistentqueue.go create mode 100644 pkg/lang/persistentqueue_test.go create mode 100644 pkg/lang/taggedliteral.go create mode 100644 pkg/lang/taggedliteral_test.go diff --git a/pkg/javacompat/base64/base64.go b/pkg/javacompat/base64/base64.go new file mode 100644 index 00000000..9718574a --- /dev/null +++ b/pkg/javacompat/base64/base64.go @@ -0,0 +1,88 @@ +// 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 (*Decoder) Decode(value any) []byte { + 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) + } + return decoded +} + +// 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..b6ec486b --- /dev/null +++ b/pkg/javacompat/base64/base64_test.go @@ -0,0 +1,13 @@ +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 := string(GetDecoder().Decode(encoded)); decoded != "hi" { + t.Fatalf("decoded = %q, want hi", decoded) + } +} diff --git a/pkg/javacompat/date/date.go b/pkg/javacompat/date/date.go index 4cff53c9..41988353 100644 --- a/pkg/javacompat/date/date.go +++ b/pkg/javacompat/date/date.go @@ -44,6 +44,24 @@ 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 +} + +// 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") @@ -51,6 +69,8 @@ func init() { pkgmap.SetHostClass("Date", class) lang.RegisterHostConstructor("java.util.Date", lang.FnFunc(func(args ...any) any { return New(args...) })) + pkgmap.Set("github.com/glojurelang/glojure/pkg/javacompat/date.ParseInstantDate", + lang.FnFunc1(ParseInstantDate)) } func toInt64(value any) int64 { diff --git a/pkg/javacompat/date/date_test.go b/pkg/javacompat/date/date_test.go index ac76a401..e0fc92e6 100644 --- a/pkg/javacompat/date/date_test.go +++ b/pkg/javacompat/date/date_test.go @@ -16,3 +16,16 @@ 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) { + if !New(int64(42)).(*Date).Equals(New(int64(42))) { + t.Fatal("dates with equal milliseconds were not equal") + } +} diff --git a/pkg/javacompat/filesystem/filesystem.go b/pkg/javacompat/filesystem/filesystem.go index 543c5de9..d265796f 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) diff --git a/pkg/javacompat/filesystem/filesystem_test.go b/pkg/javacompat/filesystem/filesystem_test.go index f2cef15c..aa503add 100644 --- a/pkg/javacompat/filesystem/filesystem_test.go +++ b/pkg/javacompat/filesystem/filesystem_test.go @@ -28,3 +28,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/nio/nio.go b/pkg/javacompat/nio/nio.go new file mode 100644 index 00000000..867aa383 --- /dev/null +++ b/pkg/javacompat/nio/nio.go @@ -0,0 +1,129 @@ +// Package nio exposes the small java.nio charset surface used by portable +// Clojure libraries. +package nio + +import ( + "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 } +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 { return &ByteBuffer{bytes: byteSlice(value)} } + +// 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..15befa7d --- /dev/null +++ b/pkg/javacompat/nio/nio_test.go @@ -0,0 +1,16 @@ +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})) +} diff --git a/pkg/javacompat/streams/streams.go b/pkg/javacompat/streams/streams.go index 8dcc3c0d..8a24bacf 100644 --- a/pkg/javacompat/streams/streams.go +++ b/pkg/javacompat/streams/streams.go @@ -4,11 +4,13 @@ package streams import ( "bufio" "bytes" + "errors" "fmt" "io" "os" "reflect" "strings" + "unicode/utf8" "github.com/glojurelang/glojure/pkg/lang" "github.com/glojurelang/glojure/pkg/pkgmap" @@ -19,10 +21,20 @@ 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 + lineNumber int + lastRune rune + lastRuneSize int + lastRuneWasNew bool } type PrintWriter struct { io.Writer @@ -45,7 +57,70 @@ func (s *ByteArrayOutputStream) ToByteArray() []byte { 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 +128,31 @@ func (s *PushbackReader) Close() { } } } +func (s *PushbackReader) ReadRune() (rune, int, error) { + 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 err := s.Reader.UnreadRune(); err != nil { + return err + } + if s.lastRuneWasNew { + s.lineNumber-- + } + s.lastRuneSize = 0 + s.lastRuneWasNew = false + return nil +} +func (s *PushbackReader) GetLineNumber() int { return s.lineNumber } func (w *PrintWriter) Close() { if w.closer != nil { if err := w.closer.Close(); err != nil { @@ -68,7 +168,18 @@ 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) } @@ -106,7 +217,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 { @@ -124,7 +235,7 @@ func NewPushbackReader(args ...any) any { if !ok { panic(fmt.Sprintf("PushbackReader/new: %T is not a reader", args[0])) } - pushback := &PushbackReader{Reader: bufio.NewReader(reader)} + pushback := &PushbackReader{Reader: bufio.NewReader(reader), lineNumber: 1} pushback.closer, _ = args[0].(io.Closer) return pushback } diff --git a/pkg/javacompat/streams/streams_test.go b/pkg/javacompat/streams/streams_test.go index 7ec43981..782cf48f 100644 --- a/pkg/javacompat/streams/streams_test.go +++ b/pkg/javacompat/streams/streams_test.go @@ -5,8 +5,23 @@ import ( "os" "path/filepath" "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 := string(stream.ToByteArray()); got != "ABC" { + t.Fatalf("bytes = %q, want ABC", got) + } +} + type closeTrackingReader struct { *bytes.Reader closed bool @@ -40,6 +55,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 +99,28 @@ func TestPushbackReaderRunes(t *testing.T) { } } +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) 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/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 2e692615..a2dbdb31 100644 --- a/pkg/javacompat/uuid/uuid.go +++ b/pkg/javacompat/uuid/uuid.go @@ -64,6 +64,7 @@ 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.NewClassWithTypes( "java.util.UUID", diff --git a/pkg/lang/bigdecimal.go b/pkg/lang/bigdecimal.go index 752bede8..ae733ce2 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,9 +22,18 @@ import ( // arithmetic with decimal fractions. A decimal representation // would avoid this problem. type BigDecimal struct { - val *big.Float + val *big.Float + scale int + hasScale bool } +type RoundingMode string + +const ( + RoundingModeDown RoundingMode = "DOWN" + RoundingModeHalfEven RoundingMode = "HALF_EVEN" +) + // NewBigDecimal creates a new BigDecimal from a string. func NewBigDecimal(s string) (*BigDecimal, error) { bf, ok := new(big.Float).SetString(s) @@ -61,6 +72,49 @@ 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) + + if fmt.Sprint(mode) == 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) + } + return n.val.Text('f', -1) +} + func (n *BigDecimal) ToBigFloat() *big.Float { res := new(big.Float) res.Set(n.val) @@ -177,3 +231,33 @@ func (n *BigDecimal) Abs() *BigDecimal { } return n } + +func newHostBigDecimal(args ...any) any { + 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 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) + } +} diff --git a/pkg/lang/bigdecimal_test.go b/pkg/lang/bigdecimal_test.go new file mode 100644 index 00000000..fdccfb75 --- /dev/null +++ b/pkg/lang/bigdecimal_test.go @@ -0,0 +1,24 @@ +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) + } +} diff --git a/pkg/lang/equal.go b/pkg/lang/equal.go index 07ff2c2d..1646d8e9 100644 --- a/pkg/lang/equal.go +++ b/pkg/lang/equal.go @@ -66,6 +66,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 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/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..2c54a913 100644 --- a/pkg/lang/record.go +++ b/pkg/lang/record.go @@ -132,6 +132,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 +191,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/struct.go b/pkg/lang/struct.go index 1aed98f2..8088fc79 100644 --- a/pkg/lang/struct.go +++ b/pkg/lang/struct.go @@ -207,6 +207,57 @@ 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) 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 e36f0002..ec0faf21 100644 --- a/pkg/lang/type.go +++ b/pkg/lang/type.go @@ -24,6 +24,10 @@ 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) } diff --git a/pkg/lang/type_test.go b/pkg/lang/type_test.go index 5738a6e1..e3178505 100644 --- a/pkg/lang/type_test.go +++ b/pkg/lang/type_test.go @@ -21,6 +21,17 @@ 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 TestHasTypeAcceptsClass(t *testing.T) { class := NewClass(reflect.TypeOf(""), "java.lang.String") if !HasType(class, "value") { diff --git a/pkg/reader/reader.go b/pkg/reader/reader.go index 509f7149..a49ee488 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 ( @@ -1038,11 +1039,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/stdlib/clojure/core.glj b/pkg/stdlib/clojure/core.glj index 734e3d6e..fb9b5a11 100644 --- a/pkg/stdlib/clojure/core.glj +++ b/pkg/stdlib/clojure/core.glj @@ -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/loader.go b/pkg/stdlib/clojure/core/loader.go index ec8b548a..cda949ef 100644 --- a/pkg/stdlib/clojure/core/loader.go +++ b/pkg/stdlib/clojure/core/loader.go @@ -27796,7 +27796,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 diff --git a/scripts/rewrite-core/rewrite.clj b/scripts/rewrite-core/rewrite.clj index 12a235e7..90037427 100644 --- a/scripts/rewrite-core/rewrite.clj +++ b/scripts/rewrite-core/rewrite.clj @@ -1393,6 +1393,12 @@ (sexpr-replace '(.getInterfaces c) nil) ;; no such concept in go (sexpr-replace '(.getSuperclass c) nil) ;; no such concept in go + ;; Preserve the public JVM compatibility class while giving AOT a concrete + ;; Go type for the predicate. The hosted class is registered at runtime, + ;; after clojure.core itself is compiled. + (sexpr-replace '(instance? clojure.lang.TaggedLiteral value) + '(instance? github.com:glojurelang:glojure:pkg:lang.*TaggedLiteral value)) + ;; Omit some methods [(fn select [zloc] (and (z/list? zloc) (let [sexpr (z/sexpr zloc)] From 6a670eb886d690109a2197d14060f5d42bfed13a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 3 Aug 2026 02:40:44 -0400 Subject: [PATCH 06/31] Expand Java runtime compatibility --- pkg/javacompat/arrays/arrays.go | 56 +++++++++ pkg/javacompat/arrays/arrays_test.go | 12 ++ pkg/javacompat/base64/base64.go | 8 +- pkg/javacompat/base64/base64_test.go | 16 ++- pkg/javacompat/classes/classes.go | 2 + pkg/javacompat/filesystem/filesystem.go | 32 ++++- pkg/javacompat/filesystem/filesystem_test.go | 24 ++++ pkg/javacompat/nio/nio.go | 53 ++++++++- pkg/javacompat/nio/nio_test.go | 24 ++++ .../processbuilder/processbuilder.go | 110 ++++++++++++++++++ .../processbuilder/processbuilder_test.go | 22 ++++ pkg/javacompat/regex/regex.go | 27 ++++- pkg/javacompat/regex/regex_test.go | 21 ++++ pkg/javacompat/stacktrace/stacktrace.go | 42 +++++++ pkg/javacompat/stacktrace/stacktrace_test.go | 13 +++ pkg/javacompat/string/string.go | 26 +++++ pkg/javacompat/string/string_compat_test.go | 12 ++ pkg/lang/equal.go | 8 ++ pkg/lang/numbers.go | 13 ++- pkg/lang/numbers_cast_test.go | 14 ++- pkg/lang/struct.go | 21 ++++ pkg/lang/type_test.go | 8 ++ pkg/reader/reader.go | 19 ++- pkg/reader/reader_test.go | 36 ++++++ 24 files changed, 604 insertions(+), 15 deletions(-) create mode 100644 pkg/javacompat/arrays/arrays.go create mode 100644 pkg/javacompat/arrays/arrays_test.go create mode 100644 pkg/javacompat/processbuilder/processbuilder.go create mode 100644 pkg/javacompat/processbuilder/processbuilder_test.go create mode 100644 pkg/javacompat/regex/regex_test.go create mode 100644 pkg/javacompat/stacktrace/stacktrace.go create mode 100644 pkg/javacompat/stacktrace/stacktrace_test.go create mode 100644 pkg/javacompat/string/string_compat_test.go diff --git a/pkg/javacompat/arrays/arrays.go b/pkg/javacompat/arrays/arrays.go new file mode 100644 index 00000000..da9d62b6 --- /dev/null +++ b/pkg/javacompat/arrays/arrays.go @@ -0,0 +1,56 @@ +// Package arrays exposes common java.util.Arrays operations. +package arrays + +import ( + "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 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) +} + +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..56905de0 --- /dev/null +++ b/pkg/javacompat/arrays/arrays_test.go @@ -0,0 +1,12 @@ +package arrays + +import "testing" + +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 index 9718574a..9cc849df 100644 --- a/pkg/javacompat/base64/base64.go +++ b/pkg/javacompat/base64/base64.go @@ -26,7 +26,7 @@ func (*Encoder) EncodeToString(value any) string { return stdbase64.StdEncoding.EncodeToString(byteSlice(value)) } -func (*Decoder) Decode(value any) []byte { +func (*Decoder) Decode(value any) []int8 { var text string switch value := value.(type) { case string: @@ -38,7 +38,11 @@ func (*Decoder) Decode(value any) []byte { if err != nil { panic(err) } - return decoded + 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 diff --git a/pkg/javacompat/base64/base64_test.go b/pkg/javacompat/base64/base64_test.go index b6ec486b..bf3b4d66 100644 --- a/pkg/javacompat/base64/base64_test.go +++ b/pkg/javacompat/base64/base64_test.go @@ -7,7 +7,19 @@ func TestBase64RoundTrip(t *testing.T) { if encoded != "aGk=" { t.Fatalf("encoded = %q, want aGk=", encoded) } - if decoded := string(GetDecoder().Decode(encoded)); decoded != "hi" { - t.Fatalf("decoded = %q, want hi", decoded) + if decoded := GetDecoder().Decode(encoded); !EqualsBytes(decoded, []int8{'h', 'i'}) { + t.Fatalf("decoded = %v, want hi", decoded) } } + +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/classes/classes.go b/pkg/javacompat/classes/classes.go index c64d1bd9..8136e95d 100644 --- a/pkg/javacompat/classes/classes.go +++ b/pkg/javacompat/classes/classes.go @@ -17,6 +17,8 @@ func register(name, javaPackage string, typ reflect.Type) { func init() { register("Object", "java.lang", reflect.TypeOf((*any)(nil)).Elem()) register("Byte", "java.lang", reflect.TypeOf(int8(0))) + 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()) diff --git a/pkg/javacompat/filesystem/filesystem.go b/pkg/javacompat/filesystem/filesystem.go index d265796f..e669bd88 100644 --- a/pkg/javacompat/filesystem/filesystem.go +++ b/pkg/javacompat/filesystem/filesystem.go @@ -124,16 +124,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 aa503add..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) diff --git a/pkg/javacompat/nio/nio.go b/pkg/javacompat/nio/nio.go index 867aa383..e2b69e8a 100644 --- a/pkg/javacompat/nio/nio.go +++ b/pkg/javacompat/nio/nio.go @@ -13,7 +13,11 @@ import ( type Charset struct{ name string } type CharsetDecoder struct{ charset *Charset } -type ByteBuffer struct{ bytes []byte } +type ByteBuffer struct { + bytes []byte + position int + limit int +} type CodingErrorAction string type CharacterCodingException struct{ message string } @@ -56,7 +60,52 @@ func (d *CharsetDecoder) Decode(buffer any) string { } func (*CharacterCodingException) Error() string { return "Input length = 1" } -func Wrap(value any) *ByteBuffer { return &ByteBuffer{bytes: byteSlice(value)} } +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]) +} + +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() {} diff --git a/pkg/javacompat/nio/nio_test.go b/pkg/javacompat/nio/nio_test.go index 15befa7d..bc89bb58 100644 --- a/pkg/javacompat/nio/nio_test.go +++ b/pkg/javacompat/nio/nio_test.go @@ -14,3 +14,27 @@ func TestUTF8Decoder(t *testing.T) { }() 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') + } +} 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..69d5a595 100644 --- a/pkg/javacompat/regex/regex.go +++ b/pkg/javacompat/regex/regex.go @@ -12,6 +12,7 @@ package regex import ( "fmt" "reflect" + "strings" jregex "github.com/gloathub/gojava/regex" "github.com/glojurelang/glojure/pkg/lang" @@ -35,19 +36,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,6 +75,19 @@ 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 register(jvmName, goName string, v any) { pkgmap.Set(pkg+"."+goName, v) pkgmap.Set("Pattern."+jvmName, v) @@ -86,6 +105,10 @@ 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", lang.FnFunc1(func(value any) any { return IsPattern(value) })) + pkgmap.Set(pkg+".ReplaceAll", lang.FnFunc3(func(pattern, input, replacement any) any { + return ReplaceAll(pattern, toString(input), toString(replacement)) + })) } 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/string/string.go b/pkg/javacompat/string/string.go index 96ef3c9a..c8c158d0 100644 --- a/pkg/javacompat/string/string.go +++ b/pkg/javacompat/string/string.go @@ -56,6 +56,30 @@ func Join(args ...any) string { func ValueOf(x any) string { return jstr.ValueOf(x) } +func New(args ...any) any { + if len(args) < 1 || len(args) > 2 { + panic(fmt.Sprintf("String/new: wrong number of args (%d)", len(args))) + } + 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.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]) if !ok { @@ -82,6 +106,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...) })) diff --git a/pkg/javacompat/string/string_compat_test.go b/pkg/javacompat/string/string_compat_test.go new file mode 100644 index 00000000..9326e795 --- /dev/null +++ b/pkg/javacompat/string/string_compat_test.go @@ -0,0 +1,12 @@ +package string + +import "testing" + +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) + } +} diff --git a/pkg/lang/equal.go b/pkg/lang/equal.go index 1646d8e9..4851c316 100644 --- a/pkg/lang/equal.go +++ b/pkg/lang/equal.go @@ -23,6 +23,14 @@ 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 { return true diff --git a/pkg/lang/numbers.go b/pkg/lang/numbers.go index 292c0021..32d15004 100644 --- a/pkg/lang/numbers.go +++ b/pkg/lang/numbers.go @@ -531,7 +531,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 { diff --git a/pkg/lang/numbers_cast_test.go b/pkg/lang/numbers_cast_test.go index 9f2787e3..74aca9ad 100644 --- a/pkg/lang/numbers_cast_test.go +++ b/pkg/lang/numbers_cast_test.go @@ -1,6 +1,18 @@ package lang -import "testing" +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} { diff --git a/pkg/lang/struct.go b/pkg/lang/struct.go index 8088fc79..7605827b 100644 --- a/pkg/lang/struct.go +++ b/pkg/lang/struct.go @@ -86,6 +86,22 @@ 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 resolver, ok := v.(FieldOrMethodResolver); ok { if result, found := resolver.ResolveFieldOrMethod(name); found { return result, true @@ -134,6 +150,11 @@ 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 } } diff --git a/pkg/lang/type_test.go b/pkg/lang/type_test.go index e3178505..5a1b025b 100644 --- a/pkg/lang/type_test.go +++ b/pkg/lang/type_test.go @@ -55,3 +55,11 @@ func TestHasTypeAcceptsClassAliases(t *testing.T) { 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/reader/reader.go b/pkg/reader/reader.go index a49ee488..858c639e 100644 --- a/pkg/reader/reader.go +++ b/pkg/reader/reader.go @@ -726,13 +726,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 { @@ -745,7 +752,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 } diff --git a/pkg/reader/reader_test.go b/pkg/reader/reader_test.go index a9065ce8..c5684610 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" @@ -235,3 +236,38 @@ 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 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) + } +} From e1ab191c80fb3ca7779956ad084a48e20085db4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 3 Aug 2026 06:53:26 -0400 Subject: [PATCH 07/31] Expand hosted Java compatibility --- pkg/compiler/analyze.go | 13 ++ pkg/compiler/analyze_test.go | 11 ++ pkg/javacompat/arrays/arrays.go | 48 +++++ pkg/javacompat/arrays/arrays_test.go | 17 +- pkg/javacompat/base64/base64.go | 9 + pkg/javacompat/base64/base64_test.go | 8 + pkg/javacompat/classes/classes.go | 88 ++++++++- pkg/javacompat/classes/classes_test.go | 32 +++- pkg/javacompat/date/date.go | 14 ++ pkg/javacompat/date/date_test.go | 17 +- pkg/javacompat/double/double.go | 22 ++- pkg/javacompat/double/double_test.go | 10 + pkg/javacompat/filesystem/filesystem.go | 3 + pkg/javacompat/instant/instant.go | 11 ++ pkg/javacompat/integer/integer.go | 10 + pkg/javacompat/math/math.go | 29 +++ pkg/javacompat/messagedigest/messagedigest.go | 175 ++++++++++++++++++ .../messagedigest/messagedigest_test.go | 56 ++++++ pkg/javacompat/nio/nio.go | 12 ++ pkg/javacompat/nio/nio_test.go | 14 ++ pkg/javacompat/regex/regex.go | 19 +- pkg/javacompat/streams/streams.go | 170 ++++++++++++++++- pkg/javacompat/streams/streams_test.go | 71 ++++++- pkg/javacompat/string/string.go | 24 ++- pkg/javacompat/string/string_compat_test.go | 13 +- pkg/javacompat/uuid/uuid.go | 7 + pkg/lang/bigdecimal.go | 45 ++++- pkg/lang/bigdecimal_test.go | 28 +++ pkg/lang/bigint.go | 19 ++ pkg/lang/char.go | 16 +- pkg/lang/class.go | 36 ++++ pkg/lang/equal.go | 9 +- pkg/lang/hashes.go | 2 + pkg/lang/interfaces.go | 6 +- pkg/lang/iteration.go | 19 +- pkg/lang/keyword.go | 6 +- pkg/lang/keyword_test.go | 8 + pkg/lang/multifn.go | 33 +++- pkg/lang/multifn_test.go | 29 +++ pkg/lang/namespace.go | 4 + pkg/lang/numbers.go | 28 +++ pkg/lang/numbers_unchecked_test.go | 15 ++ pkg/lang/record.go | 4 + pkg/lang/record_test.go | 14 +- pkg/lang/reduced.go | 7 + pkg/lang/regexpmatcher.go | 10 + pkg/lang/regexpmatcher_test.go | 7 + pkg/lang/slices.go | 13 +- pkg/lang/slices_test.go | 8 + pkg/lang/string_bytes_test.go | 9 +- pkg/lang/stringseq.go | 16 +- pkg/lang/struct.go | 42 +++++ pkg/lang/subvector.go | 27 +++ pkg/lang/subvector_test.go | 17 ++ pkg/lang/type.go | 14 +- pkg/lang/type_test.go | 8 + pkg/lang/vector.go | 20 +- pkg/lang/vector_test.go | 31 +++- pkg/reader/reader.go | 23 ++- pkg/reader/reader_test.go | 11 ++ pkg/runtime/rtcompat.go | 26 ++- 61 files changed, 1429 insertions(+), 84 deletions(-) create mode 100644 pkg/javacompat/messagedigest/messagedigest.go create mode 100644 pkg/javacompat/messagedigest/messagedigest_test.go create mode 100644 pkg/lang/numbers_unchecked_test.go create mode 100644 pkg/lang/subvector_test.go 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/javacompat/arrays/arrays.go b/pkg/javacompat/arrays/arrays.go index da9d62b6..3c1ff6fb 100644 --- a/pkg/javacompat/arrays/arrays.go +++ b/pkg/javacompat/arrays/arrays.go @@ -2,6 +2,7 @@ package arrays import ( + "fmt" "reflect" "github.com/glojurelang/glojure/pkg/lang" @@ -31,6 +32,48 @@ func Equals(left, right any) bool { 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() { @@ -40,6 +83,11 @@ func init() { 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 { diff --git a/pkg/javacompat/arrays/arrays_test.go b/pkg/javacompat/arrays/arrays_test.go index 56905de0..ce793df2 100644 --- a/pkg/javacompat/arrays/arrays_test.go +++ b/pkg/javacompat/arrays/arrays_test.go @@ -1,6 +1,21 @@ package arrays -import "testing" +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}) { diff --git a/pkg/javacompat/base64/base64.go b/pkg/javacompat/base64/base64.go index 9cc849df..de12fedc 100644 --- a/pkg/javacompat/base64/base64.go +++ b/pkg/javacompat/base64/base64.go @@ -26,6 +26,15 @@ 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) { diff --git a/pkg/javacompat/base64/base64_test.go b/pkg/javacompat/base64/base64_test.go index bf3b4d66..b51d0429 100644 --- a/pkg/javacompat/base64/base64_test.go +++ b/pkg/javacompat/base64/base64_test.go @@ -12,6 +12,14 @@ func TestBase64RoundTrip(t *testing.T) { } } +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 diff --git a/pkg/javacompat/classes/classes.go b/pkg/javacompat/classes/classes.go index 8136e95d..626dea18 100644 --- a/pkg/javacompat/classes/classes.go +++ b/pkg/javacompat/classes/classes.go @@ -3,6 +3,8 @@ package classes import ( + "fmt" + "math/big" "reflect" "github.com/glojurelang/glojure/pkg/lang" @@ -14,18 +16,100 @@ func register(name, javaPackage string, typ reflect.Type) { 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 + } + } + 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 lang.NewBigIntFromGoBigInt(number) + } + if len(bytes) > 0 && bytes[0]&0x80 != 0 { + number.Sub(number, new(big.Int).Lsh(big.NewInt(1), uint(8*len(bytes)))) + } + return lang.NewBigIntFromGoBigInt(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("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))) + 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()) @@ -40,8 +124,10 @@ 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()) diff --git a/pkg/javacompat/classes/classes_test.go b/pkg/javacompat/classes/classes_test.go index 2a068bac..064fc632 100644 --- a/pkg/javacompat/classes/classes_test.go +++ b/pkg/javacompat/classes/classes_test.go @@ -1,22 +1,50 @@ 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", "Byte", "Short", "Float", "Comparable", "Set", "List", "Map", "Keyword", "IDeref", "Associative", + "Object", "Byte", "Short", "Float", "Comparable", "CharSequence", "Number", "Class", "ClassNotFoundException", "NumberFormatException", "Set", "Collection", "List", "Map", "Keyword", "IDeref", "Associative", "Counted", "IAtom", "IBlockingDeref", "IChunkedSeq", "IEditableCollection", "IFn", "ILookup", "IMapEntry", "IMeta", "IObj", "IPending", "IPersistentCollection", "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}).(*lang.BigInt) + if got, want := value.ToBigInteger().Cmp(big.NewInt(255)), 0; got != want { + t.Fatalf("BigInteger(1, [0xff]) = %v", value) + } + if got, want := value.ToString(int64(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"))) + } +} diff --git a/pkg/javacompat/date/date.go b/pkg/javacompat/date/date.go index 41988353..5810bf5c 100644 --- a/pkg/javacompat/date/date.go +++ b/pkg/javacompat/date/date.go @@ -4,6 +4,7 @@ package date import ( "fmt" + "io" "reflect" "time" @@ -27,6 +28,10 @@ func New(args ...any) any { } 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) @@ -49,6 +54,11 @@ func (d *Date) Equals(other any) bool { 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 { @@ -67,6 +77,10 @@ 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...) })) pkgmap.Set("github.com/glojurelang/glojure/pkg/javacompat/date.ParseInstantDate", diff --git a/pkg/javacompat/date/date_test.go b/pkg/javacompat/date/date_test.go index e0fc92e6..f9ea2d62 100644 --- a/pkg/javacompat/date/date_test.go +++ b/pkg/javacompat/date/date_test.go @@ -1,11 +1,21 @@ package date import ( + "bytes" "testing" "github.com/glojurelang/glojure/pkg/lang" ) +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) @@ -25,7 +35,12 @@ func TestParseInstantDate(t *testing.T) { } func TestDateEquality(t *testing.T) { - if !New(int64(42)).(*Date).Equals(New(int64(42))) { + 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") + } } 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 e669bd88..68d76127 100644 --- a/pkg/javacompat/filesystem/filesystem.go +++ b/pkg/javacompat/filesystem/filesystem.go @@ -112,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 { diff --git a/pkg/javacompat/instant/instant.go b/pkg/javacompat/instant/instant.go index aacc9705..9d735e8e 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() } @@ -64,6 +70,11 @@ func register(jvmName, goName string, v any) { } 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/integer/integer.go b/pkg/javacompat/integer/integer.go index 4443c8d3..a79f8a6f 100644 --- a/pkg/javacompat/integer/integer.go +++ b/pkg/javacompat/integer/integer.go @@ -105,6 +105,16 @@ func register(jvmName, goName string, v any) { } 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 index e2b69e8a..da76ae5e 100644 --- a/pkg/javacompat/nio/nio.go +++ b/pkg/javacompat/nio/nio.go @@ -3,6 +3,7 @@ package nio import ( + "encoding/binary" "fmt" "reflect" "unicode/utf8" @@ -102,6 +103,17 @@ func (b *ByteBuffer) Get(index any) int8 { 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)} diff --git a/pkg/javacompat/nio/nio_test.go b/pkg/javacompat/nio/nio_test.go index bc89bb58..7b7b3db6 100644 --- a/pkg/javacompat/nio/nio_test.go +++ b/pkg/javacompat/nio/nio_test.go @@ -38,3 +38,17 @@ func TestByteBufferPositionLimitAndSlice(t *testing.T) { 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/regex/regex.go b/pkg/javacompat/regex/regex.go index 69d5a595..ace4f19c 100644 --- a/pkg/javacompat/regex/regex.go +++ b/pkg/javacompat/regex/regex.go @@ -12,6 +12,7 @@ package regex import ( "fmt" "reflect" + stdregexp "regexp" "strings" jregex "github.com/gloathub/gojava/regex" @@ -88,11 +89,21 @@ func ReplaceAll(pattern any, input, replacement string) string { 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() { @@ -105,10 +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", lang.FnFunc1(func(value any) any { return IsPattern(value) })) - pkgmap.Set(pkg+".ReplaceAll", lang.FnFunc3(func(pattern, input, replacement any) any { - return ReplaceAll(pattern, toString(input), toString(replacement)) - })) + pkgmap.Set(pkg+".IsPattern", IsPatternCompat) + pkgmap.Set(pkg+".ReplaceAll", ReplaceAllCompat) } func toString(x any) string { diff --git a/pkg/javacompat/streams/streams.go b/pkg/javacompat/streams/streams.go index 8a24bacf..44be8f04 100644 --- a/pkg/javacompat/streams/streams.go +++ b/pkg/javacompat/streams/streams.go @@ -31,11 +31,50 @@ type StringReader struct { type PushbackReader struct { *bufio.Reader 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 @@ -51,8 +90,13 @@ 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() } @@ -129,7 +173,16 @@ func (s *PushbackReader) Close() { } } func (s *PushbackReader) ReadRune() (rune, int, error) { - rn, size, err := s.Reader.ReadRune() + 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 } @@ -142,16 +195,64 @@ func (s *PushbackReader) ReadRune() (rune, int, error) { return rn, size, nil } func (s *PushbackReader) UnreadRune() error { - if err := s.Reader.UnreadRune(); err != nil { - return err - } - if s.lastRuneWasNew { - s.lineNumber-- + 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 { @@ -184,6 +285,42 @@ func (s *StringReader) ReadLine() any { 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 { @@ -228,14 +365,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), lineNumber: 1} + 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 } @@ -305,6 +449,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: diff --git a/pkg/javacompat/streams/streams_test.go b/pkg/javacompat/streams/streams_test.go index 782cf48f..8876c176 100644 --- a/pkg/javacompat/streams/streams_test.go +++ b/pkg/javacompat/streams/streams_test.go @@ -2,8 +2,10 @@ package streams import ( "bytes" + "io" "os" "path/filepath" + "reflect" "testing" "github.com/glojurelang/glojure/pkg/lang" @@ -17,8 +19,19 @@ func TestByteArrayOutputStreamJavaWriteOverloads(t *testing.T) { } lang.Apply(write, []any{int('A')}) lang.Apply(write, []any{[]int8{'B', 'C'}}) - if got := string(stream.ToByteArray()); got != "ABC" { - t.Fatalf("bytes = %q, want ABC", got) + 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) } } @@ -99,6 +112,37 @@ 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 { @@ -159,3 +203,26 @@ 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) + } +} diff --git a/pkg/javacompat/string/string.go b/pkg/javacompat/string/string.go index c8c158d0..fafa4bb6 100644 --- a/pkg/javacompat/string/string.go +++ b/pkg/javacompat/string/string.go @@ -54,12 +54,24 @@ 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) > 2 { + 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 @@ -71,7 +83,7 @@ func New(args ...any) any { bytes[index] = byte(item) } return string(bytes) - case lang.IPersistentVector: + case []lang.Char, []int32, lang.IPersistentVector: chars, ok := toInt32Slice(value) if ok { return string(chars) @@ -369,6 +381,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 index 9326e795..5b348827 100644 --- a/pkg/javacompat/string/string_compat_test.go +++ b/pkg/javacompat/string/string_compat_test.go @@ -1,6 +1,10 @@ package string -import "testing" +import ( + "testing" + + "github.com/glojurelang/glojure/pkg/lang" +) func TestStringConstructors(t *testing.T) { if got := New([]byte("hello"), "ASCII"); got != "hello" { @@ -10,3 +14,10 @@ func TestStringConstructors(t *testing.T) { 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) + } +} diff --git a/pkg/javacompat/uuid/uuid.go b/pkg/javacompat/uuid/uuid.go index a2dbdb31..b515e0db 100644 --- a/pkg/javacompat/uuid/uuid.go +++ b/pkg/javacompat/uuid/uuid.go @@ -9,6 +9,7 @@ package uuid import ( "fmt" + "io" "reflect" juuid "github.com/gloathub/gojava/uuid" @@ -74,6 +75,12 @@ func register(jvmName, goName string, v any) { } 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/lang/bigdecimal.go b/pkg/lang/bigdecimal.go index ae733ce2..6150e93c 100644 --- a/pkg/lang/bigdecimal.go +++ b/pkg/lang/bigdecimal.go @@ -23,6 +23,7 @@ import ( // would avoid this problem. type BigDecimal struct { val *big.Float + text string scale int hasScale bool } @@ -40,7 +41,7 @@ func NewBigDecimal(s string) (*BigDecimal, error) { if !ok { return nil, fmt.Errorf("invalid big decimal: %s", s) } - return &BigDecimal{val: bf}, nil + return &BigDecimal{val: bf, text: s}, nil } // NewBigDecimalFromBigFloat @@ -112,6 +113,9 @@ 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) } @@ -122,6 +126,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, ".") { @@ -133,7 +140,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, ".") @@ -233,6 +240,33 @@ func (n *BigDecimal) Abs() *BigDecimal { } 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))) } @@ -246,6 +280,13 @@ func newHostBigDecimal(args ...any) any { 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", diff --git a/pkg/lang/bigdecimal_test.go b/pkg/lang/bigdecimal_test.go index fdccfb75..1beb86c3 100644 --- a/pkg/lang/bigdecimal_test.go +++ b/pkg/lang/bigdecimal_test.go @@ -22,3 +22,31 @@ func TestBigDecimalJavaCompatibility(t *testing.T) { 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 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 03efdb23..d53b31fb 100644 --- a/pkg/lang/char.go +++ b/pkg/lang/char.go @@ -103,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()) } - return NewChar(rune(s[idx])) + 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()) + } + r, _ := utf8.DecodeRuneInString(s[bytePos:]) + return NewChar(r) } diff --git a/pkg/lang/class.go b/pkg/lang/class.go index 85bb92aa..9b993680 100644 --- a/pkg/lang/class.go +++ b/pkg/lang/class.go @@ -20,7 +20,24 @@ type Class struct { 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). @@ -61,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 { @@ -74,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)) } @@ -100,3 +126,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 4851c316..f6b0badb 100644 --- a/pkg/lang/equal.go +++ b/pkg/lang/equal.go @@ -32,7 +32,8 @@ func Equals(a, b any) bool { } } - if a == b { + if aVal.IsValid() && bVal.IsValid() && + aVal.Type() == bVal.Type() && aVal.Type().Comparable() && a == b { return true } @@ -123,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/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/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 32d15004..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 } 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/record.go b/pkg/lang/record.go index 2c54a913..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: " + 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/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 7605827b..13ff776f 100644 --- a/pkg/lang/struct.go +++ b/pkg/lang/struct.go @@ -7,6 +7,8 @@ import ( "regexp" "sync" "unicode" + + "github.com/glojurelang/glojure/pkg/pkgmap" ) type fomKey struct { @@ -36,6 +38,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,6 +72,14 @@ 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 *Var: switch name { @@ -78,6 +95,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. @@ -128,6 +163,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 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/type.go b/pkg/lang/type.go index ec0faf21..f09c9067 100644 --- a/pkg/lang/type.go +++ b/pkg/lang/type.go @@ -68,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 5a1b025b..ed45052b 100644 --- a/pkg/lang/type_test.go +++ b/pkg/lang/type_test.go @@ -32,6 +32,14 @@ func TestHasTypeRecordDescriptor(t *testing.T) { } } +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") { 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 858c639e..f7640b97 100644 --- a/pkg/reader/reader.go +++ b/pkg/reader/reader.go @@ -591,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) } @@ -599,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++ diff --git a/pkg/reader/reader_test.go b/pkg/reader/reader_test.go index c5684610..74df7835 100644 --- a/pkg/reader/reader_test.go +++ b/pkg/reader/reader_test.go @@ -261,6 +261,17 @@ func TestJavaEscapeRegex(t *testing.T) { } } +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() 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) From 18f75eb6215b21a0d7092deff5c3adbd9fdceeef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 3 Aug 2026 09:27:38 -0400 Subject: [PATCH 08/31] Add Grenadine-backed dependency loading Embed Grenadine's portable resolver and expose glojure.deps plus the shared clojurestar.deps facade. Add the native filesystem, HTTP, hashing, and archive host needed to install Maven dependencies and append their extracted source roots at runtime. --- pkg/runtime/envinit.go | 2 + pkg/runtime/grenadine_host.go | 221 ++++++++++++++++++ pkg/runtime/grenadine_host_test.go | 69 ++++++ pkg/stdlib/clojurestar/deps.cljc | 17 ++ pkg/stdlib/glojure/deps.clj | 47 ++++ pkg/stdlib/glojure/deps/host.clj | 2 + pkg/stdlib/grenadine/core.cljc | 74 ++++++ pkg/stdlib/grenadine/expander.cljc | 333 +++++++++++++++++++++++++++ pkg/stdlib/grenadine/graph.cljc | 338 ++++++++++++++++++++++++++++ pkg/stdlib/grenadine/lock.cljc | 71 ++++++ pkg/stdlib/grenadine/pom.cljc | 347 +++++++++++++++++++++++++++++ pkg/stdlib/grenadine/repo.cljc | 328 +++++++++++++++++++++++++++ pkg/stdlib/grenadine/runtime.cljc | 57 +++++ pkg/stdlib/grenadine/version.cljc | 192 ++++++++++++++++ pkg/stdlib/grenadine/xml.cljc | 293 ++++++++++++++++++++++++ pkg/stdlib/stdlib.go | 2 +- test/glojure/test_glojure/deps.glj | 22 ++ 17 files changed, 2414 insertions(+), 1 deletion(-) create mode 100644 pkg/runtime/grenadine_host.go create mode 100644 pkg/runtime/grenadine_host_test.go create mode 100644 pkg/stdlib/clojurestar/deps.cljc create mode 100644 pkg/stdlib/glojure/deps.clj create mode 100644 pkg/stdlib/glojure/deps/host.clj create mode 100644 pkg/stdlib/grenadine/core.cljc create mode 100644 pkg/stdlib/grenadine/expander.cljc create mode 100644 pkg/stdlib/grenadine/graph.cljc create mode 100644 pkg/stdlib/grenadine/lock.cljc create mode 100644 pkg/stdlib/grenadine/pom.cljc create mode 100644 pkg/stdlib/grenadine/repo.cljc create mode 100644 pkg/stdlib/grenadine/runtime.cljc create mode 100644 pkg/stdlib/grenadine/version.cljc create mode 100644 pkg/stdlib/grenadine/xml.cljc create mode 100644 test/glojure/test_glojure/deps.glj 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/grenadine_host.go b/pkg/runtime/grenadine_host.go new file mode 100644 index 00000000..0c82412a --- /dev/null +++ b/pkg/runtime/grenadine_host.go @@ -0,0 +1,221 @@ +package runtime + +import ( + "archive/zip" + "crypto/sha1" + "crypto/sha256" + "encoding/hex" + "fmt" + "io" + "net/http" + "os" + "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("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("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 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..78869fd2 --- /dev/null +++ b/pkg/runtime/grenadine_host_test.go @@ -0,0 +1,69 @@ +package runtime + +import ( + "archive/zip" + "bytes" + "os" + "path/filepath" + "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 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/stdlib/clojurestar/deps.cljc b/pkg/stdlib/clojurestar/deps.cljc new file mode 100644 index 00000000..3c620906 --- /dev/null +++ b/pkg/stdlib/clojurestar/deps.cljc @@ -0,0 +1,17 @@ +(ns clojurestar.deps + "Dialect-neutral dynamic dependency loading." + (:require + #?(:bb [babashka.deps :as implementation] + :glj [glojure.deps :as implementation] + :jolt [jolt.deps :as implementation] + :lg [let-go.deps :as implementation] + :clj [grenadine.jvm :as implementation]))) + +(defn add-deps + "Add the Maven 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) diff --git a/pkg/stdlib/glojure/deps.clj b/pkg/stdlib/glojure/deps.clj new file mode 100644 index 00000000..b3b9c8b1 --- /dev/null +++ b/pkg/stdlib/glojure/deps.clj @@ -0,0 +1,47 @@ +(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 [grenadine.runtime :as runtime] + [glojure.deps.host :as host])) + +(defonce ^:private basis (atom {})) + +(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 add-libs + ([libs] (add-libs libs nil)) + ([libs opts] + (let [opts (or opts {})] + (runtime/add-libs! basis add-roots! libs + (assoc opts :host (or (:host opts) (host/host))))))) + +(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)))))) + +(defn sync-deps + ([] (sync-deps "deps.edn" nil)) + ([path] (sync-deps path nil)) + ([path opts] + (add-deps (read-string (slurp path)) opts))) 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/grenadine/core.cljc b/pkg/stdlib/grenadine/core.cljc new file mode 100644 index 00000000..a9e6c508 --- /dev/null +++ b/pkg/stdlib/grenadine/core.cljc @@ -0,0 +1,74 @@ +(ns grenadine.core + "Portable Maven dependency resolution." + (:require [grenadine.expander :as expander] + [grenadine.graph :as graph] + [grenadine.lock :as lock] + [grenadine.pom :as pom] + [grenadine.repo :as repo])) + +(def parse-pom pom/parse-pom) +(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!) + +(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)] + (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 [pom-fn (or (:pom-fn opts) (cached-pom-provider opts)) + resolution (graph/resolve-graph deps (assoc opts :pom-fn pom-fn)) + initial-lock (lock/emit-lock resolution (assoc opts :pom-fn pom-fn)) + fetched (repo/fetch-lock! initial-lock opts)] + (when (seq (:failed fetched)) + (throw (ex-info "Failed to install Maven artifacts" + {:type :grenadine.core/install-failed + :failed (:failed fetched)}))) + (let [final-lock (:lock fetched) + extraction + (when (:source-roots? opts) + (repo/prepare-source-roots! final-lock opts))] + (when (seq (:failed extraction)) + (throw (ex-info "Failed to prepare Maven source roots" + {:type :grenadine.core/extraction-failed + :failed (:failed extraction)}))) + {:classpath (lock/lock->classpath + final-lock + {:local-repo (repo/local-repo opts)}) + :fetched (:fetched fetched) + :cached (:cached fetched) + :source-roots (:roots extraction) + :lock final-lock + :resolution resolution + :warnings (vec (concat (:warnings resolution) + (:warnings fetched)))}))) diff --git a/pkg/stdlib/grenadine/expander.cljc b/pkg/stdlib/grenadine/expander.cljc new file mode 100644 index 00000000..b61f4bda --- /dev/null +++ b/pkg/stdlib/grenadine/expander.cljc @@ -0,0 +1,333 @@ +(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-exclusions + [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-id + [version-map lib] + (get-in version-map [lib :select])) + +(defn- selected-coordinate + [version-map lib] + (get-in version-map [lib :versions (selected-id version-map lib)])) + +(defn- selected-paths + [version-map lib] + (get-in version-map [lib :paths (selected-id 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] + ;; 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 + (not-comparable! lib candidate selected warnings on-warning error))) + + :default + (try + (pos? (compare-versions lib candidate selected)) + (catch Exception error + (not-comparable! lib candidate selected warnings on-warning error))))) + +(defn- include-coordinate + [version-map lib coord coord-id path exclusions + base-lib compare-versions warnings on-warning] + (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-id 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-id version-map lib)) + {:include? false + :reason :same-version + :version-map (add-version version-map lib coord path coord-id)} + + (newer? lib coord (selected-coordinate version-map lib) + compare-versions warnings on-warning) + {: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. 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] + :or {known-coordinate? some? + base-lib identity + override-deps {} + default-deps {}}}] + (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 (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-coordinate + version-map lib coordinate id parents exclusions + base-lib compare-versions warnings on-warning) + include? (:include? decision) + version-map (:version-map decision) + reason (:reason decision) + update + (update-exclusions + 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/graph.cljc b/pkg/stdlib/grenadine/graph.cljc new file mode 100644 index 00000000..ac677e2a --- /dev/null +++ b/pkg/stdlib/grenadine/graph.cljc @@ -0,0 +1,338 @@ +(ns grenadine.graph + "Pure path-aware dependency graph traversal and version mediation." + (:require [clojure.string :as str] + [grenadine.expander :as expander] + [grenadine.version :as version])) + +(defn- split-lib + [lib] + (cond + (symbol? lib) + [(or (namespace lib) (name lib)) (name lib)] + + (string? lib) + (if-let [slash (str/index-of lib "/")] + [(subs lib 0 slash) (subs lib (inc slash))] + [lib lib]) + + :else + (throw (ex-info (str "Unsupported dependency name: " lib) + {:type :grenadine.graph/invalid-lib + :lib lib})))) + +(defn- ga + [{:keys [group artifact]}] + [group artifact]) + +(defn- gav + [{:keys [group artifact version]}] + [group artifact version]) + +(defn- coord-order + [{:keys [group artifact version]}] + [group artifact version]) + +(defn- normalize-exclusions + [exclusions] + (set + (map + (fn [exclusion] + (if (map? exclusion) + (ga exclusion) + (split-lib exclusion))) + exclusions))) + +(defn- root-coordinates + [deps] + (->> deps + (map + (fn [entry] + (let [[lib coordinate] entry + [group artifact] (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 {:group group :artifact artifact :version version} + :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]}] + (when-not pom-fn + (throw (ex-info "resolve-graph requires :pom-fn" + {:type :grenadine.graph/missing-pom-fn}))) + (let [global-exclusions (normalize-exclusions exclusions) + 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) + current-ga (ga coords) + path-gavs (set (map gav (butlast (:via state))))] + (cond + (contains? (:blocked state) current-ga) + (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 :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 :version]) + (seq (:exclusions coordinate)) + (assoc :exclusions (normalize-exclusions (:exclusions coordinate))))) + +(defn- tools-deps-expansion + [deps {:keys [pom-fn include-optional? exclusions]}] + (let [global-exclusions (normalize-exclusions exclusions) + roots + (->> (root-coordinates deps) + (remove #(contains? global-exclusions (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 (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 :version]) + :depth 0 + :order 0 + :via [(select-keys coordinate + [:group :artifact :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]`." + [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 [[group artifact version] (key entry)] + (= version + (get-in selected + [[group artifact] :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..887bbbeb --- /dev/null +++ b/pkg/stdlib/grenadine/lock.cljc @@ -0,0 +1,71 @@ +(ns grenadine.lock + "Pure Grenadine lockfile construction." + (:require [clojure.string :as str])) + +(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 "/") + 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]}] + [group artifact 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 :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 (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]}] + (let [local-repo + (loop [value local-repo] + (if (and (seq value) + (= \/ (nth value (dec (count value))))) + (recur (subs value 0 (dec (count value)))) + value))] + (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..7cc81aa0 --- /dev/null +++ b/pkg/stdlib/grenadine/pom.cljc @@ -0,0 +1,347 @@ +(ns grenadine.pom + "Pure Maven POM normalization and effective-model construction." + (:require [clojure.string :as str] + [grenadine.xml :as xml])) + +(defn- elements + [node tag] + (filter #(and (map? %) (= tag (:tag %))) (:content node))) + +(defn- element + [node tag] + (first (elements node tag))) + +(defn- text + [node] + (when node + (let [value (str/trim + (apply str (filter string? (:content node))))] + (when (seq value) value)))) + +(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] + (let [project (xml/parse xml-source)] + (when (not= :project (:tag 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] + (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)] + (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] + (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) 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)) + 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) + 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 [])) diff --git a/pkg/stdlib/grenadine/repo.cljc b/pkg/stdlib/grenadine/repo.cljc new file mode 100644 index 00000000..808de08a --- /dev/null +++ b/pkg/stdlib/grenadine/repo.cljc @@ -0,0 +1,328 @@ +(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 :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_LOCAL_REPOSITORY`, then `$HOME/.m2/repository`." + [{:keys [host local-repo]}] + (or local-repo + (let [getenv (:getenv host) + configured (when (fn? getenv) + (getenv "GRENADINE_LOCAL_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 "/" + artifact "-" version ".pom")) + +(defn- remote-url + [repo path] + (str (trim-trailing-slashes + (if (map? repo) (:url repo) repo)) + "/" path)) + +(defn- child-elements + [node tag] + (filter #(and (map? %) (= tag (:tag %))) (:content node))) + +(defn- child-element + [node tag] + (first (child-elements node tag))) + +(defn- element-text + [node] + (when node + (let [value (str/trim (apply str (filter string? (:content node))))] + (when (seq value) value)))) + +(defn- metadata-version + [source] + (let [metadata (xml/parse source) + 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) + (remove #(str/ends-with? (str/upper-case %) "-SNAPSHOT")))] + (or release + latest + (reduce + (fn [selected candidate] + (if (or (nil? selected) (version/newer? candidate selected)) + candidate + selected)) + nil + versions)))) + +(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]}] + (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))) + (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]}] + (contains? source-libs (symbol group artifact))) + (: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/runtime.cljc b/pkg/stdlib/grenadine/runtime.cljc new file mode 100644 index 00000000..27e8c320 --- /dev/null +++ b/pkg/stdlib/grenadine/runtime.cljc @@ -0,0 +1,57 @@ +(ns grenadine.runtime + "Shared add-only behavior for non-JVM runtime facades." + (:require [grenadine.core :as grenadine])) + +(defn current-basis + [basis] + @basis) + +(defn- missing-libs + [basis libs] + (reduce + (fn [result [lib coordinate]] + (if (contains? @basis lib) + result + (assoc result lib coordinate))) + {} + libs)) + +(defn- retained-warnings + [basis libs] + (->> libs + (keep + (fn [[lib requested]] + (when-let [loaded (get @basis 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 [missing (missing-libs basis 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 + :mediation + (or (:mediation opts) + :tools-deps)))) + roots (vec (:source-roots result))] + (when (seq roots) + (add-roots! roots)) + (swap! basis merge missing) + (update result :warnings into retained))))) diff --git a/pkg/stdlib/grenadine/version.cljc b/pkg/stdlib/grenadine/version.cljc new file mode 100644 index 00000000..8f9c4f94 --- /dev/null +++ b/pkg/stdlib/grenadine/version.cljc @@ -0,0 +1,192 @@ +(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- digit? + [c] + (let [n (int 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 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..c5b66b0c --- /dev/null +++ b/pkg/stdlib/grenadine/xml.cljc @@ -0,0 +1,293 @@ +(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 (= \newline (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 [end (+ offset (count token))] + (and (<= end (count source)) + (= token (subs source offset end))))) + +(defn- whitespace? + [c] + (or (= c \space) (= c \tab) (= c \newline) (= c \return))) + +(defn- skip-whitespace + [source offset] + (loop [i offset] + (if (and (< i (count source)) (whitespace? (nth source i))) + (recur (inc i)) + i))) + +(defn- ascii-letter? + [c] + (let [n (int c)] + (or (<= 65 n 90) (<= 97 n 122)))) + +(defn- ascii-digit? + [c] + (let [n (int 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)) + [(subs 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 (int 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 (subs 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 + (subs source piece-start i) + (decode-entity source i (subs 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] + (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 (subs 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 " Date: Mon, 3 Aug 2026 09:32:34 -0400 Subject: [PATCH 09/31] Expand hosted runtime compatibility --- pkg/javacompat/classes/classes.go | 33 ++++- pkg/javacompat/classes/classes_test.go | 42 +++++- pkg/javacompat/date/date.go | 23 ++++ pkg/javacompat/date/date_test.go | 18 +++ pkg/javacompat/instant/instant.go | 1 + pkg/javacompat/instant/instant_test.go | 18 +++ pkg/javacompat/streams/streams.go | 145 +++++++++++++++++++- pkg/javacompat/streams/streams_test.go | 70 ++++++++++ pkg/javacompat/string/string.go | 9 +- pkg/javacompat/string/string_compat_test.go | 13 ++ pkg/javacompat/thread/thread.go | 13 +- pkg/javacompat/thread/thread_test.go | 19 +++ pkg/lang/bigdecimal.go | 15 +- pkg/lang/bigdecimal_test.go | 11 ++ pkg/lang/class.go | 10 ++ pkg/lang/ref.go | 14 ++ pkg/lang/ref_test.go | 15 ++ pkg/lang/struct.go | 43 ++++++ pkg/lang/struct_test.go | 16 +++ pkg/runtime/evalast.go | 15 +- 20 files changed, 524 insertions(+), 19 deletions(-) create mode 100644 pkg/javacompat/instant/instant_test.go create mode 100644 pkg/javacompat/thread/thread_test.go create mode 100644 pkg/lang/ref_test.go diff --git a/pkg/javacompat/classes/classes.go b/pkg/javacompat/classes/classes.go index 626dea18..43224f22 100644 --- a/pkg/javacompat/classes/classes.go +++ b/pkg/javacompat/classes/classes.go @@ -11,6 +11,9 @@ import ( "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)) @@ -26,7 +29,7 @@ func newBigInteger(args ...any) any { if err != nil { panic(err) } - return value + return value.ToBigInteger() } } magnitudeArg := args[len(args)-1] @@ -60,12 +63,12 @@ func newBigInteger(args ...any) any { if signum < 0 { number.Neg(number) } - return lang.NewBigIntFromGoBigInt(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 lang.NewBigIntFromGoBigInt(number) + return number } func init() { @@ -89,6 +92,8 @@ func init() { 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()) @@ -97,6 +102,22 @@ func init() { 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", @@ -135,7 +156,11 @@ func init() { 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 064fc632..ee135e87 100644 --- a/pkg/javacompat/classes/classes_test.go +++ b/pkg/javacompat/classes/classes_test.go @@ -11,7 +11,7 @@ import ( func TestCommonClassesAreRegistered(t *testing.T) { for _, name := range []string{ - "Object", "Byte", "Short", "Float", "Comparable", "CharSequence", "Number", "Class", "ClassNotFoundException", "NumberFormatException", "Set", "Collection", "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", "IReduce", "IReduceInit", @@ -25,11 +25,11 @@ func TestCommonClassesAreRegistered(t *testing.T) { } func TestBigIntegerSignumMagnitudeConstructor(t *testing.T) { - value := newBigInteger(int64(1), []int8{-1}).(*lang.BigInt) - if got, want := value.ToBigInteger().Cmp(big.NewInt(255)), 0; got != want { + 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.ToString(int64(16)), "ff"; got != want { + if got, want := value.Text(16), "ff"; got != want { t.Fatalf("hex = %q, want %q", got, want) } } @@ -48,3 +48,37 @@ func TestKeywordClassMatchesKeywordValues(t *testing.T) { 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 5810bf5c..d02ffea2 100644 --- a/pkg/javacompat/date/date.go +++ b/pkg/javacompat/date/date.go @@ -22,6 +22,13 @@ 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))) } @@ -83,10 +90,26 @@ func init() { 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 f9ea2d62..46f20bf6 100644 --- a/pkg/javacompat/date/date_test.go +++ b/pkg/javacompat/date/date_test.go @@ -3,8 +3,10 @@ package date import ( "bytes" "testing" + "time" "github.com/glojurelang/glojure/pkg/lang" + "github.com/glojurelang/glojure/pkg/pkgmap" ) func TestDateReadableRepresentation(t *testing.T) { @@ -44,3 +46,19 @@ func TestDateEquality(t *testing.T) { 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/instant/instant.go b/pkg/javacompat/instant/instant.go index 9d735e8e..eab47647 100644 --- a/pkg/javacompat/instant/instant.go +++ b/pkg/javacompat/instant/instant.go @@ -65,6 +65,7 @@ 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")) } 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/streams/streams.go b/pkg/javacompat/streams/streams.go index 44be8f04..68a91884 100644 --- a/pkg/javacompat/streams/streams.go +++ b/pkg/javacompat/streams/streams.go @@ -10,6 +10,7 @@ import ( "os" "reflect" "strings" + "unicode/utf16" "unicode/utf8" "github.com/glojurelang/glojure/pkg/lang" @@ -79,7 +80,23 @@ 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 @@ -335,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 { @@ -478,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 8876c176..f80a3fdd 100644 --- a/pkg/javacompat/streams/streams_test.go +++ b/pkg/javacompat/streams/streams_test.go @@ -189,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 { @@ -226,3 +237,62 @@ func TestFileInputStreamJavaRead(t *testing.T) { 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 fafa4bb6..8a80b2f7 100644 --- a/pkg/javacompat/string/string.go +++ b/pkg/javacompat/string/string.go @@ -252,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)) diff --git a/pkg/javacompat/string/string_compat_test.go b/pkg/javacompat/string/string_compat_test.go index 5b348827..6a754a32 100644 --- a/pkg/javacompat/string/string_compat_test.go +++ b/pkg/javacompat/string/string_compat_test.go @@ -1,6 +1,7 @@ package string import ( + "reflect" "testing" "github.com/glojurelang/glojure/pkg/lang" @@ -21,3 +22,15 @@ func TestStringCharArrayRangeConstructor(t *testing.T) { 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/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/lang/bigdecimal.go b/pkg/lang/bigdecimal.go index 6150e93c..9c808329 100644 --- a/pkg/lang/bigdecimal.go +++ b/pkg/lang/bigdecimal.go @@ -33,6 +33,8 @@ 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. @@ -88,7 +90,14 @@ func (n *BigDecimal) SetScale(scale any, mode any) *BigDecimal { quotient, remainder := new(big.Int), new(big.Int) quotient.QuoRem(scaledNumerator, rat.Denom(), remainder) - if fmt.Sprint(mode) == string(RoundingModeHalfEven) && remainder.Sign() != 0 { + 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) @@ -301,4 +310,8 @@ func init() { 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 index 1beb86c3..67a4ed22 100644 --- a/pkg/lang/bigdecimal_test.go +++ b/pkg/lang/bigdecimal_test.go @@ -43,6 +43,17 @@ func TestBigDecimalUnscaledConstructorPreservesDecimalText(t *testing.T) { } } +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 { diff --git a/pkg/lang/class.go b/pkg/lang/class.go index 9b993680..f7f7e66d 100644 --- a/pkg/lang/class.go +++ b/pkg/lang/class.go @@ -114,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). 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/struct.go b/pkg/lang/struct.go index 13ff776f..baf3a28a 100644 --- a/pkg/lang/struct.go +++ b/pkg/lang/struct.go @@ -3,6 +3,7 @@ package lang import ( "fmt" "io" + "math" "reflect" "regexp" "sync" @@ -81,6 +82,14 @@ func FieldOrMethod(v interface{}, name string) (interface{}, bool) { } } 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": @@ -137,6 +146,29 @@ func FieldOrMethod(v interface{}, name string) (interface{}, bool) { }), 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 @@ -197,6 +229,8 @@ func FieldOrMethod(v interface{}, name string) (interface{}, bool) { // 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 } } @@ -257,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 } diff --git a/pkg/lang/struct_test.go b/pkg/lang/struct_test.go index 9335777e..e5479ae5 100644 --- a/pkg/lang/struct_test.go +++ b/pkg/lang/struct_test.go @@ -1,6 +1,7 @@ package lang import ( + "math" "reflect" "testing" ) @@ -304,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/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()) } From 3458b90a796e5a4747142958af115139539e7604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 3 Aug 2026 09:38:51 -0400 Subject: [PATCH 10/31] Recognize hosted UUID values --- pkg/javacompat/uuid/uuid.go | 8 ++++++-- pkg/javacompat/uuid/uuid_test.go | 3 +++ pkg/stdlib/clojure/core.glj | 2 +- pkg/stdlib/clojure/core/loader.go | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/pkg/javacompat/uuid/uuid.go b/pkg/javacompat/uuid/uuid.go index b515e0db..8afc3cd3 100644 --- a/pkg/javacompat/uuid/uuid.go +++ b/pkg/javacompat/uuid/uuid.go @@ -22,8 +22,12 @@ 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. diff --git a/pkg/javacompat/uuid/uuid_test.go b/pkg/javacompat/uuid/uuid_test.go index 3390e408..884eee68 100644 --- a/pkg/javacompat/uuid/uuid_test.go +++ b/pkg/javacompat/uuid/uuid_test.go @@ -12,6 +12,9 @@ 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") } diff --git a/pkg/stdlib/clojure/core.glj b/pkg/stdlib/clojure/core.glj index fb9b5a11..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). diff --git a/pkg/stdlib/clojure/core/loader.go b/pkg/stdlib/clojure/core/loader.go index cda949ef..39939802 100644 --- a/pkg/stdlib/clojure/core/loader.go +++ b/pkg/stdlib/clojure/core/loader.go @@ -6,6 +6,7 @@ import ( errors6 "errors" fmt "fmt" filesystem9 "github.com/glojurelang/glojure/pkg/javacompat/filesystem" + uuidcompat "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" @@ -30205,7 +30206,7 @@ func LoadNS() { tmp1 = lang.FnFunc1(func(p0 any) any { v2 := p0 _ = v2 - tmp3 := lang.IsInstance[uuid12.UUID](v2) + tmp3 := uuidcompat.IsUUID(v2) return tmp3 }) aotDirectFn555 = tmp1 From 7db98911672187e234c53d5247f223ec4c1df75a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 3 Aug 2026 11:39:34 -0400 Subject: [PATCH 11/31] Fix AOT standard library bootstrap --- pkg/glj/init-bootstrap.go | 5 + pkg/glj/init_bootstrap_test.go | 19 ++ pkg/stdlib/clojure/core/async/loader.go | 3 + pkg/stdlib/clojure/core/loader.go | 250 +++++++++----------- pkg/stdlib/clojure/core/protocols/loader.go | 3 + pkg/stdlib/clojure/string/loader.go | 29 ++- pkg/stdlib/clojure/template/loader.go | 3 + pkg/stdlib/clojure/test/loader.go | 19 +- pkg/stdlib/clojure/uuid/loader.go | 3 + pkg/stdlib/clojure/walk/loader.go | 3 + pkg/stdlib/glojure/go/io/loader.go | 21 +- pkg/stdlib/glojure/go/types/loader.go | 3 + 12 files changed, 191 insertions(+), 170 deletions(-) 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/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 39939802..c35dd648 100644 --- a/pkg/stdlib/clojure/core/loader.go +++ b/pkg/stdlib/clojure/core/loader.go @@ -6,7 +6,7 @@ import ( errors6 "errors" fmt "fmt" filesystem9 "github.com/glojurelang/glojure/pkg/javacompat/filesystem" - uuidcompat "github.com/glojurelang/glojure/pkg/javacompat/uuid" + 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" @@ -4860,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? @@ -4876,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? @@ -4892,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 @@ -4900,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() } @@ -4909,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() } @@ -4918,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() } @@ -4967,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() } @@ -4976,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() } @@ -4985,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() } @@ -5026,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() } @@ -5035,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() } @@ -5052,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() } @@ -5069,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() } @@ -5078,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() } @@ -5095,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() } @@ -5120,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() } @@ -5137,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() } @@ -5290,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, ) @@ -5490,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 @@ -5589,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 @@ -5641,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 @@ -5693,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 @@ -5745,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 @@ -5797,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 @@ -5849,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 @@ -5901,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 @@ -5953,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 @@ -6028,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() } @@ -6107,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! @@ -6505,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 @@ -7357,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? @@ -7475,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 @@ -7484,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? @@ -7505,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 @@ -7521,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 @@ -7543,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 @@ -7559,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 @@ -7585,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 @@ -7601,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 @@ -7617,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 @@ -7633,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? @@ -7649,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 @@ -8134,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! @@ -8194,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 @@ -8766,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 @@ -10192,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 @@ -11750,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 @@ -12037,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 @@ -12216,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? @@ -12284,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 @@ -12863,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 @@ -13260,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? @@ -13747,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 @@ -14950,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? @@ -15260,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? @@ -16539,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 @@ -16879,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 @@ -16887,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 @@ -17617,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 @@ -18301,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? @@ -18425,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 @@ -18447,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? @@ -18499,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 @@ -18612,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 @@ -18697,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 @@ -21495,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 @@ -21533,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 @@ -23018,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 @@ -23377,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) @@ -24392,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 @@ -24588,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 @@ -24722,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 @@ -24776,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? @@ -25428,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 @@ -25813,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? @@ -27394,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 @@ -27765,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 @@ -28219,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 @@ -28777,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) @@ -28960,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) @@ -29186,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) @@ -29374,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) @@ -29464,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) @@ -29511,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) @@ -29662,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) @@ -30206,7 +30176,7 @@ func LoadNS() { tmp1 = lang.FnFunc1(func(p0 any) any { v2 := p0 _ = v2 - tmp3 := uuidcompat.IsUUID(v2) + tmp3 := lang.Apply1(uuid17.IsUUID, v2) return tmp3 }) aotDirectFn555 = tmp1 @@ -30493,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! @@ -31396,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 @@ -35339,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 @@ -37469,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 @@ -38488,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 @@ -38841,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 @@ -39320,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 @@ -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 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/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?", From 34e861b3669e3701e5cf51466180cdc56924f03d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 3 Aug 2026 11:41:05 -0400 Subject: [PATCH 12/31] Builds for v0.7.5 --- pkg/gen/gljimports/gljimports_darwin_amd64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_darwin_arm64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_dragonfly_amd64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_freebsd_386.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_freebsd_amd64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_freebsd_arm64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_js_wasm.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_linux_386.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_linux_amd64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_linux_arm.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_linux_arm64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_linux_ppc64le.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_linux_riscv64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_linux_s390x.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_netbsd_amd64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_netbsd_arm64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_openbsd_amd64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_openbsd_arm64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_plan9_386.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_plan9_amd64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_plan9_arm.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_wasip1_wasm.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_windows_386.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_windows_amd64.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_windows_arm.go | 15 +++++++++++++++ pkg/gen/gljimports/gljimports_windows_arm64.go | 15 +++++++++++++++ 26 files changed, 390 insertions(+) diff --git a/pkg/gen/gljimports/gljimports_darwin_amd64.go b/pkg/gen/gljimports/gljimports_darwin_amd64.go index 6e89272c..eb85343e 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 d6bed217..a26d380b 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 3df9af88..aa270626 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 c62be7c9..31b1adde 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 ee6a5870..5cff6039 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 4b61d0c8..9b6d3a28 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 e2855814..868e2de1 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 49588589..efd64520 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 38d78c9a..5d6d75fc 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 99cb89ae..44e4ec7a 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 b4e9a8e9..66943526 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 d316c46a..c61a7eb6 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 ebee425d..fbc4e28c 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 4423f65a..651eacdc 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 f9ede3ae..e467792f 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 77d2c566..a26b717f 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 bb349bab..a365180b 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 8395b553..1ec38b08 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 a9e4851d..5c2bfbfb 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 dcc39f3d..8f167167 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 409bd012..67faf7f4 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 5aa2a575..9b03f2e5 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 0db16442..0c89dad4 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 370c82b7..32b0ff95 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 ceddfcc2..ec33caa8 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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 19f5dc7a..bca7a85e 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()) @@ -817,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) @@ -847,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()) @@ -867,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) @@ -909,6 +914,8 @@ func RegisterImports(_register func(string, interface{})) { _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()) @@ -917,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) @@ -954,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))) @@ -1084,6 +1098,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) From cf63dc2c7b928f03666b1019336cead17306b17a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 3 Aug 2026 12:13:03 -0400 Subject: [PATCH 13/31] Resolve project dependencies from the CLI Load the current directory's deps.edn before scripts, expressions, and REPL servers. Add a leading -Sdeps option that merges inline dependency data after the project configuration, matching Jolt's invocation style. --- pkg/gljmain/gljmain.go | 65 +++++++++++++++++++++++++++++++++++++ pkg/gljmain/gljmain_test.go | 52 +++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 pkg/gljmain/gljmain_test.go diff --git a/pkg/gljmain/gljmain.go b/pkg/gljmain/gljmain.go index 004cfbf5..9ac000c9 100644 --- a/pkg/gljmain/gljmain.go +++ b/pkg/gljmain/gljmain.go @@ -6,6 +6,7 @@ import ( "log" "os" "path/filepath" + "strconv" "strings" // bootstrap the runtime @@ -53,6 +54,7 @@ func printHelp() { 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,6 +63,9 @@ 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 @@ -79,12 +84,72 @@ 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=") || + !strings.HasPrefix(arg, "-") +} + +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 diff --git a/pkg/gljmain/gljmain_test.go b/pkg/gljmain/gljmain_test.go new file mode 100644 index 00000000..03a4fda4 --- /dev/null +++ b/pkg/gljmain/gljmain_test.go @@ -0,0 +1,52 @@ +package gljmain + +import ( + "slices" + "testing" +) + +func TestUsesProjectDeps(t *testing.T) { + tests := []struct { + args []string + want bool + }{ + {nil, true}, + {[]string{"main.clj"}, 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) + } + } +} From c357b850139ca7eaa12db06b3e94b330121e8f2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 3 Aug 2026 21:55:27 -0400 Subject: [PATCH 14/31] Add Git and local dependency support --- pkg/runtime/grenadine_host.go | 104 ++++++ pkg/runtime/grenadine_host_test.go | 31 ++ pkg/stdlib/clojurestar/deps.cljc | 4 +- pkg/stdlib/glojure/deps.clj | 17 +- pkg/stdlib/grenadine/basis.cljc | 478 +++++++++++++++++++++++++++ pkg/stdlib/grenadine/coordinate.cljc | 173 ++++++++++ pkg/stdlib/grenadine/core.cljc | 43 +-- pkg/stdlib/grenadine/expander.cljc | 21 +- pkg/stdlib/grenadine/gitlibs.cljc | 165 +++++++++ pkg/stdlib/grenadine/lock.cljc | 24 +- pkg/stdlib/grenadine/runtime.cljc | 23 +- pkg/stdlib/grenadine/source.cljc | 47 +++ pkg/stdlib/grenadine/xml.cljc | 170 +++++----- test/glojure/test_glojure/deps.glj | 3 +- 14 files changed, 1171 insertions(+), 132 deletions(-) create mode 100644 pkg/stdlib/grenadine/basis.cljc create mode 100644 pkg/stdlib/grenadine/coordinate.cljc create mode 100644 pkg/stdlib/grenadine/gitlibs.cljc create mode 100644 pkg/stdlib/grenadine/source.cljc diff --git a/pkg/runtime/grenadine_host.go b/pkg/runtime/grenadine_host.go index 0c82412a..11a41f4a 100644 --- a/pkg/runtime/grenadine_host.go +++ b/pkg/runtime/grenadine_host.go @@ -2,6 +2,7 @@ package runtime import ( "archive/zip" + "bytes" "crypto/sha1" "crypto/sha256" "encoding/hex" @@ -9,6 +10,7 @@ import ( "io" "net/http" "os" + "os/exec" "path/filepath" "strings" "time" @@ -59,6 +61,26 @@ func grenadineHost() lang.IPersistentMap { _, 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) @@ -77,6 +99,12 @@ func grenadineHost() lang.IPersistentMap { } 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) @@ -96,6 +124,82 @@ func grenadineHost() lang.IPersistentMap { ) } +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 { diff --git a/pkg/runtime/grenadine_host_test.go b/pkg/runtime/grenadine_host_test.go index 78869fd2..78920103 100644 --- a/pkg/runtime/grenadine_host_test.go +++ b/pkg/runtime/grenadine_host_test.go @@ -5,6 +5,7 @@ import ( "bytes" "os" "path/filepath" + "strings" "testing" "github.com/glojurelang/glojure/pkg/lang" @@ -17,6 +18,36 @@ func TestGrenadineDigest(t *testing.T) { } } +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") diff --git a/pkg/stdlib/clojurestar/deps.cljc b/pkg/stdlib/clojurestar/deps.cljc index 3c620906..8707b24b 100644 --- a/pkg/stdlib/clojurestar/deps.cljc +++ b/pkg/stdlib/clojurestar/deps.cljc @@ -1,14 +1,14 @@ (ns clojurestar.deps "Dialect-neutral dynamic dependency loading." (:require - #?(:bb [babashka.deps :as implementation] + #?(:bb [grenadine.bb :as implementation] :glj [glojure.deps :as implementation] :jolt [jolt.deps :as implementation] :lg [let-go.deps :as implementation] :clj [grenadine.jvm :as implementation]))) (defn add-deps - "Add the Maven dependencies in a deps.edn map to the running dialect. + "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." diff --git a/pkg/stdlib/glojure/deps.clj b/pkg/stdlib/glojure/deps.clj index b3b9c8b1..ff7471ca 100644 --- a/pkg/stdlib/glojure/deps.clj +++ b/pkg/stdlib/glojure/deps.clj @@ -3,10 +3,12 @@ Installed JARs are safely extracted and their source roots are appended with `clojure.core/add-load-path`." - (:require [grenadine.runtime :as runtime] + (:require [clojure.string :as str] + [grenadine.runtime :as runtime] [glojure.deps.host :as host])) -(defonce ^:private basis (atom {})) +(defonce ^:private basis (atom {:libs {} :classpath {} :classpath-roots [] + :grenadine/loaded {}})) (defn current-basis [] (runtime/current-basis basis)) @@ -38,10 +40,17 @@ (assoc :local-repo (:mvn/local-repo deps-map)) (:mvn/repos deps-map) - (assoc :repos (: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] - (add-deps (read-string (slurp 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))))))) diff --git a/pkg/stdlib/grenadine/basis.cljc b/pkg/stdlib/grenadine/basis.cljc new file mode 100644 index 00000000..96e4a387 --- /dev/null +++ b/pkg/stdlib/grenadine/basis.cljc @@ -0,0 +1,478 @@ +(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-deps + [model] + (into [] + (keep + (fn [{:keys [group artifact version scope optional exclusions]}] + (when (and group artifact version + (not (#{"test" "provided" "system"} scope)) + (not optional)) + [(symbol group artifact) + (cond-> {:mvn/version version} + (seq exclusions) + (assoc :exclusions + (set (map #(symbol (:group %) (:artifact %)) + exclusions))))]))) + (:deps model))) + +(defn- raw-pom-deps + [text] + (let [raw (pom/parse-pom text) + properties (:properties raw) + interpolate #(pom/interpolate-string % properties)] + (into [] + (keep + (fn [{:keys [group artifact version scope optional exclusions]}] + (let [group (interpolate group) + artifact (interpolate artifact) + version (interpolate version)] + (when (and group artifact version + (not (#{"test" "provided" "system"} scope)) + (not optional) + (not (str/includes? version "${"))) + [(symbol group artifact) + (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))) + 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))) + (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)] + (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] (coordinate/split-lib lib) + coords {:group group :artifact artifact + :version (:mvn/version coord)}] + {: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] (coordinate/split-lib lib)] + [[group artifact] + {:coords {:group group :artifact artifact + :version (:mvn/version coord)}}])))) + 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))) + :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)})] + (into {} + (map + (fn [[[group artifact] occurrence]] + [(symbol group artifact) + {:mvn/version (get-in occurrence [:coords :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 [artifact] + [(symbol (:group artifact) (:artifact artifact)) artifact])) + (: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 #(symbol (:group %) (:artifact %)) (:fetched fetched))) + cached-libs + (set (map #(symbol (:group %) (:artifact %)) (: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..2b13c970 --- /dev/null +++ b/pkg/stdlib/grenadine/coordinate.cljc @@ -0,0 +1,173 @@ +(ns grenadine.coordinate + "Coordinate recognition and canonicalization shared by every resolver host." + (:require [clojure.string :as str] + [grenadine.gitlibs :as gitlibs] + [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] + (when-not (symbol? lib) + (throw (ex-info (str "Library name must be a symbol: " (pr-str lib)) + {:type :grenadine.coordinate/invalid-lib :lib lib}))) + [(or (namespace lib) (name lib)) (name 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}))) + 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 index a9e6c508..dcccc09c 100644 --- a/pkg/stdlib/grenadine/core.cljc +++ b/pkg/stdlib/grenadine/core.cljc @@ -1,6 +1,7 @@ (ns grenadine.core - "Portable Maven dependency resolution." - (:require [grenadine.expander :as expander] + "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] @@ -13,6 +14,7 @@ (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] @@ -46,29 +48,14 @@ Pass `:source-roots? true` to also extract and return portable Clojure source roots for non-JVM runtimes." [deps opts] - (let [pom-fn (or (:pom-fn opts) (cached-pom-provider opts)) - resolution (graph/resolve-graph deps (assoc opts :pom-fn pom-fn)) - initial-lock (lock/emit-lock resolution (assoc opts :pom-fn pom-fn)) - fetched (repo/fetch-lock! initial-lock opts)] - (when (seq (:failed fetched)) - (throw (ex-info "Failed to install Maven artifacts" - {:type :grenadine.core/install-failed - :failed (:failed fetched)}))) - (let [final-lock (:lock fetched) - extraction - (when (:source-roots? opts) - (repo/prepare-source-roots! final-lock opts))] - (when (seq (:failed extraction)) - (throw (ex-info "Failed to prepare Maven source roots" - {:type :grenadine.core/extraction-failed - :failed (:failed extraction)}))) - {:classpath (lock/lock->classpath - final-lock - {:local-repo (repo/local-repo opts)}) - :fetched (:fetched fetched) - :cached (:cached fetched) - :source-roots (:roots extraction) - :lock final-lock - :resolution resolution - :warnings (vec (concat (:warnings resolution) - (:warnings fetched)))}))) + (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 index b61f4bda..ecafb7d5 100644 --- a/pkg/stdlib/grenadine/expander.cljc +++ b/pkg/stdlib/grenadine/expander.cljc @@ -132,24 +132,29 @@ false) (defn- newer? - [lib candidate selected compare-versions warnings on-warning] + [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 - (not-comparable! lib candidate selected warnings on-warning 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 - (not-comparable! lib candidate selected warnings on-warning error))))) + (if fail-on-incomparable? + (throw error) + (not-comparable! lib candidate selected warnings on-warning error)))))) (defn- include-coordinate [version-map lib coord coord-id path exclusions - base-lib compare-versions warnings on-warning] + base-lib compare-versions warnings on-warning fail-on-incomparable?] (cond (empty? path) {:include? true @@ -182,7 +187,7 @@ :version-map (add-version version-map lib coord path coord-id)} (newer? lib coord (selected-coordinate version-map lib) - compare-versions warnings on-warning) + compare-versions warnings on-warning fail-on-incomparable?) {:include? true :reason :newer-version :version-map @@ -237,7 +242,8 @@ `: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] + base-lib override-deps default-deps trace? on-warning + fail-on-incomparable?] :or {known-coordinate? some? base-lib identity override-deps {} @@ -281,7 +287,8 @@ decision (include-coordinate version-map lib coordinate id parents exclusions - base-lib compare-versions warnings on-warning) + base-lib compare-versions warnings on-warning + fail-on-incomparable?) include? (:include? decision) version-map (:version-map decision) reason (:reason decision) diff --git a/pkg/stdlib/grenadine/gitlibs.cljc b/pkg/stdlib/grenadine/gitlibs.cljc new file mode 100644 index 00000000..a60dc9fd --- /dev/null +++ b/pkg/stdlib/grenadine/gitlibs.cljc @@ -0,0 +1,165 @@ +;; Adapted from org.clojure/tools.gitlibs (EPL-1.0). +(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, GITLIBS, and + ~/.gitlibs." + [{:keys [host gitlibs-dir]}] + (or gitlibs-dir + (let [getenv (:getenv host)] + (when getenv + (let [value (getenv "GRENADINE_GITLIBS")] + (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/lock.cljc b/pkg/stdlib/grenadine/lock.cljc index 887bbbeb..39070d64 100644 --- a/pkg/stdlib/grenadine/lock.cljc +++ b/pkg/stdlib/grenadine/lock.cljc @@ -1,6 +1,7 @@ (ns grenadine.lock "Pure Grenadine lockfile construction." - (:require [clojure.string :as str])) + (:require [clojure.string :as str] + [grenadine.gitlibs :as gitlibs])) (def default-repos [{:id "central" :url "https://repo.maven.apache.org/maven2/"} @@ -59,13 +60,26 @@ (defn lock->classpath "Return local artifact paths without touching the filesystem." - [lock {:keys [local-repo]}] + [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))] - (mapv #(str local-repo - "/" (:path %)) - (:artifacts lock)))) + (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/runtime.cljc b/pkg/stdlib/grenadine/runtime.cljc index 27e8c320..67b96b3f 100644 --- a/pkg/stdlib/grenadine/runtime.cljc +++ b/pkg/stdlib/grenadine/runtime.cljc @@ -4,13 +4,13 @@ (defn current-basis [basis] - @basis) + (dissoc @basis :grenadine/loaded)) (defn- missing-libs [basis libs] (reduce (fn [result [lib coordinate]] - (if (contains? @basis lib) + (if (contains? (:grenadine/loaded @basis) lib) result (assoc result lib coordinate))) {} @@ -21,7 +21,7 @@ (->> libs (keep (fn [[lib requested]] - (when-let [loaded (get @basis lib)] + (when-let [loaded (get-in @basis [:grenadine/loaded lib])] (when (not= loaded requested) {:warning :loaded-lib-not-upgraded :lib lib @@ -53,5 +53,20 @@ roots (vec (:source-roots result))] (when (seq roots) (add-roots! roots)) - (swap! basis merge missing) + (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/xml.cljc b/pkg/stdlib/grenadine/xml.cljc index c5b66b0c..0bad03fb 100644 --- a/pkg/stdlib/grenadine/xml.cljc +++ b/pkg/stdlib/grenadine/xml.cljc @@ -12,7 +12,7 @@ (loop [i 0 line 1 column 1] (if (= i offset) {:offset offset :line line :column column} - (if (= \newline (nth source i)) + (if (= "\n" (nth source i)) (recur (inc i) (inc line) 1) (recur (inc i) line (inc column)))))) @@ -25,13 +25,18 @@ (defn- starts-at? [source offset token] - (let [end (+ offset (count token))] + (let [token (vec (re-seq #"(?s)." token)) + end (+ offset (count token))] (and (<= end (count source)) - (= token (subs source offset end))))) + (= token (subvec source offset end))))) + +(defn- source-slice + [source start end] + (apply str (subvec source start end))) (defn- whitespace? [c] - (or (= c \space) (= c \tab) (= c \newline) (= c \return))) + (contains? #{" " "\t" "\n" "\r"} c)) (defn- skip-whitespace [source offset] @@ -42,24 +47,24 @@ (defn- ascii-letter? [c] - (let [n (int c)] + (let [n (int (if (string? c) (first c) c))] (or (<= 65 n 90) (<= 97 n 122)))) (defn- ascii-digit? [c] - (let [n (int c)] + (let [n (int (if (string? c) (first c) c))] (<= 48 n 57))) (defn- name-start? [c] - (or (ascii-letter? c) (= c \_) (= c \:))) + (or (ascii-letter? c) (= c "_") (= c ":"))) (defn- name-char? [c] (or (name-start? c) (ascii-digit? c) - (= c \-) - (= c \.))) + (= c "-") + (= c "."))) (defn- parse-name [source offset] @@ -69,7 +74,7 @@ (loop [i (inc offset)] (if (and (< i (count source)) (name-char? (nth source i))) (recur (inc i)) - [(subs source offset i) i]))) + [(source-slice source offset i) i]))) (defn- local-keyword [name] @@ -78,7 +83,7 @@ (defn- digit-value [c radix] - (let [n (int c) + (let [n (int (if (string? c) (first c) c)) value (cond (<= 48 n 57) (- n 48) (<= 65 n 70) (+ 10 (- n 65)) @@ -146,15 +151,16 @@ [source start end] (loop [i start pieces [] piece-start start] (if (= i end) - (apply str (conj pieces (subs source piece-start end))) - (if (= \& (nth source i)) - (let [semi (find-char source (inc i) \;)] + (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 - (subs source piece-start i) - (decode-entity source i (subs source (inc i) semi))) + (source-slice source piece-start i) + (decode-entity source i + (source-slice source (inc i) semi))) (inc semi))) (recur (inc i) pieces piece-start))))) @@ -163,13 +169,13 @@ (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))) + (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 \')) + (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) @@ -189,7 +195,7 @@ (starts-at? source i "/>") [{:tag (local-keyword name) :attrs attrs :content []} (+ i 2) true] - (= \> (nth source i)) + (= ">" (nth source i)) [{:tag (local-keyword name) :attrs attrs :content []} (inc i) false] :else @@ -225,69 +231,71 @@ Returns one element map. Whitespace outside the document element is ignored." [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)) + (let [source (vec (re-seq #"(?s)." source))] + (loop [i 0 stack [] roots []] + (if (= i (count source)) (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 (subs 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 "")] + (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 " Date: Tue, 4 Aug 2026 23:53:14 -0400 Subject: [PATCH 15/31] Allow REPL share URL configuration --- pkg/repl/options.go | 24 ++++++++++++++++-------- pkg/repl/repl.go | 9 ++++----- pkg/repl/repl_common.go | 7 ++++--- pkg/repl/repl_test.go | 23 +++++++++++++++++++++-- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/pkg/repl/options.go b/pkg/repl/options.go index 235808e3..d875e08b 100644 --- a/pkg/repl/options.go +++ b/pkg/repl/options.go @@ -8,14 +8,15 @@ import ( ) 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 +59,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..80b9e7d3 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,14 @@ func copyToClipboard(text string) { } } -const shareBaseURL = "https://gloathub.org/repl" +const defaultShareBaseURL = "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 +736,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) } From 9c5a950347d284bdcf4813f49590168f8535f052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Tue, 4 Aug 2026 23:57:57 -0400 Subject: [PATCH 16/31] Builds for v0.7.8 --- pkg/gen/gljimports/gljimports_darwin_amd64.go | 1 + pkg/gen/gljimports/gljimports_darwin_arm64.go | 1 + pkg/gen/gljimports/gljimports_dragonfly_amd64.go | 1 + pkg/gen/gljimports/gljimports_freebsd_386.go | 1 + pkg/gen/gljimports/gljimports_freebsd_amd64.go | 1 + pkg/gen/gljimports/gljimports_freebsd_arm64.go | 1 + pkg/gen/gljimports/gljimports_js_wasm.go | 1 + pkg/gen/gljimports/gljimports_linux_386.go | 1 + pkg/gen/gljimports/gljimports_linux_amd64.go | 1 + pkg/gen/gljimports/gljimports_linux_arm.go | 1 + pkg/gen/gljimports/gljimports_linux_arm64.go | 1 + pkg/gen/gljimports/gljimports_linux_ppc64le.go | 1 + pkg/gen/gljimports/gljimports_linux_riscv64.go | 1 + pkg/gen/gljimports/gljimports_linux_s390x.go | 1 + pkg/gen/gljimports/gljimports_netbsd_amd64.go | 1 + pkg/gen/gljimports/gljimports_netbsd_arm64.go | 1 + pkg/gen/gljimports/gljimports_openbsd_amd64.go | 1 + pkg/gen/gljimports/gljimports_openbsd_arm64.go | 1 + pkg/gen/gljimports/gljimports_plan9_386.go | 1 + pkg/gen/gljimports/gljimports_plan9_amd64.go | 1 + pkg/gen/gljimports/gljimports_plan9_arm.go | 1 + pkg/gen/gljimports/gljimports_wasip1_wasm.go | 1 + pkg/gen/gljimports/gljimports_windows_386.go | 1 + pkg/gen/gljimports/gljimports_windows_amd64.go | 1 + pkg/gen/gljimports/gljimports_windows_arm.go | 1 + pkg/gen/gljimports/gljimports_windows_arm64.go | 1 + 26 files changed, 26 insertions(+) diff --git a/pkg/gen/gljimports/gljimports_darwin_amd64.go b/pkg/gen/gljimports/gljimports_darwin_amd64.go index eb85343e..4fa445be 100644 --- a/pkg/gen/gljimports/gljimports_darwin_amd64.go +++ b/pkg/gen/gljimports/gljimports_darwin_amd64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_darwin_arm64.go b/pkg/gen/gljimports/gljimports_darwin_arm64.go index a26d380b..0bd2d427 100644 --- a/pkg/gen/gljimports/gljimports_darwin_arm64.go +++ b/pkg/gen/gljimports/gljimports_darwin_arm64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_dragonfly_amd64.go b/pkg/gen/gljimports/gljimports_dragonfly_amd64.go index aa270626..498f6a13 100644 --- a/pkg/gen/gljimports/gljimports_dragonfly_amd64.go +++ b/pkg/gen/gljimports/gljimports_dragonfly_amd64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_freebsd_386.go b/pkg/gen/gljimports/gljimports_freebsd_386.go index 31b1adde..08ed903a 100644 --- a/pkg/gen/gljimports/gljimports_freebsd_386.go +++ b/pkg/gen/gljimports/gljimports_freebsd_386.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_freebsd_amd64.go b/pkg/gen/gljimports/gljimports_freebsd_amd64.go index 5cff6039..0c66d5d3 100644 --- a/pkg/gen/gljimports/gljimports_freebsd_amd64.go +++ b/pkg/gen/gljimports/gljimports_freebsd_amd64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_freebsd_arm64.go b/pkg/gen/gljimports/gljimports_freebsd_arm64.go index 9b6d3a28..c231d348 100644 --- a/pkg/gen/gljimports/gljimports_freebsd_arm64.go +++ b/pkg/gen/gljimports/gljimports_freebsd_arm64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_js_wasm.go b/pkg/gen/gljimports/gljimports_js_wasm.go index 868e2de1..8427d624 100644 --- a/pkg/gen/gljimports/gljimports_js_wasm.go +++ b/pkg/gen/gljimports/gljimports_js_wasm.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_linux_386.go b/pkg/gen/gljimports/gljimports_linux_386.go index efd64520..b3df814e 100644 --- a/pkg/gen/gljimports/gljimports_linux_386.go +++ b/pkg/gen/gljimports/gljimports_linux_386.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_linux_amd64.go b/pkg/gen/gljimports/gljimports_linux_amd64.go index 5d6d75fc..e8ba6240 100644 --- a/pkg/gen/gljimports/gljimports_linux_amd64.go +++ b/pkg/gen/gljimports/gljimports_linux_amd64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_linux_arm.go b/pkg/gen/gljimports/gljimports_linux_arm.go index 44e4ec7a..14375f1d 100644 --- a/pkg/gen/gljimports/gljimports_linux_arm.go +++ b/pkg/gen/gljimports/gljimports_linux_arm.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_linux_arm64.go b/pkg/gen/gljimports/gljimports_linux_arm64.go index 66943526..82c6828e 100644 --- a/pkg/gen/gljimports/gljimports_linux_arm64.go +++ b/pkg/gen/gljimports/gljimports_linux_arm64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_linux_ppc64le.go b/pkg/gen/gljimports/gljimports_linux_ppc64le.go index c61a7eb6..e27a1b5e 100644 --- a/pkg/gen/gljimports/gljimports_linux_ppc64le.go +++ b/pkg/gen/gljimports/gljimports_linux_ppc64le.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_linux_riscv64.go b/pkg/gen/gljimports/gljimports_linux_riscv64.go index fbc4e28c..f5f4e231 100644 --- a/pkg/gen/gljimports/gljimports_linux_riscv64.go +++ b/pkg/gen/gljimports/gljimports_linux_riscv64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_linux_s390x.go b/pkg/gen/gljimports/gljimports_linux_s390x.go index 651eacdc..5dffa74d 100644 --- a/pkg/gen/gljimports/gljimports_linux_s390x.go +++ b/pkg/gen/gljimports/gljimports_linux_s390x.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_netbsd_amd64.go b/pkg/gen/gljimports/gljimports_netbsd_amd64.go index e467792f..aa8a50ac 100644 --- a/pkg/gen/gljimports/gljimports_netbsd_amd64.go +++ b/pkg/gen/gljimports/gljimports_netbsd_amd64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_netbsd_arm64.go b/pkg/gen/gljimports/gljimports_netbsd_arm64.go index a26b717f..ad7175cc 100644 --- a/pkg/gen/gljimports/gljimports_netbsd_arm64.go +++ b/pkg/gen/gljimports/gljimports_netbsd_arm64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_openbsd_amd64.go b/pkg/gen/gljimports/gljimports_openbsd_amd64.go index a365180b..6b8fbd44 100644 --- a/pkg/gen/gljimports/gljimports_openbsd_amd64.go +++ b/pkg/gen/gljimports/gljimports_openbsd_amd64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_openbsd_arm64.go b/pkg/gen/gljimports/gljimports_openbsd_arm64.go index 1ec38b08..96d828fb 100644 --- a/pkg/gen/gljimports/gljimports_openbsd_arm64.go +++ b/pkg/gen/gljimports/gljimports_openbsd_arm64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_plan9_386.go b/pkg/gen/gljimports/gljimports_plan9_386.go index 5c2bfbfb..6211c7c2 100644 --- a/pkg/gen/gljimports/gljimports_plan9_386.go +++ b/pkg/gen/gljimports/gljimports_plan9_386.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_plan9_amd64.go b/pkg/gen/gljimports/gljimports_plan9_amd64.go index 8f167167..46c9cc67 100644 --- a/pkg/gen/gljimports/gljimports_plan9_amd64.go +++ b/pkg/gen/gljimports/gljimports_plan9_amd64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_plan9_arm.go b/pkg/gen/gljimports/gljimports_plan9_arm.go index 67faf7f4..d822d15c 100644 --- a/pkg/gen/gljimports/gljimports_plan9_arm.go +++ b/pkg/gen/gljimports/gljimports_plan9_arm.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_wasip1_wasm.go b/pkg/gen/gljimports/gljimports_wasip1_wasm.go index 9b03f2e5..062404be 100644 --- a/pkg/gen/gljimports/gljimports_wasip1_wasm.go +++ b/pkg/gen/gljimports/gljimports_wasip1_wasm.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_windows_386.go b/pkg/gen/gljimports/gljimports_windows_386.go index 0c89dad4..2acc4b2e 100644 --- a/pkg/gen/gljimports/gljimports_windows_386.go +++ b/pkg/gen/gljimports/gljimports_windows_386.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_windows_amd64.go b/pkg/gen/gljimports/gljimports_windows_amd64.go index 32b0ff95..3f3c3d1e 100644 --- a/pkg/gen/gljimports/gljimports_windows_amd64.go +++ b/pkg/gen/gljimports/gljimports_windows_amd64.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_windows_arm.go b/pkg/gen/gljimports/gljimports_windows_arm.go index ec33caa8..e27d4441 100644 --- a/pkg/gen/gljimports/gljimports_windows_arm.go +++ b/pkg/gen/gljimports/gljimports_windows_arm.go @@ -1053,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) diff --git a/pkg/gen/gljimports/gljimports_windows_arm64.go b/pkg/gen/gljimports/gljimports_windows_arm64.go index bca7a85e..060d7bbc 100644 --- a/pkg/gen/gljimports/gljimports_windows_arm64.go +++ b/pkg/gen/gljimports/gljimports_windows_arm64.go @@ -1053,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) From 81d34d95f60ca9b9a0f2fe751a9a49549a79b39e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Wed, 5 Aug 2026 00:09:16 -0400 Subject: [PATCH 17/31] Fix Wasm REPL share URL build --- Makefile | 6 +++++- pkg/repl/options.go | 2 ++ pkg/repl/repl.go | 2 -- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index c63cf43d..23e584a3 100644 --- a/Makefile +++ b/Makefile @@ -209,7 +209,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 # vet ($(MAKE) test-suite v=1 || $(MAKE) test-suite v=1) || $(MAKE) test-suite v=1 TEST-COMPARE-LOAD := $(shell \ @@ -226,6 +226,10 @@ 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-aot test-suite-aot test-aot: test-aot-runtime test-glj $(MAKE) test-suite-aot diff --git a/pkg/repl/options.go b/pkg/repl/options.go index d875e08b..97fa413e 100644 --- a/pkg/repl/options.go +++ b/pkg/repl/options.go @@ -7,6 +7,8 @@ import ( "github.com/glojurelang/glojure/pkg/nrepl" ) +const defaultShareBaseURL = "https://gloathub.org/repl" + type options struct { stdin io.Reader stdout io.Writer diff --git a/pkg/repl/repl.go b/pkg/repl/repl.go index 80b9e7d3..e236bea6 100644 --- a/pkg/repl/repl.go +++ b/pkg/repl/repl.go @@ -686,8 +686,6 @@ func copyToClipboard(text string) { } } -const defaultShareBaseURL = "https://gloathub.org/repl" - func shareURL(exprs []string, baseURL string) (string, error) { data, err := json.Marshal(exprs) if err != nil { From c550063560ca97bbcb9ddf1e45ac3b2bad2d7683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Wed, 5 Aug 2026 08:43:49 -0400 Subject: [PATCH 18/31] Fix BSD REPL terminal builds --- Makefile | 15 ++++++++++++++- pkg/repl/ioctl_bsd.go | 10 ++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 pkg/repl/ioctl_bsd.go diff --git a/Makefile b/Makefile index 23e584a3..390e9817 100644 --- a/Makefile +++ b/Makefile @@ -209,7 +209,7 @@ vet: $(GO) go vet ./... # vet is disabled until we fix errors in generated code -test: test-aot-runtime test-glj test-repl-wasm # 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 \ @@ -230,6 +230,19 @@ test-aot-runtime: $(GO) 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 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 +) From 55f69f2d459c92325b504aa731181e538182a9fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Fri, 7 Aug 2026 15:36:31 -0400 Subject: [PATCH 19/31] Update embedded Grenadine resolver --- pkg/stdlib/clojurestar/deps.cljc | 6 +- pkg/stdlib/grenadine/basis.cljc | 68 ++++++++---- pkg/stdlib/grenadine/coordinate.cljc | 73 ++++++++++++- pkg/stdlib/grenadine/expander.cljc | 39 +++++-- pkg/stdlib/grenadine/gitlibs.cljc | 13 ++- pkg/stdlib/grenadine/graph.cljc | 61 +++++------ pkg/stdlib/grenadine/lock.cljc | 13 ++- pkg/stdlib/grenadine/pom.cljc | 2 + pkg/stdlib/grenadine/repo.cljc | 67 ++++++++++-- pkg/stdlib/grenadine/version.cljc | 149 +++++++++++++++++++++++++++ test/glojure/test_glojure/deps.glj | 13 ++- 11 files changed, 420 insertions(+), 84 deletions(-) diff --git a/pkg/stdlib/clojurestar/deps.cljc b/pkg/stdlib/clojurestar/deps.cljc index 8707b24b..c51ad3f5 100644 --- a/pkg/stdlib/clojurestar/deps.cljc +++ b/pkg/stdlib/clojurestar/deps.cljc @@ -1,11 +1,9 @@ (ns clojurestar.deps "Dialect-neutral dynamic dependency loading." (:require - #?(:bb [grenadine.bb :as implementation] + #?(:gobb [gobb.deps :as implementation] :glj [glojure.deps :as implementation] - :jolt [jolt.deps :as implementation] - :lg [let-go.deps :as implementation] - :clj [grenadine.jvm :as implementation]))) + :jolt [jolt.deps :as implementation]))) (defn add-deps "Add the dependencies in a deps.edn map to the running dialect. diff --git a/pkg/stdlib/grenadine/basis.cljc b/pkg/stdlib/grenadine/basis.cljc index 96e4a387..438f4a27 100644 --- a/pkg/stdlib/grenadine/basis.cljc +++ b/pkg/stdlib/grenadine/basis.cljc @@ -1,3 +1,16 @@ +; 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] @@ -47,15 +60,19 @@ :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 version scope optional exclusions]}] + (fn [{:keys [group artifact classifier version scope optional exclusions]}] (when (and group artifact version (not (#{"test" "provided" "system"} scope)) (not optional)) - [(symbol group artifact) + [(pom-lib group artifact classifier) (cond-> {:mvn/version version} (seq exclusions) (assoc :exclusions @@ -70,15 +87,16 @@ interpolate #(pom/interpolate-string % properties)] (into [] (keep - (fn [{:keys [group artifact version scope optional exclusions]}] + (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 "${"))) - [(symbol group artifact) + [(pom-lib group artifact classifier) (cond-> {:mvn/version version} (seq exclusions) (assoc :exclusions @@ -199,9 +217,13 @@ (let [value (case (coordinate/coordinate-type coord) :mvn - (let [[group artifact] (coordinate/split-lib lib) - coords {:group group :artifact artifact - :version (:mvn/version coord)}] + (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))) @@ -273,10 +295,13 @@ (keep (fn [[lib coord]] (when (= :mvn (coordinate/coordinate-type coord)) - (let [[group artifact] (coordinate/split-lib lib)] - [[group artifact] - {:coords {:group group :artifact artifact - :version (:mvn/version 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 @@ -297,6 +322,7 @@ top {:coord-id (fn [_ coord] (coordinate/dep-id coord)) :coord-deps (fn [lib coord] (:children (info lib coord))) + :base-lib coordinate/base-lib :compare-versions (fn [lib left right] (coordinate/compare-coordinates lib left right opts)) @@ -314,9 +340,11 @@ {:pom-fn pom-fn :mediation (:mediation opts)})] (into {} (map - (fn [[[group artifact] occurrence]] - [(symbol group artifact) - {:mvn/version (get-in occurrence [:coords :version])}])) + (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) @@ -333,8 +361,8 @@ final-lock (:lock fetched) artifacts (into {} - (map (fn [artifact] - [(symbol (:group artifact) (:artifact artifact)) artifact])) + (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)) @@ -438,9 +466,13 @@ :classpath classpath})) ordered-libs)) fetched-libs - (set (map #(symbol (:group %) (:artifact %)) (:fetched fetched))) + (set (map #(coordinate/lib-symbol (:group %) (:artifact %) + (:classifier %)) + (:fetched fetched))) cached-libs - (set (map #(symbol (:group %) (:artifact %)) (:cached fetched))) + (set (map #(coordinate/lib-symbol (:group %) (:artifact %) + (:classifier %)) + (:cached fetched))) installed-libs (vec (filter diff --git a/pkg/stdlib/grenadine/coordinate.cljc b/pkg/stdlib/grenadine/coordinate.cljc index 2b13c970..3b0db430 100644 --- a/pkg/stdlib/grenadine/coordinate.cljc +++ b/pkg/stdlib/grenadine/coordinate.cljc @@ -1,7 +1,21 @@ +; 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 @@ -35,10 +49,52 @@ (defn split-lib [lib] - (when-not (symbol? lib) - (throw (ex-info (str "Library name must be a symbol: " (pr-str lib)) - {:type :grenadine.coordinate/invalid-lib :lib lib}))) - [(or (namespace lib) (name lib)) (name 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"] @@ -100,7 +156,14 @@ (throw (ex-info (str "Maven coordinate requires :mvn/version: " lib) {:type :grenadine.coordinate/invalid-maven :lib lib :coordinate 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 diff --git a/pkg/stdlib/grenadine/expander.cljc b/pkg/stdlib/grenadine/expander.cljc index ecafb7d5..a15b3fcc 100644 --- a/pkg/stdlib/grenadine/expander.cljc +++ b/pkg/stdlib/grenadine/expander.cljc @@ -1,3 +1,16 @@ +; 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. @@ -21,7 +34,9 @@ true (recur (pop search))))))) -(defn- update-exclusions +(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) @@ -66,17 +81,17 @@ (cond-> {:select coord-id} direct? (assoc :top true)))) -(defn- selected-id +(defn- selected-version [version-map lib] (get-in version-map [lib :select])) -(defn- selected-coordinate +(defn- selected-coord [version-map lib] - (get-in version-map [lib :versions (selected-id 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-id version-map lib)])) + (get-in version-map [lib :paths (selected-version version-map lib)])) (defn- parent-missing? [version-map parent-path] @@ -152,7 +167,9 @@ (throw error) (not-comparable! lib candidate selected warnings on-warning error)))))) -(defn- include-coordinate +(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 @@ -173,7 +190,7 @@ (parent-missing? version-map path) {:include? false :reason :parent-omitted :version-map version-map} - (nil? (selected-id version-map lib)) + (nil? (selected-version version-map lib)) {:include? true :reason :new-dep :version-map @@ -181,12 +198,12 @@ (add-version lib coord path coord-id) (select-version lib coord-id false))} - (= coord-id (selected-id version-map lib)) + (= 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-coordinate version-map lib) + (newer? lib coord (selected-coord version-map lib) compare-versions warnings on-warning fail-on-incomparable?) {:include? true :reason :newer-version @@ -285,7 +302,7 @@ order trace)) (let [id (coord-id lib coordinate) decision - (include-coordinate + (include-coord? version-map lib coordinate id parents exclusions base-lib compare-versions warnings on-warning fail-on-incomparable?) @@ -293,7 +310,7 @@ version-map (:version-map decision) reason (:reason decision) update - (update-exclusions + (update-excl lib coordinate id use-path include? reason exclusions cuts) child-predicate (:child-predicate update) diff --git a/pkg/stdlib/grenadine/gitlibs.cljc b/pkg/stdlib/grenadine/gitlibs.cljc index a60dc9fd..724da8c7 100644 --- a/pkg/stdlib/grenadine/gitlibs.cljc +++ b/pkg/stdlib/grenadine/gitlibs.cljc @@ -1,4 +1,15 @@ -;; Adapted from org.clojure/tools.gitlibs (EPL-1.0). +; 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])) diff --git a/pkg/stdlib/grenadine/graph.cljc b/pkg/stdlib/grenadine/graph.cljc index ac677e2a..ad4bb62f 100644 --- a/pkg/stdlib/grenadine/graph.cljc +++ b/pkg/stdlib/grenadine/graph.cljc @@ -1,36 +1,28 @@ (ns grenadine.graph "Pure path-aware dependency graph traversal and version mediation." - (:require [clojure.string :as str] + (:require [grenadine.coordinate :as coordinate] [grenadine.expander :as expander] [grenadine.version :as version])) (defn- split-lib [lib] - (cond - (symbol? lib) - [(or (namespace lib) (name lib)) (name lib)] - - (string? lib) - (if-let [slash (str/index-of lib "/")] - [(subs lib 0 slash) (subs lib (inc slash))] - [lib lib]) - - :else - (throw (ex-info (str "Unsupported dependency name: " lib) - {:type :grenadine.graph/invalid-lib - :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 [group artifact version]}] - [group artifact version]) + [{:keys [version] :as coordinate}] + (conj (ga coordinate) version)) (defn- coord-order - [{:keys [group artifact version]}] - [group artifact version]) + [{:keys [version] :as coordinate}] + (conj (ga coordinate) version)) (defn- normalize-exclusions [exclusions] @@ -38,8 +30,9 @@ (map (fn [exclusion] (if (map? exclusion) - (ga exclusion) - (split-lib exclusion))) + (base-ga exclusion) + (let [[group artifact] (split-lib exclusion)] + [group artifact]))) exclusions))) (defn- root-coordinates @@ -48,7 +41,7 @@ (map (fn [entry] (let [[lib coordinate] entry - [group artifact] (split-lib lib) + [group artifact classifier] (split-lib lib) version (:mvn/version coordinate)] (when-not version (throw @@ -56,7 +49,8 @@ {:type :grenadine.graph/unsupported-coordinate :lib lib :coordinate coordinate}))) - {:coords {:group group :artifact artifact :version version} + {:coords (cond-> {:group group :artifact artifact :version version} + classifier (assoc :classifier classifier)) :edge-exclusions (normalize-exclusions (:exclusions coordinate #{}))}))) (sort-by #(coord-order (:coords %))) @@ -113,10 +107,9 @@ :warnings warnings} (let [state (nth queue index) coords (:coords state) - current-ga (ga coords) path-gavs (set (map gav (butlast (:via state))))] (cond - (contains? (:blocked state) current-ga) + (contains? (:blocked state) (base-ga coords)) (recur queue (inc index) order occurrences graph (conj omitted-items (omitted state :excluded)) warnings) @@ -146,7 +139,7 @@ (fn [dependency] (let [child-coords (select-keys dependency - [:group :artifact :version])] + [:group :artifact :classifier :version])] {:coords child-coords :depth (inc (:depth state)) :via (conj (:via state) child-coords) @@ -232,7 +225,7 @@ (defn- tools-coordinate [coordinate] - (cond-> (select-keys coordinate [:group :artifact :version]) + (cond-> (select-keys coordinate [:group :artifact :classifier :version]) (seq (:exclusions coordinate)) (assoc :exclusions (normalize-exclusions (:exclusions coordinate))))) @@ -241,7 +234,7 @@ (let [global-exclusions (normalize-exclusions exclusions) roots (->> (root-coordinates deps) - (remove #(contains? global-exclusions (ga (:coords %)))) + (remove #(contains? global-exclusions (base-ga (:coords %)))) (mapv (fn [{:keys [coords edge-exclusions]}] [(ga coords) @@ -262,7 +255,7 @@ (->> (:deps (pom-fn coordinate)) (filter #(and (kept-scope? (:scope %)) (or include-optional? (not (:optional %))) - (not (contains? global-exclusions (ga %))))) + (not (contains? global-exclusions (base-ga %))))) (mapv (fn [dependency] [(ga dependency) (tools-coordinate dependency)]))))}))) @@ -278,11 +271,11 @@ (if (seq matches) (reduce nearer matches) {:coords (select-keys coordinate - [:group :artifact :version]) + [:group :artifact :classifier :version]) :depth 0 :order 0 :via [(select-keys coordinate - [:group :artifact :version])] + [:group :artifact :classifier :version])] :scope "compile" :direct? true})] [key selected])) @@ -299,7 +292,8 @@ "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]`." + 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) @@ -327,10 +321,11 @@ (into {} (filter (fn [entry] - (let [[group artifact version] (key entry)] + (let [version (peek (key entry)) + lib-key (pop (key entry))] (= version (get-in selected - [[group artifact] :coords :version]))))) + [lib-key :coords :version]))))) (:graph enumerated)) :omitted (vec (concat (:omitted enumerated) conflicts)) :warnings (vec (concat (:warnings enumerated) diff --git a/pkg/stdlib/grenadine/lock.cljc b/pkg/stdlib/grenadine/lock.cljc index 39070d64..2cc9969e 100644 --- a/pkg/stdlib/grenadine/lock.cljc +++ b/pkg/stdlib/grenadine/lock.cljc @@ -1,7 +1,8 @@ (ns grenadine.lock "Pure Grenadine lockfile construction." (:require [clojure.string :as str] - [grenadine.gitlibs :as gitlibs])) + [grenadine.gitlibs :as gitlibs] + [grenadine.version :as version])) (def default-repos [{:id "central" :url "https://repo.maven.apache.org/maven2/"} @@ -10,7 +11,8 @@ (defn artifact-path [{:keys [group artifact version classifier]}] (let [directory (str (str/replace group "." "/") - "/" artifact "/" version "/") + "/" artifact "/" + (version/snapshot-base-version version) "/") filename (str artifact "-" version (when classifier (str "-" classifier)) ".jar")] @@ -21,8 +23,8 @@ (if (map? repo) (:url repo) repo)) (defn- gav - [{:keys [group artifact version]}] - [group artifact version]) + [{:keys [group artifact version classifier]}] + [group (str artifact (when classifier (str "$" classifier))) version]) (defn emit-lock "Convert a resolution into stable lockfile data. @@ -38,7 +40,7 @@ (->> (:selected resolution) vals (map :coords) - (sort-by (juxt :group :artifact :version)) + (sort-by (juxt :group :artifact :classifier :version)) (keep (fn [coords] (let [pom (when pom-fn (pom-fn coords)) @@ -51,6 +53,7 @@ :packaging packaging :path (artifact-path coords) :repo (repo-fn coords)} + (select-keys coords [:classifier]) (select-keys (get integrity (gav coords)) [:sha256 :size])))))) vec)] diff --git a/pkg/stdlib/grenadine/pom.cljc b/pkg/stdlib/grenadine/pom.cljc index 7cc81aa0..994474b4 100644 --- a/pkg/stdlib/grenadine/pom.cljc +++ b/pkg/stdlib/grenadine/pom.cljc @@ -1,3 +1,5 @@ +;; 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] diff --git a/pkg/stdlib/grenadine/repo.cljc b/pkg/stdlib/grenadine/repo.cljc index 808de08a..aa17a99f 100644 --- a/pkg/stdlib/grenadine/repo.cljc +++ b/pkg/stdlib/grenadine/repo.cljc @@ -43,7 +43,7 @@ (defn- pom-path [{:keys [group artifact version]}] (str (str/replace group "." "/") - "/" artifact "/" version "/" + "/" artifact "/" (version/snapshot-base-version version) "/" artifact "-" version ".pom")) (defn- remote-url @@ -66,7 +66,7 @@ (let [value (str/trim (apply str (filter string? (:content node))))] (when (seq value) value)))) -(defn- metadata-version +(defn- metadata-data [source] (let [metadata (xml/parse source) versioning (child-element metadata :versioning) @@ -76,7 +76,12 @@ versions (->> (child-elements versions-node :version) (keep element-text) - (remove #(str/ends-with? (str/upper-case %) "-SNAPSHOT")))] + vec)] + {:release release :latest latest :versions versions})) + +(defn- metadata-version + [source] + (let [{:keys [release latest versions]} (metadata-data source)] (or release latest (reduce @@ -85,7 +90,53 @@ candidate selected)) nil - versions)))) + (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]}] + (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)))) + (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. @@ -306,8 +357,12 @@ artifacts (if source-libs (filter - (fn [{:keys [group artifact]}] - (contains? source-libs (symbol group artifact))) + (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 []] diff --git a/pkg/stdlib/grenadine/version.cljc b/pkg/stdlib/grenadine/version.cljc index 8f9c4f94..e7545e1a 100644 --- a/pkg/stdlib/grenadine/version.cljc +++ b/pkg/stdlib/grenadine/version.cljc @@ -1,3 +1,22 @@ +; 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])) @@ -187,6 +206,136 @@ (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/test/glojure/test_glojure/deps.glj b/test/glojure/test_glojure/deps.glj index e21df5ea..445be9f6 100644 --- a/test/glojure/test_glojure/deps.glj +++ b/test/glojure/test_glojure/deps.glj @@ -1,7 +1,9 @@ (ns glojure.test-glojure.deps (:require [clojure.test :refer [deftest is run-tests]] [clojurestar.deps :as portable-deps] - [glojure.deps :as deps])) + [glojure.deps :as deps] + [grenadine.coordinate :as coordinate] + [grenadine.version :as version])) (deftest embedded-grenadine-facade (let [coordinate {:mvn/version "1.0.0"} @@ -20,4 +22,13 @@ (deftest portable-facade (is (nil? (portable-deps/add-deps {})))) +(deftest embedded-grenadine-legacy-maven-forms + (is (= ["hiccup" "hiccup" nil] + (coordinate/split-lib 'hiccup))) + (is (= ["org.lwjgl" "lwjgl-stb" "natives-macos"] + (coordinate/split-lib 'org.lwjgl/lwjgl-stb$natives-macos))) + (is (version/in-range? "1.9" "[1.0,2.0)")) + (is (= "0.0.1-SNAPSHOT" + (version/snapshot-base-version "0.0.1-20200715.082439-21")))) + (run-tests) From 877f510abf3f2baa888a4031865d24478faaa679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Sun, 9 Aug 2026 10:49:07 -0400 Subject: [PATCH 20/31] Support dash as stdin script --- pkg/gljmain/gljmain.go | 55 +++++++++++++++++++++++-------------- pkg/gljmain/gljmain_test.go | 23 ++++++++++++++++ 2 files changed, 57 insertions(+), 21 deletions(-) diff --git a/pkg/gljmain/gljmain.go b/pkg/gljmain/gljmain.go index 9ac000c9..e3aed44e 100644 --- a/pkg/gljmain/gljmain.go +++ b/pkg/gljmain/gljmain.go @@ -3,6 +3,7 @@ package gljmain import ( "bufio" "fmt" + "io" "log" "os" "path/filepath" @@ -51,7 +52,7 @@ 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 @@ -70,6 +71,7 @@ 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 @@ -91,7 +93,31 @@ func usesProjectDeps(args []string) bool { arg := args[0] return arg == "-e" || arg == "--nrepl" || strings.HasPrefix(arg, "--nrepl=") || arg == "--srepl" || strings.HasPrefix(arg, "--srepl=") || - !strings.HasPrefix(arg, "-") + 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) { @@ -232,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 { @@ -240,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 { + defer func() { + if err := file.Close(); err != nil { log.Fatal(err) } - _, err = env.Eval(val) - if err != nil { - log.Fatal(err) - } - } + }() + runScript(file, args[1:]) } } diff --git a/pkg/gljmain/gljmain_test.go b/pkg/gljmain/gljmain_test.go index 03a4fda4..ac4bd129 100644 --- a/pkg/gljmain/gljmain_test.go +++ b/pkg/gljmain/gljmain_test.go @@ -1,10 +1,32 @@ 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 @@ -12,6 +34,7 @@ func TestUsesProjectDeps(t *testing.T) { }{ {nil, true}, {[]string{"main.clj"}, true}, + {[]string{"-"}, true}, {[]string{"-e", "(+ 1 2)"}, true}, {[]string{"--nrepl"}, true}, {[]string{"--nrepl=7888"}, true}, From d0df55d276927d4f7eab0204b21c4e6b287080e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 10 Aug 2026 16:16:12 -0400 Subject: [PATCH 21/31] Update embedded Grenadine to 0.1.7 --- pkg/stdlib/glojure/deps.clj | 6 ++- pkg/stdlib/grenadine/basis.cljc | 10 ++-- pkg/stdlib/grenadine/core.cljc | 10 +++- pkg/stdlib/grenadine/pom.cljc | 86 ++++++++++++++++-------------- pkg/stdlib/grenadine/repo.cljc | 30 +++++------ pkg/stdlib/grenadine/version.cljc | 7 ++- pkg/stdlib/grenadine/xml.cljc | 11 ++-- pkg/stdlib/grenadine/xml_tree.cljc | 40 ++++++++++++++ test/glojure/test_glojure/deps.glj | 11 ++++ 9 files changed, 143 insertions(+), 68 deletions(-) create mode 100644 pkg/stdlib/grenadine/xml_tree.cljc diff --git a/pkg/stdlib/glojure/deps.clj b/pkg/stdlib/glojure/deps.clj index ff7471ca..be1df7bf 100644 --- a/pkg/stdlib/glojure/deps.clj +++ b/pkg/stdlib/glojure/deps.clj @@ -5,6 +5,7 @@ `clojure.core/add-load-path`." (:require [clojure.string :as str] [grenadine.runtime :as runtime] + [grenadine.xml :as xml] [glojure.deps.host :as host])) (defonce ^:private basis (atom {:libs {} :classpath {} :classpath-roots [] @@ -25,7 +26,10 @@ ([libs opts] (let [opts (or opts {})] (runtime/add-libs! basis add-roots! libs - (assoc opts :host (or (:host opts) (host/host))))))) + (assoc opts + :host (or (:host opts) (host/host)) + :xml-parser (or (:xml-parser opts) + xml/parse)))))) (defn add-lib ([lib coordinate] (add-lib lib coordinate nil)) diff --git a/pkg/stdlib/grenadine/basis.cljc b/pkg/stdlib/grenadine/basis.cljc index 438f4a27..29f89381 100644 --- a/pkg/stdlib/grenadine/basis.cljc +++ b/pkg/stdlib/grenadine/basis.cljc @@ -81,8 +81,8 @@ (:deps model))) (defn- raw-pom-deps - [text] - (let [raw (pom/parse-pom text) + [text opts] + (let [raw (pom/parse-pom text opts) properties (:properties raw) interpolate #(pom/interpolate-string % properties)] (into [] @@ -165,7 +165,7 @@ {:manifest :pom :root root :children (normalize-deps - (into {} (raw-pom-deps (read-text host pom-path))) + (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" @@ -190,7 +190,7 @@ :source-root destination :children (if pom-path (normalize-deps - (into {} (raw-pom-deps (read-text host pom-path))) + (into {} (raw-pom-deps (read-text host pom-path) opts)) (parent-path jar) opts) []) :paths [jar]}))) @@ -206,7 +206,7 @@ (fn [coords] (if-let [entry (find @poms coords)] (val entry) - (let [value (pom/effective-pom coords fetch-pom)] + (let [value (pom/effective-pom coords fetch-pom opts)] (swap! poms assoc coords value) value))))) info diff --git a/pkg/stdlib/grenadine/core.cljc b/pkg/stdlib/grenadine/core.cljc index dcccc09c..3cb1f62a 100644 --- a/pkg/stdlib/grenadine/core.cljc +++ b/pkg/stdlib/grenadine/core.cljc @@ -7,7 +7,13 @@ [grenadine.pom :as pom] [grenadine.repo :as repo])) -(def parse-pom pom/parse-pom) +(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) @@ -24,7 +30,7 @@ (let [key [(:group coords) (:artifact coords) (:version coords)]] (if-let [cached (get @cache key)] cached - (let [effective (pom/effective-pom coords fetch-pom)] + (let [effective (pom/effective-pom coords fetch-pom opts)] (swap! cache assoc key effective) effective)))))) diff --git a/pkg/stdlib/grenadine/pom.cljc b/pkg/stdlib/grenadine/pom.cljc index 994474b4..9e4bd1c5 100644 --- a/pkg/stdlib/grenadine/pom.cljc +++ b/pkg/stdlib/grenadine/pom.cljc @@ -3,22 +3,19 @@ (ns grenadine.pom "Pure Maven POM normalization and effective-model construction." (:require [clojure.string :as str] - [grenadine.xml :as xml])) + [grenadine.xml-tree :as xml])) (defn- elements [node tag] - (filter #(and (map? %) (= tag (:tag %))) (:content node))) + (xml/elements node tag)) (defn- element [node tag] - (first (elements node tag))) + (xml/element node tag)) (defn- text [node] - (when node - (let [value (str/trim - (apply str (filter string? (:content node))))] - (when (seq value) value)))) + (xml/text node)) (defn- field [node tag] @@ -75,32 +72,34 @@ (defn parse-pom "Parse POM XML into a canonical raw model. No inheritance or interpolation is performed here." - [xml-source] - (let [project (xml/parse xml-source)] - (when (not= :project (:tag 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))}))) + ([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]}] @@ -234,13 +233,13 @@ (declare effective-pom*) (defn- import-boms - [management fetch-pom path] + [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)] + bom (effective-pom* coords fetch-pom path opts)] (merge-ordered result (vals (:dep-management bom)))) result)) [] @@ -258,7 +257,7 @@ dependency)) (defn- effective-pom* - [coords fetch-pom path] + [coords fetch-pom path opts] (let [identity (coords-key coords)] (when (some #(= identity %) path) (throw @@ -267,7 +266,9 @@ {:type :grenadine.pom/model-cycle :coordinates (conj path identity)}))) (let [raw-source (fetch-pom coords) - raw (if (string? raw-source) (parse-pom raw-source) raw-source)] + 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 @@ -278,7 +279,8 @@ (effective-pom* (assert-resolved-coordinate "parent" parent-coords) fetch-pom - next-path)) + next-path + opts)) declared (:declared-coords raw) preliminary-coords {:group (or (:group declared) (get-in parent [:coords :group])) @@ -312,7 +314,7 @@ (mapv #(interpolate-map % interpolation-context) (:dependency-management raw)) imported-management - (import-boms declared-management fetch-pom next-path) + (import-boms declared-management fetch-pom next-path opts) parent-management (or (:dep-management parent) {}) management-entries (merge-ordered @@ -345,5 +347,7 @@ `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] + (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 index aa17a99f..d5377064 100644 --- a/pkg/stdlib/grenadine/repo.cljc +++ b/pkg/stdlib/grenadine/repo.cljc @@ -3,7 +3,7 @@ (:require [clojure.string :as str] [grenadine.lock :as lock] [grenadine.version :as version] - [grenadine.xml :as xml])) + [grenadine.xml-tree :as xml])) (defn- require-host [host keys] @@ -54,21 +54,19 @@ (defn- child-elements [node tag] - (filter #(and (map? %) (= tag (:tag %))) (:content node))) + (xml/elements node tag)) (defn- child-element [node tag] - (first (child-elements node tag))) + (xml/element node tag)) (defn- element-text [node] - (when node - (let [value (str/trim (apply str (filter string? (:content node))))] - (when (seq value) value)))) + (xml/text node)) (defn- metadata-data - [source] - (let [metadata (xml/parse source) + [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)) @@ -80,8 +78,8 @@ {:release release :latest latest :versions versions})) (defn- metadata-version - [source] - (let [{:keys [release latest versions]} (metadata-data source)] + [source opts] + (let [{:keys [release latest versions]} (metadata-data source opts)] (or release latest (reduce @@ -95,7 +93,8 @@ (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]}] + [{: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") @@ -108,8 +107,8 @@ response ((:http-get host) url)] (if (= 200 (:status response)) (try - (:versions - (metadata-data ((:bytes->utf8 host) (:body response)))) + (:versions + (metadata-data ((:bytes->utf8 host) (:body response)) opts)) (catch Exception error (throw (ex-info (str "Invalid Maven metadata for " @@ -143,7 +142,7 @@ 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]}] + [{: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") @@ -155,7 +154,8 @@ (if (= 200 (:status response)) (let [candidate (try - (metadata-version ((:bytes->utf8 host) (:body response))) + (metadata-version ((:bytes->utf8 host) (:body response)) + opts) (catch Exception error (throw (ex-info (str "Invalid Maven metadata for " diff --git a/pkg/stdlib/grenadine/version.cljc b/pkg/stdlib/grenadine/version.cljc index e7545e1a..d189bea9 100644 --- a/pkg/stdlib/grenadine/version.cljc +++ b/pkg/stdlib/grenadine/version.cljc @@ -39,9 +39,14 @@ "" 5 "sp" 6}) +(defn- char-code + [c] + #?(:cljs (.charCodeAt c 0) + :default (int (if (string? c) (first c) c)))) + (defn- digit? [c] - (let [n (int c)] + (let [n (char-code c)] (<= 48 n 57))) (defn- normalize-number diff --git a/pkg/stdlib/grenadine/xml.cljc b/pkg/stdlib/grenadine/xml.cljc index 0bad03fb..b65f0852 100644 --- a/pkg/stdlib/grenadine/xml.cljc +++ b/pkg/stdlib/grenadine/xml.cljc @@ -45,14 +45,19 @@ (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 (int (if (string? c) (first c) c))] + (let [n (char-code c)] (or (<= 65 n 90) (<= 97 n 122)))) (defn- ascii-digit? [c] - (let [n (int (if (string? c) (first c) c))] + (let [n (char-code c)] (<= 48 n 57))) (defn- name-start? @@ -83,7 +88,7 @@ (defn- digit-value [c radix] - (let [n (int (if (string? c) (first c) c)) + (let [n (char-code c) value (cond (<= 48 n 57) (- n 48) (<= 65 n 70) (+ 10 (- n 65)) diff --git a/pkg/stdlib/grenadine/xml_tree.cljc b/pkg/stdlib/grenadine/xml_tree.cljc new file mode 100644 index 00000000..53c85f5a --- /dev/null +++ b/pkg/stdlib/grenadine/xml_tree.cljc @@ -0,0 +1,40 @@ +(ns grenadine.xml-tree + "Parser-independent operations over data.xml-shaped element trees." + (:require [clojure.string :as str])) + +(defn parse + "Parse `source` with the `:xml-parser` function in `opts`." + [source opts] + (let [parser (:xml-parser opts)] + (when-not (fn? parser) + (throw + (ex-info "XML parsing requires an :xml-parser function" + {:type :grenadine.xml/missing-parser + :option :xml-parser + :value parser}))) + (parser source))) + +(defn tag? + "Return true when `node` has `tag` as its namespace-local element name." + [node tag] + (and (map? node) + (some? (:tag node)) + (= (name tag) (name (:tag node))))) + +(defn elements + "Return the direct child elements of `node` with local name `tag`." + [node tag] + (filter #(tag? % tag) (:content node))) + +(defn element + "Return the first direct child element with local name `tag`." + [node tag] + (first (elements node tag))) + +(defn text + "Return the trimmed direct text content of `node`, or nil when blank." + [node] + (when node + (let [value (str/trim + (apply str (filter string? (:content node))))] + (when (seq value) value)))) diff --git a/test/glojure/test_glojure/deps.glj b/test/glojure/test_glojure/deps.glj index 445be9f6..4d311ea1 100644 --- a/test/glojure/test_glojure/deps.glj +++ b/test/glojure/test_glojure/deps.glj @@ -14,11 +14,22 @@ (fn [libs opts] (is (= {'example/library coordinate} libs)) (is (map? (:host opts))) + (is (fn? (:xml-parser opts))) {:classpath [] :source-roots [] :warnings []})})] (is (= [] (:source-roots result))) (is (= coordinate (get-in (deps/current-basis) [:libs 'example/library]))))) +(deftest caller-supplied-xml-parser-wins + (let [parser (fn [_] nil)] + (deps/add-libs + {'example/xml-parser {:mvn/version "1"}} + {:xml-parser parser + :install-fn + (fn [_ opts] + (is (identical? parser (:xml-parser opts))) + {:classpath [] :source-roots [] :warnings []})}))) + (deftest portable-facade (is (nil? (portable-deps/add-deps {})))) From 671b0530fde722a70d5f0a53c9e979073ff15d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Sun, 16 Aug 2026 16:55:17 -0400 Subject: [PATCH 22/31] Add dependency-acquiring require --- pkg/stdlib/clojurestar/deps.cljc | 28 ++- pkg/stdlib/glojure/deps.clj | 76 +++++++ pkg/stdlib/grenadine/require_deps.cljc | 266 +++++++++++++++++++++++++ test/glojure/test_glojure/deps.glj | 20 ++ 4 files changed, 389 insertions(+), 1 deletion(-) create mode 100644 pkg/stdlib/grenadine/require_deps.cljc diff --git a/pkg/stdlib/clojurestar/deps.cljc b/pkg/stdlib/clojurestar/deps.cljc index c51ad3f5..3b27cd74 100644 --- a/pkg/stdlib/clojurestar/deps.cljc +++ b/pkg/stdlib/clojurestar/deps.cljc @@ -1,6 +1,6 @@ (ns clojurestar.deps "Dialect-neutral dynamic dependency loading." - (:require + (:require [grenadine.require-deps :as required] #?(:gobb [gobb.deps :as implementation] :glj [glojure.deps :as implementation] :jolt [jolt.deps :as implementation]))) @@ -13,3 +13,29 @@ [deps-map] (implementation/add-deps deps-map) nil) + +(defn require-deps + "Acquire and load one or more quoted dependency libspecs. + + An optional leading map accepts :mvn/local-repo and :cache-dir. 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 quoted 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 + (implementation/prepare-required! coordinate options)] + (when alias-symbol + (alias alias-symbol namespace-symbol)) + (when refer-symbols + (refer namespace-symbol :only refer-symbols)))) + nil)) diff --git a/pkg/stdlib/glojure/deps.clj b/pkg/stdlib/glojure/deps.clj index be1df7bf..425626e7 100644 --- a/pkg/stdlib/glojure/deps.clj +++ b/pkg/stdlib/glojure/deps.clj @@ -4,6 +4,7 @@ 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.runtime :as runtime] [grenadine.xml :as xml] [glojure.deps.host :as host])) @@ -11,6 +12,9 @@ (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! @@ -58,3 +62,75 @@ (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) + :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))))))))) diff --git a/pkg/stdlib/grenadine/require_deps.cljc b/pkg/stdlib/grenadine/require_deps.cljc new file mode 100644 index 00000000..217c1119 --- /dev/null +++ b/pkg/stdlib/grenadine/require_deps.cljc @@ -0,0 +1,266 @@ +(ns grenadine.require-deps + "Portable parsing and Gist 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- 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 (boolean (re-matches #"[A-Fa-f0-9]{40}" 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 revision] (parse-revision coordinate body) + parts (str/split body #"/" -1)] + (when-not (<= 2 (count parts) 3) + (fail! (str "Malformed Gist coordinate: " coordinate) + {:coordinate coordinate})) + (let [[owner id filename] parts] + (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-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)) + + :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 quoted 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 :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 cache-root + "Resolve the clojurestar cache root from options and a host home directory." + [host options] + (or (:cache-dir options) + (when-let [home ((:home-dir host))] + (str home "/.cache/clojurestar")) + (fail! "Unable to determine the default clojurestar cache directory" + {:option :cache-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- parent-path + [path] + (subs path 0 (str/last-index-of path "/"))) + +(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] + (let [target (gist-cache-path host options coordinate) + pinned? (some? (:revision coordinate)) + 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) (gist-raw-url coordinate) temporary) + (throw + (ex-info (str "Unable to download Gist source: " + (:coordinate coordinate)) + {:type :clojurestar.deps/gist-http-failure + :coordinate (:coordinate coordinate) + :url (gist-raw-url coordinate)}))) + ((:atomic-move! host) temporary target) + {:path target :source ((:read-text host) target) :cached? false} + (finally + ((:delete! host) temporary))))))) + +(defn gist-namespace + "Extract and validate the namespace from a Gist's first source form." + [coordinate first-form] + (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 "A selected Gist file must begin with an ns form" + {:type :clojurestar.deps/gist-missing-ns + :coordinate (:coordinate coordinate)}))) + namespace-symbol)) + +(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/test/glojure/test_glojure/deps.glj b/test/glojure/test_glojure/deps.glj index 4d311ea1..398ba3ae 100644 --- a/test/glojure/test_glojure/deps.glj +++ b/test/glojure/test_glojure/deps.glj @@ -33,6 +33,26 @@ (deftest portable-facade (is (nil? (portable-deps/add-deps {})))) +(deftest dependency-acquiring-facade + (let [seen (atom [])] + (with-redefs + [deps/prepare-required! + (fn [coordinate options] + (swap! seen conj [(:coordinate coordinate) options]) + 'grenadine.version)] + (is (nil? + (portable-deps/require-deps + {:cache-dir "/cache"} + '["gist:ingydotnet/f70409675d234aa4f2fe379cd975a4f5" + :as required-version] + '["mvn:example/library@1.0.0/example.library" + :refer [compare-versions]]))) + (is (= ["gist:ingydotnet/f70409675d234aa4f2fe379cd975a4f5" + "mvn:example/library@1.0.0/example.library"] + (mapv first @seen))) + (is (some? (resolve 'required-version/compare-versions))) + (is (some? (resolve 'compare-versions)))))) + (deftest embedded-grenadine-legacy-maven-forms (is (= ["hiccup" "hiccup" nil] (coordinate/split-lib 'hiccup))) From d924774eefdf1f2de55a1772d7e70c086db97f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 17 Aug 2026 08:51:30 -0400 Subject: [PATCH 23/31] Skip host-provided dependency coordinates Keep Clojure runtime libraries out of Maven expansion, honor direct dependencies such as spec.alpha, and add Glojure-specific Maven and Git cache overrides. --- pkg/stdlib/glojure/deps.clj | 25 ++++++++++++--- pkg/stdlib/grenadine/basis.cljc | 5 ++- pkg/stdlib/grenadine/expander.cljc | 51 +++++++++++++++++++----------- pkg/stdlib/grenadine/gitlibs.cljc | 6 ++-- pkg/stdlib/grenadine/graph.cljc | 26 ++++++++++++--- pkg/stdlib/grenadine/repo.cljc | 4 +-- pkg/stdlib/grenadine/runtime.cljc | 9 +++++- test/glojure/test_glojure/deps.glj | 17 +++++++--- 8 files changed, 105 insertions(+), 38 deletions(-) diff --git a/pkg/stdlib/glojure/deps.clj b/pkg/stdlib/glojure/deps.clj index 425626e7..9587e1e4 100644 --- a/pkg/stdlib/glojure/deps.clj +++ b/pkg/stdlib/glojure/deps.clj @@ -25,15 +25,30 @@ {: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 {})] + (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_CACHE")] (runtime/add-libs! basis add-roots! libs - (assoc opts - :host (or (:host opts) (host/host)) - :xml-parser (or (:xml-parser opts) - xml/parse)))))) + (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)) diff --git a/pkg/stdlib/grenadine/basis.cljc b/pkg/stdlib/grenadine/basis.cljc index 29f89381..2070c9f0 100644 --- a/pkg/stdlib/grenadine/basis.cljc +++ b/pkg/stdlib/grenadine/basis.cljc @@ -323,6 +323,7 @@ {: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)) @@ -337,7 +338,9 @@ (let [legacy (graph/resolve-graph (into {} top) - {:pom-fn pom-fn :mediation (:mediation opts)})] + {:pom-fn pom-fn + :mediation (:mediation opts) + :provided-libs (:provided-libs opts)})] (into {} (map (fn [[_ occurrence]] diff --git a/pkg/stdlib/grenadine/expander.cljc b/pkg/stdlib/grenadine/expander.cljc index a15b3fcc..326c3019 100644 --- a/pkg/stdlib/grenadine/expander.cljc +++ b/pkg/stdlib/grenadine/expander.cljc @@ -255,16 +255,19 @@ Required options are `:coord-id`, `:coord-deps`, and `:compare-versions`. Optional coordinate maps `:override-deps` and `:default-deps` are applied at - every occurrence. The result contains selected `:libs`, stable inclusion - `:order`, collected `:warnings`, and, with `:trace?`, a tools.deps-shaped - `:trace` containing `:log` and `:vmap`." + 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?] + fail-on-incomparable? provided-libs] :or {known-coordinate? some? base-lib identity override-deps {} - default-deps {}}}] + default-deps {} + provided-libs #{}}}] (when-not (and (ifn? coord-id) (ifn? coord-deps) (ifn? compare-versions)) @@ -291,16 +294,28 @@ (or (get override-deps lib) original-coordinate (get default-deps lib))] - (if (or (nil? coordinate) + (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) + (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 @@ -341,10 +356,10 @@ :include (boolean include?) :reason reason}) trace)] - (recur pending queue index version-map - (:exclusions update) (:cuts update) - (if include? (conj order lib) order) - 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]] diff --git a/pkg/stdlib/grenadine/gitlibs.cljc b/pkg/stdlib/grenadine/gitlibs.cljc index 724da8c7..86c78364 100644 --- a/pkg/stdlib/grenadine/gitlibs.cljc +++ b/pkg/stdlib/grenadine/gitlibs.cljc @@ -17,13 +17,13 @@ (defn gitlibs-dir "Resolve the Git cache directory. - Explicit :gitlibs-dir wins, followed by GRENADINE_GITLIBS, GITLIBS, and - ~/.gitlibs." + Explicit :gitlibs-dir wins, followed by GRENADINE_GITLIBS_CACHE, GITLIBS, + and ~/.gitlibs." [{:keys [host gitlibs-dir]}] (or gitlibs-dir (let [getenv (:getenv host)] (when getenv - (let [value (getenv "GRENADINE_GITLIBS")] + (let [value (getenv "GRENADINE_GITLIBS_CACHE")] (when (seq value) value)))) (let [getenv (:getenv host)] (when getenv diff --git a/pkg/stdlib/grenadine/graph.cljc b/pkg/stdlib/grenadine/graph.cljc index ad4bb62f..20a89c75 100644 --- a/pkg/stdlib/grenadine/graph.cljc +++ b/pkg/stdlib/grenadine/graph.cljc @@ -35,6 +35,15 @@ [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 @@ -78,11 +87,12 @@ :reason reason}) (defn- enumerate - [deps {:keys [pom-fn include-optional? exclusions]}] + [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]}] @@ -109,6 +119,11 @@ 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)) @@ -230,11 +245,13 @@ (assoc :exclusions (normalize-exclusions (:exclusions coordinate))))) (defn- tools-deps-expansion - [deps {:keys [pom-fn include-optional? exclusions]}] + [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 #(contains? global-exclusions (base-ga (:coords %)))) + (remove #(or (contains? global-exclusions (base-ga (:coords %))) + (contains? provided-libs (base-ga (:coords %))))) (mapv (fn [{:keys [coords edge-exclusions]}] [(ga coords) @@ -255,7 +272,8 @@ (->> (:deps (pom-fn coordinate)) (filter #(and (kept-scope? (:scope %)) (or include-optional? (not (:optional %))) - (not (contains? global-exclusions (base-ga %))))) + (not (contains? global-exclusions (base-ga %))) + (not (contains? provided-libs (base-ga %))))) (mapv (fn [dependency] [(ga dependency) (tools-coordinate dependency)]))))}))) diff --git a/pkg/stdlib/grenadine/repo.cljc b/pkg/stdlib/grenadine/repo.cljc index d5377064..c6d44f51 100644 --- a/pkg/stdlib/grenadine/repo.cljc +++ b/pkg/stdlib/grenadine/repo.cljc @@ -18,12 +18,12 @@ "Return the Maven local repository path. An explicit `:local-repo` wins, followed by - `GRENADINE_LOCAL_REPOSITORY`, then `$HOME/.m2/repository`." + `GRENADINE_MAVEN_REPOSITORY`, then `$HOME/.m2/repository`." [{:keys [host local-repo]}] (or local-repo (let [getenv (:getenv host) configured (when (fn? getenv) - (getenv "GRENADINE_LOCAL_REPOSITORY"))] + (getenv "GRENADINE_MAVEN_REPOSITORY"))] (when (seq configured) configured)) (str ((:home-dir host)) "/.m2/repository"))) diff --git a/pkg/stdlib/grenadine/runtime.cljc b/pkg/stdlib/grenadine/runtime.cljc index 67b96b3f..2f9e63a1 100644 --- a/pkg/stdlib/grenadine/runtime.cljc +++ b/pkg/stdlib/grenadine/runtime.cljc @@ -2,6 +2,11 @@ "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)) @@ -35,7 +40,8 @@ `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 [missing (missing-libs basis libs) + (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 [] @@ -47,6 +53,7 @@ (-> opts (dissoc :install-fn) (assoc :source-roots? true + :provided-libs provided-libs :mediation (or (:mediation opts) :tools-deps)))) diff --git a/test/glojure/test_glojure/deps.glj b/test/glojure/test_glojure/deps.glj index 398ba3ae..b55c7b8e 100644 --- a/test/glojure/test_glojure/deps.glj +++ b/test/glojure/test_glojure/deps.glj @@ -7,14 +7,23 @@ (deftest embedded-grenadine-facade (let [coordinate {:mvn/version "1.0.0"} + runtime-host + {:getenv #(get {"GLOJURE_MAVEN_REPOSITORY" "/dialect/m2" + "GLOJURE_GITLIBS_CACHE" "/dialect/gitlibs"} %)} result (deps/add-deps - {:deps {'example/library coordinate}} - {:install-fn + {:deps {'example/library coordinate + 'org.clojure/clojure {:mvn/version "1.12.4"}}} + {:host runtime-host + :install-fn (fn [libs opts] (is (= {'example/library coordinate} libs)) - (is (map? (:host opts))) - (is (fn? (:xml-parser opts))) + (is (= runtime-host (:host opts))) + (is (fn? (:xml-parser opts))) + (is (= "/dialect/m2" (:local-repo opts))) + (is (= "/dialect/gitlibs" (:gitlibs-dir opts))) + (is (= '#{org.clojure/clojure org.clojure/clojurescript} + (:provided-libs opts))) {:classpath [] :source-roots [] :warnings []})})] (is (= [] (:source-roots result))) (is (= coordinate From 0c54c77874d420d23604760673877782cf8ffd7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 17 Aug 2026 09:28:43 -0400 Subject: [PATCH 24/31] Allow unquoted require-deps libspecs --- pkg/stdlib/clojurestar/deps.cljc | 20 +++++++++++++++++--- pkg/stdlib/grenadine/require_deps.cljc | 2 +- test/glojure/test_glojure/deps.glj | 4 ++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/pkg/stdlib/clojurestar/deps.cljc b/pkg/stdlib/clojurestar/deps.cljc index 3b27cd74..1733d510 100644 --- a/pkg/stdlib/clojurestar/deps.cljc +++ b/pkg/stdlib/clojurestar/deps.cljc @@ -14,8 +14,8 @@ (implementation/add-deps deps-map) nil) -(defn require-deps - "Acquire and load one or more quoted dependency libspecs. +(defn require-deps* + "Acquire and load one or more dependency libspec values. An optional leading map accepts :mvn/local-repo and :cache-dir. Libspecs support :as and an explicit :refer vector. Dependencies are prepared and @@ -27,7 +27,7 @@ [{} arguments])] (when (empty? libspecs) (throw - (ex-info "require-deps requires at least one quoted libspec vector" + (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} @@ -39,3 +39,17 @@ (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/grenadine/require_deps.cljc b/pkg/stdlib/grenadine/require_deps.cljc index 217c1119..68e0433a 100644 --- a/pkg/stdlib/grenadine/require_deps.cljc +++ b/pkg/stdlib/grenadine/require_deps.cljc @@ -118,7 +118,7 @@ {:coordinate coordinate})))) (defn parse-libspec - "Validate a quoted require-deps libspec vector." + "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" diff --git a/test/glojure/test_glojure/deps.glj b/test/glojure/test_glojure/deps.glj index b55c7b8e..adb8b5b7 100644 --- a/test/glojure/test_glojure/deps.glj +++ b/test/glojure/test_glojure/deps.glj @@ -52,8 +52,8 @@ (is (nil? (portable-deps/require-deps {:cache-dir "/cache"} - '["gist:ingydotnet/f70409675d234aa4f2fe379cd975a4f5" - :as required-version] + ["gist:ingydotnet/f70409675d234aa4f2fe379cd975a4f5" + :as required-version] '["mvn:example/library@1.0.0/example.library" :refer [compare-versions]]))) (is (= ["gist:ingydotnet/f70409675d234aa4f2fe379cd975a4f5" From 57570a5aab44b4b608075626e2b57ef6a35012af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 17 Aug 2026 09:40:30 -0400 Subject: [PATCH 25/31] Document dynamic dependency loading --- README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/README.md b/README.md index 66577560..4cc76915 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,41 @@ $ 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 and Gist 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. + +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 cache uses explicit `:gitlibs/dir` or `:gitlibs-dir`, then +`GLOJURE_GITLIBS_CACHE`, `GRENADINE_GITLIBS_CACHE`, `GITLIBS`, and finally +`$HOME/.gitlibs`. + +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. From 231565c4535983331fc38ed777775b824fd1d5d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 17 Aug 2026 10:09:09 -0400 Subject: [PATCH 26/31] Unify Gist and Gitlibs cache directory --- README.md | 7 ++++--- pkg/stdlib/clojurestar/deps.cljc | 3 ++- pkg/stdlib/glojure/deps.clj | 8 +++++++- pkg/stdlib/grenadine/gitlibs.cljc | 4 ++-- pkg/stdlib/grenadine/require_deps.cljc | 23 +++++++++++++++++------ test/glojure/test_glojure/deps.glj | 16 +++++++++++++++- 6 files changed, 47 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 4cc76915..d13902b4 100644 --- a/README.md +++ b/README.md @@ -167,9 +167,10 @@ The Maven repository is selected in this order: 3. `GRENADINE_MAVEN_REPOSITORY`; 4. `$HOME/.m2/repository`. -The Git cache uses explicit `:gitlibs/dir` or `:gitlibs-dir`, then -`GLOJURE_GITLIBS_CACHE`, `GRENADINE_GITLIBS_CACHE`, `GITLIBS`, and finally -`$HOME/.gitlibs`. +The Git and Gist cache root uses explicit `:gitlibs/dir` or `:gitlibs-dir`, then +`GLOJURE_GITLIBS_DIR`, `GRENADINE_GITLIBS_DIR`, `GITLIBS`, and finally +`$HOME/.gitlibs`. Gist source is stored under `gist/` 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 diff --git a/pkg/stdlib/clojurestar/deps.cljc b/pkg/stdlib/clojurestar/deps.cljc index 1733d510..4d774ccb 100644 --- a/pkg/stdlib/clojurestar/deps.cljc +++ b/pkg/stdlib/clojurestar/deps.cljc @@ -17,7 +17,8 @@ (defn require-deps* "Acquire and load one or more dependency libspec values. - An optional leading map accepts :mvn/local-repo and :cache-dir. Libspecs + An optional leading map accepts :mvn/local-repo and :gitlibs/dir; + :cache-dir remains a compatibility alias for the Gist cache root. Libspecs support :as and an explicit :refer vector. Dependencies are prepared and required from left to right." [& arguments] diff --git a/pkg/stdlib/glojure/deps.clj b/pkg/stdlib/glojure/deps.clj index 9587e1e4..b66941c3 100644 --- a/pkg/stdlib/glojure/deps.clj +++ b/pkg/stdlib/glojure/deps.clj @@ -5,6 +5,7 @@ `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])) @@ -38,7 +39,7 @@ maven-repository (environment-option runtime-host "GLOJURE_MAVEN_REPOSITORY") gitlibs-cache - (environment-option runtime-host "GLOJURE_GITLIBS_CACHE")] + (environment-option runtime-host "GLOJURE_GITLIBS_DIR")] (runtime/add-libs! basis add-roots! libs (cond-> (assoc opts :host runtime-host @@ -82,6 +83,11 @@ [] (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) diff --git a/pkg/stdlib/grenadine/gitlibs.cljc b/pkg/stdlib/grenadine/gitlibs.cljc index 86c78364..c7de6fdb 100644 --- a/pkg/stdlib/grenadine/gitlibs.cljc +++ b/pkg/stdlib/grenadine/gitlibs.cljc @@ -17,13 +17,13 @@ (defn gitlibs-dir "Resolve the Git cache directory. - Explicit :gitlibs-dir wins, followed by GRENADINE_GITLIBS_CACHE, GITLIBS, + 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_CACHE")] + (let [value (getenv "GRENADINE_GITLIBS_DIR")] (when (seq value) value)))) (let [getenv (:getenv host)] (when getenv diff --git a/pkg/stdlib/grenadine/require_deps.cljc b/pkg/stdlib/grenadine/require_deps.cljc index 68e0433a..79a43bd1 100644 --- a/pkg/stdlib/grenadine/require_deps.cljc +++ b/pkg/stdlib/grenadine/require_deps.cljc @@ -168,7 +168,7 @@ "Validate the optional leading require-deps options map." [options] (let [options (or options {}) - supported #{:mvn/local-repo :cache-dir}] + 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)))] @@ -192,13 +192,24 @@ (when filename (str "/" filename)))) (defn cache-root - "Resolve the clojurestar cache root from options and a host home directory." + "Resolve the Gist cache under the effective tools.gitlibs-compatible root." [host options] - (or (:cache-dir 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 "/.cache/clojurestar")) - (fail! "Unable to determine the default clojurestar cache directory" - {:option :cache-dir}))) + (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." diff --git a/test/glojure/test_glojure/deps.glj b/test/glojure/test_glojure/deps.glj index adb8b5b7..9af1d7c9 100644 --- a/test/glojure/test_glojure/deps.glj +++ b/test/glojure/test_glojure/deps.glj @@ -2,14 +2,16 @@ (:require [clojure.test :refer [deftest is run-tests]] [clojurestar.deps :as portable-deps] [glojure.deps :as deps] + [glojure.deps.host :as deps-host] [grenadine.coordinate :as coordinate] + [grenadine.require-deps :as required] [grenadine.version :as version])) (deftest embedded-grenadine-facade (let [coordinate {:mvn/version "1.0.0"} runtime-host {:getenv #(get {"GLOJURE_MAVEN_REPOSITORY" "/dialect/m2" - "GLOJURE_GITLIBS_CACHE" "/dialect/gitlibs"} %)} + "GLOJURE_GITLIBS_DIR" "/dialect/gitlibs"} %)} result (deps/add-deps {:deps {'example/library coordinate @@ -62,6 +64,18 @@ (is (some? (resolve 'required-version/compare-versions))) (is (some? (resolve 'compare-versions)))))) +(deftest gist-cache-follows-gitlibs-directory + (let [runtime-host + {:getenv #(get {"GLOJURE_GITLIBS_DIR" "/dialect/gitlibs"} %) + :home-dir (constantly "/home/test")}] + (with-redefs [deps-host/host (constantly runtime-host)] + (let [required-host (@#'deps/required-host)] + (is (= "/dialect/gitlibs" + (required/cache-root required-host {}))) + (is (= "/explicit/gitlibs" + (required/cache-root + required-host {:gitlibs/dir "/explicit/gitlibs"}))))))) + (deftest embedded-grenadine-legacy-maven-forms (is (= ["hiccup" "hiccup" nil] (coordinate/split-lib 'hiccup))) From 11e17db3cf16aa0895e99c9934fbbf27a682eade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 17 Aug 2026 10:29:50 -0400 Subject: [PATCH 27/31] Support slash-ordered pinned Gist coordinates --- README.md | 2 ++ pkg/stdlib/grenadine/require_deps.cljc | 40 +++++++++++++++----------- test/glojure/test_glojure/deps.glj | 11 +++++++ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index d13902b4..85030fb4 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,8 @@ Literal libspec vectors do not need quoting; quoted vectors remain supported. `require-deps` accepts Maven and Gist 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. The Maven repository is selected in this order: diff --git a/pkg/stdlib/grenadine/require_deps.cljc b/pkg/stdlib/grenadine/require_deps.cljc index 79a43bd1..3b5c35c8 100644 --- a/pkg/stdlib/grenadine/require_deps.cljc +++ b/pkg/stdlib/grenadine/require_deps.cljc @@ -59,24 +59,32 @@ (defn- parse-gist [coordinate body] - (let [[body revision] (parse-revision coordinate body) - parts (str/split body #"/" -1)] - (when-not (<= 2 (count parts) 3) + (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})) - (let [[owner id filename] parts] - (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]}))) + (when (and slash-revision? + (not (boolean (re-matches #"[A-Fa-f0-9]{40}" 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-maven [coordinate] diff --git a/test/glojure/test_glojure/deps.glj b/test/glojure/test_glojure/deps.glj index 9af1d7c9..f9f45715 100644 --- a/test/glojure/test_glojure/deps.glj +++ b/test/glojure/test_glojure/deps.glj @@ -76,6 +76,17 @@ (required/cache-root required-host {:gitlibs/dir "/explicit/gitlibs"}))))))) +(deftest pinned-gist-coordinate-aliases + (let [revision "0123456789abcdef0123456789abcdef01234567" + base "gist:ingydotnet/f70409675d234aa4f2fe379cd975a4f5/" + suffix (required/parse-coordinate + (str base "mathy.clj@" revision)) + slash (required/parse-coordinate + (str base revision "/mathy.clj"))] + (is (= (:identity suffix) (:identity slash))) + (is (= (required/gist-raw-url suffix) + (required/gist-raw-url slash))))) + (deftest embedded-grenadine-legacy-maven-forms (is (= ["hiccup" "hiccup" nil] (coordinate/split-lib 'hiccup))) From 33ecf8903cc6578a4a4cb39346f11b17ddf34720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Mon, 17 Aug 2026 11:05:26 -0400 Subject: [PATCH 28/31] Support GitHub source-file dependencies --- README.md | 12 ++- pkg/stdlib/clojurestar/deps.cljc | 2 +- pkg/stdlib/glojure/deps.clj | 11 +++ pkg/stdlib/grenadine/require_deps.cljc | 129 ++++++++++++++++++++----- test/glojure/test_glojure/deps.glj | 14 +++ 5 files changed, 142 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 85030fb4..da21d762 100644 --- a/README.md +++ b/README.md @@ -156,11 +156,16 @@ script can acquire a Maven library and import its namespace without a JVM: ``` Literal libspec vectors do not need quoting; quoted vectors remain supported. -`require-deps` accepts Maven and Gist coordinates, with `:as` or an explicit +`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: @@ -169,9 +174,10 @@ The Maven repository is selected in this order: 3. `GRENADINE_MAVEN_REPOSITORY`; 4. `$HOME/.m2/repository`. -The Git and Gist cache root uses explicit `:gitlibs/dir` or `:gitlibs-dir`, then +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 source is stored under `gist/` in that root; +`$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 diff --git a/pkg/stdlib/clojurestar/deps.cljc b/pkg/stdlib/clojurestar/deps.cljc index 4d774ccb..c5cc4189 100644 --- a/pkg/stdlib/clojurestar/deps.cljc +++ b/pkg/stdlib/clojurestar/deps.cljc @@ -18,7 +18,7 @@ "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 the Gist cache root. Libspecs + :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] diff --git a/pkg/stdlib/glojure/deps.clj b/pkg/stdlib/glojure/deps.clj index b66941c3..fbf7f116 100644 --- a/pkg/stdlib/glojure/deps.clj +++ b/pkg/stdlib/glojure/deps.clj @@ -150,6 +150,17 @@ (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 diff --git a/pkg/stdlib/grenadine/require_deps.cljc b/pkg/stdlib/grenadine/require_deps.cljc index 3b5c35c8..2b6a0da1 100644 --- a/pkg/stdlib/grenadine/require_deps.cljc +++ b/pkg/stdlib/grenadine/require_deps.cljc @@ -1,5 +1,5 @@ (ns grenadine.require-deps - "Portable parsing and Gist acquisition for clojurestar.deps/require-deps." + "Portable parsing and source-file acquisition for clojurestar.deps/require-deps." (:require [clojure.string :as str])) (defn- fail! @@ -31,6 +31,11 @@ (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) @@ -52,7 +57,7 @@ (when (str/includes? base "@") (fail! (str "Malformed Gist coordinate: " coordinate) {:coordinate coordinate})) - (when-not (boolean (re-matches #"[A-Fa-f0-9]{40}" revision)) + (when-not (full-sha? revision) (fail! "Pinned Gist revisions must be full 40-character commit SHAs" {:coordinate coordinate :revision revision})) [base revision])))) @@ -70,7 +75,7 @@ (fail! (str "Malformed Gist coordinate: " coordinate) {:coordinate coordinate})) (when (and slash-revision? - (not (boolean (re-matches #"[A-Fa-f0-9]{40}" 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) @@ -86,6 +91,32 @@ :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] @@ -118,6 +149,9 @@ (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)] @@ -199,8 +233,16 @@ (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 the Gist cache under the effective tools.gitlibs-compatible root." + "Resolve source-file caches under the effective Gitlibs-compatible root." [host options] (or (:gitlibs/dir options) (:cache-dir options) @@ -227,19 +269,21 @@ (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-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] - (let [target (gist-cache-path host options coordinate) - pinned? (some? (:revision coordinate)) +(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} @@ -247,21 +291,49 @@ ((:mkdirs! host) (parent-path target)) ((:delete! host) temporary) (try - (when-not ((:download! host) (gist-raw-url coordinate) temporary) + (when-not ((:download! host) url temporary) (throw - (ex-info (str "Unable to download Gist source: " + (ex-info (str "Unable to download " source-label " source: " (:coordinate coordinate)) - {:type :clojurestar.deps/gist-http-failure + {:type failure-type :coordinate (:coordinate coordinate) - :url (gist-raw-url coordinate)}))) + :url url}))) ((:atomic-move! host) temporary target) {:path target :source ((:read-text host) target) :cached? false} (finally ((:delete! host) temporary))))))) -(defn gist-namespace - "Extract and validate the namespace from a Gist's first source form." - [coordinate first-form] +(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)) @@ -269,11 +341,24 @@ (second first-form))] (when-not namespace-symbol (throw - (ex-info "A selected Gist file must begin with an ns form" - {:type :clojurestar.deps/gist-missing-ns + (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 diff --git a/test/glojure/test_glojure/deps.glj b/test/glojure/test_glojure/deps.glj index f9f45715..14354a82 100644 --- a/test/glojure/test_glojure/deps.glj +++ b/test/glojure/test_glojure/deps.glj @@ -87,6 +87,20 @@ (is (= (required/gist-raw-url suffix) (required/gist-raw-url slash))))) +(deftest github-source-coordinate + (let [short-coordinate + (required/parse-coordinate + "github:weavejester/medley/1.7.0/src/medley/core.cljc") + blob-coordinate + (required/parse-coordinate + "github:weavejester/medley/blob/1.7.0/src/medley/core.cljc")] + (is (= [:github "weavejester" "medley" "1.7.0" + "src/medley/core.cljc"] + (:identity short-coordinate))) + (is (= (:identity short-coordinate) (:identity blob-coordinate))) + (is (= "https://raw.githubusercontent.com/weavejester/medley/1.7.0/src/medley/core.cljc" + (required/github-raw-url short-coordinate))))) + (deftest embedded-grenadine-legacy-maven-forms (is (= ["hiccup" "hiccup" nil] (coordinate/split-lib 'hiccup))) From d079e509f497c30b40c11d25f656545ec4e1215a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Tue, 18 Aug 2026 09:13:19 -0400 Subject: [PATCH 29/31] Update embedded Grenadine to 0.1.7 --- pkg/stdlib/clojurestar/deps.cljc | 9 +++- pkg/stdlib/grenadine/expander.cljc | 80 +++++++++++++++--------------- 2 files changed, 48 insertions(+), 41 deletions(-) diff --git a/pkg/stdlib/clojurestar/deps.cljc b/pkg/stdlib/clojurestar/deps.cljc index c5cc4189..8b196cb2 100644 --- a/pkg/stdlib/clojurestar/deps.cljc +++ b/pkg/stdlib/clojurestar/deps.cljc @@ -34,7 +34,14 @@ (let [{:keys [coordinate] alias-symbol :as refer-symbols :refer} (required/parse-libspec libspec) namespace-symbol - (implementation/prepare-required! coordinate options)] + #?(: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 diff --git a/pkg/stdlib/grenadine/expander.cljc b/pkg/stdlib/grenadine/expander.cljc index 326c3019..a42eb824 100644 --- a/pkg/stdlib/grenadine/expander.cljc +++ b/pkg/stdlib/grenadine/expander.cljc @@ -316,46 +316,46 @@ (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)] + 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) From d0aadbe67e2ecd08c93152edae16a205a8e570e5 Mon Sep 17 00:00:00 2001 From: James Hamlin Date: Sat, 1 Aug 2026 13:18:34 -0700 Subject: [PATCH 30/31] Install managed Go before WASM builds --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 390e9817..7c0d04c9 100644 --- a/Makefile +++ b/Makefile @@ -196,7 +196,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) \ From 8b0da7b7aa25c9cf621ca54cc13b67381839938e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingy=20d=C3=B6t=20Net?= Date: Wed, 19 Aug 2026 13:12:13 -0400 Subject: [PATCH 31/31] Keep committed stdlib sources during release --- Makefile | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 7c0d04c9..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 \ @@ -293,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 ;) @@ -319,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