From 1b7ebce4464473c27eb10e35db1bfea3a29f98e6 Mon Sep 17 00:00:00 2001 From: Tim Holy Date: Fri, 24 Aug 2018 08:00:57 -0500 Subject: [PATCH] Generate names for `::NamedTuple` arguments (fixes #34) --- src/debug.jl | 26 ++++++++++++++++---------- test/runtests.jl | 4 ++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/debug.jl b/src/debug.jl index fc201ef..29834bf 100644 --- a/src/debug.jl +++ b/src/debug.jl @@ -508,9 +508,13 @@ function signature_names!(sigex::ExLike) # This argument has a type but no name return arg, true end - if isa(arg, Expr) && arg.head == :curly && arg.args[1] == :Type - # Argument of the form ::Type{T} - return arg.args[2], false + if isa(arg, Expr) && arg.head == :curly + if arg.args[1] == :Type + # Argument of the form ::Type{T} + return arg.args[2], false + elseif arg.args[1] == :NamedTuple + return :NamedTuple, true, arg + end end return arg end @@ -537,20 +541,22 @@ function signature_names!(sigex::ExLike) argnames = Union{Symbol,Expr}[] for i = offset+1:length(sigex.args) arg = sigex.args[i] - name = argname(arg) - if name isa Tuple - name, genname = name - if genname + retname = argname(arg) + if retname isa Tuple + should_gen = retname[2] + if should_gen # This argument is missing a real name - argt = name - name = genunderscored(argt) + argt = length(retname) == 3 ? retname[3] : retname[1] + name = genunderscored(retname[1]) sigex.args[i] = :($name::$argt) else # This is a ::Type{T} argument. We should remove this from the list of parameters + name = retname[1] parameternames = filter(!isequal(name), parameternames) end + retname = name end - push!(argnames, name) + push!(argnames, retname) end return sigex.args[1], tuple(argnames...), kwnames, tuple(parameternames...) diff --git a/test/runtests.jl b/test/runtests.jl index 27ad8fc..0aa47dc 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -33,6 +33,10 @@ Base.show(io::IO, ::ErrorsOnShow) = throw(ArgumentError("no show")) ex = :(f(Tuseless::Type{T}, ::IndexStyle, x::Int) where T) @test Rebugger.signature_names!(ex) == (:f, (:Tuseless, :__IndexStyle_1, :x), (), (:T,)) @test ex == :(f(Tuseless::Type{T}, __IndexStyle_1::IndexStyle, x::Int) where T) + # issue #34 + ex = :(_mapreduce_dim(f, op, ::NamedTuple{()}, A::AbstractArray, ::Colon)) + @test Rebugger.signature_names!(ex) == (:_mapreduce_dim, (:f, :op, :__NamedTuple_1, :A, :__Colon_1), (), ()) + @test ex == :(_mapreduce_dim(f, op, __NamedTuple_1::NamedTuple{()}, A::AbstractArray, __Colon_1::Colon)) end @testset "Caller buffer capture and insertion" begin function run_insertion(str, atstr)