blob: f3b33d69d07dc462b103a8dc62e0dda77fe13e94 [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_'):
Dusan Klinecc9b031a2014-11-10 13:21:08 +010013 raise AttributeError('name must start with visit_ but was {}'.format(name))
Dusan Klinece26bb022014-11-09 12:21:37 +010014
15 def f(element):
16 if self.verbose:
17 msg = 'unimplemented call to {}; ignoring ({})'
18 print(msg.format(name, element))
19 return True
20 return f
21
22 # visitor.visit_PackageStatement(self)
23 # visitor.visit_ImportStatement(self)
24 # visitor.visit_OptionStatement(self)
25 # visitor.visit_FieldDirective(self)
26 # visitor.visit_FieldType(self)
27 # visitor.visit_FieldDefinition(self)
28 # visitor.visit_EnumFieldDefinition(self)
29 # visitor.visit_EnumDefinition(self)
30 # visitor.visit_MessageDefinition(self)
31 # visitor.visit_MessageExtension(self)
32 # visitor.visit_MethodDefinition(self)
33 # visitor.visit_ServiceDefinition(self)
34 # visitor.visit_ExtensionsDirective(self)
35 # visitor.visit_Literal(self)
36 # visitor.visit_Name(self)
Dusan Klinecc9b031a2014-11-10 13:21:08 +010037 # visitor.visit_Proto(self)
Dusan Klinece26bb022014-11-09 12:21:37 +010038
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 '''
Dusan Klinecc9b031a2014-11-10 13:21:08 +010045 def __init__(self, linespan=[], lexspan=[], p=None):
Dusan Klinecccaa0d92014-11-09 03:21:31 +010046 super(SourceElement, self).__init__()
Dusan Klinecc9b031a2014-11-10 13:21:08 +010047 self._fields = [] # ['linespan', 'lexspan']
48 self.linespan = linespan
49 self.lexspan = lexspan
50 self.p = p
Dusan Klinecccaa0d92014-11-09 03:21:31 +010051
52 def __repr__(self):
53 equals = ("{0}={1!r}".format(k, getattr(self, k))
54 for k in self._fields)
55 args = ", ".join(equals)
56 return "{0}({1})".format(self.__class__.__name__, args)
57
58 def __eq__(self, other):
59 try:
60 return self.__dict__ == other.__dict__
61 except AttributeError:
62 return False
63
64 def __ne__(self, other):
65 return not self == other
66
Dusan Klinecc9b031a2014-11-10 13:21:08 +010067 def setLexData(self, linespan, lexspan):
68 self.linespan = linespan
69 self.lexspan = lexspan
70
71 def setLexObj(self, p):
72 self.p = p
73
Dusan Klinecccaa0d92014-11-09 03:21:31 +010074 def accept(self, visitor):
75 pass
76
Dusan Klinece26bb022014-11-09 12:21:37 +010077class PackageStatement(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +010078 def __init__(self, name, linespan=None, lexspan=None, p=None):
79 super(PackageStatement, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
80 self._fields += ['name']
Dusan Klinecccaa0d92014-11-09 03:21:31 +010081 self.name = name
82
83 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +010084 visitor.visit_PackageStatement(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +010085
86class ImportStatement(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +010087 def __init__(self, name, linespan=None, lexspan=None, p=None):
88 super(ImportStatement, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
89 self._fields += ['name']
Dusan Klinecccaa0d92014-11-09 03:21:31 +010090 self.name = name
91
92 def accept(self, visitor):
93 visitor.visit_ImportStatement(self)
94
Dusan Klinece26bb022014-11-09 12:21:37 +010095class OptionStatement(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +010096 def __init__(self, name, value, linespan=None, lexspan=None, p=None):
97 super(OptionStatement, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
98 self._fields += ['name', 'value']
Dusan Klinecccaa0d92014-11-09 03:21:31 +010099 self.name = name
100 self.value = value
101
102 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100103 visitor.visit_OptionStatement(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100104
Dusan Klinece26bb022014-11-09 12:21:37 +0100105class FieldDirective(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100106 def __init__(self, name, value, linespan=None, lexspan=None, p=None):
107 super(FieldDirective, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
108 self._fields += ['name', 'value']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100109 self.name = name
110 self.value = value
111
112 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100113 visitor.visit_FieldDirective(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100114
Dusan Klinece26bb022014-11-09 12:21:37 +0100115class FieldType(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100116 def __init__(self, name, linespan=None, lexspan=None, p=None):
117 super(FieldType, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
118 self._fields += ['name']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100119 self.name = name
120
121 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100122 visitor.visit_FieldType(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100123
Dusan Klinece26bb022014-11-09 12:21:37 +0100124class FieldDefinition(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100125 def __init__(self, field_modifier, ftype, name, fieldId, fieldDirective, linespan=None, lexspan=None, p=None):
126 super(FieldDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
127 self._fields += ['field_modifier', 'ftype', 'name', 'fieldId', 'fieldDirective']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100128 self.name = name
129 self.field_modifier = field_modifier
130 self.ftype = ftype
131 self.fieldId = fieldId
132 self.fieldDirective = fieldDirective
133
134 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100135 visitor.visit_FieldDefinition(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100136
Dusan Klinece26bb022014-11-09 12:21:37 +0100137class EnumFieldDefinition(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100138 def __init__(self, name, fieldId, linespan=None, lexspan=None, p=None):
139 super(EnumFieldDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
140 self._fields += ['name', 'fieldId']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100141 self.name = name
142 self.fieldId = fieldId
143
144 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100145 visitor.visit_EnumFieldDefinition(self)
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100146
Dusan Klinece26bb022014-11-09 12:21:37 +0100147class EnumDefinition(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100148 def __init__(self, name, body, linespan=None, lexspan=None, p=None):
149 super(EnumDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
150 self._fields += ['name', 'body']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100151 self.name = name
152 self.body = body
153
154 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100155 if visitor.visit_EnumDefinition(self):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100156 for s in self.body:
157 s.accept(visitor)
158
Dusan Klinece26bb022014-11-09 12:21:37 +0100159class MessageDefinition(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100160 def __init__(self, name, body, linespan=None, lexspan=None, p=None):
161 super(MessageDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
162 self._fields += ['name', 'body']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100163 self.name = name
164 self.body = body
165
166 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100167 if visitor.visit_MessageDefinition(self):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100168 for s in self.body:
169 s.accept(visitor)
170
171class MessageExtension(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100172 def __init__(self, name, body, linespan=None, lexspan=None, p=None):
173 super(MessageExtension, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
174 self._fields += ['name', 'body']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100175 self.name = name
176 self.body = body
177
178 def accept(self, visitor):
179 if visitor.visit_MessageExtension(self):
180 for s in self.body:
181 s.accept(visitor)
182
183class MethodDefinition(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100184 def __init__(self, name, name2, name3, linespan=None, lexspan=None, p=None):
185 super(MethodDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
186 self._fields += ['name', 'name2', 'name3']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100187 self.name = name
188 self.name2 = name2
189 self.name3 = name3
190
191 def accept(self, visitor):
192 visitor.visit_MethodDefinition(self)
193
Dusan Klinece26bb022014-11-09 12:21:37 +0100194class ServiceDefinition(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100195 def __init__(self, name, body, linespan=None, lexspan=None, p=None):
196 super(ServiceDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
197 self._fields += ['name', 'body']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100198 self.name = name
199 self.body = body
200
201 def accept(self, visitor):
Dusan Klinece26bb022014-11-09 12:21:37 +0100202 if visitor.visit_ServiceDefinition(self):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100203 for s in self.body:
204 s.accept(visitor)
205
206class ExtensionsMax(SourceElement):
207 pass
208
209class ExtensionsDirective(SourceElement):
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100210 def __init__(self, fromVal, toVal, linespan=None, lexspan=None, p=None):
211 super(ExtensionsDirective, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
212 self._fields += ['fromVal', 'toVal']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100213 self.fromVal = fromVal
214 self.toVal = toVal
215
216 def accept(self, visitor):
217 visitor.visit_ExtensionsDirective(self)
218
219class Literal(SourceElement):
220
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100221 def __init__(self, value, linespan=None, lexspan=None, p=None):
222 super(Literal, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
223 self._fields += ['value']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100224 self.value = value
225
226 def accept(self, visitor):
227 visitor.visit_Literal(self)
228
229class Name(SourceElement):
230
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100231 def __init__(self, value, linespan=None, lexspan=None, p=None):
232 super(Name, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
233 self._fields += ['value']
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100234 self.value = value
235
236 def append_name(self, name):
237 try:
238 self.value = self.value + '.' + name.value
239 except:
240 self.value = self.value + '.' + name
241
242 def accept(self, visitor):
243 visitor.visit_Name(self)
244
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100245class ProtoFile(SourceElement):
Dusan Klinecccaa0d92014-11-09 03:21:31 +0100246
Dusan Klinecc9b031a2014-11-10 13:21:08 +0100247 def __init__(self, pkg, body, linespan=None, lexspan=None, p=None):
248 super(ProtoFile, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
249 self._fields += ['pkg', 'body']
250 self.pkg = pkg
251 self.body = body
252
253 def accept(self, visitor):
254 if visitor.visit_Proto(self):
255 for s in self.body:
256 s.accept(visitor)