Add codegen to the tracked files
[platform/upstream/gst-editing-services.git] / bindings / python / codegen / defsparser.py
1 # -*- Mode: Python; py-indent-offset: 4 -*-
2 import os, sys
3 import scmexpr
4 from definitions import BoxedDef, EnumDef, FlagsDef, FunctionDef, \
5      InterfaceDef, MethodDef, ObjectDef, MiniObjectDef, PointerDef, \
6      VirtualDef
7
8 class IncludeParser(scmexpr.Parser):
9     """A simple parser that follows include statements automatically"""
10     def include(self, filename):
11         if not os.path.isabs(filename):
12             filename = os.path.join(os.path.dirname(self.filename), filename)
13
14         # set self.filename to the include name, to handle recursive includes
15         oldfile = self.filename
16         self.filename = filename
17         self.startParsing()
18         self.filename = oldfile
19
20 class DefsParser(IncludeParser):
21     def __init__(self, arg, defines={}):
22         IncludeParser.__init__(self, arg)
23         self.objects = []
24         self.miniobjects = []
25         self.interfaces = []
26         self.enums = []      # enums and flags
27         self.boxes = []      # boxed types
28         self.pointers = []   # pointer types
29         self.functions = []  # functions and methods
30         self.virtuals = []   # virtual methods
31         self.c_name = {}     # hash of c names of functions
32         self.methods = {}    # hash of methods of particular objects
33         self.defines = defines      # -Dfoo=bar options, as dictionary
34
35     def define_object(self, *args):
36         odef = apply(ObjectDef, args)
37         self.objects.append(odef)
38         self.c_name[odef.c_name] = odef
39     # TODO: define_mini_object
40     def define_miniobject(self, *args):
41         odef = apply(MiniObjectDef, args)
42         self.miniobjects.append(odef)
43         self.c_name[odef.c_name] = odef
44     def define_interface(self, *args):
45         idef = apply(InterfaceDef, args)
46         self.interfaces.append(idef)
47         self.c_name[idef.c_name] = idef
48     def define_enum(self, *args):
49         edef = apply(EnumDef, args)
50         self.enums.append(edef)
51         self.c_name[edef.c_name] = edef
52     def define_flags(self, *args):
53         fdef = apply(FlagsDef, args)
54         self.enums.append(fdef)
55         self.c_name[fdef.c_name] = fdef
56     def define_boxed(self, *args):
57         bdef = apply(BoxedDef, args)
58         self.boxes.append(bdef)
59         self.c_name[bdef.c_name] = bdef
60     def define_pointer(self, *args):
61         pdef = apply(PointerDef, args)
62         self.pointers.append(pdef)
63         self.c_name[pdef.c_name] = pdef
64     def define_function(self, *args):
65         fdef = apply(FunctionDef, args)
66         self.functions.append(fdef)
67         self.c_name[fdef.c_name] = fdef
68     def define_method(self, *args):
69         mdef = apply(MethodDef, args)
70         self.functions.append(mdef)
71         self.c_name[mdef.c_name] = mdef
72     def define_virtual(self, *args):
73         vdef = apply(VirtualDef, args)
74         self.virtuals.append(vdef)
75     def merge(self, old, parmerge):
76         for obj in self.objects:
77             if old.c_name.has_key(obj.c_name):
78                 obj.merge(old.c_name[obj.c_name])
79         for f in self.functions:
80             if old.c_name.has_key(f.c_name):
81                 f.merge(old.c_name[f.c_name], parmerge)
82
83     def printMissing(self, old):
84         for obj in self.objects:
85             if not old.c_name.has_key(obj.c_name):
86                 obj.write_defs()
87         for f in self.functions:
88             if not old.c_name.has_key(f.c_name):
89                 f.write_defs()
90
91     def write_defs(self, fp=sys.stdout):
92         for obj in self.objects:
93             obj.write_defs(fp)
94         # TODO: Add miniobject
95         for obj in self.miniobjects:
96             obj.write_defs(fp)
97         for enum in self.enums:
98             enum.write_defs(fp)
99         for boxed in self.boxes:
100             boxed.write_defs(fp)
101         for pointer in self.pointers:
102             pointer.write_defs(fp)
103         for func in self.functions:
104             func.write_defs(fp)
105
106     def find_object(self, c_name):
107         for obj in self.objects:
108             if obj.c_name == c_name:
109                 return obj
110         else:
111             raise ValueError, 'object not found'
112
113     def find_constructor(self, obj, overrides):
114         for func in self.functions:
115             if isinstance(func, FunctionDef) and \
116                func.is_constructor_of == obj.c_name and \
117                not overrides.is_ignored(func.c_name):
118                 return func
119
120     def find_methods(self, obj):
121         objname = obj.c_name
122         return filter(lambda func, on=objname: isinstance(func, MethodDef) and
123                       func.of_object == on, self.functions)
124
125     def find_virtuals(self, obj):
126         objname = obj.c_name
127         retval = filter(lambda func, on=objname: isinstance(func, VirtualDef) and
128                         func.of_object == on, self.virtuals)
129         return retval
130
131     def find_functions(self):
132         return filter(lambda func: isinstance(func, FunctionDef) and
133                       not func.is_constructor_of, self.functions)
134
135     def ifdef(self, *args):
136         if args[0] in self.defines:
137             for arg in args[1:]:
138                 self.handle(arg)
139
140     def ifndef(self, *args):
141         if args[0] not in self.defines:
142             for arg in args[1:]:
143                 self.handle(arg)