summaryrefslogtreecommitdiff
path: root/src/ir.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir.h')
-rw-r--r--src/ir.h151
1 files changed, 151 insertions, 0 deletions
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 <vince@netsurf-browser.org>
+ */
+
+#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