summaryrefslogtreecommitdiff
path: root/src/interface-map.h
blob: 5f1926e4c21601a7f8971bae28aa300bebffb939 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* Interface mapping
 *
 * 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_interface_map_h
#define nsgenbind_interface_map_h

struct genbind_node;
struct webidl_node;

/**
 *map entry for each argument of an overload on an operation
 */
struct interface_map_operation_argument_entry {
        const char *name;

        int optionalc; /**< Number of parameters that are optional */
        int elipsisc; /**< Number of elipsis parameters */

        struct webidl_node *node;
};

/** map entry for each overload of an operation */
struct interface_map_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 interface_map_operation_argument_entry *argumentv;
};

/** map entry for operations on an interface */
struct interface_map_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 interface_map_operation_overload_entry *overloadv;
};

/** map entry for attributes on an interface */
struct interface_map_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 interface_map_constant_entry {
        const char *name; /** attribute name */
        struct webidl_node *node; /**< AST constant node */
};

/** map entry for an interface */
struct interface_map_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 interface_map_operation_entry *operationv;

        int attributec; /**< number of attributes on interface */
        struct interface_map_attribute_entry *attributev;

        int constantc; /**< number of constants on interface */
        struct interface_map_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.
                              */
};

/** WebIDL interface map */
struct interface_map {
        int entryc; /**< count of interfaces */
        struct interface_map_entry *entries; /**< interface 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 interface_map_new(struct genbind_node *genbind,
                      struct webidl_node *webidl,
                      struct interface_map **map_out);

int interface_map_dump(struct interface_map *map);

int interface_map_dumpdot(struct interface_map *map);

/**
 * interface map parent entry
 *
 * \return inherit entry or NULL if there is not one
 */
struct interface_map_entry *interface_map_inherit_entry(struct interface_map *map, struct interface_map_entry *entry);

#endif