From 188c8f049581143a92e3a710203d9c1d6598056b Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Wed, 1 Jan 2014 18:31:37 +0000 Subject: add function and property enumerations to the interface map --- src/jsapi-libdom-function.c | 16 +++++++-------- src/jsapi-libdom-property.c | 14 ++++++++------ src/jsapi-libdom.c | 47 +++++++++++++++++++++++++++++++++++++++++++-- src/webidl-ast.c | 20 +++++++++++++++++++ src/webidl-ast.h | 2 ++ 5 files changed, 83 insertions(+), 16 deletions(-) (limited to 'src') 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, -- cgit v1.2.3