ProtoFile parse entity, output from lexed added to object (e.g., positions in the input).
diff --git a/plyproto/model.py b/plyproto/model.py
index e471126..f3b33d6 100644
--- a/plyproto/model.py
+++ b/plyproto/model.py
@@ -10,8 +10,7 @@
def __getattr__(self, name):
if not name.startswith('visit_'):
- raise AttributeError('name must start with visit_ but was {}'
- .format(name))
+ raise AttributeError('name must start with visit_ but was {}'.format(name))
def f(element):
if self.verbose:
@@ -35,6 +34,7 @@
# visitor.visit_ExtensionsDirective(self)
# visitor.visit_Literal(self)
# visitor.visit_Name(self)
+ # visitor.visit_Proto(self)
# Base node
class SourceElement(object):
@@ -42,9 +42,12 @@
A SourceElement is the base class for all elements that occur in a Protocol Buffers
file parsed by plyproto.
'''
- def __init__(self):
+ def __init__(self, linespan=[], lexspan=[], p=None):
super(SourceElement, self).__init__()
- self._fields = []
+ self._fields = [] # ['linespan', 'lexspan']
+ self.linespan = linespan
+ self.lexspan = lexspan
+ self.p = p
def __repr__(self):
equals = ("{0}={1!r}".format(k, getattr(self, k))
@@ -61,31 +64,38 @@
def __ne__(self, other):
return not self == other
+ def setLexData(self, linespan, lexspan):
+ self.linespan = linespan
+ self.lexspan = lexspan
+
+ def setLexObj(self, p):
+ self.p = p
+
def accept(self, visitor):
pass
class PackageStatement(SourceElement):
- def __init__(self, name):
- super(PackageStatement, self).__init__()
- self._fields = ['name']
+ def __init__(self, name, linespan=None, lexspan=None, p=None):
+ super(PackageStatement, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['name']
self.name = name
def accept(self, visitor):
visitor.visit_PackageStatement(self)
class ImportStatement(SourceElement):
- def __init__(self, name):
- super(ImportStatement, self).__init__()
- self._fields = ['name']
+ def __init__(self, name, linespan=None, lexspan=None, p=None):
+ super(ImportStatement, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['name']
self.name = name
def accept(self, visitor):
visitor.visit_ImportStatement(self)
class OptionStatement(SourceElement):
- def __init__(self, name, value):
- super(OptionStatement, self).__init__()
- self._fields = ['name', 'value']
+ def __init__(self, name, value, linespan=None, lexspan=None, p=None):
+ super(OptionStatement, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['name', 'value']
self.name = name
self.value = value
@@ -93,9 +103,9 @@
visitor.visit_OptionStatement(self)
class FieldDirective(SourceElement):
- def __init__(self, name, value):
- super(FieldDirective, self).__init__()
- self._fields = ['name', 'value']
+ def __init__(self, name, value, linespan=None, lexspan=None, p=None):
+ super(FieldDirective, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['name', 'value']
self.name = name
self.value = value
@@ -103,18 +113,18 @@
visitor.visit_FieldDirective(self)
class FieldType(SourceElement):
- def __init__(self, name):
- super(FieldType, self).__init__()
- self._fields = ['name']
+ def __init__(self, name, linespan=None, lexspan=None, p=None):
+ super(FieldType, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['name']
self.name = name
def accept(self, visitor):
visitor.visit_FieldType(self)
class FieldDefinition(SourceElement):
- def __init__(self, field_modifier, ftype, name, fieldId, fieldDirective):
- super(FieldDefinition, self).__init__()
- self._fields = ['field_modifier', 'ftype', 'name', 'fieldId', 'fieldDirective']
+ def __init__(self, field_modifier, ftype, name, fieldId, fieldDirective, linespan=None, lexspan=None, p=None):
+ super(FieldDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['field_modifier', 'ftype', 'name', 'fieldId', 'fieldDirective']
self.name = name
self.field_modifier = field_modifier
self.ftype = ftype
@@ -125,9 +135,9 @@
visitor.visit_FieldDefinition(self)
class EnumFieldDefinition(SourceElement):
- def __init__(self, name, fieldId):
- super(EnumFieldDefinition, self).__init__()
- self._fields = ['name', 'fieldId']
+ def __init__(self, name, fieldId, linespan=None, lexspan=None, p=None):
+ super(EnumFieldDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['name', 'fieldId']
self.name = name
self.fieldId = fieldId
@@ -135,9 +145,9 @@
visitor.visit_EnumFieldDefinition(self)
class EnumDefinition(SourceElement):
- def __init__(self, name, body):
- super(EnumDefinition, self).__init__()
- self._fields = ['name', 'body']
+ def __init__(self, name, body, linespan=None, lexspan=None, p=None):
+ super(EnumDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['name', 'body']
self.name = name
self.body = body
@@ -147,9 +157,9 @@
s.accept(visitor)
class MessageDefinition(SourceElement):
- def __init__(self, name, body):
- super(MessageDefinition, self).__init__()
- self._fields = ['name', 'body']
+ def __init__(self, name, body, linespan=None, lexspan=None, p=None):
+ super(MessageDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['name', 'body']
self.name = name
self.body = body
@@ -159,9 +169,9 @@
s.accept(visitor)
class MessageExtension(SourceElement):
- def __init__(self, name, body):
- super(MessageExtension, self).__init__()
- self._fields = ['name', 'body']
+ def __init__(self, name, body, linespan=None, lexspan=None, p=None):
+ super(MessageExtension, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['name', 'body']
self.name = name
self.body = body
@@ -171,9 +181,9 @@
s.accept(visitor)
class MethodDefinition(SourceElement):
- def __init__(self, name, name2, name3):
- super(MethodDefinition, self).__init__()
- self._fields = ['name', 'name2', 'name3']
+ def __init__(self, name, name2, name3, linespan=None, lexspan=None, p=None):
+ super(MethodDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['name', 'name2', 'name3']
self.name = name
self.name2 = name2
self.name3 = name3
@@ -182,9 +192,9 @@
visitor.visit_MethodDefinition(self)
class ServiceDefinition(SourceElement):
- def __init__(self, name, body):
- super(ServiceDefinition, self).__init__()
- self._fields = ['name', 'body']
+ def __init__(self, name, body, linespan=None, lexspan=None, p=None):
+ super(ServiceDefinition, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['name', 'body']
self.name = name
self.body = body
@@ -197,9 +207,9 @@
pass
class ExtensionsDirective(SourceElement):
- def __init__(self, fromVal, toVal):
- super(ExtensionsDirective, self).__init__()
- self._fields = ['fromVal', 'toVal']
+ def __init__(self, fromVal, toVal, linespan=None, lexspan=None, p=None):
+ super(ExtensionsDirective, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['fromVal', 'toVal']
self.fromVal = fromVal
self.toVal = toVal
@@ -208,9 +218,9 @@
class Literal(SourceElement):
- def __init__(self, value):
- super(Literal, self).__init__()
- self._fields = ['value']
+ def __init__(self, value, linespan=None, lexspan=None, p=None):
+ super(Literal, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['value']
self.value = value
def accept(self, visitor):
@@ -218,9 +228,9 @@
class Name(SourceElement):
- def __init__(self, value):
- super(Name, self).__init__()
- self._fields = ['value']
+ def __init__(self, value, linespan=None, lexspan=None, p=None):
+ super(Name, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['value']
self.value = value
def append_name(self, name):
@@ -232,4 +242,15 @@
def accept(self, visitor):
visitor.visit_Name(self)
+class ProtoFile(SourceElement):
+ def __init__(self, pkg, body, linespan=None, lexspan=None, p=None):
+ super(ProtoFile, self).__init__(linespan=linespan, lexspan=lexspan, p=p)
+ self._fields += ['pkg', 'body']
+ self.pkg = pkg
+ self.body = body
+
+ def accept(self, visitor):
+ if visitor.visit_Proto(self):
+ for s in self.body:
+ s.accept(visitor)