Skip to content

Commit 36d28cc

Browse files
committed
Merge remote-tracking branch 'origin/master' into b/611-migrate-to-exproniconjl-v08-from-unityperjl
2 parents d924da7 + b959fd8 commit 36d28cc

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "SymbolicUtils"
22
uuid = "d1185830-fcd6-423d-90d6-eec64667417b"
33
authors = ["Shashi Gowda"]
4-
version = "3.6.0"
4+
version = "3.7.0"
55

66
[deps]
77
AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"

src/types.jl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,7 @@ promote_symtype(f, Ts...) = Any
10211021
#### Function-like variables
10221022
#---------------------------
10231023

1024-
struct FnType{X<:Tuple,Y} end
1024+
struct FnType{X<:Tuple,Y,Z} end
10251025

10261026
(f::Symbolic{<:FnType})(args...) = _Term(promote_symtype(f, symtype.(args)...), f, [args...])
10271027

@@ -1128,8 +1128,16 @@ function _name_type(x)
11281128
lhs, rhs = x.args[1:2]
11291129
if lhs isa Expr && lhs.head === :call
11301130
# e.g. f(::Real)::Unreal
1131+
if lhs.args[1] isa Expr
1132+
func_name_and_type = _name_type(lhs.args[1])
1133+
name = func_name_and_type.name
1134+
functype = func_name_and_type.type
1135+
else
1136+
name = lhs.args[1]
1137+
functype = Nothing
1138+
end
11311139
type = map(x->_name_type(x).type, lhs.args[2:end])
1132-
return (name=lhs.args[1], type=:($FnType{Tuple{$(type...)}, $rhs}))
1140+
return (name=name, type=:($FnType{Tuple{$(type...)}, $rhs, $functype}))
11331141
else
11341142
return (name=lhs, type=rhs)
11351143
end

test/basics.jl

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ using Test
66

77
@testset "@syms" begin
88
let
9-
@syms a b::Float64 f(::Real) g(p, h(q::Real))::Int
9+
@syms a b::Float64 f(::Real) g(p, h(q::Real))::Int
1010

1111
@test issym(a) && symtype(a) == Number
1212
@test a.impl.name === :a
@@ -16,9 +16,11 @@ using Test
1616

1717
@test issym(f)
1818
@test f.impl.name === :f
19+
@test symtype(f) == FnType{Tuple{Real}, Number, Nothing}
1920

2021
@test issym(g)
2122
@test g.impl.name === :g
23+
@test symtype(g) == FnType{Tuple{Number, FnType{Tuple{Real}, Number, Nothing}}, Int, Nothing}
2224

2325
@test isterm(f(b))
2426
@test symtype(f(b)) === Number
@@ -32,6 +34,21 @@ using Test
3234
# issue #91
3335
@syms h(a,b,c)
3436
@test isequal(h(1,2,3), h(1,2,3))
37+
38+
@syms (f::typeof(max))(::Real, ::AbstractFloat)::Number a::Real
39+
@test issym(f)
40+
@test f.name == :f
41+
@test symtype(f) == FnType{Tuple{Real, AbstractFloat}, Number, typeof(max)}
42+
@test isterm(f(a, b))
43+
@test symtype(f(a, b)) == Number
44+
45+
@syms g(p, (h::typeof(identity))(q::Real)::Number)::Number
46+
@test issym(g)
47+
@test g.name == :g
48+
@test symtype(g) == FnType{Tuple{Number, FnType{Tuple{Real}, Number, typeof(identity)}}, Number, Nothing}
49+
@test_throws "not a subtype of" g(a, f)
50+
@syms (f::typeof(identity))(::Real)::Number
51+
@test symtype(g(a, f)) == Number
3552
end
3653
end
3754

0 commit comments

Comments
 (0)