@@ -33,22 +33,19 @@ macro interface(exs...)
3333
3434 is_method_dispatchable = false
3535 structbody = Expr (:block , __source__)
36- omittable_fields = Set {Symbol} ()
3736 extended_fields = Dict {Symbol,Vector{Int}} ()
3837 duplicated_fields = Int[]
3938 if extends != = nothing
4039 for extend in extends
4140 is_method_dispatchable |= extend === :RequestMessage || extend === :NotificationMessage
4241 add_extended_interface! (toplevelblk, structbody,
43- omittable_fields,
4442 extended_fields,
4543 duplicated_fields,
4644 extend,
4745 __source__)
4846 end
4947 end
5048 _, method = process_interface_def! (toplevelblk, structbody,
51- omittable_fields,
5249 extended_fields,
5350 duplicated_fields,
5451 defex,
@@ -68,35 +65,22 @@ macro interface(exs...)
6865end
6966
7067function process_interface_def! (toplevelblk:: Expr , structbody:: Expr ,
71- omittable_fields:: Set{Symbol} ,
7268 extended_fields:: Dict{Symbol,Vector{Int}} ,
7369 duplicated_fields:: Vector{Int} ,
7470 defex:: Expr ,
7571 __source__:: LineNumberNode ,
7672 Name:: Union{Symbol,Nothing} )
77- method = _process_interface_def! (toplevelblk, structbody, omittable_fields, extended_fields, duplicated_fields, defex, __source__)
73+ method = _process_interface_def! (toplevelblk, structbody, extended_fields, duplicated_fields, defex, __source__)
7874 deleteat! (structbody. args, duplicated_fields)
7975 is_anon = Name === nothing
8076 if is_anon
8177 # Name = Symbol("AnonymousInterface", string(__source__)) # XXX this doesn't work probably due to Julia internal bug
8278 Name = Symbol (" AnonymousInterface" , gensym ())
8379 end
8480 structdef = Expr (:struct , false , Name, structbody)
81+ # TODO Use `StructUtils.@defaults` here?
8582 kwdef = Expr (:macrocall , GlobalRef (Base, Symbol (" @kwdef" )), __source__, structdef) # `@kwdef` will attach `Core.__doc__` automatically
8683 push! (toplevelblk. args, kwdef)
87- if ! isempty (omittable_fields)
88- omitempties = Tuple (omittable_fields)
89- if Name === :InitializeParams
90- # HACK: In the write->read roundtrip of `InitializationRequest` in the
91- # `withserver` test, empty `workspaceFolders` needs to be serialized without
92- # being omitted. So override the `omitempties` for `InitializeParams`.
93- # In the normal lifecycle of a language server, `InitializeParams` is never
94- # serialized, so adding this hack doesn't affect the language server's behavior
95- # (except in the tests)
96- omitempties = ()
97- end
98- push! (toplevelblk. args, :(StructTypes. omitempties (:: Type{$Name} ) = $ omitempties))
99- end
10084 if is_anon
10185 push! (toplevelblk. args, :(Base. convert (:: Type{$Name} , nt:: NamedTuple ) = $ Name (; nt... )))
10286 end
@@ -107,13 +91,11 @@ function process_interface_def!(toplevelblk::Expr, structbody::Expr,
10791end
10892
10993function add_extended_interface! (toplevelblk:: Expr , structbody:: Expr ,
110- omittable_fields:: Set{Symbol} ,
11194 extended_fields:: Dict{Symbol,Vector{Int}} ,
11295 duplicated_fields:: Vector{Int} ,
11396 extend:: Symbol ,
11497 __source__:: LineNumberNode )
11598 return _process_interface_def! (toplevelblk, structbody,
116- omittable_fields,
11799 extended_fields,
118100 duplicated_fields,
119101 _INTERFACE_DEFS[extend],
@@ -122,7 +104,6 @@ function add_extended_interface!(toplevelblk::Expr, structbody::Expr,
122104end
123105
124106function _process_interface_def! (toplevelblk:: Expr , structbody:: Expr ,
125- omittable_fields:: Set{Symbol} ,
126107 extended_fields:: Dict{Symbol,Vector{Int}} ,
127108 duplicated_fields:: Vector{Int} ,
128109 defex:: Expr ,
@@ -157,7 +138,6 @@ function _process_interface_def!(toplevelblk::Expr, structbody::Expr,
157138 error (" Unsupported syntax found in `@interface`: " , defex)
158139 end
159140 end
160- omittable = false
161141 if Meta. isexpr (fieldline, :(= ))
162142 fielddecl, default = fieldline. args
163143 if Meta. isexpr (fielddecl, :(:: ))
@@ -177,14 +157,6 @@ function _process_interface_def!(toplevelblk::Expr, structbody::Expr,
177157 if Meta. isexpr (fielddecl, :(:: ))
178158 fieldname = fielddecl. args[1 ]
179159 fieldtype = fielddecl. args[2 ]
180- if Meta. isexpr (fieldtype, :curly ) && fieldtype. args[1 ] === :Union
181- for i = 2 : length (fieldtype. args)
182- ufty = fieldtype. args[i]
183- if ufty === :Nothing
184- omittable = true
185- end
186- end
187- end
188160 if Meta. isexpr (fieldtype, :curly )
189161 for i = 1 : length (fieldtype. args)
190162 ufty = fieldtype. args[i]
@@ -203,12 +175,8 @@ function _process_interface_def!(toplevelblk::Expr, structbody::Expr,
203175 fieldname = fielddecl
204176 end
205177 fieldname isa Symbol || error (" Invalid `@interface` syntax: " , defex)
206- if omittable
207- push! (omittable_fields, fieldname)
208- end
209178 if haskey (extended_fields, fieldname)
210179 append! (duplicated_fields, extended_fields[fieldname])
211- omittable || delete! (omittable_fields, fieldname)
212180 end
213181 push! (structbody. args, fieldline)
214182 if extending
@@ -221,11 +189,10 @@ function _process_interface_def!(toplevelblk::Expr, structbody::Expr,
221189end
222190
223191function process_anon_interface_def! (toplevelblk:: Expr , defex:: Expr , __source__:: LineNumberNode ) # Anonymous @interface
224- omittable_fields = Set {Symbol} ()
225192 extended_fields = Dict {Symbol,Vector{Int}} ()
226193 duplicated_fields = Int[]
227194 res, _ = process_interface_def! (toplevelblk, Expr (:block ),
228- omittable_fields, extended_fields, duplicated_fields, defex, __source__, #= Name=# nothing )
195+ extended_fields, duplicated_fields, defex, __source__, #= Name=# nothing )
229196 if ! (isempty (extended_fields) && isempty (duplicated_fields))
230197 error (" `Anonymous @interface` does not support extension" , defex)
231198 end
0 commit comments