diff --git a/src/sugar.jl b/src/sugar.jl index a189c03f..d3f9f834 100644 --- a/src/sugar.jl +++ b/src/sugar.jl @@ -521,19 +521,23 @@ function show_optic(io, optic) outer = Iterators.dropwhile(x -> applicable(_shortstring, "", x), opts) if !isempty(outer) show(io, opcompose(outer...)) + end + if !isempty(inner) && !isempty(outer) print(io, " ∘ ") end - shortstr = reduce(inner; init=("_", false)) do (prev, need_parens_prev), o - # if _need_parens is true for this o and the one before, wrap the previous one in parentheses - if need_parens_prev && _need_parens(o) - prev = "($prev)" + if !isempty(inner) + shortstr = reduce(inner; init=("_", false)) do (prev, need_parens_prev), o + # if _need_parens is true for this o and the one before, wrap the previous one in parentheses + if need_parens_prev && _need_parens(o) + prev = "($prev)" + end + _shortstring(prev, o), _need_parens(o) + end |> first + if get(io, :compact, false) + print(io, shortstr) + else + print(io, "(@o ", shortstr, ")") end - _shortstring(prev, o), _need_parens(o) - end |> first - if get(io, :compact, false) - print(io, shortstr) - else - print(io, "(@o ", shortstr, ")") end end diff --git a/test/test_core.jl b/test/test_core.jl index 49c09ddb..bc603189 100644 --- a/test/test_core.jl +++ b/test/test_core.jl @@ -470,6 +470,11 @@ end @test sprint(show, (@optic log(_.a[2])); context=:compact => true) == "log(_.a[2])" @test sprint(show, (@optic Base.tail(_.a[2])); context=:compact => true) == "tail(_.a[2])" # non-exported function @test sprint(show, (@optic Base.Fix2(_.a[2])); context=:compact => true) == "Fix2(_.a[2])" # non-exported type + + # show_optic is reasonable even for types without special show_optic handling: + o = Recursive(Returns(true), Properties()) + @test sprint(Accessors.show_optic, o) == "$o" + @test sprint(Accessors.show_optic, (@o _.a) ∘ o) == "(@o _.a) ∘ $o" end @testset "text/plain show" begin