blob: e471126e2e29248014856b4d5c63ebac6e00b38d [file] [log] [blame]
Dusan Klinecccaa0d92014-11-09 03:21:31 +01001__author__ = "Dusan (Ph4r05) Klinec"
2__copyright__ = "Copyright (C) 2014 Dusan (ph4r05) Klinec"
3__license__ = "Apache License, Version 2.0"
4__version__ = "1.0"
5
Dusan Klinece26bb022014-11-09 12:21:37 +01006class Visitor(object):
7
8 def __init__(self, verbose=False):
9 self.verbose = verbose
10
11 def __getattr__(self, name):
12 if not name.startswith('visit_'):
13 raise AttributeError('name must start with visit_ but was {}'
14 .format(name))
15
16 def f(element):
17 if self.verbose:
18 msg = 'unimplemented call to {}; ignoring ({})'
19 print(msg.format(name, element))
20 return True
21 return f
22
23 # visitor.visit_PackageStatement(self)
24 # visitor.visit_ImportStatement(self)
25 # visitor.visit_OptionStatement(self)
26 # visitor.visit_FieldDirective(self)
27 # visitor.visit_FieldType(self)
28 # visitor.visit_FieldDefinition(self)
29 # visitor.visit_EnumFieldDefinition(self)
30 # visitor.visit_EnumDefinition(self)
31 # visitor.visit_MessageDefinition(self)
32 # visitor.visit_MessageExtension(self)
33 # visitor.visit_MethodDefinition(self)
34 # visitor.visit_ServiceDefinition(self)
35 # visitor.visit_ExtensionsDirective(self)
36 # visitor.visit_Literal(self)
37 # visitor.visit_Name(self)
38
Dusan Klinecccaa0d92014-11-09 03:21:31 +010039# Base node
40class SourceElement(object):
41 '''
Dusan Klinece26bb022014-11-09 12:21:37 +010042 A SourceElement is the base class for all elements that occur in a Protocol Buffers
43 file parsed by plyproto.
Dusan Klinecccaa0d92014-11-09 03:21:31 +010044 '''
45 def __init__(self):
46 super(SourceElement, self).__init__()
47 self._fields = []
48
49 def __repr__(self):
50 equals = ("{0}={1!r}".format(k, getattr(self, k))
51 for k in self._fields)
52 args = ", ".join(equals)
53 return "{0}({1})".format(self.__class__.__name__, args)
54
55 def __eq__(self, other):
56 try:
57 return self.__dict__ == other.__dict__
58 except AttributeError:
59 return False
60
61 def __ne__(self, other):
62 return not self == other
63
64 def accept(self, visitor):
65 pass
66
Dusan Klinece26bb022014-11-09 12:21:37 +010067class PackageStatement(SourceElement):
Dusan Klinecccaa0d92014-11-09 03:21:31 +010068 def __init__(self, name):
Dusan Klinece26bb022014-11-09 12:21:37 +010069 super(PackageStatement, self).__init__()
Dusan Klinecccaa0d92014-11-09 03:21:31 +010070 self._fields = ['name']
71 self.name = name
72
73 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +010074 visitor.visit_PackageStatement(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +010075
76class ImportStatement(SourceElement):
77 def __init__(self, name):
78 super(ImportStatement, self).__init__()
79 self._fields = ['name']
80 self.name = name
81
82 def accept(self, visitor):
83 visitor.visit_ImportStatement(self)
84
Dusan Klinece26bb022014-11-09 12:21:37 +010085class OptionStatement(SourceElement):
Dusan Klinecccaa0d92014-11-09 03:21:31 +010086 def __init__(self, name, value):
Dusan Klinece26bb022014-11-09 12:21:37 +010087 super(OptionStatement, self).__init__()
Dusan Klinecccaa0d92014-11-09 03:21:31 +010088 self._fields = ['name', 'value']
89 self.name = name
90 self.value = value
91
92 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +010093 visitor.visit_OptionStatement(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +010094
Dusan Klinece26bb022014-11-09 12:21:37 +010095class FieldDirective(SourceElement):
Dusan Klinecccaa0d92014-11-09 03:21:31 +010096 def __init__(self, name, value):
Dusan Klinece26bb022014-11-09 12:21:37 +010097 super(FieldDirective, self).__init__()
Dusan Klinecccaa0d92014-11-09 03:21:31 +010098 self._fields = ['name', 'value']
99 self.name = name
100 self.value = value
101
102 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100103 visitor.visit_FieldDirective(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100104
Dusan Klinece26bb022014-11-09 12:21:37 +0100105class FieldType(SourceElement):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100106 def __init__(self, name):
Dusan Klinece26bb022014-11-09 12:21:37 +0100107 super(FieldType, self).__init__()
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100108 self._fields = ['name']
109 self.name = name
110
111 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100112 visitor.visit_FieldType(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100113
Dusan Klinece26bb022014-11-09 12:21:37 +0100114class FieldDefinition(SourceElement):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100115 def __init__(self, field_modifier, ftype, name, fieldId, fieldDirective):
Dusan Klinece26bb022014-11-09 12:21:37 +0100116 super(FieldDefinition, self).__init__()
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100117 self._fields = ['field_modifier', 'ftype', 'name', 'fieldId', 'fieldDirective']
118 self.name = name
119 self.field_modifier = field_modifier
120 self.ftype = ftype
121 self.fieldId = fieldId
122 self.fieldDirective = fieldDirective
123
124 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100125 visitor.visit_FieldDefinition(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100126
Dusan Klinece26bb022014-11-09 12:21:37 +0100127class EnumFieldDefinition(SourceElement):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100128 def __init__(self, name, fieldId):
Dusan Klinece26bb022014-11-09 12:21:37 +0100129 super(EnumFieldDefinition, self).__init__()
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100130 self._fields = ['name', 'fieldId']
131 self.name = name
132 self.fieldId = fieldId
133
134 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100135 visitor.visit_EnumFieldDefinition(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100136
Dusan Klinece26bb022014-11-09 12:21:37 +0100137class EnumDefinition(SourceElement):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100138 def __init__(self, name, body):
Dusan Klinece26bb022014-11-09 12:21:37 +0100139 super(EnumDefinition, self).__init__()
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100140 self._fields = ['name', 'body']
141 self.name = name
142 self.body = body
143
144 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100145 if visitor.visit_EnumDefinition(self):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100146 for s in self.body:
147 s.accept(visitor)
148
Dusan Klinece26bb022014-11-09 12:21:37 +0100149class MessageDefinition(SourceElement):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100150 def __init__(self, name, body):
Dusan Klinece26bb022014-11-09 12:21:37 +0100151 super(MessageDefinition, self).__init__()
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100152 self._fields = ['name', 'body']
153 self.name = name
154 self.body = body
155
156 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100157 if visitor.visit_MessageDefinition(self):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100158 for s in self.body:
159 s.accept(visitor)
160
161class MessageExtension(SourceElement):
162 def __init__(self, name, body):
163 super(MessageExtension, self).__init__()
164 self._fields = ['name', 'body']
165 self.name = name
166 self.body = body
167
168 def accept(self, visitor):
169 if visitor.visit_MessageExtension(self):
170 for s in self.body:
171 s.accept(visitor)
172
173class MethodDefinition(SourceElement):
174 def __init__(self, name, name2, name3):
175 super(MethodDefinition, self).__init__()
176 self._fields = ['name', 'name2', 'name3']
177 self.name = name
178 self.name2 = name2
179 self.name3 = name3
180
181 def accept(self, visitor):
182 visitor.visit_MethodDefinition(self)
183
Dusan Klinece26bb022014-11-09 12:21:37 +0100184class ServiceDefinition(SourceElement):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100185 def __init__(self, name, body):
Dusan Klinece26bb022014-11-09 12:21:37 +0100186 super(ServiceDefinition, self).__init__()
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100187 self._fields = ['name', 'body']
188 self.name = name
189 self.body = body
190
191 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100192 if visitor.visit_ServiceDefinition(self):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100193 for s in self.body:
194 s.accept(visitor)
195
196class ExtensionsMax(SourceElement):
197 pass
198
199class ExtensionsDirective(SourceElement):
200 def __init__(self, fromVal, toVal):
201 super(ExtensionsDirective, self).__init__()
202 self._fields = ['fromVal', 'toVal']
203 self.fromVal = fromVal
204 self.toVal = toVal
205
206 def accept(self, visitor):
207 visitor.visit_ExtensionsDirective(self)
208
209class Literal(SourceElement):
210
211 def __init__(self, value):
212 super(Literal, self).__init__()
213 self._fields = ['value']
214 self.value = value
215
216 def accept(self, visitor):
217 visitor.visit_Literal(self)
218
219class Name(SourceElement):
220
221 def __init__(self, value):
222 super(Name, self).__init__()
223 self._fields = ['value']
224 self.value = value
225
226 def append_name(self, name):
227 try:
228 self.value = self.value + '.' + name.value
229 except:
230 self.value = self.value + '.' + name
231
232 def accept(self, visitor):
233 visitor.visit_Name(self)
234
235