@@ -42,16 +42,21 @@ purego_generate_bindings_from_runestone :: proc(
4242 package_name := purego_generate_package_name (rn)
4343 types := purego_generate_types (rs, rn)
4444 func_sym_decls := purego_generate_function_symbol_declarations (rs, rn)
45- type_sym_decls := purego_generate_type_symbol_declarations (rs, rn)
45+ type_sym_getters := purego_generate_type_symbol_getters (rs, rn)
46+ type_sym_setters := purego_generate_type_symbol_setters (rs, rn)
47+ type_sym_pointers := purego_generate_type_symbol_pointers (rs, rn)
4648 symbol_registrations := purego_generate_symbol_registrations (rs, rn)
4749 symbol_reg_var_name := purego_generate_symbol_registration_variable_name (
4850 rs.plats,
4951 )
52+
5053 defer if len (build_constraints) != 0 do delete (build_constraints)
5154 defer delete (package_name)
5255 defer delete (types)
5356 defer delete (func_sym_decls)
54- defer delete (type_sym_decls)
57+ defer delete (type_sym_getters)
58+ defer delete (type_sym_setters)
59+ defer delete (type_sym_pointers)
5560 defer delete (symbol_registrations)
5661 defer delete (symbol_reg_var_name)
5762
@@ -73,9 +78,17 @@ purego_generate_bindings_from_runestone :: proc(
7378 io.write_string (wd, " \n )\n\n " ) or_return
7479 }
7580
76- if len (type_sym_decls) != 0 {
77- io.write_string (wd, type_sym_decls) or_return
78- io.write_string (wd, " \n\n " ) or_return
81+ if len (type_sym_getters) != 0 {
82+ io.write_string (wd, type_sym_getters) or_return
83+ io.write_string (wd, " \n " ) or_return
84+ }
85+ if len (type_sym_setters) != 0 {
86+ io.write_string (wd, type_sym_setters) or_return
87+ io.write_string (wd, " \n " ) or_return
88+ }
89+ if len (type_sym_pointers) != 0 {
90+ io.write_string (wd, type_sym_pointers) or_return
91+ io.write_string (wd, " \n " ) or_return
7992 }
8093
8194 io.write_string (wd, " var (\n " ) or_return
@@ -221,19 +234,20 @@ purego_generate_function_symbol_declarations :: proc(
221234 strings.builder_init (&buf)
222235
223236 has_funcs: bool
237+ last_func_idx: int
224238
225- for entry in rs.symbols.data {
239+ for entry, idx in rs.symbols.data {
226240 sym := entry.value
227241
228242 if _, is_func := sym.value.(runic.Function); is_func {
229243 has_funcs = true
230- break
244+ last_func_idx = idx
231245 }
232246 }
233247
234248 if !has_funcs do return strings.to_string (buf)
235249
236- for entry in rs.symbols.data {
250+ for entry, idx in rs.symbols.data {
237251 sym_name, sym := entry.key, entry.value
238252
239253 if _, is_type := sym.value.(runic.Type); is_type do continue
@@ -247,14 +261,16 @@ purego_generate_function_symbol_declarations :: proc(
247261 strings.write_rune (&buf, ' ' )
248262 purego_write_symbol (&buf, sym, rn)
249263
250- strings.write_rune (&buf, ' \n ' )
264+ if idx != last_func_idx {
265+ strings.write_rune (&buf, ' \n ' )
266+ }
251267 }
252268
253269 return strings.to_string (buf)
254270}
255271
256272@(private)
257- purego_generate_type_symbol_declarations :: proc (
273+ purego_generate_type_symbol_getters :: proc (
258274 rs: runic.Runestone,
259275 rn: runic.To,
260276) -> string {
@@ -293,6 +309,29 @@ purego_generate_type_symbol_declarations :: proc(
293309 strings.write_string (&buf, " ))\n }\n " )
294310 }
295311
312+ return strings.to_string (buf)
313+ }
314+
315+ @(private)
316+ purego_generate_type_symbol_setters :: proc (
317+ rs: runic.Runestone,
318+ rn: runic.To,
319+ ) -> string {
320+ buf: strings.Builder
321+ strings.builder_init (&buf)
322+
323+ has_types: bool
324+
325+ for entry in rs.symbols.data {
326+ sym := entry.value
327+ if _, is_type := sym.value.(runic.Type); is_type {
328+ has_types = true
329+ break
330+ }
331+ }
332+
333+ if !has_types do return strings.to_string (buf)
334+
296335 for entry in rs.symbols.data {
297336 sym_name, sym := entry.key, entry.value
298337
@@ -313,6 +352,29 @@ purego_generate_type_symbol_declarations :: proc(
313352 strings.write_string (&buf, " )) = value\n }\n " )
314353 }
315354
355+ return strings.to_string (buf)
356+ }
357+
358+ @(private)
359+ purego_generate_type_symbol_pointers :: proc (
360+ rs: runic.Runestone,
361+ rn: runic.To,
362+ ) -> string {
363+ buf: strings.Builder
364+ strings.builder_init (&buf)
365+
366+ has_types: bool
367+
368+ for entry in rs.symbols.data {
369+ sym := entry.value
370+ if _, is_type := sym.value.(runic.Type); is_type {
371+ has_types = true
372+ break
373+ }
374+ }
375+
376+ if !has_types do return strings.to_string (buf)
377+
316378 strings.write_string (&buf, " var (\n " )
317379
318380 for entry in rs.symbols.data {
0 commit comments