summaryrefslogtreecommitdiffstatshomepage
path: root/scripts/build/complay.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/build/complay.py')
-rw-r--r--scripts/build/complay.py43
1 files changed, 34 insertions, 9 deletions
diff --git a/scripts/build/complay.py b/scripts/build/complay.py
index 8ac24bb005a..f6e7db4320e 100644
--- a/scripts/build/complay.py
+++ b/scripts/build/complay.py
@@ -274,6 +274,7 @@ class LayoutChecker(Minifyer):
except:
self.handleError('Element mamelayout attribute version "%s" is not an integer' % (attrs['version'], ))
self.variable_scopes.append({ })
+ self.repeat_depth.append(0)
self.handlers.append((self.layoutStartHandler, self.layoutEndHandler))
def rootEndHandler(self, name, attrs):
@@ -284,18 +285,24 @@ class LayoutChecker(Minifyer):
if 'name' not in attrs:
self.handleError('Element element missing attribute name')
else:
+ generated_name = self.VARPATTERN.match(attrs['name'])
+ if generated_name:
+ self.generated_element_names = True
if attrs['name'] not in self.elements:
self.elements[attrs['name']] = self.formatLocation()
- elif not self.VARPATTERN.match(attrs['name']):
+ elif not generated_name:
self.handleError('Element element has duplicate name (previous %s)' % (self.elements[attrs['name']], ))
self.handlers.append((self.elementStartHandler, self.elementEndHandler))
elif 'group' == name:
if 'name' not in attrs:
self.handleError('Element group missing attribute name')
else:
+ generated_name = self.VARPATTERN.match(attrs['name'])
+ if generated_name:
+ self.generated_group_names = True
if attrs['name'] not in self.groups:
self.groups[attrs['name']] = self.formatLocation()
- elif not self.VARPATTERN.match(attrs['name']):
+ elif not generated_name:
self.handleError('Element group has duplicate name (previous %s)' % (self.groups[attrs['name']], ))
self.handlers.append((self.groupViewStartHandler, self.groupViewEndHandler))
self.variable_scopes.append({ })
@@ -313,6 +320,15 @@ class LayoutChecker(Minifyer):
self.variable_scopes.append({ })
self.repeat_depth.append(0)
self.have_bounds.append(False)
+ elif 'repeat' == name:
+ if 'count' not in attrs:
+ self.handleError('Element repeat missing attribute count')
+ else:
+ count = self.checkIntAttribute(name, attrs, 'count', None)
+ if (count is not None) and (0 >= count):
+ self.handleError('Element repeat attribute count "%s" is negative' % (attrs['count'], ))
+ self.variable_scopes.append({ })
+ self.repeat_depth[-1] += 1
elif 'param' == name:
self.checkParameter(attrs)
self.ignored_depth = 1
@@ -323,14 +339,19 @@ class LayoutChecker(Minifyer):
self.ignored_depth = 1
def layoutEndHandler(self, name):
- for element in self.referenced_elements:
- if (element not in self.elements) and (not self.VARPATTERN.match(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) and (not self.VARPATTERN.match(group)):
- self.handleError('Group "%s" not found (first referenced at %s)' % (group, self.referenced_groups[group]))
self.variable_scopes.pop()
- self.handlers.pop()
+ if self.repeat_depth[-1]:
+ self.repeat_depth[-1] -= 1
+ else:
+ if not self.generated_element_names:
+ for element in self.referenced_elements:
+ if (element not in self.elements) and (not self.VARPATTERN.match(element)):
+ self.handleError('Element "%s" not found (first referenced at %s)' % (element, self.referenced_elements[element]))
+ if not self.generated_group_names:
+ for group in self.referenced_groups:
+ if (group not in self.groups) and (not self.VARPATTERN.match(group)):
+ self.handleError('Group "%s" not found (first referenced at %s)' % (group, self.referenced_groups[group]))
+ self.handlers.pop()
def elementStartHandler(self, name, attrs):
if name in self.SHAPES:
@@ -456,6 +477,8 @@ class LayoutChecker(Minifyer):
self.repeat_depth = [ ]
self.have_bounds = [ ]
self.have_color = [ ]
+ self.generated_element_names = False
+ self.generated_group_names = False
super(LayoutChecker, self).startDocument()
def endDocument(self):
@@ -471,6 +494,8 @@ class LayoutChecker(Minifyer):
del self.repeat_depth
del self.have_bounds
del self.have_color
+ del self.generated_element_names
+ del self.generated_group_names
super(LayoutChecker, self).endDocument()
def startElement(self, name, attrs):