From e8d19a2821bfd15bcbe8d17f6564439c1673cbf7 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Mon, 17 Aug 2015 19:12:51 +0200 Subject: rename interface map to be intermediate representation The interface map is now completely inapropriately named and is in fact now an intermediate representation of the webidl and bindings kept in a sorted order. --- src/ir.h | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 src/ir.h (limited to 'src/ir.h') diff --git a/src/ir.h b/src/ir.h new file mode 100644 index 0000000..4d0365e --- /dev/null +++ b/src/ir.h @@ -0,0 +1,151 @@ +/* intermediate representation of WebIDL and binding data + * + * This file is part of nsgenbind. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2012 Vincent Sanders + */ + +#ifndef nsgenbind_ir_h +#define nsgenbind_ir_h + +struct genbind_node; +struct webidl_node; + +/** + * map entry for each argument of an overload on an operation + */ +struct ir_operation_argument_entry { + const char *name; + + int optionalc; /**< 1 if the argument is optional */ + int elipsisc; /**< 1 if the argument is an elipsis */ + + struct webidl_node *node; +}; + +/** map entry for each overload of an operation */ +struct ir_operation_overload_entry { + struct webidl_node *type; /**< The return type of this overload */ + + int optionalc; /**< Number of parameters that are optional */ + int elipsisc; /**< Number of elipsis parameters */ + + int argumentc; /**< the number of parameters */ + struct ir_operation_argument_entry *argumentv; +}; + +/** map entry for operations on an interface */ +struct ir_operation_entry { + const char *name; /** operation name */ + struct webidl_node *node; /**< AST operation node */ + struct genbind_node *method; /**< method from binding */ + + int overloadc; /**< Number of overloads of this operation */ + struct ir_operation_overload_entry *overloadv; +}; + +/** map entry for attributes on an interface */ +struct ir_attribute_entry { + const char *name; /** attribute name */ + struct webidl_node *node; /**< AST attribute node */ + enum webidl_type_modifier modifier; + struct genbind_node *getter; /**< getter from binding */ + struct genbind_node *setter; /**< getter from binding */ +}; + +/** map entry for constants on an interface */ +struct ir_constant_entry { + const char *name; /** attribute name */ + struct webidl_node *node; /**< AST constant node */ +}; + +/** map entry for an interface */ +struct ir_interface_entry { + const char *name; /** interface name */ + struct webidl_node *node; /**< AST interface node */ + const char *inherit_name; /**< Name of interface inhertited from */ + int inherit_idx; /**< index into map of inherited interface or -1 for + * not in map + */ + int refcount; /**< number of interfacess in map that refer to this + * interface + */ + bool noobject; /**< flag indicating if no interface object should eb + * generated. This allows for interfaces which do not + * generate code. For implements (mixin) interfaces + */ + bool primary_global; /**< flag indicating the interface is the primary + * global javascript object. + */ + + int operationc; /**< number of operations on interface */ + struct ir_operation_entry *operationv; + + int attributec; /**< number of attributes on interface */ + struct ir_attribute_entry *attributev; + + int constantc; /**< number of constants on interface */ + struct ir_constant_entry *constantv; + + + struct genbind_node *class; /**< class from binding (if any) */ + + /* The variables are created and used by the output generation but + * rtaher than have another allocation and pointer the data they are + * just inline here. + */ + + char *filename; /**< filename used for output */ + + char *class_name; /**< the interface name converted to output + * appropriate value. e.g. generators targetting c + * might lowercase the name or add underscores + * instead of caps + */ + int class_init_argc; /**< The number of parameters on the class + * initializer. + */ +}; + +/** map entry for a dictionary */ +struct ir_dictionary_entry { + const char *name; /** dictionary name */ + struct webidl_node *node; /**< AST dictionary node */ + const char *inherit_name; /**< Name of interface inhertited from */ +}; + +/** intermediate representation of WebIDL and binding data */ +struct ir { + int interfacec; /**< count of interfaces */ + struct ir_interface_entry *interfaces; /**< interface entries */ + + int dictionaryc; /**< count of dictionaries */ + struct ir_dictionary_entry *dictionaries; /**< dictionary entries */ + + /** The AST node of the binding information */ + struct genbind_node *binding_node; + + /** Root AST node of the webIDL */ + struct webidl_node *webidl; +}; + +/** + * Create a new interface map + */ +int ir_new(struct genbind_node *genbind, + struct webidl_node *webidl, + struct ir **map_out); + +int ir_dump(struct ir *map); + +int ir_dumpdot(struct ir *map); + +/** + * interface map parent entry + * + * \return inherit entry or NULL if there is not one + */ +struct ir_interface_entry *ir_inherit_entry(struct ir *map, struct ir_interface_entry *entry); + +#endif -- cgit v1.2.3