diff --git a/src/type_utils.jl b/src/type_utils.jl index f8466e7..a93782e 100644 --- a/src/type_utils.jl +++ b/src/type_utils.jl @@ -6,6 +6,19 @@ 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] + +# 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) = [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