diff options
author | Vincent Sanders <vince@kyllikki.org> | 2014-01-01 18:31:37 +0000 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2014-05-16 14:38:56 +0100 |
commit | 188c8f049581143a92e3a710203d9c1d6598056b (patch) | |
tree | 516d49d87f71bfcfa064759ab64efcd43a931502 | |
parent | 0d89adf43b0c3b85d698e333c157e7589f51beb7 (diff) | |
download | nsgenbind-188c8f049581143a92e3a710203d9c1d6598056b.tar.gz nsgenbind-188c8f049581143a92e3a710203d9c1d6598056b.tar.bz2 |
add function and property enumerations to the interface map
-rw-r--r-- | src/jsapi-libdom-function.c | 16 | ||||
-rw-r--r-- | src/jsapi-libdom-property.c | 14 | ||||
-rw-r--r-- | src/jsapi-libdom.c | 47 | ||||
-rw-r--r-- | src/webidl-ast.c | 20 | ||||
-rw-r--r-- | src/webidl-ast.h | 2 |
5 files changed, 83 insertions, 16 deletions
diff --git a/src/jsapi-libdom-function.c b/src/jsapi-libdom-function.c index 594a100..0196c58 100644 --- a/src/jsapi-libdom-function.c +++ b/src/jsapi-libdom-function.c @@ -837,10 +837,10 @@ output_function_body(struct binding *binding, const char *interface) return -1; } - members_node = webidl_node_find(webidl_node_getnode(interface_node), - NULL, - webidl_cmp_node_type, - (void *)WEBIDL_NODE_TYPE_LIST); + members_node = webidl_node_find_type( + webidl_node_getnode(interface_node), + NULL, + WEBIDL_NODE_TYPE_LIST); while (members_node != NULL) { fprintf(binding->outfile,"/**** %s ****/\n", interface); @@ -851,10 +851,10 @@ output_function_body(struct binding *binding, const char *interface) webidl_operator_body_cb, binding); - members_node = webidl_node_find(webidl_node_getnode(interface_node), - members_node, - webidl_cmp_node_type, - (void *)WEBIDL_NODE_TYPE_LIST); + members_node = webidl_node_find_type( + webidl_node_getnode(interface_node), + members_node, + WEBIDL_NODE_TYPE_LIST); } /* check for inherited nodes and insert them too */ diff --git a/src/jsapi-libdom-property.c b/src/jsapi-libdom-property.c index 7e67bae..df296cf 100644 --- a/src/jsapi-libdom-property.c +++ b/src/jsapi-libdom-property.c @@ -986,9 +986,10 @@ generate_property_body(struct binding *binding, const char *interface) } /* generate property bodies */ - members_node = webidl_node_find_type(webidl_node_getnode(interface_node), - NULL, - WEBIDL_NODE_TYPE_LIST); + members_node = webidl_node_find_type( + webidl_node_getnode(interface_node), + NULL, + WEBIDL_NODE_TYPE_LIST); while (members_node != NULL) { fprintf(binding->outfile,"/**** %s ****/\n", interface); @@ -1000,9 +1001,10 @@ generate_property_body(struct binding *binding, const char *interface) binding); - members_node = webidl_node_find_type(webidl_node_getnode(interface_node), - members_node, - WEBIDL_NODE_TYPE_LIST); + members_node = webidl_node_find_type( + webidl_node_getnode(interface_node), + members_node, + WEBIDL_NODE_TYPE_LIST); } diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c index bd1dbbe..2edfc83 100644 --- a/src/jsapi-libdom.c +++ b/src/jsapi-libdom.c @@ -819,6 +819,33 @@ binding_has_private(struct genbind_node *binding_list) return false; } + +/** count the number of methods or properties for an interface */ +static int +enumerate_interface_own(struct webidl_node *interface_node, + enum webidl_node_type node_type) +{ + int count = 0; + struct webidl_node *members_node; + + members_node = webidl_node_find_type( + webidl_node_getnode(interface_node), + NULL, + WEBIDL_NODE_TYPE_LIST); + while (members_node != NULL) { + count += webidl_node_enumerate_type( + webidl_node_getnode(members_node), + node_type); + + members_node = webidl_node_find_type( + webidl_node_getnode(interface_node), + members_node, + WEBIDL_NODE_TYPE_LIST); + } + + return count; +} + /* build interface map and return the first interface */ static struct genbind_node * build_interface_map(struct genbind_node *binding_node, @@ -881,6 +908,17 @@ build_interface_map(struct genbind_node *binding_node, return NULL; } + /* enumerate the number of functions */ + interfaces[idx].own_functions = enumerate_interface_own( + interfaces[idx].widl_node, + WEBIDL_NODE_TYPE_OPERATION); + + /* enumerate the number of properties */ + interfaces[idx].own_properties = enumerate_interface_own( + interfaces[idx].widl_node, + WEBIDL_NODE_TYPE_ATTRIBUTE); + + /* extract the name of the inherited interface (if any) */ interfaces[idx].inherit_name = webidl_node_gettext( webidl_node_find_type( webidl_node_getnode(interfaces[idx].widl_node), @@ -923,14 +961,19 @@ build_interface_map(struct genbind_node *binding_node, /* show the interface map */ if (options->verbose) { for (idx = 0; idx < interfacec; idx++ ) { - printf("interface num:%d name:%s node:%p widl:%p inherit:%s inherit idx:%d refcount:%d\n", + printf("interface num:%d\n" + " name:%s node:%p widl:%p\n" + " inherit:%s inherit idx:%d refcount:%d\n" + " own functions:%d own properties:%d\n", idx, interfaces[idx].name, interfaces[idx].node, interfaces[idx].widl_node, interfaces[idx].inherit_name, interfaces[idx].inherit_idx, - interfaces[idx].refcount); + interfaces[idx].refcount, + interfaces[idx].own_functions, + interfaces[idx].own_properties); } } diff --git a/src/webidl-ast.c b/src/webidl-ast.c index d75a186..8acb2fb 100644 --- a/src/webidl-ast.c +++ b/src/webidl-ast.c @@ -162,6 +162,26 @@ int webidl_cmp_node_type(struct webidl_node *node, void *ctx) return 0; } +static int webidl_enumerate_node(struct webidl_node *node, void *ctx) +{ + node = node; + (*((int *)ctx))++; + return 0; +} + +/* exported interface defined in nsgenbind-ast.h */ +int +webidl_node_enumerate_type(struct webidl_node *node, + enum webidl_node_type type) +{ + int count = 0; + webidl_node_for_each_type(node, + type, + webidl_enumerate_node, + &count); + return count; +} + /* exported interface defined in webidl-ast.h */ struct webidl_node * webidl_node_find(struct webidl_node *node, diff --git a/src/webidl-ast.h b/src/webidl-ast.h index 70518fd..eaa8d44 100644 --- a/src/webidl-ast.h +++ b/src/webidl-ast.h @@ -95,6 +95,8 @@ int webidl_node_for_each_type(struct webidl_node *node, webidl_callback_t *cb, void *ctx); +int webidl_node_enumerate_type(struct webidl_node *node, enum webidl_node_type type); + struct webidl_node * webidl_node_find(struct webidl_node *node, struct webidl_node *prev, |