forked from GiovineItalia/Gadfly.jl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvarset.jl
72 lines (63 loc) · 2.29 KB
/
varset.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# Generate large types where each field has an optional default value
# to which it's initialized. the format of each row in `table` is
# "[doc str], variable name, [variable type, [default value, [depwarn
# str]]]", where square brackets indicate optional elements.
macro varset(name::Symbol, table)
@assert table.head == :block
table = table.args
names = Any[]
vars = Any[]
depwarns = Any[]
parsed_vars = Any[]
parameters = Any[]
parameters_expr = Expr(:parameters)
inherit_parameters = Any[]
inherit_parameters_expr = Expr(:parameters)
for row in table
isa(row, LineNumberNode) && continue
hasdocstr = false
if isa(row, Symbol)
var = row
typ = :Any
default = :nothing
depwarnstr = ""
elseif row.head == :tuple && 2 <= length(row.args) <= 5
if isa(row.args[1], String)
docstr = row.args[1]
hasdocstr = true
end
var = row.args[hasdocstr+1]
typ = row.args[hasdocstr+2]
default = length(row.args)-hasdocstr > 2 ? row.args[hasdocstr+3] : :nothing
depwarnstr = length(row.args)-hasdocstr > 3 ? row.args[hasdocstr+4] : ""
else
error("Bad varset syntax ", row)
end
push!(names, var)
hasdocstr && push!(vars, :($docstr))
isempty(depwarnstr) || push!(depwarns, :($var != $default && Base.depwarn($depwarnstr, Symbol($name))))
push!(vars, :($(var)::$(typ)))
push!(parameters, Expr(:kw, var, default))
push!(inherit_parameters, Expr(:kw, var, :(b.$var)))
if typ==:ColorOrNothing
push!(parsed_vars, :($(var)==nothing ? nothing : parse_colorant($(var))))
else
push!(parsed_vars, :($(var)))
end
end
parameters_expr = Expr(:parameters, parameters...)
inherit_parameters_expr = Expr(:parameters, inherit_parameters...)
ex =
quote
Base.@__doc__ mutable struct $(name)
$(vars...)
end
function $(name)($(parameters_expr))
$(depwarns...)
return $(name)($(parsed_vars...))
end
$(name)($(inherit_parameters_expr), b::$name) = $(name)($(names...))
copy(a::$(name)) = $(name)(a)
end
esc(ex)
end