From 27e55a8ca386868795bf1b46e2f70e6fd6e2841d Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Fri, 14 Aug 2026 13:01:29 +0200 Subject: [PATCH 1/3] Handle Core.TypeEq on Julia 1.14-dev https://github.com/JuliaLang/julia/pull/61915 changed how `Type{ConcreteType}` arguments are represented in method signatures, breaking `signature()` for constructors of concrete (parametric) types. Co-Authored-By: Claude Sonnet 5 --- src/type_utils.jl | 7 +++++++ test/type_utils.jl | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/type_utils.jl b/src/type_utils.jl index f8466e7..3485960 100644 --- a/src/type_utils.jl +++ b/src/type_utils.jl @@ -9,3 +9,10 @@ parameters(sig::UnionAll) = parameters(sig.body) parameters(sig::DataType) = sig.parameters parameters(sig::Union) = Base.uniontypes(sig) parameters(sig::TypeVar) = [sig] + +# On Julia 1.14.0-DEV.2291 `Type{ConcreteType}` may be represented via `Core.TypeEq` +# instead of `DataType`/`UnionAll`. +# https://github.com/JuliaLang/julia/pull/61915 +@static if isdefined(Core, :TypeEq) + parameters(sig::Core.TypeEq) = Core.svec(sig.T) +end diff --git a/test/type_utils.jl b/test/type_utils.jl index 8fcd816..7600c7d 100644 --- a/test/type_utils.jl +++ b/test/type_utils.jl @@ -72,5 +72,17 @@ @test length(w) == 1 @test first(w).args[1] == :T end + + @static if isdefined(Core, :TypeEq) + @testset "Core.TypeEq" begin + struct TypeEqTest + x + end + m = only(methods(TypeEqTest, Tuple{Any})) + constructor_type = first(parameters(m.sig)) + @test constructor_type isa Core.TypeEq + @test collect(parameters(constructor_type)) == [TypeEqTest] + end + end end end From 3a843074d392f453e2eeb9b0568c3bc82556aa83 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Mon, 17 Aug 2026 08:41:49 +0200 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: Frames White --- src/type_utils.jl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/type_utils.jl b/src/type_utils.jl index 3485960..4dd772c 100644 --- a/src/type_utils.jl +++ b/src/type_utils.jl @@ -6,7 +6,13 @@ Extracts the type-parameters of the `type`. e.g. `parameters(Foo{A, B, C}) == [A, B, C]` """ parameters(sig::UnionAll) = parameters(sig.body) -parameters(sig::DataType) = sig.parameters +# Introduced in Julia 1.14.0-DEV.2291 https://github.com/JuliaLang/julia/pull/61915 +# type_parameter is the officially supported way of doing this, and accessing directly is deprecated +@static if isdefined(Base, :type_parameter): + parameters(sig::DataType) = Base.type_parameter(sig) +else + parameters(sig::DataType) = sig.parameters +end parameters(sig::Union) = Base.uniontypes(sig) parameters(sig::TypeVar) = [sig] @@ -14,5 +20,5 @@ parameters(sig::TypeVar) = [sig] # instead of `DataType`/`UnionAll`. # https://github.com/JuliaLang/julia/pull/61915 @static if isdefined(Core, :TypeEq) - parameters(sig::Core.TypeEq) = Core.svec(sig.T) + parameters(sig::Core.TypeEq) = [sig.T] end From a1b7e2c86b1b82287f3250752588e6613308b2c6 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Mon, 17 Aug 2026 08:44:08 +0200 Subject: [PATCH 3/3] Remove extra colon --- src/type_utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/type_utils.jl b/src/type_utils.jl index 4dd772c..a93782e 100644 --- a/src/type_utils.jl +++ b/src/type_utils.jl @@ -8,7 +8,7 @@ e.g. `parameters(Foo{A, B, C}) == [A, B, C]` parameters(sig::UnionAll) = parameters(sig.body) # Introduced in Julia 1.14.0-DEV.2291 https://github.com/JuliaLang/julia/pull/61915 # type_parameter is the officially supported way of doing this, and accessing directly is deprecated -@static if isdefined(Base, :type_parameter): +@static if isdefined(Base, :type_parameter) parameters(sig::DataType) = Base.type_parameter(sig) else parameters(sig::DataType) = sig.parameters