Skip to content

Commit 7c3dda4

Browse files
authored
Merge pull request #125 from aminya/nameconflict
2 parents 18d47ae + 712a93f commit 7c3dda4

File tree

5 files changed

+73
-41
lines changed

5 files changed

+73
-41
lines changed

deps/SnoopCompile/precompile/precompile_AcuteML.jl

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,9 @@ function _precompile_()
44
precompile(Tuple{Core.kwftype(typeof(AcuteML.render2file)),NamedTuple{(:id, :age, :field, :GPA, :courses),Tuple{Int64,Int64,String,Float64,Array{String,1}}},typeof(render2file),String,Bool})
55
precompile(Tuple{typeof(AcuteML.aml_create),Expr,Array{Union{Expr, Symbol},1},Array{Any,1},Array{Union{Expr, Symbol, Type},1},Array{Union{Expr, Symbol},1},Array{Union{Missing, String},1},Array{Union{Missing, Function, Symbol},1},Array{Union{Missing, Type},1},String,Type{T} where T,Array{Union{Missing, Function, Symbol},0},Bool,Array{Union{Nothing, Expr},1},Array{Union{Nothing, Expr},1},Array{Union{Nothing, Expr},1},Symbol})
66
precompile(Tuple{typeof(AcuteML.aml_parse),Expr})
7-
precompile(Tuple{typeof(AcuteML.get_arg_xmlcreator),Nothing,Bool,Expr,Symbol,String,Type{T} where T,Missing,QuoteNode,Expr})
8-
precompile(Tuple{typeof(AcuteML.get_arg_xmlcreator),Nothing,Bool,Symbol,Symbol,String,Type{T} where T,Missing,QuoteNode,Expr})
9-
precompile(Tuple{typeof(AcuteML.get_arg_xmlcreator),Nothing,Bool,Symbol,Symbol,String,Type{T} where T,Symbol,QuoteNode,Expr})
10-
precompile(Tuple{typeof(AcuteML.get_arg_xmlcreator),Nothing,Bool,Type{T} where T,Symbol,String,Type{T} where T,Missing,QuoteNode,Expr})
11-
precompile(Tuple{typeof(AcuteML.get_arg_xmlextractor),Nothing,Bool,Expr,Symbol,String,Type{T} where T,Missing,QuoteNode,Expr})
12-
precompile(Tuple{typeof(AcuteML.get_arg_xmlextractor),Nothing,Bool,Symbol,Symbol,String,Type{T} where T,Missing,QuoteNode,Expr})
13-
precompile(Tuple{typeof(AcuteML.get_arg_xmlextractor),Nothing,Bool,Symbol,Symbol,String,Type{T} where T,Symbol,QuoteNode,Expr})
14-
precompile(Tuple{typeof(AcuteML.get_arg_xmlextractor),Nothing,Bool,Type{T} where T,Symbol,String,Type{T} where T,Missing,QuoteNode,Expr})
15-
precompile(Tuple{typeof(AcuteML.get_arg_xmludpater),Nothing,Bool,Expr,Symbol,String,Type{T} where T,Missing,QuoteNode,Expr})
16-
precompile(Tuple{typeof(AcuteML.get_arg_xmludpater),Nothing,Bool,Symbol,Symbol,String,Type{T} where T,Missing,QuoteNode,Expr})
17-
precompile(Tuple{typeof(AcuteML.get_arg_xmludpater),Nothing,Bool,Symbol,Symbol,String,Type{T} where T,Symbol,QuoteNode,Expr})
18-
precompile(Tuple{typeof(AcuteML.get_arg_xmludpater),Nothing,Bool,Type{T} where T,Symbol,String,Type{T} where T,Missing,QuoteNode,Expr})
7+
precompile(Tuple{typeof(AcuteML.get_arg_xmlcreator),Nothing,Bool,Expr,Expr,String,Type{T} where T,Expr,QuoteNode,Expr})
8+
precompile(Tuple{typeof(AcuteML.get_arg_xmlextractor),Nothing,Bool,Expr,Expr,String,Type{T} where T,Expr,QuoteNode,Expr})
9+
precompile(Tuple{typeof(AcuteML.get_arg_xmludpater),Nothing,Bool,Expr,Expr,String,Type{T} where T,Expr,QuoteNode,Expr})
1910
precompile(Tuple{typeof(AcuteML.multiString),Array{String,1}})
2011
precompile(Tuple{typeof(AcuteML.multiString),Float64})
2112
precompile(Tuple{typeof(AcuteML.multiString),Int64})

src/@aml/@aml_create.jl

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ function aml_create(expr::Expr, args_param, args_defaultvalue, args_type, args_v
6161
##########################
6262
has_arg_xmlchecker = !ismissing(argfunction)
6363

64-
inps = (has_arg_xmlchecker, argtype, argvar, argname, argliteraltype, argfunction, argsym, argvarcall)
64+
inps = (has_arg_xmlchecker, esc(argtype), esc(argvar), argname, argliteraltype, esc(argfunction), argsym, argvarcall)
6565

6666
args_xmlcreator[iArg]=get_arg_xmlcreator(argcustomcreator, inps...)
6767

@@ -98,18 +98,21 @@ function aml_create(expr::Expr, args_param, args_defaultvalue, args_type, args_v
9898

9999
struct_definition =:($expr)
100100

101-
struct_xmlchecker = get_struct_xmlchecker(struct_function, args_var)
101+
# args_var is used here to support all the inputs (even non-aml)
102+
esc_args_var = esc.(args_var)
103+
104+
struct_xmlchecker = get_struct_xmlchecker(struct_function, esc_args_var)
102105

103106
# Creator
104-
struct_xmlcreator = get_struct_xmlcreator(S, amlargs_param, struct_xmlchecker, node_initializer, args_xmlcreator, args_var, custom_creator_end)
107+
struct_xmlcreator = get_struct_xmlcreator(S, amlargs_param, struct_xmlchecker, node_initializer, args_xmlcreator, esc_args_var, custom_creator_end)
105108
# Extractor
106-
struct_xmlextractor = get_struct_xmlextractor(S, args_xmlextractor, struct_xmlchecker, args_var, custom_extractor_end)
109+
struct_xmlextractor = get_struct_xmlextractor(S, args_xmlextractor, struct_xmlchecker, esc_args_var, custom_extractor_end)
107110

108111
if iscurly
109112
# Creator
110-
struct_xmlcreator_curly = get_struct_xmlcreator(SQ, P, amlargs_param, struct_xmlchecker, node_initializer, args_xmlcreator, args_var, custom_creator_end)
113+
struct_xmlcreator_curly = get_struct_xmlcreator(SQ, P, amlargs_param, struct_xmlchecker, node_initializer, args_xmlcreator, esc_args_var, custom_creator_end)
111114
# Extractor
112-
struct_xmlextractor_curly = get_struct_xmlextractor(SQ, P, args_xmlextractor, struct_xmlchecker, args_var, custom_extractor_end)
115+
struct_xmlextractor_curly = get_struct_xmlextractor(SQ, P, args_xmlextractor, struct_xmlchecker, esc_args_var, custom_extractor_end)
113116
else
114117
struct_xmlcreator_curly = nothing
115118
struct_xmlextractor_curly = nothing

src/@aml/@aml_create/get_arg_xml_.jl

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
"""
55
Get a argument creator expression
66
"""
7-
function get_arg_xmlcreator(argcustomcreator, has_arg_xmlchecker::Bool, argtype, argvar, argname, argliteraltype, argfunction, argsym, argvarcall)
8-
esc_argvar = esc(argvar)
7+
function get_arg_xmlcreator(argcustomcreator, has_arg_xmlchecker::Bool, argtype, esc_argvar, argname, argliteraltype, esc_argfunction, argsym, argvarcall)
98

109
if !has_arg_xmlchecker
1110
arg_creator = quote
@@ -15,7 +14,7 @@ function get_arg_xmlcreator(argcustomcreator, has_arg_xmlchecker::Bool, argtype,
1514
else
1615
arg_creator=quote
1716
$(esc(argcustomcreator))
18-
if isnothing($esc_argvar) || ($(esc(argfunction)))($esc_argvar)
17+
if isnothing($esc_argvar) || ($esc_argfunction)($esc_argvar)
1918
addelm!(aml, $argname, $esc_argvar, $argliteraltype)
2019
else
2120
error("$($argname) doesn't meet criteria function")
@@ -28,21 +27,20 @@ end
2827
"""
2928
Get a argument extractor expression
3029
"""
31-
function get_arg_xmlextractor(argcustomextractor, has_arg_xmlchecker::Bool, argtype, argvar, argname, argliteraltype, argfunction, argsym, argvarcall)
32-
esc_argvar = esc(argvar)
30+
function get_arg_xmlextractor(argcustomextractor, has_arg_xmlchecker::Bool, esc_argtype, esc_argvar, argname, argliteraltype, esc_argfunction, argsym, argvarcall)
3331

3432
if !has_arg_xmlchecker
3533
arg_extractor=quote
3634
$(esc(argcustomextractor))
37-
$esc_argvar = findcontent($(esc(argtype)), $argname, aml, $argliteraltype)
35+
$esc_argvar = findcontent($esc_argtype, $argname, aml, $argliteraltype)
3836
end
3937
else
4038
arg_extractor=quote
4139
$(esc(argcustomextractor))
4240

43-
$esc_argvar = findcontent($(esc(argtype)), $argname, aml, $argliteraltype)
41+
$esc_argvar = findcontent($esc_argtype, $argname, aml, $argliteraltype)
4442

45-
if !isnothing($esc_argvar) && !(($(esc(argfunction)))($esc_argvar))
43+
if !isnothing($esc_argvar) && !(($esc_argfunction)($esc_argvar))
4644
error("$($argname) doesn't meet criteria function")
4745
end
4846
end
@@ -53,7 +51,7 @@ end
5351
"""
5452
Get a argument updater expression
5553
"""
56-
function get_arg_xmludpater(argcustomupdater, has_arg_xmlchecker::Bool, argtype, argvar, argname, argliteraltype, argfunction, argsym, argvarcall)
54+
function get_arg_xmludpater(argcustomupdater, has_arg_xmlchecker::Bool, esc_argtype, esc_argvar, argname, argliteraltype, esc_argfunction, argsym, argvarcall)
5755

5856
if !has_arg_xmlchecker
5957
arg_updater = quote
@@ -68,7 +66,7 @@ function get_arg_xmludpater(argcustomupdater, has_arg_xmlchecker::Bool, argtype,
6866
$(esc(argcustomupdater))
6967

7068
if name == $argsym
71-
if isnothing($(argvarcall)) || ($(esc(argfunction)))($(argvarcall))
69+
if isnothing($(argvarcall)) || ($esc_argfunction)($(argvarcall))
7270
updatecontent!(value, $argname, str.aml, $argliteraltype)
7371
else
7472
error("$($argname) doesn't meet criteria function")
@@ -105,7 +103,7 @@ function parse_argtype(argtype)
105103
# elseif isa(argtype, Symbol) ||
106104
# (isa(argtype, Expr) && argtype.args[1] == :Union) ||
107105
# (isa(argtype, Expr) && argtype.args[1] == :UN) ||
108-
# !(argtype <: AbstractVector)
106+
# !(esc_argtype <: AbstractVector)
109107
else
110108
arg_parsedtype = Any
111109
end

src/@aml/@aml_create/get_struct_xml_.jl

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
"""
44
check function for the aml struct
55
"""
6-
function get_struct_xmlchecker(struct_function, args_var)
6+
function get_struct_xmlchecker(struct_function, esc_args_var)
77
# aml Function
88
if !ismissing(struct_function[1])
99
F = struct_function[1]
1010
struct_xmlchecker = quote
11-
if !( ($(esc(F)))($(esc.(args_var)...)) )
11+
if !( ($(esc(F)))($(esc_args_var...)) )
1212
error("struct criteria function ($($(esc(F)))) isn't meet")
1313
end
1414
end
@@ -18,49 +18,51 @@ function get_struct_xmlchecker(struct_function, args_var)
1818
return struct_xmlchecker
1919
end
2020
################################################################
21-
function get_struct_xmlcreator(T, args_param, struct_xmlchecker, node_initializer, args_xmlcreator, args_var, custom_creator_end)
21+
function get_struct_xmlcreator(T, args_param, struct_xmlchecker, node_initializer, args_xmlcreator, esc_args_var, custom_creator_end)
2222
struct_xmlcreator = quote
2323
function ($(esc(T)))(; $(esc.(args_param)...))
2424
$struct_xmlchecker
2525
$node_initializer
2626
$(args_xmlcreator...)
2727
$(esc(custom_creator_end))
28-
return ($(esc(T)))($(esc.(args_var)...), aml)
28+
return ($(esc(T)))($(esc_args_var...), aml)
2929
end
3030
end
3131
return struct_xmlcreator
3232
end
33-
function get_struct_xmlcreator(SQ, P, args_param, struct_xmlchecker, node_initializer, args_xmlcreator, args_var, custom_creator_end)
33+
function get_struct_xmlcreator(SQ, P, args_param, struct_xmlchecker, node_initializer, args_xmlcreator, esc_args_var, custom_creator_end)
3434
struct_xmlcreator_curly = quote
3535
function ($(esc(SQ)))(; $(esc.(args_param)...)) where {$(esc.(P)...)}
3636
$struct_xmlchecker
3737
$node_initializer
3838
$(args_xmlcreator...)
3939
$(esc(custom_creator_end))
40-
return ($(esc(SQ)))($(esc.(args_var)...), aml)
40+
return ($(esc(SQ)))($(esc_args_var...), aml)
4141
end
4242
end
4343
return struct_xmlcreator_curly
4444
end
4545
################################################################
46-
function get_struct_xmlextractor(T, args_xmlextractor, struct_xmlchecker, args_var, custom_extractor_end)
46+
function get_struct_xmlextractor(T, args_xmlextractor, struct_xmlchecker, esc_args_var, custom_extractor_end)
47+
4748
struct_xmlextractor = quote
4849
function ($(esc(T)))(aml::Union{Document, Node})
4950
$(args_xmlextractor...)
5051
$struct_xmlchecker
5152
$(esc(custom_extractor_end))
52-
return ($(esc(T)))($(esc.(args_var)...), aml)
53+
return ($(esc(T)))($(esc_args_var...), aml)
5354
end
5455
end
5556
return struct_xmlextractor
5657
end
57-
function get_struct_xmlextractor(SQ, P, args_xmlextractor, struct_xmlchecker, args_var, custom_extractor_end)
58+
function get_struct_xmlextractor(SQ, P, args_xmlextractor, struct_xmlchecker, esc_args_var, custom_extractor_end)
59+
5860
struct_xmlextractor_curly = quote
5961
function ($(esc(SQ)))(aml::Union{Document, Node}) where {$(esc.(P)...)}
6062
$(args_xmlextractor...)
6163
$struct_xmlchecker
6264
$(esc(custom_extractor_end))
63-
return ($(esc(SQ)))($(esc.(args_var)...), aml)
65+
return ($(esc(SQ)))($(esc_args_var...), aml)
6466
end
6567
end
6668
return struct_xmlextractor_curly

src/AcuteML.jl

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,14 @@ export Node, Document
2424
@aml
2525
2626
# Type Definition
27-
Use `@aml` macro to define a Julia type, and then the package automatically creates a xml or html associated with the defined type.
27+
Use `@aml` macro to define a Julia type, and then the package automatically creates a xml or html associated with the defined type. The general syntax would look like this:
28+
```julia
29+
@aml mutable struct mybody "body"
30+
myh1, "h1"
31+
p::Vector{String}, "~"
32+
end
33+
```
34+
Now, we go into the details:
2835
2936
### Document Definition
3037
* Use doc literal before the root name to define a HTML or XML document. For HTML documents root should always be "html".
@@ -40,7 +47,7 @@ end
4047
```
4148
4249
### Nodes (Elements) Definition
43-
* Specify the html/xml struct name as a string after the struct name after a space
50+
* Specify the html/xml name of struct as a string after the struct name (after a space)
4451
```julia
4552
@aml mutable struct Person "person"
4653
# add fields (elements) here
@@ -63,6 +70,29 @@ field, "study-field"
6370
age::UInt, "~"
6471
```
6572
73+
!!! warning
74+
The field names of a struct should not be the same as other defined types. This error happens when you use the same name of a type for a field name. For example, the follwing is an **error**:
75+
```julia
76+
@aml struct person "~"
77+
name, "~"
78+
end
79+
@aml struct myxml doc"~"
80+
person::person, "~"
81+
end
82+
```
83+
Another example of this error:
84+
```julia
85+
@aml struct myxml doc"~"
86+
Int, "myint"
87+
end
88+
```
89+
However, you can choose any xml/html name. The xml/html name of the fields isn't related to the types defined in Julia. So the following is a **valid** syntax:
90+
```julia
91+
@aml struct myxml doc"~"
92+
myint, "Int"
93+
end
94+
```
95+
6696
### Attributes
6797
* If the value is going to be an attribute put `att` before its name
6898
```julia
@@ -378,6 +408,14 @@ macro aml(expr)
378408
# args_param.args # empty
379409
expr.args[3], args_param, args_defaultvalue, args_type, args_var, args_name, args_function, args_literaltype, struct_name, struct_nodetype, struct_function, is_struct_mutable, args_custom_creator, args_custom_extractor, args_custom_updater, T = aml_parse(expr)
380410

411+
# check if the field name is a defined type
412+
for arg_var in args_var
413+
if isdefined(__module__, arg_var) && isa(getfield(__module__, arg_var), Type)
414+
f, l = __source__.file, __source__.line
415+
@error "Change the field name `$arg_var` in struct `$T` to something else. The name conflicts with an already defined type name. \n Happens at $f:$l"
416+
end
417+
end
418+
381419
out = aml_create(expr, args_param, args_defaultvalue, args_type, args_var, args_name, args_function, args_literaltype, struct_name, struct_nodetype, struct_function, is_struct_mutable, args_custom_creator, args_custom_extractor, args_custom_updater, T)
382420

383421
# elseif expr isa Expr && expr.head == :tuple

0 commit comments

Comments
 (0)