diff options
Diffstat (limited to 'scripts/build')
-rw-r--r-- | scripts/build/complay.py | 89 |
1 files changed, 62 insertions, 27 deletions
diff --git a/scripts/build/complay.py b/scripts/build/complay.py index 4332a952c27..af5003581e6 100644 --- a/scripts/build/complay.py +++ b/scripts/build/complay.py @@ -101,8 +101,10 @@ class LayoutChecker(Minifyer): self.locator = None self.errors = 0 self.elements = { } + self.groups = { } self.views = { } - self.referenced = { } + self.referenced_elements = { } + self.referenced_groups = { } self.have_bounds = [ ] self.have_color = [ ] @@ -163,6 +165,38 @@ class LayoutChecker(Minifyer): except: self.handleError('Element color attribute %s "%s" is not numeric' % (name, attrs[name])) + def checkGroupViewItem(self, name, attrs): + if name in self.OBJECTS: + if 'element' not in attrs: + self.handleError('Element %s missing attribute element', (name, )) + elif attrs['element'] not in self.referenced_elements: + self.referenced_elements[attrs['element']] = self.formatLocation() + self.in_object = True + self.have_bounds.append(False) + elif 'screen' == name: + if 'index' in attrs: + try: + index = long(attrs['index']) + if 0 > index: + self.handleError('Element screen attribute index "%s" is negative' % (attrs['index'], )) + except: + self.handleError('Element screen attribute index "%s" is not an integer' % (attrs['index'], )) + self.in_object = True + self.have_bounds.append(False) + elif 'group' == name: + if 'ref' not in attrs: + self.handleError('Element group missing attribute ref') + elif attrs['ref'] not in self.referenced_groups: + self.referenced_groups[attrs['ref']] = self.formatLocation() + self.in_object = True + self.have_bounds.append(False) + elif 'bounds' == name: + self.checkBounds(attrs) + self.ignored_depth = 1 + else: + self.handleError('Encountered unexpected element %s' % (name, )) + self.ignored_depth = 1 + def setDocumentLocator(self, locator): self.locator = locator super(LayoutChecker, self).setDocumentLocator(locator) @@ -170,6 +204,7 @@ class LayoutChecker(Minifyer): def startDocument(self): self.in_layout = False self.in_element = False + self.in_group = False self.in_view = False self.in_shape = False self.in_object = False @@ -179,8 +214,10 @@ class LayoutChecker(Minifyer): def endDocument(self): self.locator = None self.elements.clear() + self.groups.clear() self.views.clear() - self.referenced.clear() + self.referenced_elements.clear() + self.referenced_groups.clear() del self.have_bounds[:] del self.have_color[:] super(LayoutChecker, self).endDocument() @@ -238,29 +275,8 @@ class LayoutChecker(Minifyer): self.have_color.append(False) else: self.ignored_depth = 1 - elif self.in_view: - if name in self.OBJECTS: - if 'element' not in attrs: - self.handleError('Element %s missing attribute element', (name, )) - elif attrs['element'] not in self.referenced: - self.referenced[attrs['element']] = self.formatLocation() - self.in_object = True - self.have_bounds.append(False) - elif 'screen' == name: - if 'index' in attrs: - try: - index = long(attrs['index']) - if 0 > index: - self.handleError('Element screen attribute index "%s" is negative' % (attrs['index'], )) - except: - self.handleError('Element screen attribute index "%s" is not an integer' % (attrs['index'], )) - self.in_object = True - self.have_bounds.append(False) - elif 'bounds' == name: - self.checkBounds(attrs) - self.ignored_depth = 1 - else: - self.ignored_depth = 1 + elif self.in_group or self.in_view: + self.checkGroupViewItem(name, attrs) elif 'element' == name: if 'name' not in attrs: self.handleError('Element element missing attribute name') @@ -270,6 +286,16 @@ class LayoutChecker(Minifyer): else: self.elements[attrs['name']] = self.formatLocation() self.in_element = True + elif 'group' == name: + if 'name' not in attrs: + self.handleError('Element group missing attribute name') + else: + if attrs['name'] in self.groups: + self.handleError('Element group has duplicate name (previous %s)' % (self.groups[attrs['name']], )) + else: + self.groups[attrs['name']] = self.formatLocation() + self.in_group = True + self.have_bounds.append(False) elif 'view' == name: if 'name' not in attrs: self.handleError('Element view missing attribute name') @@ -280,7 +306,10 @@ class LayoutChecker(Minifyer): self.views[attrs['name']] = self.formatLocation() self.in_view = True self.have_bounds.append(False) + elif 'script' == name: + self.ignored_depth = 1 else: + self.handleError('Encountered unexpected element %s' % (name, )) self.ignored_depth = 1 super(LayoutChecker, self).startElement(name, attrs) @@ -296,13 +325,19 @@ class LayoutChecker(Minifyer): self.have_color.pop() elif self.in_element: self.in_element = False + elif self.in_group: + self.in_group = False + self.have_bounds.pop() elif self.in_view: self.in_view = False self.have_bounds.pop() elif self.in_layout: - for element in self.referenced: + for element in self.referenced_elements: if element not in self.elements: - self.handleError('Element "%s" not found (first referenced at %s)' % (element, self.referenced[element])) + self.handleError('Element "%s" not found (first referenced at %s)' % (element, self.referenced_elements[element])) + for group in self.referenced_groups: + if group not in self.groups: + self.handleError('Group "%s" not found (first referenced at %s)' % (group, self.referenced_groups[group])) self.in_layout = False super(LayoutChecker, self).endElement(name) |