Bug 1399059 - Part 3 - Don't return offset from getEntity. r?Pike draft
authorStaś Małolepszy <stas@mozilla.com>
Fri, 15 Sep 2017 16:38:10 +0200
changeset 329 db20f168ef12041571b277d7bfb14582246f4b2a
parent 328 37cfd135777ea6d3cfd5db5cb8280ebffdfe3901
child 330 df70a282f950d7efb65de38e2fa76974a7cf72fb
push id105
push usersmalolepszy@mozilla.com
push dateThu, 21 Sep 2017 17:02:01 +0000
reviewersPike
bugs1399059
Bug 1399059 - Part 3 - Don't return offset from getEntity. r?Pike MozReview-Commit-ID: DAbWaMsO5cg
compare_locales/parser.py
--- a/compare_locales/parser.py
+++ b/compare_locales/parser.py
@@ -244,53 +244,54 @@ class Parser(object):
         return self.walk(onlyEntities=True)
 
     def walk(self, onlyEntities=False):
         if not self.ctx:
             # loading file failed, or we just didn't load anything
             return
         ctx = self.ctx
         contents = ctx.contents
+
         offset = 0
-        entity, offset = self.getEntity(ctx, offset)
+        entity = self.getEntity(ctx, offset)
         while entity:
-            if (not onlyEntities or
-                    isinstance(entity, Entity) or
-                    type(entity) is Junk):
+            offset = entity.span[1]
+
+            if (not onlyEntities or isinstance(entity, (Entity, Junk))):
                 yield entity
-            entity, offset = self.getEntity(ctx, offset)
+
+            entity = self.getEntity(ctx, offset)
+
         if len(contents) > offset:
             yield Junk(ctx, (offset, len(contents)))
 
     def getEntity(self, ctx, offset):
         m = self.reKey.match(ctx.contents, offset)
         if m:
-            offset = m.end()
             entity = self.createEntity(ctx, m)
-            return (entity, offset)
+            return entity
         m = self.reComment.match(ctx.contents, offset)
         if m:
-            offset = m.end()
             self.last_comment = Comment(ctx, *[m.span(i) for i in xrange(2)])
-            return (self.last_comment, offset)
+            return self.last_comment
         return self.getTrailing(ctx, offset, self.reKey, self.reComment)
 
     def getTrailing(self, ctx, offset, *expressions):
         junkend = None
         for exp in expressions:
             m = exp.search(ctx.contents, offset)
             if m:
                 junkend = min(junkend, m.start()) if junkend else m.start()
         if junkend is None:
             if self.tail.match(ctx.contents, offset):
                 white_end = len(ctx.contents)
-                return (Whitespace(ctx, (offset, white_end)), white_end)
+                return Whitespace(ctx, (offset, white_end))
             else:
-                return (None, offset)
-        return (Junk(ctx, (offset, junkend)), junkend)
+                return None
+        return Junk(ctx, (offset, junkend))
 
     def createEntity(self, ctx, m):
         pre_comment = self.last_comment
         self.last_comment = None
         return Entity(ctx, pre_comment,
                       *[m.span(i) for i in xrange(4)])
 
     @classmethod
@@ -371,24 +372,23 @@ class DTDParser(Parser):
         Overload Parser.getEntity to special-case ParsedEntities.
         Just check for a parsed entity if that method claims junk.
 
         <!ENTITY % foo SYSTEM "url">
         %foo;
         '''
         if offset is 0 and self.reHeader.match(ctx.contents):
             offset += 1
-        entity, inneroffset = Parser.getEntity(self, ctx, offset)
+        entity = Parser.getEntity(self, ctx, offset)
         if (entity and isinstance(entity, Junk)) or entity is None:
             m = self.rePE.match(ctx.contents, offset)
             if m:
-                inneroffset = m.end()
                 self.last_comment = None
                 entity = DTDEntity(ctx, '', *[m.span(i) for i in xrange(4)])
-        return (entity, inneroffset)
+        return entity
 
     def createEntity(self, ctx, m):
         valspan = m.span('val')
         valspan = (valspan[0]+1, valspan[1]-1)
         pre_comment = self.last_comment
         self.last_comment = None
         return DTDEntity(ctx, pre_comment,
                          m.span(),
@@ -433,17 +433,17 @@ class PropertiesParser(Parser):
                 m = self._trailingWS.match(contents, offset)
                 if not m:
                     break
                 offset = m.end()
             # Extend the 0th span (the whole match) to the end of the trailing
             # whitespace.
             spans[0] = (spans[0][0], offset)
             self.last_comment = Comment(ctx, *spans)
-            return (self.last_comment, offset)
+            return self.last_comment
         m = self.reKey.match(contents, offset)
         if m:
             startline = offset = m.end()
             while True:
                 endval = nextline = contents.find('\n', offset)
                 if nextline == -1:
                     endval = offset = len(contents)
                     break
@@ -464,17 +464,17 @@ class PropertiesParser(Parser):
             pre_comment = self.last_comment
             self.last_comment = None
             entity = PropertiesEntity(
                 ctx, pre_comment,
                 (m.start(), offset),   # full span
                 (m.start(1), offset),   # entity def span
                 m.span(1),   # key span
                 (m.end(), endval))   # value span
-            return (entity, offset)
+            return entity
         return self.getTrailing(ctx, offset, self.reKey, self.reComment)
 
 
 class DefinesInstruction(EntityBase):
     '''Entity-like object representing processing instructions in inc files
     '''
     def __init__(self, ctx, span, def_span, val_span):
         self.ctx = ctx
@@ -505,28 +505,24 @@ class DefinesParser(Parser):
                                '(?:[ \t]*(?:\n|\Z))*',
                                re.M)
         Parser.__init__(self)
 
     def getEntity(self, ctx, offset):
         contents = ctx.contents
         m = self.reComment.match(contents, offset)
         if m:
-            offset = m.end()
             self.last_comment = Comment(ctx, *[m.span(i) for i in xrange(2)])
-            return (self.last_comment, offset)
+            return self.last_comment
         m = self.reKey.match(contents, offset)
         if m:
-            offset = m.end()
-            return (self.createEntity(ctx, m), offset)
+            return self.createEntity(ctx, m)
         m = self.rePI.match(contents, offset)
         if m:
-            offset = m.end()
-            return (DefinesInstruction(ctx, *[m.span(i) for i in xrange(3)]),
-                    offset)
+            return DefinesInstruction(ctx, *[m.span(i) for i in xrange(3)])
         return self.getTrailing(ctx, offset,
                                 self.reComment, self.reKey, self.rePI)
 
 
 class IniSection(EntityBase):
     '''Entity-like object representing sections in ini files
     '''
     def __init__(self, ctx, span, def_span, val_span):
@@ -563,27 +559,24 @@ class IniParser(Parser):
             '((.+?)=(.*))'
             '(?:[ \t]*(?:\n|\Z))*', re.M)
         Parser.__init__(self)
 
     def getEntity(self, ctx, offset):
         contents = ctx.contents
         m = self.reComment.match(contents, offset)
         if m:
-            offset = m.end()
             self.last_comment = Comment(ctx, *[m.span(i) for i in xrange(2)])
-            return (self.last_comment, offset)
+            return self.last_comment
         m = self.reSection.match(contents, offset)
         if m:
-            offset = m.end()
-            return (IniSection(ctx, *[m.span(i) for i in xrange(3)]), offset)
+            return IniSection(ctx, *[m.span(i) for i in xrange(3)])
         m = self.reKey.match(contents, offset)
         if m:
-            offset = m.end()
-            return (self.createEntity(ctx, m), offset)
+            return self.createEntity(ctx, m)
         return self.getTrailing(ctx, offset,
                                 self.reComment, self.reSection, self.reKey)
 
 
 class FluentAttribute(EntityBase):
     ignored_fields = ['span']
 
     def __init__(self, entity, attr_node):