diff options
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/build/complay.py | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/scripts/build/complay.py b/scripts/build/complay.py index 5dfee05e018..9b3334d96c2 100755 --- a/scripts/build/complay.py +++ b/scripts/build/complay.py @@ -97,7 +97,7 @@ class LayoutChecker(Minifyer): VARPATTERN = re.compile('^.*~[0-9A-Za-z_]+~.*$') FLOATCHARS = re.compile('^.*[.eE].*$') SHAPES = frozenset(('disk', 'dotmatrix', 'dotmatrix5dot', 'dotmatrixdot', 'led14seg', 'led14segsc', 'led16seg', 'led16segsc', 'led7seg', 'led8seg_gts1', 'rect')) - OBJECTS = frozenset(('backdrop', 'bezel')) + OBJECTS = frozenset(('backdrop', )) ORIENTATIONS = frozenset((0, 90, 180, 270)) YESNO = frozenset(('yes', 'no')) BLENDMODES = frozenset(('none', 'alpha', 'multiply', 'add')) @@ -111,6 +111,8 @@ class LayoutChecker(Minifyer): self.views = { } self.referenced_elements = { } self.referenced_groups = { } + self.group_collections = { } + self.current_collections = None def formatLocation(self): return '%s:%d:%d' % (self.locator.getSystemId(), self.locator.getLineNumber(), self.locator.getColumnNumber()) @@ -320,6 +322,7 @@ class LayoutChecker(Minifyer): self.handleError('Element element attribute defstate "%s" is negative' % (attrs['defstate'], )) self.handlers.append((self.elementStartHandler, self.elementEndHandler)) elif 'group' == name: + self.current_collections = { } if 'name' not in attrs: self.handleError('Element group missing attribute name') else: @@ -328,6 +331,8 @@ class LayoutChecker(Minifyer): self.generated_group_names = True if attrs['name'] not in self.groups: self.groups[attrs['name']] = self.formatLocation() + if not generated_name: + self.group_collections[attrs['name']] = self.current_collections elif not generated_name: self.handleError('Element group has duplicate name (previous %s)' % (self.groups[attrs['name']], )) self.handlers.append((self.groupViewStartHandler, self.groupViewEndHandler)) @@ -335,6 +340,7 @@ class LayoutChecker(Minifyer): self.repeat_depth.append(0) self.have_bounds.append(False) elif ('view' == name) and (not self.repeat_depth[-1]): + self.current_collections = { } if 'name' not in attrs: self.handleError('Element view missing attribute name') else: @@ -475,7 +481,7 @@ class LayoutChecker(Minifyer): if ('element' != name) and not self.has_legacy_object: self.has_legacy_object = True if self.has_collection: - self.handleError('Layout contains collection as well as legacy backdrop/bezel elements') + self.handleError('Layout contains collection as well as legacy backdrop elements') self.handlers.append((self.objectStartHandler, self.objectEndHandler)) self.have_bounds.append(False) self.have_orientation.append(False) @@ -497,8 +503,15 @@ class LayoutChecker(Minifyer): 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() + else: + if attrs['ref'] not in self.referenced_groups: + self.referenced_groups[attrs['ref']] = self.formatLocation() + if (not self.VARPATTERN.match(attrs['ref'])) and (attrs['ref'] in self.group_collections): + for n, l in self.group_collections[attrs['ref']].items(): + if n not in self.current_collections: + self.current_collections[n] = l + else: + self.handleError('Element group instantiates collection with duplicate name "%s" from %s (previous %s)' % (n, l, self.current_collections[n])) self.handlers.append((self.objectStartHandler, self.objectEndHandler)) self.have_bounds.append(False) self.have_orientation.append(False) @@ -514,12 +527,17 @@ class LayoutChecker(Minifyer): elif 'collection' == name: if 'name' not in attrs: self.handleError('Element collection missing attribute name') + elif not self.VARPATTERN.match(attrs['name']): + if attrs['name'] not in self.current_collections: + self.current_collections[attrs['name']] = self.formatLocation() + else: + self.handleError('Element collection has duplicate name (previous %s)' % (self.current_collections[attrs['name']], )) if attrs.get('visible', 'yes') not in self.YESNO: self.handleError('Element collection attribute visible "%s" is not "yes" or "no"' % (attrs['visible'], )) if not self.has_collection: self.has_collection = True if self.has_legacy_object: - self.handleError('Layout contains collection as well as legacy backdrop/bezel elements') + self.handleError('Layout contains collection as well as legacy backdrop elements') self.variable_scopes.append({ }) self.collection_depth += 1 elif 'param' == name: @@ -543,6 +561,7 @@ class LayoutChecker(Minifyer): elif self.repeat_depth[-1]: self.repeat_depth[-1] -= 1 else: + self.current_collections = None self.repeat_depth.pop() self.have_bounds.pop() self.handlers.pop() @@ -585,6 +604,8 @@ class LayoutChecker(Minifyer): self.views.clear() self.referenced_elements.clear() self.referenced_groups.clear() + self.group_collections.clear() + self.current_collections = None del self.handlers del self.ignored_depth del self.variable_scopes |