145
223
if (cb == null) {
148
cb.name = fix_type_name (cb.name, module);
226
cb.name = fix_type_name (cb.name, ns);
149
227
ns.add_callback (cb);
150
228
current_source_file.add_node (cb);
151
229
} else if (node.type == IdlNodeTypeId.STRUCT) {
152
var st = parse_struct ((IdlNodeStruct) node);
156
st.name = fix_type_name (st.name, module);
158
current_source_file.add_node (st);
230
parse_struct ((IdlNodeStruct) node, ns, module);
159
231
} else if (node.type == IdlNodeTypeId.BOXED) {
160
var st = parse_boxed ((IdlNodeBoxed) node);
161
st.name = fix_type_name (st.name, module);
163
st.set_type_id (st.get_upper_case_cname ("TYPE_"));
164
current_source_file.add_node (st);
232
parse_boxed ((IdlNodeBoxed) node, ns, module);
165
233
} else if (node.type == IdlNodeTypeId.ENUM) {
166
234
var en = parse_enum ((IdlNodeEnum) node);
167
en.name = fix_type_name (en.name, module);
235
en.name = fix_type_name (en.name, ns);
168
236
ns.add_enum (en);
169
237
current_source_file.add_node (en);
170
238
} else if (node.type == IdlNodeTypeId.OBJECT) {
171
var cl = parse_object ((IdlNodeInterface) node);
172
cl.name = fix_type_name (cl.name, module);
174
current_source_file.add_node (cl);
239
parse_object ((IdlNodeInterface) node, ns, module);
175
240
} else if (node.type == IdlNodeTypeId.INTERFACE) {
176
var iface = parse_interface ((IdlNodeInterface) node);
177
iface.name = fix_type_name (iface.name, module);
178
ns.add_interface (iface);
179
current_source_file.add_node (iface);
241
parse_interface ((IdlNodeInterface) node, ns, module);
180
242
} else if (node.type == IdlNodeTypeId.CONSTANT) {
181
243
var c = parse_constant ((IdlNodeConstant) node);
182
c.name = fix_const_name (c.name, module);
244
c.name = fix_const_name (c.name, ns);
183
245
ns.add_constant (c);
184
246
current_source_file.add_node (c);
185
247
} else if (node.type == IdlNodeTypeId.FUNCTION) {
229
private Struct parse_struct (IdlNodeStruct! st_node) {
293
private bool is_reference_type (string! cname) {
294
var st_attributes = get_attributes (cname);
295
if (st_attributes != null) {
296
foreach (string attr in st_attributes) {
297
var nv = attr.split ("=", 2);
298
if (nv[0] == "is_value_type" && eval (nv[1]) == "1") {
306
private void parse_struct (IdlNodeStruct! st_node, Namespace! ns, IdlModule! module) {
230
307
weak IdlNode node = (IdlNode) st_node;
232
309
if (st_node.deprecated) {
236
var st = new Struct (node.name, current_source_reference);
237
st.access = MemberAccessibility.PUBLIC;
239
st.set_is_reference_type (true);
241
var st_attributes = get_attributes (node.name);
242
if (st_attributes != null) {
243
foreach (string attr in st_attributes) {
244
var nv = attr.split ("=", 2);
245
if (nv[0] == "is_value_type" && eval (nv[1]) == "1") {
246
st.set_is_reference_type (false);
251
current_data_type = st;
253
foreach (weak IdlNode member in st_node.members) {
254
if (member.type == IdlNodeTypeId.FUNCTION) {
255
var m = parse_function ((IdlNodeFunction) member);
259
} else if (member.type == IdlNodeTypeId.FIELD) {
260
var f = parse_field ((IdlNodeField) member);
267
current_data_type = null;
313
string name = fix_type_name (node.name, ns);
315
if (!is_reference_type (node.name)) {
316
var st = ns.scope.lookup (name) as Struct;
318
st = new Struct (name, current_source_reference);
319
st.access = SymbolAccessibility.PUBLIC;
321
var st_attributes = get_attributes (node.name);
322
if (st_attributes != null) {
323
foreach (string attr in st_attributes) {
324
var nv = attr.split ("=", 2);
325
if (nv[0] == "cheader_filename") {
326
st.add_cheader_filename (eval (nv[1]));
327
} else if (nv[0] == "hidden") {
328
if (eval (nv[1]) == "1") {
336
current_source_file.add_node (st);
339
current_data_type = st;
341
foreach (weak IdlNode member in st_node.members) {
342
if (member.type == IdlNodeTypeId.FUNCTION) {
343
var m = parse_function ((IdlNodeFunction) member);
347
} else if (member.type == IdlNodeTypeId.FIELD) {
348
var f = parse_field ((IdlNodeField) member);
355
current_data_type = null;
357
var cl = ns.scope.lookup (name) as Class;
359
cl = new Class (name, current_source_reference);
360
cl.access = SymbolAccessibility.PUBLIC;
362
var cl_attributes = get_attributes (node.name);
363
if (cl_attributes != null) {
364
foreach (string attr in cl_attributes) {
365
var nv = attr.split ("=", 2);
366
if (nv[0] == "cheader_filename") {
367
cl.add_cheader_filename (eval (nv[1]));
368
} else if (nv[0] == "hidden") {
369
if (eval (nv[1]) == "1") {
377
current_source_file.add_node (cl);
380
current_data_type = cl;
382
string ref_function = null;
383
string unref_function = null;
384
string copy_function = null;
385
string free_function = null;
387
foreach (weak IdlNode member in st_node.members) {
388
if (member.type == IdlNodeTypeId.FUNCTION) {
389
if (member.name == "ref") {
390
ref_function = ((IdlNodeFunction) member).symbol;
391
} else if (member.name == "unref") {
392
unref_function = ((IdlNodeFunction) member).symbol;
393
} else if (member.name == "free" || member.name == "destroy") {
394
free_function = ((IdlNodeFunction) member).symbol;
396
if (member.name == "copy") {
397
copy_function = ((IdlNodeFunction) member).symbol;
399
var m = parse_function ((IdlNodeFunction) member);
404
} else if (member.type == IdlNodeTypeId.FIELD) {
405
var f = parse_field ((IdlNodeField) member);
412
if (ref_function != null) {
413
cl.set_ref_function (ref_function);
415
if (copy_function != null) {
416
cl.set_dup_function (copy_function);
418
if (unref_function != null) {
419
cl.set_unref_function (unref_function);
420
} else if (free_function != null) {
421
cl.set_free_function (free_function);
424
current_data_type = null;
272
private Struct parse_boxed (IdlNodeBoxed! boxed_node) {
428
private void parse_boxed (IdlNodeBoxed! boxed_node, Namespace! ns, IdlModule! module) {
273
429
weak IdlNode node = (IdlNode) boxed_node;
275
var st = new Struct (node.name, current_source_reference);
276
st.access = MemberAccessibility.PUBLIC;
278
st.set_is_reference_type (true);
280
var st_attributes = get_attributes (node.name);
281
if (st_attributes != null) {
282
foreach (string attr in st_attributes) {
283
var nv = attr.split ("=", 2);
284
if (nv[0] == "is_value_type" && eval (nv[1]) == "1") {
285
st.set_is_reference_type (false);
290
current_data_type = st;
292
foreach (weak IdlNode member in boxed_node.members) {
293
if (member.type == IdlNodeTypeId.FUNCTION) {
294
var m = parse_function ((IdlNodeFunction) member);
298
} else if (member.type == IdlNodeTypeId.FIELD) {
299
var f = parse_field ((IdlNodeField) member);
306
current_data_type = null;
431
string name = fix_type_name (node.name, ns);
433
if (!is_reference_type (node.name)) {
434
var st = ns.scope.lookup (name) as Struct;
436
st = new Struct (name, current_source_reference);
437
st.access = SymbolAccessibility.PUBLIC;
439
var st_attributes = get_attributes (node.name);
440
if (st_attributes != null) {
441
foreach (string attr in st_attributes) {
442
var nv = attr.split ("=", 2);
443
if (nv[0] == "cheader_filename") {
444
st.add_cheader_filename (eval (nv[1]));
450
st.set_type_id (st.get_upper_case_cname ("TYPE_"));
451
current_source_file.add_node (st);
454
current_data_type = st;
456
foreach (weak IdlNode member in boxed_node.members) {
457
if (member.type == IdlNodeTypeId.FUNCTION) {
458
var m = parse_function ((IdlNodeFunction) member);
462
} else if (member.type == IdlNodeTypeId.FIELD) {
463
var f = parse_field ((IdlNodeField) member);
470
current_data_type = null;
472
var cl = ns.scope.lookup (name) as Class;
474
cl = new Class (name, current_source_reference);
475
cl.access = SymbolAccessibility.PUBLIC;
477
var cl_attributes = get_attributes (node.name);
478
if (cl_attributes != null) {
479
foreach (string attr in cl_attributes) {
480
var nv = attr.split ("=", 2);
481
if (nv[0] == "cheader_filename") {
482
cl.add_cheader_filename (eval (nv[1]));
488
cl.set_type_id (cl.get_upper_case_cname ("TYPE_"));
489
current_source_file.add_node (cl);
492
var parent = new TypeReference ();
493
parent.namespace_name = "GLib";
494
parent.type_name = "Boxed";
495
cl.add_base_type (parent);
497
current_data_type = cl;
499
string ref_function = null;
500
string unref_function = null;
501
string copy_function = null;
502
string free_function = null;
504
foreach (weak IdlNode member in boxed_node.members) {
505
if (member.type == IdlNodeTypeId.FUNCTION) {
506
if (member.name == "ref") {
507
ref_function = ((IdlNodeFunction) member).symbol;
508
} else if (member.name == "unref") {
509
unref_function = ((IdlNodeFunction) member).symbol;
510
} else if (member.name == "free" || member.name == "destroy") {
511
free_function = ((IdlNodeFunction) member).symbol;
513
if (member.name == "copy") {
514
copy_function = ((IdlNodeFunction) member).symbol;
516
var m = parse_function ((IdlNodeFunction) member);
521
} else if (member.type == IdlNodeTypeId.FIELD) {
522
var f = parse_field ((IdlNodeField) member);
529
if (ref_function != null) {
530
cl.set_ref_function (ref_function);
532
if (copy_function != null) {
533
cl.set_dup_function (copy_function);
535
if (unref_function != null) {
536
cl.set_unref_function (unref_function);
537
} else if (free_function != null) {
538
cl.set_free_function (free_function);
541
current_data_type = null;
311
545
private Enum parse_enum (IdlNodeEnum! en_node) {
312
546
weak IdlNode node = (IdlNode) en_node;
314
548
var en = new Enum (node.name, current_source_reference);
315
en.access = MemberAccessibility.PUBLIC;
549
en.access = SymbolAccessibility.PUBLIC;
317
551
string common_prefix = null;
343
private Class parse_object (IdlNodeInterface! node) {
344
var cl = new Class (node.gtype_name, current_source_reference);
345
cl.access = MemberAccessibility.PUBLIC;
347
var attributes = get_attributes (cl.name);
348
if (attributes != null) {
349
foreach (string attr in attributes) {
350
var nv = attr.split ("=", 2);
351
if (nv[0] == "cheader_filename") {
352
cl.add_cheader_filename (eval (nv[1]));
582
private void parse_object (IdlNodeInterface! node, Namespace! ns, IdlModule! module) {
583
string name = fix_type_name (node.gtype_name, ns);
585
string base_class = null;
587
var cl = ns.scope.lookup (name) as Class;
589
cl = new Class (name, current_source_reference);
590
cl.access = SymbolAccessibility.PUBLIC;
592
var attributes = get_attributes (node.gtype_name);
593
if (attributes != null) {
594
foreach (string attr in attributes) {
595
var nv = attr.split ("=", 2);
596
if (nv[0] == "cheader_filename") {
597
cl.add_cheader_filename (eval (nv[1]));
598
} else if (nv[0] == "base_class") {
599
base_class = eval (nv[1]);
600
} else if (nv[0] == "hidden") {
601
if (eval (nv[1]) == "1") {
609
current_source_file.add_node (cl);
357
if (node.parent != null) {
612
if (base_class != null) {
613
var parent = new TypeReference ();
614
parse_type_string (parent, base_class);
615
cl.add_base_type (parent);
616
} else if (node.parent != null) {
358
617
var parent = new TypeReference ();
359
618
parse_type_string (parent, node.parent);
360
619
cl.add_base_type (parent);
621
var parent = new TypeReference ();
622
parent.namespace_name = "GLib";
623
parent.type_name = "Object";
624
cl.add_base_type (parent);
363
627
foreach (string iface_name in node.interfaces) {
426
690
current_data_type = null;
427
691
current_type_symbol_set = null;
432
private Interface parse_interface (IdlNodeInterface! node) {
433
var iface = new Interface (node.gtype_name, current_source_reference);
434
iface.access = MemberAccessibility.PUBLIC;
436
var attributes = get_attributes (iface.name);
437
if (attributes != null) {
438
foreach (string attr in attributes) {
439
var nv = attr.split ("=", 2);
440
if (nv[0] == "cheader_filename") {
441
iface.add_cheader_filename (eval (nv[1]));
694
private void parse_interface (IdlNodeInterface! node, Namespace! ns, IdlModule! module) {
695
string name = fix_type_name (node.gtype_name, ns);
697
var iface = ns.scope.lookup (name) as Interface;
699
iface = new Interface (name, current_source_reference);
700
iface.access = SymbolAccessibility.PUBLIC;
702
var attributes = get_attributes (node.gtype_name);
703
if (attributes != null) {
704
foreach (string attr in attributes) {
705
var nv = attr.split ("=", 2);
706
if (nv[0] == "cheader_filename") {
707
iface.add_cheader_filename (eval (nv[1]));
446
foreach (string prereq_name in node.prerequisites) {
447
var prereq = new TypeReference ();
448
parse_type_string (prereq, prereq_name);
449
iface.add_prerequisite (prereq);
712
foreach (string prereq_name in node.prerequisites) {
713
var prereq = new TypeReference ();
714
parse_type_string (prereq, prereq_name);
715
iface.add_prerequisite (prereq);
718
ns.add_interface (iface);
719
current_source_file.add_node (iface);
452
722
current_data_type = iface;
624
929
type.namespace_name = null;
625
930
type.type_name = "pointer";
627
} else if (n.has_prefix ("Atk")) {
628
type.namespace_name = "Atk";
629
type.type_name = n.offset ("Atk".len ());
630
if (type.type_name == "AttributeSet") {
631
type.namespace_name = "GLib";
632
type.type_name = "SList";
634
} else if (n.has_prefix ("Gst")) {
635
type.namespace_name = "Gst";
636
type.type_name = n.offset ("Gst".len ());
637
if (type.type_name == "ClockTime") {
638
type.namespace_name = null;
639
type.type_name = "uint64";
640
} else if (type.type_name == "ClockTimeDiff") {
641
type.namespace_name = null;
642
type.type_name = "int64";
643
} else if (type.type_name == "ClockID" || type.type_name.has_prefix ("Xml")) {
644
type.namespace_name = null;
645
type.type_name = "pointer";
647
} else if (n.has_prefix ("Gtk")) {
648
type.namespace_name = "Gtk";
649
type.type_name = n.offset ("Gtk".len ());
650
if (type.type_name == "TextLayout") {
651
type.namespace_name = null;
652
type.type_name = "pointer";
654
} else if (n.has_prefix ("Gdk")) {
655
type.namespace_name = "Gdk";
656
type.type_name = n.offset ("Gdk".len ());
657
if (type.type_name == "NativeWindow" || type.type_name == "XEvent") {
658
type.namespace_name = null;
659
type.type_name = "pointer";
661
} else if (n.has_prefix ("Pango")) {
662
type.namespace_name = "Pango";
663
type.type_name = n.offset ("Pango".len ());
664
if (type.type_name == "Glyph") {
665
type.namespace_name = null;
666
type.type_name = "uint";
667
} else if (type.type_name == "GlyphUnit") {
668
type.namespace_name = null;
669
type.type_name = "int";
671
} else if (n.has_prefix ("Vte")) {
672
type.namespace_name = "Vte";
673
type.type_name = n.offset ("Vte".len ());
674
} else if (n.has_prefix ("Goo")) {
675
type.namespace_name = "Goo";
676
type.type_name = n.offset ("Goo".len ());
932
} else if (n == "AtkAttributeSet") {
933
type.namespace_name = "GLib";
934
type.type_name = "SList";
935
} else if (n == "GstClockTime") {
936
type.type_name = "uint64";
937
} else if (n == "GstClockTimeDiff") {
938
type.type_name = "int64";
939
} else if (n == "PangoGlyph") {
940
type.type_name = "uint";
941
} else if (n == "PangoGlyphUnit") {
942
type.type_name = "int";
943
} else if (n == "ClutterFixed" || n == "ClutterUnit" || n == "ClutterAngle") {
944
type.type_name = "int32";
945
} else if (n == "SoupProtocol") {
946
type.namespace_name = "GLib";
947
type.type_name = "Quark";
948
} else if (n == "GStrv") {
949
type.type_name = "string";
951
} else if (n.has_prefix (current_namespace.name)) {
952
type.namespace_name = current_namespace.name;
953
type.type_name = n.offset (current_namespace.name.len ());
677
954
} else if (n.has_prefix ("G")) {
678
955
type.namespace_name = "GLib";
679
type.type_name = n.offset ("G".len ());
680
if (type.type_name == "Strv") {
681
type.namespace_name = null;
682
type.type_name = "string";
684
} else if (type.type_name == "StaticRecMutex") {
685
type.namespace_name = null;
686
type.type_name = "pointer";
956
type.type_name = n.offset (1);
689
958
var name_parts = n.split (".", 2);
690
959
if (name_parts[1] == null) {