summaryrefslogtreecommitdiff
path: root/vapigen
diff options
context:
space:
mode:
authorLuca Bruno <lucabru@src.gnome.org>2011-07-06 09:54:18 +0200
committerLuca Bruno <lucabru@src.gnome.org>2011-08-01 19:09:00 +0200
commitf6166af03fa3db947637a8157d6ff507b6f795f2 (patch)
treedde593203fe150209e236ade6e1bf9cb45545c85 /vapigen
parente00603e1955886dc012a3fc949e28ed4069b007c (diff)
downloadvala-f6166af03fa3db947637a8157d6ff507b6f795f2.tar.gz
gidlparser: Do not use C specific methods of code nodes
Diffstat (limited to 'vapigen')
-rw-r--r--vapigen/valagidlparser.vala559
1 files changed, 348 insertions, 211 deletions
diff --git a/vapigen/valagidlparser.vala b/vapigen/valagidlparser.vala
index 55c414c85..7655d5e41 100644
--- a/vapigen/valagidlparser.vala
+++ b/vapigen/valagidlparser.vala
@@ -88,8 +88,8 @@ public class Vala.GIdlParser : CodeVisitor {
}
private void visit_type (TypeSymbol t) {
- if (!cname_type_map.contains (t.get_cname ())) {
- cname_type_map[t.get_cname ()] = t;
+ if (!cname_type_map.contains (get_cname (t))) {
+ cname_type_map[get_cname (t)] = t;
}
}
@@ -165,23 +165,10 @@ public class Vala.GIdlParser : CodeVisitor {
if (type_name.has_prefix (container.name)) {
return type_name.substring (container.name.length);
- } else if (container.name == "GLib" && type_name.has_prefix ("G")) {
- return type_name.substring (1);
- } else {
- string best_match = null;
- if (container is Namespace) {
- foreach (string cprefix in ((Namespace) container).get_cprefixes ()) {
- if (type_name.has_prefix (cprefix)) {
- if (best_match == null || cprefix.length > best_match.length)
- best_match = cprefix;
- }
- }
- } else {
- best_match = container.get_cprefix ();
- }
-
- if (best_match != null) {
- return type_name.substring (best_match.length);;
+ } else {
+ var cprefix = get_cprefix (container);
+ if (type_name.has_prefix (cprefix)) {
+ return type_name.substring (cprefix.length);;
}
}
@@ -189,24 +176,141 @@ public class Vala.GIdlParser : CodeVisitor {
}
private string fix_const_name (string const_name, Symbol container) {
- var pref = container.get_lower_case_cprefix ().up ();
+ var pref = get_lower_case_cprefix (container).up ();
if (const_name.has_prefix (pref)) {
return const_name.substring (pref.length);
}
return const_name;
}
+ private string get_cheader_filename (Symbol sym) {
+ var cheader_filename = sym.get_attribute_string ("CCode", "cheader_filename");
+ if (cheader_filename != null) {
+ return cheader_filename;
+ }
+ if (sym.parent_symbol != null) {
+ return get_cheader_filename (sym.parent_symbol);
+ } else if (sym.source_reference != null) {
+ return sym.source_reference.file.get_cinclude_filename ();
+ }
+ return "";
+ }
+
+ private string get_cname (Symbol sym, Symbol? container = null) {
+ if (container == null) {
+ container = sym.parent_symbol;
+ }
+ var cname = sym.get_attribute_string ("CCode", "cname");
+ if (cname != null) {
+ return cname;
+ }
+ if (sym is Method) {
+ var name = sym.name;
+ if (sym is CreationMethod) {
+ if (name == null || name == ".new") {
+ name = "new";
+ } else {
+ name = "new_"+name;
+ }
+ }
+ if (container != null) {
+ return "%s%s".printf (get_lower_case_cprefix (container), name);
+ } else {
+ return name;
+ }
+ } else {
+ if (container != null) {
+ return "%s%s".printf (get_cprefix (container), sym.name);
+ } else {
+ return sym.name;
+ }
+ }
+ }
+
+ private string get_finish_cname (Method m) {
+ var finish_cname = m.get_attribute_string ("CCode", "finish_name");
+ if (finish_cname != null) {
+ return finish_cname;
+ }
+ var result = get_cname (m);
+ if (result.has_suffix ("_async")) {
+ result = result.substring (0, result.length - "_async".length);
+ }
+ return result + "_finish";
+ }
+
+ private string get_lower_case_cname (Symbol sym) {
+ var lower_case_csuffix = Symbol.camel_case_to_lower_case (sym.name);
+ if (sym is ObjectTypeSymbol) {
+ // remove underscores in some cases to avoid conflicts of type macros
+ if (lower_case_csuffix.has_prefix ("type_")) {
+ lower_case_csuffix = "type" + lower_case_csuffix.substring ("type_".length);
+ } else if (lower_case_csuffix.has_prefix ("is_")) {
+ lower_case_csuffix = "is" + lower_case_csuffix.substring ("is_".length);
+ }
+ if (lower_case_csuffix.has_suffix ("_class")) {
+ lower_case_csuffix = lower_case_csuffix.substring (0, lower_case_csuffix.length - "_class".length) + "class";
+ }
+ }
+ if (sym.parent_symbol != null) {
+ return "%s%s".printf (get_lower_case_cprefix (sym.parent_symbol), lower_case_csuffix);
+ } else {
+ return lower_case_csuffix;
+ }
+ }
+
+ private string get_lower_case_cprefix (Symbol sym) {
+ if (sym.name == null) {
+ return "";
+ }
+ string cprefix;
+ if (sym is Namespace) {
+ cprefix = sym.get_attribute_string ("CCode", "lower_case_cprefix");
+ } else {
+ cprefix = sym.get_attribute_string ("CCode", "cprefix");
+ }
+ if (cprefix != null) {
+ return cprefix;
+ }
+ return get_lower_case_cname (sym) + "_";
+ }
+
+ public string get_cprefix (Symbol sym) {
+ if (sym is ObjectTypeSymbol) {
+ return get_cname (sym);
+ } else if (sym is Enum || sym is ErrorDomain) {
+ return "%s_".printf (get_lower_case_cname (sym).up ());
+ } else if (sym is Namespace) {
+ if (sym.name != null) {
+ var cprefix = sym.get_attribute_string ("CCode", "cprefix");
+ if (cprefix != null) {
+ return cprefix;
+ }
+ if (sym.parent_symbol != null) {
+ return "%s%s".printf (get_cprefix (sym.parent_symbol), sym.name);
+ } else {
+ return sym.name;
+ }
+ } else {
+ return "";
+ }
+ } else if (sym.name != null) {
+ return sym.name;
+ }
+ return "";
+ }
+
private string[] get_attributes_for_node (IdlNode node) {
string name;
if (node.type == IdlNodeTypeId.FUNCTION) {
name = ((IdlNodeFunction) node).symbol;
} else if (node.type == IdlNodeTypeId.SIGNAL) {
- name = "%s::%s".printf (current_data_type.get_cname (), node.name);
+ name = "%s::%s".printf (get_cname (current_data_type), node.name);
} else if (node.type == IdlNodeTypeId.PROPERTY) {
- name = "%s:%s".printf (current_data_type.get_cname (), node.name);
+ name = "%s:%s".printf (get_cname (current_data_type), node.name);
} else if (node.type == IdlNodeTypeId.FIELD) {
- name = "%s.%s".printf (current_data_type.get_cname (), node.name);
+ name = "%s.%s".printf (get_cname (current_data_type), node.name);
} else {
name = node.name;
}
@@ -304,6 +408,11 @@ public class Vala.GIdlParser : CodeVisitor {
st.add_property ((Property) sym);
}
}
+
+ if (!(sym is Namespace) && container is Namespace) {
+ // set C headers
+ sym.set_attribute_string ("CCode", "cheader_filename", get_cheader_filename (sym));
+ }
}
private void parse_node (IdlNode node, IdlModule module, Symbol container) {
@@ -349,13 +458,15 @@ public class Vala.GIdlParser : CodeVisitor {
private Symbol? get_container_from_name (string name) {
var path = name.split (".");
Symbol? cp = current_namespace;
+ if (cp.parent_symbol != context.root) {
+ cp = cp.parent_symbol;
+ }
Symbol? cc = null;
foreach ( unowned string tok in path ) {
cc = cp.scope.lookup (tok) as Symbol;
if ( cc == null ) {
cc = new Namespace (tok, current_source_reference);
- ((Namespace) cc).add_cprefix (cp.get_cprefix () + tok);
add_symbol_to_container (cp, cc);
}
cp = cc;
@@ -384,18 +495,17 @@ public class Vala.GIdlParser : CodeVisitor {
foreach (string attr in attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "cheader_filename") {
- ns.set_cheader_filename (eval (nv[1]));
+ ns.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "cprefix") {
- var cprefixes = eval (nv[1]).split (",");
- foreach(string name in cprefixes) {
- ns.add_cprefix (name);
- }
+ ns.set_attribute_string ("CCode", "cprefix", eval (nv[1]));
} else if (nv[0] == "lower_case_cprefix") {
- ns.set_lower_case_cprefix (eval (nv[1]));
+ ns.set_attribute_string ("CCode", "lower_case_cprefix", eval (nv[1]));
} else if (nv[0] == "gir_namespace") {
ns.source_reference.file.gir_namespace = eval (nv[1]);
+ ns.set_attribute_string ("CCode", "gir_namespace", eval (nv[1]));
} else if (nv[0] == "gir_version") {
ns.source_reference.file.gir_version = eval (nv[1]);
+ ns.set_attribute_string ("CCode", "gir_version", eval (nv[1]));
}
}
}
@@ -432,7 +542,14 @@ public class Vala.GIdlParser : CodeVisitor {
}
}
+ if (container is Namespace) {
+ current_namespace = (Namespace) container;
+ } else {
+ current_data_type = (TypeSymbol) container;
+ }
parse_node (node, module, container);
+ current_namespace = ns;
+ current_data_type = null;
}
current_namespace = null;
@@ -465,7 +582,7 @@ public class Vala.GIdlParser : CodeVisitor {
return null;
}
} else if (nv[0] == "cheader_filename") {
- cb.add_cheader_filename (eval (nv[1]));
+ cb.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "has_target") {
if (eval (nv[1]) == "0") {
check_has_target = false;
@@ -488,28 +605,28 @@ public class Vala.GIdlParser : CodeVisitor {
} else if (nv[0] == "error_types") {
error_types = eval (nv[1]);
} else if (nv[0] == "array_length_type") {
- cb.array_length_type = eval (nv[1]);
+ cb.set_attribute_string ("CCode", "array_length_type", eval (nv[1]));
} else if (nv[0] == "type_name") {
cb.return_type = return_type = parse_type_from_string (eval (nv[1]), return_type.value_owned);
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- cb.deprecated = true;
+ cb.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- cb.replacement = eval (nv[1]);
+ cb.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- cb.deprecated_since = eval (nv[1]);
+ cb.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "type_arguments") {
parse_type_arguments_from_string (return_type, eval (nv[1]));
} else if (nv[0] == "instance_pos") {
- cb.cinstance_parameter_position = double.parse (eval (nv[1]));
+ cb.set_attribute_double ("CCode", "instance_pos", double.parse (eval (nv[1])));
} else if (nv[0] == "type_parameters") {
foreach (string type_param_name in eval (nv[1]).split (",")) {
cb.add_type_parameter (new TypeParameter (type_param_name, current_source_reference));
}
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- cb.experimental = true;
+ cb.set_attribute ("Experimental", true);
}
}
}
@@ -599,14 +716,14 @@ public class Vala.GIdlParser : CodeVisitor {
parse_type_arguments_from_string (param_type, eval (nv[1]));
} else if (nv[0] == "no_array_length") {
if (eval (nv[1]) == "1") {
- p.no_array_length = true;
+ p.set_attribute_bool ("CCode", "array_length", false);
}
} else if (nv[0] == "array_length_type") {
- p.array_length_type = eval (nv[1]);
+ p.set_attribute_string ("CCode", "array_length_type", eval (nv[1]));
} else if (nv[0] == "array_null_terminated") {
if (eval (nv[1]) == "1") {
- p.no_array_length = true;
- p.array_null_terminated = true;
+ p.set_attribute_bool ("CCode", "array_length", false);
+ p.set_attribute_bool ("CCode", "array_null_terminated", true);
}
} else if (nv[0] == "type_name") {
p.variable_type = param_type = parse_type_from_string (eval (nv[1]), false);
@@ -665,7 +782,7 @@ public class Vala.GIdlParser : CodeVisitor {
foreach (string attr in st_attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "cheader_filename") {
- st.add_cheader_filename (eval (nv[1]));
+ st.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "hidden") {
if (eval (nv[1]) == "1") {
return;
@@ -680,33 +797,33 @@ public class Vala.GIdlParser : CodeVisitor {
}
} else if (nv[0] == "immutable") {
if (eval (nv[1]) == "1") {
- st.is_immutable = true;
+ st.set_attribute ("Immutable", true);
}
} else if (nv[0] == "has_type_id") {
if (eval (nv[1]) == "0") {
- st.has_type_id = false;
+ st.set_attribute_bool ("CCode", "has_type_id", false);
}
} else if (nv[0] == "type_id") {
- st.set_type_id (eval (nv[1]));
+ st.set_attribute_string ("CCode", "type_id", eval (nv[1]));
} else if (nv[0] == "has_copy_function") {
if (eval (nv[1]) == "0") {
- st.has_copy_function = false;
+ st.set_attribute_bool ("CCode", "has_copy_function", false);
}
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- st.deprecated = true;
+ st.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- st.replacement = eval (nv[1]);
+ st.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- st.deprecated_since = eval (nv[1]);
+ st.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "has_destroy_function") {
if (eval (nv[1]) == "0") {
- st.has_destroy_function = false;
+ st.set_attribute_bool ("CCode", "has_destroy_function", false);
}
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- st.experimental = true;
+ st.set_attribute ("Experimental", true);
}
}
}
@@ -743,17 +860,17 @@ public class Vala.GIdlParser : CodeVisitor {
var cl = container.scope.lookup (name) as Class;
if (cl == null) {
string base_class = null;
+ bool is_fundamental = false;
cl = new Class (name, current_source_reference);
cl.access = SymbolAccessibility.PUBLIC;
- cl.is_compact = true;
var cl_attributes = get_attributes (node.name);
if (cl_attributes != null) {
foreach (string attr in cl_attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "cheader_filename") {
- cl.add_cheader_filename (eval (nv[1]));
+ cl.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "base_class") {
base_class = eval (nv[1]);
} else if (nv[0] == "hidden") {
@@ -765,10 +882,10 @@ public class Vala.GIdlParser : CodeVisitor {
cl.is_immutable = true;
}
} else if (nv[0] == "const_cname") {
- cl.const_cname = eval (nv[1]);
+ cl.set_attribute_string ("CCode", "const_cname", eval (nv[1]));
} else if (nv[0] == "is_fundamental") {
if (eval (nv[1]) == "1") {
- cl.is_compact = false;
+ is_fundamental = true;
}
} else if (nv[0] == "abstract" && base_class != null) {
if (eval (nv[1]) == "1") {
@@ -788,19 +905,19 @@ public class Vala.GIdlParser : CodeVisitor {
}
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- cl.deprecated = true;
+ cl.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- cl.replacement = eval (nv[1]);
+ cl.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- cl.deprecated_since = eval (nv[1]);
+ cl.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "type_parameters") {
foreach (string type_param_name in eval (nv[1]).split (",")) {
cl.add_type_parameter (new TypeParameter (type_param_name, current_source_reference));
}
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- cl.experimental = true;
+ cl.set_attribute ("Experimental", true);
}
}
}
@@ -813,6 +930,9 @@ public class Vala.GIdlParser : CodeVisitor {
var parent = parse_type_string (base_class);
cl.add_base_type (parent);
}
+ if (base_class == null && !is_fundamental) {
+ cl.is_compact = true;
+ }
}
current_data_type = cl;
@@ -844,16 +964,17 @@ public class Vala.GIdlParser : CodeVisitor {
}
if (ref_function != null) {
- cl.set_ref_function (ref_function);
- cl.ref_function_void = ref_function_void;
- }
- if (copy_function != null) {
- cl.set_dup_function (copy_function);
+ cl.set_attribute_string ("CCode", "ref_function", ref_function);
+ if (ref_function_void) {
+ cl.set_attribute_bool ("CCode", "ref_function_void", ref_function_void);
+ }
+ } else if (copy_function != null) {
+ cl.set_attribute_string ("CCode", "copy_function", copy_function);
}
if (unref_function != null) {
- cl.set_unref_function (unref_function);
- } else if (free_function != null) {
- cl.set_free_function (free_function);
+ cl.set_attribute_string ("CCode", "unref_function", unref_function);
+ } else if (free_function != null && free_function != "%sfree".printf (get_lower_case_cprefix (cl))) {
+ cl.set_attribute_string ("CCode", "free_function", free_function);
}
current_data_type = null;
@@ -880,22 +1001,22 @@ public class Vala.GIdlParser : CodeVisitor {
foreach (string attr in st_attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "cheader_filename") {
- st.add_cheader_filename (eval (nv[1]));
+ st.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- st.deprecated = true;
+ st.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- st.replacement = eval (nv[1]);
+ st.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- st.deprecated_since = eval (nv[1]);
+ st.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "hidden") {
if (eval (nv[1]) == "1") {
return;
}
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- st.experimental = true;
+ st.set_attribute ("Experimental", true);
}
}
}
@@ -934,7 +1055,7 @@ public class Vala.GIdlParser : CodeVisitor {
foreach (string attr in cl_attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "cheader_filename") {
- cl.add_cheader_filename (eval (nv[1]));
+ cl.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "hidden") {
if (eval (nv[1]) == "1") {
return;
@@ -982,16 +1103,17 @@ public class Vala.GIdlParser : CodeVisitor {
}
if (ref_function != null) {
- cl.set_ref_function (ref_function);
- cl.ref_function_void = ref_function_void;
- }
- if (copy_function != null) {
- cl.set_dup_function (copy_function);
+ cl.set_attribute_string ("CCode", "ref_function", ref_function);
+ if (ref_function_void) {
+ cl.set_attribute_bool ("CCode", "ref_function_void", ref_function_void);
+ }
+ } else if (copy_function != null) {
+ cl.set_attribute_string ("CCode", "copy_function", copy_function);
}
if (unref_function != null) {
- cl.set_unref_function (unref_function);
- } else if (free_function != null) {
- cl.set_free_function (free_function);
+ cl.set_attribute_string ("CCode", "unref_function", unref_function);
+ } else if (free_function != null && free_function != "%sfree".printf (get_lower_case_cprefix (cl))) {
+ cl.set_attribute_string ("CCode", "free_function", free_function);
}
current_data_type = null;
@@ -1024,37 +1146,36 @@ public class Vala.GIdlParser : CodeVisitor {
foreach (string attr in st_attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "cheader_filename") {
- st.add_cheader_filename (eval (nv[1]));
+ st.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- st.deprecated = true;
+ st.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- st.replacement = eval (nv[1]);
+ st.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- st.deprecated_since = eval (nv[1]);
+ st.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "immutable") {
if (eval (nv[1]) == "1") {
- st.is_immutable = true;
+ st.set_attribute ("Immutable", true);
}
} else if (nv[0] == "has_copy_function") {
if (eval (nv[1]) == "0") {
- st.has_copy_function = false;
+ st.set_attribute_bool ("CCode", "has_copy_function", false);
}
} else if (nv[0] == "has_destroy_function") {
if (eval (nv[1]) == "0") {
- st.has_destroy_function = false;
+ st.set_attribute_bool ("CCode", "has_destroy_function", false);
}
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- st.experimental = true;
+ st.set_attribute ("Experimental", true);
}
}
}
}
add_symbol_to_container (container, st);
- st.set_type_id (st.get_upper_case_cname ("TYPE_"));
current_source_file.add_node (st);
}
@@ -1095,7 +1216,7 @@ public class Vala.GIdlParser : CodeVisitor {
foreach (string attr in cl_attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "cheader_filename") {
- cl.add_cheader_filename (eval (nv[1]));
+ cl.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "base_class") {
base_class = eval (nv[1]);
} else if (nv[0] == "is_immutable") {
@@ -1104,14 +1225,14 @@ public class Vala.GIdlParser : CodeVisitor {
}
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- cl.deprecated = true;
+ cl.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- cl.replacement = eval (nv[1]);
+ cl.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- cl.deprecated_since = eval (nv[1]);
+ cl.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "const_cname") {
- cl.const_cname = eval (nv[1]);
+ cl.set_attribute_string ("CCode", "const_cname", eval (nv[1]));
} else if (nv[0] == "free_function") {
free_function = eval (nv[1]);
} else if (nv[0] == "ref_function") {
@@ -1126,14 +1247,13 @@ public class Vala.GIdlParser : CodeVisitor {
}
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- cl.experimental = true;
+ cl.set_attribute ("Experimental", true);
}
}
}
}
add_symbol_to_container (container, cl);
- cl.set_type_id (cl.get_upper_case_cname ("TYPE_"));
current_source_file.add_node (cl);
if (base_class != null) {
@@ -1171,16 +1291,17 @@ public class Vala.GIdlParser : CodeVisitor {
}
if (ref_function != null) {
- cl.set_ref_function (ref_function);
- cl.ref_function_void = ref_function_void;
- }
- if (copy_function != null) {
- cl.set_dup_function (copy_function);
+ cl.set_attribute_string ("CCode", "ref_function", ref_function);
+ if (ref_function_void) {
+ cl.set_attribute_bool ("CCode", "ref_function_void", ref_function_void);
+ }
+ } else if (copy_function != null) {
+ cl.set_attribute_string ("CCode", "copy_function", copy_function);
}
if (unref_function != null) {
- cl.set_unref_function (unref_function);
- } else if (free_function != null) {
- cl.set_free_function (free_function);
+ cl.set_attribute_string ("CCode", "unref_function", unref_function);
+ } else if (free_function != null && free_function != "%sfree".printf (get_lower_case_cprefix (cl))) {
+ cl.set_attribute_string ("CCode", "free_function", free_function);
}
current_data_type = null;
@@ -1207,7 +1328,9 @@ public class Vala.GIdlParser : CodeVisitor {
}
}
- en.has_type_id = (en_node.gtype_name != null && en_node.gtype_name != "");
+ if (en_node.gtype_name == null || en_node.gtype_name == "") {
+ en.set_attribute_bool ("CCode", "has_type_id", false);
+ }
string common_prefix = null;
@@ -1247,7 +1370,7 @@ public class Vala.GIdlParser : CodeVisitor {
bool is_errordomain = false;
- var cheader_filenames = new ArrayList<string> ();
+ string cheader_filename = null;
var en_attributes = get_attributes (node.name);
if (en_attributes != null) {
@@ -1256,20 +1379,20 @@ public class Vala.GIdlParser : CodeVisitor {
if (nv[0] == "common_prefix") {
common_prefix = eval (nv[1]);
} else if (nv[0] == "cheader_filename") {
- cheader_filenames.add (eval (nv[1]));
- en.add_cheader_filename (eval (nv[1]));
+ cheader_filename = eval (nv[1]);
+ en.set_attribute_string ("CCode", "cheader_filename", cheader_filename);
} else if (nv[0] == "hidden") {
if (eval (nv[1]) == "1") {
return;
}
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- en.deprecated = true;
+ en.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- en.replacement = eval (nv[1]);
+ en.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- en.deprecated_since = eval (nv[1]);
+ en.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "rename_to") {
en.name = eval (nv[1]);
} else if (nv[0] == "errordomain") {
@@ -1282,17 +1405,17 @@ public class Vala.GIdlParser : CodeVisitor {
return_type.value_owned = false;
var m = new Method ("to_string", return_type, current_source_reference);
m.access = SymbolAccessibility.PUBLIC;
- m.set_cname (eval(nv[1]));
+ m.set_attribute_string ("CCode", "cname", eval(nv[1]));
en.add_method (m);
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- en.experimental = true;
+ en.set_attribute ("Experimental", true);
}
}
}
}
- en.set_cprefix (common_prefix);
+ en.set_attribute_string ("CCode", "cprefix", common_prefix);
foreach (weak IdlNode value2 in en_node.values) {
var val_attributes = get_attributes (value2.name);
@@ -1315,10 +1438,10 @@ public class Vala.GIdlParser : CodeVisitor {
if (is_errordomain) {
var ed = new ErrorDomain (en.name, current_source_reference);
ed.access = SymbolAccessibility.PUBLIC;
- ed.set_cprefix (common_prefix);
+ ed.set_attribute_string ("CCode", "cprefix", common_prefix);
- foreach (string filename in cheader_filenames) {
- ed.add_cheader_filename (filename);
+ if (cheader_filename != null) {
+ ed.set_attribute_string ("CCode", "cheader_filename", cheader_filename);
}
foreach (EnumValue ev in en.get_values ()) {
@@ -1330,7 +1453,7 @@ public class Vala.GIdlParser : CodeVisitor {
add_symbol_to_container (container, ed);
}
} else {
- en.is_flags = is_flags;
+ en.set_attribute ("Flags", is_flags);
current_source_file.add_node (en);
if (!existing) {
add_symbol_to_container (container, en);
@@ -1353,7 +1476,7 @@ public class Vala.GIdlParser : CodeVisitor {
foreach (string attr in attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "cheader_filename") {
- cl.add_cheader_filename (eval (nv[1]));
+ cl.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "base_class") {
base_class = eval (nv[1]);
} else if (nv[0] == "hidden") {
@@ -1361,24 +1484,24 @@ public class Vala.GIdlParser : CodeVisitor {
return;
}
} else if (nv[0] == "type_check_function") {
- cl.type_check_function = eval (nv[1]);
+ cl.set_attribute_string ("CCode", "type_check_function", eval (nv[1]));
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- cl.deprecated = true;
+ cl.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- cl.replacement = eval (nv[1]);
+ cl.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- cl.deprecated_since = eval (nv[1]);
+ cl.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "type_id") {
- cl.set_type_id (eval (nv[1]));
+ cl.set_attribute_string ("CCode", "type_id", eval (nv[1]));
} else if (nv[0] == "abstract") {
if (eval (nv[1]) == "1") {
cl.is_abstract = true;
}
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- cl.experimental = true;
+ cl.set_attribute ("Experimental", true);
}
}
}
@@ -1479,17 +1602,17 @@ public class Vala.GIdlParser : CodeVisitor {
var getter = "get_%s".printf (prop.name);
if (prop.get_accessor != null && !current_type_symbol_set.contains (getter)) {
- prop.no_accessor_method = true;
+ prop.set_attribute ("NoAccessorMethod", true);
}
var setter = "set_%s".printf (prop.name);
if (prop.set_accessor != null && prop.set_accessor.writable
&& !current_type_symbol_set.contains (setter)) {
- prop.no_accessor_method = true;
+ prop.set_attribute ("NoAccessorMethod", true);
}
- if (prop.no_accessor_method && prop.get_accessor != null) {
+ if (prop.get_attribute ("NoAccessorMethod") != null && prop.get_accessor != null) {
prop.get_accessor.value_type.value_owned = true;
}
}
@@ -1522,15 +1645,15 @@ public class Vala.GIdlParser : CodeVisitor {
foreach (string attr in attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "cheader_filename") {
- iface.add_cheader_filename (eval (nv[1]));
+ iface.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "hidden") {
if (eval (nv[1]) == "1") {
return;
}
} else if (nv[0] == "type_cname") {
- iface.set_type_cname (eval (nv[1]));
+ iface.set_attribute_string ("CCode", "type_cname", eval (nv[1]));
} else if (nv[0] == "lower_case_csuffix") {
- iface.set_lower_case_csuffix (eval (nv[1]));
+ iface.set_attribute_string ("CCode", "lower_case_csuffix", eval (nv[1]));
}
}
}
@@ -1607,9 +1730,9 @@ public class Vala.GIdlParser : CodeVisitor {
// check if the method is using non-standard finish method name
if (finish_method == null) {
- var method_cname = m.get_finish_cname ();
+ var method_cname = get_finish_cname (m);
foreach (Method method in type_symbol.get_methods ()) {
- if (method.get_cname () == method_cname) {
+ if (get_cname (method) == method_cname) {
finish_method = method;
break;
}
@@ -1618,8 +1741,13 @@ public class Vala.GIdlParser : CodeVisitor {
if (finish_method != null) {
m.return_type = finish_method.return_type.copy ();
- m.no_array_length = finish_method.no_array_length;
- m.array_null_terminated = finish_method.array_null_terminated;
+ var a = finish_method.get_attribute ("CCode");
+ if (a != null && a.has_argument ("array_length")) {
+ m.set_attribute_bool ("CCode", "array_length", a.get_bool ("array_length"));
+ }
+ if (a != null && a.has_argument ("array_null_terminated")) {
+ m.set_attribute_bool ("CCode", "array_null_terminated", a.get_bool ("array_null_terminated"));
+ }
foreach (var param in finish_method.get_parameters ()) {
if (param.direction == ParameterDirection.OUT) {
var async_param = param.copy ();
@@ -1847,6 +1975,8 @@ public class Vala.GIdlParser : CodeVisitor {
if (n.has_prefix (current_namespace.name)) {
type.unresolved_symbol = new UnresolvedSymbol (new UnresolvedSymbol (null, current_namespace.name), n.substring (current_namespace.name.length));
+ } else if (current_namespace.parent_symbol != null && current_namespace.parent_symbol.name != null && n.has_prefix (current_namespace.parent_symbol.name)) {
+ type.unresolved_symbol = new UnresolvedSymbol (new UnresolvedSymbol (null, current_namespace.parent_symbol.name), n.substring (current_namespace.parent_symbol.name.length));
} else if (n.has_prefix ("G")) {
type.unresolved_symbol = new UnresolvedSymbol (new UnresolvedSymbol (null, "GLib"), n.substring (1));
} else {
@@ -2015,8 +2145,8 @@ public class Vala.GIdlParser : CodeVisitor {
// gtk widgets) add an attribute to the creation method indicating the used
// return type.
if (current_data_type is Class && res != null) {
- if ("%s*".printf (current_data_type.get_cname()) != res.type.unparsed) {
- m.custom_return_type_cname = res.type.unparsed;
+ if ("%s*".printf (get_cname (current_data_type)) != res.type.unparsed) {
+ m.set_attribute_string ("CCode", "type", res.type.unparsed);
}
}
} else {
@@ -2029,7 +2159,7 @@ public class Vala.GIdlParser : CodeVisitor {
}
if (current_data_type != null) {
- var sig_attributes = get_attributes ("%s::%s".printf (current_data_type.get_cname (), name));
+ var sig_attributes = get_attributes ("%s::%s".printf (get_cname (current_data_type), name));
if (sig_attributes != null) {
foreach (string attr in sig_attributes) {
var nv = attr.split ("=", 2);
@@ -2043,13 +2173,13 @@ public class Vala.GIdlParser : CodeVisitor {
bool add_ellipsis = false;
bool suppress_throws = false;
string? error_types = null;
+ Symbol? container = null;
var attributes = get_attributes (symbol);
if (attributes != null) {
foreach (string attr in attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "name") {
- m.set_cname (m.name);
m.name = eval (nv[1]);
} else if (nv[0] == "hidden") {
if (eval (nv[1]) == "1") {
@@ -2061,7 +2191,7 @@ public class Vala.GIdlParser : CodeVisitor {
}
} else if (nv[0] == "printf_format") {
if (eval (nv[1]) == "1") {
- m.printf_format = true;
+ m.set_attribute ("PrintfFormat", true);
}
} else if (nv[0] == "transfer_ownership") {
if (eval (nv[1]) == "1") {
@@ -2069,14 +2199,14 @@ public class Vala.GIdlParser : CodeVisitor {
}
} else if (nv[0] == "destroys_instance") {
if (eval (nv[1]) == "1") {
- m.attributes.append (new Attribute ("DestroysInstance", m.source_reference));
+ m.set_attribute ("DestroysInstance", true, m.source_reference);
}
} else if (nv[0] == "nullable") {
if (eval (nv[1]) == "1") {
return_type.nullable = true;
}
} else if (nv[0] == "sentinel") {
- m.sentinel = eval (nv[1]);
+ m.set_attribute_string ("CCode", "sentinel", eval (nv[1]));
} else if (nv[0] == "is_array") {
if (eval (nv[1]) == "1") {
return_type = new ArrayType (return_type, 1, return_type.source_reference);
@@ -2090,29 +2220,29 @@ public class Vala.GIdlParser : CodeVisitor {
error_types = eval (nv[1]);
} else if (nv[0] == "no_array_length") {
if (eval (nv[1]) == "1") {
- m.no_array_length = true;
+ m.set_attribute_bool ("CCode", "array_length", false);
}
} else if (nv[0] == "array_null_terminated") {
if (eval (nv[1]) == "1") {
- m.no_array_length = true;
- m.array_null_terminated = true;
+ m.set_attribute_bool ("CCode", "array_length", false);
+ m.set_attribute_bool ("CCode", "array_null_terminated", true);;
}
} else if (nv[0] == "array_length_type") {
- m.array_length_type = eval (nv[1]);
+ m.set_attribute_string ("CCode", "array_length_type", eval (nv[1]));
} else if (nv[0] == "type_name") {
m.return_type = return_type = parse_type_from_string (eval (nv[1]), return_type.value_owned);
} else if (nv[0] == "type_arguments") {
parse_type_arguments_from_string (return_type, eval (nv[1]));
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- m.deprecated = true;
+ m.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- m.replacement = eval (nv[1]);
+ m.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- m.deprecated_since = eval (nv[1]);
+ m.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "cheader_filename") {
- m.add_cheader_filename (eval (nv[1]));
+ m.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "abstract") {
if (eval (nv[1]) == "1") {
m.is_abstract = true;
@@ -2122,35 +2252,32 @@ public class Vala.GIdlParser : CodeVisitor {
m.is_virtual = true;
}
} else if (nv[0] == "vfunc_name") {
- m.vfunc_name = eval (nv[1]);
+ m.set_attribute_string ("CCode", "vfunc_name", eval (nv[1]));
} else if (nv[0] == "finish_name") {
- m.set_finish_cname (eval (nv[1]));
+ m.set_attribute_string ("CCode", "finish_name", eval (nv[1]));
} else if (nv[0] == "async") {
if (eval (nv[1]) == "1") {
// force async function, even if it doesn't end in _async
m.coroutine = true;
}
} else if (nv[0] == "parent") {
- Symbol container = get_container_from_name (eval (nv[1]));
- var prefix = container.get_lower_case_cprefix ();
+ container = get_container_from_name (eval (nv[1]));
+ var prefix = get_lower_case_cprefix (container);
if (symbol.has_prefix (prefix)) {
- m.set_cname (m.name);
m.name = symbol.substring (prefix.length);
}
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- m.experimental = true;
+ m.set_attribute ("Experimental", true);
}
} else if (nv[0] == "simple_generics") {
if (eval (nv[1]) == "1") {
- m.simple_generics = true;
+ m.set_attribute_bool ("CCode", "simple_generics", true);
}
}
}
}
-
- m.set_cname (symbol);
-
+
bool first = true;
Parameter last_param = null;
DataType last_param_type = null;
@@ -2163,14 +2290,14 @@ public class Vala.GIdlParser : CodeVisitor {
current_data_type != null &&
param.type.is_interface &&
(param_node.name == "self" ||
- param.type.@interface.has_suffix (current_data_type.get_cname ()))) {
+ param.type.@interface.has_suffix (get_cname (current_data_type)))) {
// instance method
continue;
} else if (!(m is CreationMethod) &&
current_data_type != null &&
param.type.is_interface &&
(param_node.name == "klass" ||
- param.type.@interface.has_suffix ("%sClass".printf(current_data_type.get_cname ())))) {
+ param.type.@interface.has_suffix ("%sClass".printf(get_cname (current_data_type))))) {
// class method
m.binding = MemberBinding.CLASS;
if (m.name.has_prefix ("class_")) {
@@ -2275,14 +2402,14 @@ public class Vala.GIdlParser : CodeVisitor {
}
} else if (nv[0] == "no_array_length") {
if (eval (nv[1]) == "1") {
- p.no_array_length = true;
+ p.set_attribute_bool ("CCode", "array_length", false);
}
} else if (nv[0] == "array_length_type") {
- p.array_length_type = eval (nv[1]);
+ p.set_attribute_string ("CCode", "array_length_type", eval (nv[1]));
} else if (nv[0] == "array_null_terminated") {
if (eval (nv[1]) == "1") {
- p.no_array_length = true;
- p.array_null_terminated = true;
+ p.set_attribute_bool ("CCode", "array_length", false);
+ p.set_attribute_bool ("CCode", "array_null_terminated", true);
}
} else if (nv[0] == "array_length_pos") {
set_array_length_pos = true;
@@ -2293,7 +2420,7 @@ public class Vala.GIdlParser : CodeVisitor {
} else if (nv[0] == "type_name") {
p.variable_type = param_type = parse_type_from_string (eval (nv[1]), false);
} else if (nv[0] == "ctype") {
- p.ctype = eval (nv[1]);
+ p.set_attribute_string ("CCode", "type", eval (nv[1]));
} else if (nv[0] == "type_arguments") {
parse_type_arguments_from_string (param_type, eval (nv[1]));
} else if (nv[0] == "default_value") {
@@ -2347,10 +2474,10 @@ public class Vala.GIdlParser : CodeVisitor {
if (show_param || !hide_param) {
m.add_parameter (p);
if (set_array_length_pos) {
- p.carray_length_parameter_position = array_length_pos;
+ p.set_attribute_double ("CCode", "array_length_pos", array_length_pos);
}
if (set_delegate_target_pos) {
- p.cdelegate_target_parameter_position = delegate_target_pos;
+ p.set_attribute_double ("CCode", "delegate_target_pos", delegate_target_pos);
}
}
@@ -2375,6 +2502,16 @@ public class Vala.GIdlParser : CodeVisitor {
} else if (add_ellipsis) {
m.add_parameter (new Parameter.with_ellipsis ());
}
+
+ if (container == null) {
+ container = current_data_type;
+ if (container == null) {
+ container = current_namespace;
+ }
+ }
+ if (symbol != get_cname (m, container)) {
+ m.set_attribute_string ("CCode", "cname", symbol);
+ }
return m;
}
@@ -2402,7 +2539,7 @@ public class Vala.GIdlParser : CodeVisitor {
private Method parse_virtual (IdlNodeVFunc v, IdlNodeFunction? func, bool is_interface = false) {
weak IdlNode node = (IdlNode) v;
- string symbol = "%s%s".printf (current_data_type.get_lower_case_cprefix(), node.name);
+ string symbol = "%s%s".printf (get_lower_case_cprefix (current_data_type), node.name);
if (func != null) {
symbol = func.symbol;
@@ -2431,7 +2568,7 @@ public class Vala.GIdlParser : CodeVisitor {
}
if (func == null) {
- m.attributes.append (new Attribute ("NoWrapper", null));
+ m.set_attribute ("NoWrapper", true);
}
}
@@ -2475,8 +2612,8 @@ public class Vala.GIdlParser : CodeVisitor {
prop.interface_only = true;
if (prop_node.type.is_interface && prop_node.type.interface == "GStrv") {
- prop.no_array_length = true;
- prop.array_null_terminated = true;
+ prop.set_attribute_bool ("CCode", "array_length", false);
+ prop.set_attribute_bool ("CCode", "array_null_terminated", true);
}
if (prop_node.readable) {
@@ -2492,7 +2629,7 @@ public class Vala.GIdlParser : CodeVisitor {
}
}
- var attributes = get_attributes ("%s:%s".printf (current_data_type.get_cname (), node.name));
+ var attributes = get_attributes ("%s:%s".printf (get_cname (current_data_type), node.name));
if (attributes != null) {
foreach (string attr in attributes) {
var nv = attr.split ("=", 2);
@@ -2504,15 +2641,15 @@ public class Vala.GIdlParser : CodeVisitor {
parse_type_arguments_from_string (prop.property_type, eval (nv[1]));
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- prop.deprecated = true;
+ prop.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- prop.replacement = eval (nv[1]);
+ prop.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- prop.deprecated_since = eval (nv[1]);
+ prop.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "accessor_method") {
if (eval (nv[1]) == "0") {
- prop.no_accessor_method = true;
+ prop.set_attribute ("NoAccessorMethod", true);
}
} else if (nv[0] == "owned_get") {
if (eval (nv[1]) == "1") {
@@ -2522,7 +2659,7 @@ public class Vala.GIdlParser : CodeVisitor {
prop.property_type = parse_type_from_string (eval (nv[1]), false);
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- prop.experimental = true;
+ prop.set_attribute ("Experimental", true);
}
} else if (nv[0] == "nullable") {
if (eval (nv[1]) == "1") {
@@ -2555,22 +2692,22 @@ public class Vala.GIdlParser : CodeVisitor {
foreach (string attr in attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "cheader_filename") {
- c.add_cheader_filename (eval (nv[1]));
+ c.set_attribute_string ("CCode", "cheader_filename", eval (nv[1]));
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- c.deprecated = true;
+ c.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- c.replacement = eval (nv[1]);
+ c.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- c.deprecated_since = eval (nv[1]);
+ c.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "hidden") {
if (eval (nv[1]) == "1") {
return null;
}
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- c.experimental = true;
+ c.set_attribute ("Experimental", true);
}
}
}
@@ -2601,7 +2738,7 @@ public class Vala.GIdlParser : CodeVisitor {
bool experimental = false;
bool no_delegate_target = false;
- var attributes = get_attributes ("%s.%s".printf (current_data_type.get_cname (), node.name));
+ var attributes = get_attributes ("%s.%s".printf (get_cname (current_data_type), node.name));
if (attributes != null) {
foreach (string attr in attributes) {
var nv = attr.split ("=", 2);
@@ -2679,50 +2816,50 @@ public class Vala.GIdlParser : CodeVisitor {
field.access = SymbolAccessibility.PUBLIC;
if (field_name != node.name) {
- field.set_cname (node.name);
+ field.set_attribute_string ("CCode", "cname", node.name);
}
if (deprecated) {
- field.deprecated = true;
+ field.set_attribute ("Deprecated", true);
if (deprecated_since != null) {
- field.deprecated_since = deprecated_since;
+ field.set_attribute_string ("Deprecated", "since", deprecated_since);
}
if (replacement != null) {
- field.replacement = replacement;
+ field.set_attribute_string ("Deprecated", "replacement", replacement);
}
}
if (experimental) {
- field.experimental = true;
+ field.set_attribute ("Experimental", true);
}
if (ctype != null) {
- field.set_ctype (ctype);
+ field.set_attribute_string ("CCode", "type", ctype);
}
if (cheader_filename != null) {
- field.add_cheader_filename (cheader_filename);
+ field.set_attribute_string ("CCode", "cheader_filename", cheader_filename);
}
if (array_null_terminated) {
- field.array_null_terminated = true;
+ field.set_attribute_bool ("CCode", "array_null_terminated", true);
}
if (array_length_cname != null || array_length_type != null) {
if (array_length_cname != null) {
- field.set_array_length_cname (array_length_cname);
+ field.set_attribute_string ("CCode", "array_length_cname", array_length_cname);
}
if (array_length_type != null) {
- field.array_length_type = array_length_type;
+ field.set_attribute_string ("CCode", "array_length_type", array_length_type);
}
- } else {
- field.no_array_length = true;
+ } else if (field.variable_type is ArrayType) {
+ field.set_attribute_bool ("CCode", "array_length", false);
}
if (no_delegate_target) {
- field.no_delegate_target = true;
+ field.set_attribute_bool ("CCode", "delegate_target", false);
}
return field;
@@ -2809,28 +2946,28 @@ public class Vala.GIdlParser : CodeVisitor {
var sig = new Signal (fix_prop_name (node.name), parse_param (sig_node.result), current_source_reference);
sig.access = SymbolAccessibility.PUBLIC;
- var attributes = get_attributes ("%s::%s".printf (current_data_type.get_cname (), sig.name));
+ var attributes = get_attributes ("%s::%s".printf (get_cname (current_data_type), sig.name));
if (attributes != null) {
string ns_name = null;
foreach (string attr in attributes) {
var nv = attr.split ("=", 2);
if (nv[0] == "name") {
- sig.set_cname (sig.name);
+ sig.set_attribute_string ("CCode", "cname", sig.name);
sig.name = eval (nv[1]);
} else if (nv[0] == "has_emitter" && eval (nv[1]) == "1") {
- sig.has_emitter = true;
+ sig.set_attribute ("HasEmitter", true);
} else if (nv[0] == "hidden") {
if (eval (nv[1]) == "1") {
return null;
}
} else if (nv[0] == "deprecated") {
if (eval (nv[1]) == "1") {
- sig.deprecated = true;
+ sig.set_attribute ("Deprecated", true);
}
} else if (nv[0] == "replacement") {
- sig.replacement = eval (nv[1]);
+ sig.set_attribute_string ("Deprecated", "replacement", eval (nv[1]));
} else if (nv[0] == "deprecated_since") {
- sig.deprecated_since = eval (nv[1]);
+ sig.set_attribute_string ("Deprecated", "since", eval (nv[1]));
} else if (nv[0] == "transfer_ownership") {
if (eval (nv[1]) == "1") {
sig.return_type.value_owned = true;
@@ -2843,7 +2980,7 @@ public class Vala.GIdlParser : CodeVisitor {
parse_type_arguments_from_string (sig.return_type, eval (nv[1]));
} else if (nv[0] == "experimental") {
if (eval (nv[1]) == "1") {
- sig.experimental = true;
+ sig.set_attribute ("Experimental", true);
}
}
}
@@ -2872,7 +3009,7 @@ public class Vala.GIdlParser : CodeVisitor {
bool hide_param = false;
bool show_param = false;
- attributes = get_attributes ("%s::%s.%s".printf (current_data_type.get_cname (), sig.name, param_node.name));
+ attributes = get_attributes ("%s::%s.%s".printf (get_cname (current_data_type), sig.name, param_node.name));
if (attributes != null) {
string ns_name = null;
foreach (string attr in attributes) {
@@ -2891,14 +3028,14 @@ public class Vala.GIdlParser : CodeVisitor {
}
} else if (nv[0] == "no_array_length") {
if (eval (nv[1]) == "1") {
- p.no_array_length = true;
+ p.set_attribute_bool ("CCode", "array_length", false);
}
} else if (nv[0] == "array_length_type") {
- p.array_length_type = eval (nv[1]);
+ p.set_attribute_string ("CCode", "array_length_type", nv[1]);
} else if (nv[0] == "array_null_terminated") {
if (eval (nv[1]) == "1") {
- p.no_array_length = true;
- p.array_null_terminated = true;
+ p.set_attribute_bool ("CCode", "array_length", false);
+ p.set_attribute_bool ("CCode", "array_null_terminated", true);
}
} else if (nv[0] == "is_out") {
if (eval (nv[1]) == "1") {