vala r2376 - in trunk: . vapigen
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r2376 - in trunk: . vapigen
- Date: Sat, 17 Jan 2009 18:02:30 +0000 (UTC)
Author: juergbi
Date: Sat Jan 17 18:02:29 2009
New Revision: 2376
URL: http://svn.gnome.org/viewvc/vala?rev=2376&view=rev
Log:
2009-01-17 JÃrg Billeter <j bitron ch>
* vapigen/valagirparser.vala:
Parse callback parameter annotations
Modified:
trunk/ChangeLog
trunk/vapigen/valagirparser.vala
Modified: trunk/vapigen/valagirparser.vala
==============================================================================
--- trunk/vapigen/valagirparser.vala (original)
+++ trunk/vapigen/valagirparser.vala Sat Jan 17 18:02:29 2009
@@ -179,7 +179,7 @@
} else if (reader.name == "bitfield") {
sym = parse_bitfield ();
} else if (reader.name == "function") {
- sym = parse_function ();
+ sym = parse_method ("function");
} else if (reader.name == "callback") {
sym = parse_callback ();
} else if (reader.name == "record") {
@@ -307,45 +307,6 @@
return ev;
}
- Method parse_function () {
- start_element ("function");
- string name = reader.get_attribute ("name");
- next ();
- DataType return_type;
- if (current_token == MarkupTokenType.START_ELEMENT && reader.name == "return-value") {
- return_type = parse_return_value ();
- } else {
- return_type = new VoidType ();
- }
- var m = new Method (name, return_type, get_current_src ());
- m.access = SymbolAccessibility.PUBLIC;
- m.binding = MemberBinding.STATIC;
- var parameters = new ArrayList<FormalParameter> ();
- var array_length_parameters = new ArrayList<int> ();
- if (current_token == MarkupTokenType.START_ELEMENT && reader.name == "parameters") {
- start_element ("parameters");
- next ();
- while (current_token == MarkupTokenType.START_ELEMENT) {
- int array_length_idx;
- var param = parse_parameter (out array_length_idx);
- if (array_length_idx != -1) {
- array_length_parameters.add (array_length_idx);
- }
- parameters.add (param);
- }
- end_element ("parameters");
- }
- int i = 0;
- foreach (FormalParameter param in parameters) {
- if (!array_length_parameters.contains (i)) {
- m.add_parameter (param);
- }
- i++;
- }
- end_element ("function");
- return m;
- }
-
DataType parse_return_value () {
start_element ("return-value");
string transfer = reader.get_attribute ("transfer-ownership");
@@ -358,18 +319,34 @@
return type;
}
- FormalParameter parse_parameter (out int array_length_idx = null) {
+ FormalParameter parse_parameter (out int array_length_idx = null, out int closure_idx = null, out int destroy_idx = null) {
FormalParameter param;
if (&array_length_idx != null) {
array_length_idx = -1;
}
+ if (&closure_idx != null) {
+ closure_idx = -1;
+ }
+ if (&destroy_idx != null) {
+ destroy_idx = -1;
+ }
start_element ("parameter");
string name = reader.get_attribute ("name");
string direction = reader.get_attribute ("direction");
string transfer = reader.get_attribute ("transfer-ownership");
string allow_none = reader.get_attribute ("allow-none");
+
+ string closure = reader.get_attribute ("closure");
+ string destroy = reader.get_attribute ("destroy");
+ if (closure != null && &closure_idx != null) {
+ closure_idx = closure.to_int ();
+ }
+ if (destroy != null && &destroy_idx != null) {
+ destroy_idx = destroy.to_int ();
+ }
+
next ();
if (reader.name == "varargs") {
start_element ("varargs");
@@ -483,7 +460,7 @@
} else if (reader.name == "constructor") {
parse_constructor ();
} else if (reader.name == "method") {
- parse_method ();
+ parse_method ("method");
} else {
// error
Report.error (get_current_src (), "unknown child element `%s' in `record'".printf (reader.name));
@@ -522,11 +499,11 @@
} else if (reader.name == "constructor") {
cl.add_method (parse_constructor ());
} else if (reader.name == "function") {
- methods.add (parse_function ());
+ methods.add (parse_method ("function"));
} else if (reader.name == "method") {
- methods.add (parse_method ());
+ methods.add (parse_method ("method"));
} else if (reader.name == "callback") {
- vmethods.add (parse_vmethod ());
+ vmethods.add (parse_method ("callback"));
} else if (reader.name == "glib:signal") {
signals.add (parse_signal ());
} else {
@@ -598,6 +575,7 @@
iface.access = SymbolAccessibility.PUBLIC;
next ();
var methods = new ArrayList<Method> ();
+ var vmethods = new ArrayList<Method> ();
while (current_token == MarkupTokenType.START_ELEMENT) {
if (reader.name == "prerequisite") {
start_element ("prerequisite");
@@ -609,9 +587,9 @@
} else if (reader.name == "property") {
iface.add_property (parse_property ());
} else if (reader.name == "callback") {
- parse_callback ();
+ vmethods.add (parse_method ("callback"));
} else if (reader.name == "method") {
- methods.add (parse_method ());
+ methods.add (parse_method ("method"));
} else if (reader.name == "glib:signal") {
iface.add_signal (parse_signal ());
} else {
@@ -621,6 +599,19 @@
}
}
+ // virtual method merging
+ foreach (Method m in vmethods) {
+ var symbol = iface.scope.lookup (m.name);
+ if (symbol == null) {
+ iface.add_method (m);
+ } else if (symbol is Signal) {
+ var sig = (Signal) symbol;
+ sig.is_virtual = true;
+ } else {
+ Report.error (get_current_src (), "duplicate member `%s' in `%s'".printf (m.name, iface.name));
+ }
+ }
+
// method merging
foreach (Method m in methods) {
var symbol = iface.scope.lookup (m.name);
@@ -629,6 +620,8 @@
} else if (symbol is Signal) {
var sig = (Signal) symbol;
sig.has_emitter = true;
+ } else if (symbol is Method) {
+ // assume method is wrapper for virtual method
} else {
Report.error (get_current_src (), "duplicate member `%s' in `%s'".printf (m.name, iface.name));
}
@@ -718,8 +711,8 @@
return m;
}
- Method parse_method () {
- start_element ("method");
+ Method parse_method (string element_name) {
+ start_element (element_name);
string name = reader.get_attribute ("name");
string throws_string = reader.get_attribute ("throws");
next ();
@@ -731,54 +724,62 @@
}
var m = new Method (name, return_type, get_current_src ());
m.access = SymbolAccessibility.PUBLIC;
- if (current_token == MarkupTokenType.START_ELEMENT && reader.name == "parameters") {
- start_element ("parameters");
- next ();
- while (current_token == MarkupTokenType.START_ELEMENT) {
- m.add_parameter (parse_parameter ());
- }
- end_element ("parameters");
- }
- if (throws_string == "1") {
- m.add_error_type (new ErrorType (null, null));
- }
- end_element ("method");
- return m;
- }
- Method parse_vmethod () {
- start_element ("callback");
- string name = reader.get_attribute ("name");
- string throws_string = reader.get_attribute ("throws");
- next ();
- DataType return_type;
- if (current_token == MarkupTokenType.START_ELEMENT && reader.name == "return-value") {
- return_type = parse_return_value ();
- } else {
- return_type = new VoidType ();
+ if (element_name == "callback") {
+ m.is_virtual = true;
+ } else if (element_name == "function") {
+ m.binding = MemberBinding.STATIC;
}
- var m = new Method (name, return_type, get_current_src ());
- m.access = SymbolAccessibility.PUBLIC;
- m.is_virtual = true;
+
+ var parameters = new ArrayList<FormalParameter> ();
+ var array_length_parameters = new ArrayList<int> ();
+ var closure_parameters = new ArrayList<int> ();
+ var destroy_parameters = new ArrayList<int> ();
if (current_token == MarkupTokenType.START_ELEMENT && reader.name == "parameters") {
start_element ("parameters");
next ();
+
bool first = true;
while (current_token == MarkupTokenType.START_ELEMENT) {
- var param = parse_parameter ();
- // first parameter is instance pointer, ignore
- if (!first) {
- m.add_parameter (param);
+ int array_length_idx, closure_idx, destroy_idx;
+ var param = parse_parameter (out array_length_idx, out closure_idx, out destroy_idx);
+ if (array_length_idx != -1) {
+ array_length_parameters.add (array_length_idx);
+ }
+ if (closure_idx != -1) {
+ closure_parameters.add (closure_idx);
+ }
+ if (destroy_idx != -1) {
+ destroy_parameters.add (destroy_idx);
+ }
+ // first parameter is instance pointer in virtual methods, ignore
+ if (element_name != "callback" || !first) {
+ parameters.add (param);
} else {
first = false;
}
}
end_element ("parameters");
}
+ int i = 0;
+
+ if (element_name == "method") {
+ // implicit instance parameter
+ i++;
+ }
+
+ foreach (FormalParameter param in parameters) {
+ if (!array_length_parameters.contains (i)
+ && !closure_parameters.contains (i)
+ && !destroy_parameters.contains (i)) {
+ m.add_parameter (param);
+ }
+ i++;
+ }
if (throws_string == "1") {
m.add_error_type (new ErrorType (null, null));
}
- end_element ("callback");
+ end_element (element_name);
return m;
}
@@ -818,7 +819,7 @@
} else if (reader.name == "constructor") {
parse_constructor ();
} else if (reader.name == "method") {
- st.add_method (parse_method ());
+ st.add_method (parse_method ("method"));
} else {
// error
Report.error (get_current_src (), "unknown child element `%s' in `class'".printf (reader.name));
@@ -842,7 +843,7 @@
} else if (reader.name == "constructor") {
parse_constructor ();
} else if (reader.name == "method") {
- st.add_method (parse_method ());
+ st.add_method (parse_method ("method"));
} else {
// error
Report.error (get_current_src (), "unknown child element `%s' in `union'".printf (reader.name));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]