| #!/usr/bin/env python3 |
| # Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| # for details. All rights reserved. Use of this source code is governed by a |
| # BSD-style license that can be found in the LICENSE file. |
| """This module provides maps and sets that report unused elements.""" |
| |
| _monitored_values = [] |
| |
| |
| def FinishMonitoring(includeDart2jsOnly, logger): |
| for value in _monitored_values: |
| if value._dart2jsOnly and not includeDart2jsOnly: |
| continue |
| value.CheckUsage(logger) |
| |
| |
| class MonitoredCollection(object): |
| |
| def __init__(self, name, dart2jsOnly): |
| self.name = name |
| self._used_keys = set() |
| self._dart2jsOnly = dart2jsOnly |
| _monitored_values.append(self) |
| |
| |
| class Dict(MonitoredCollection): |
| """Wrapper for a dict that reports unused keys.""" |
| |
| def __init__(self, name, map, dart2jsOnly=False): |
| super(Dict, self).__init__(name, dart2jsOnly) |
| self._map = map |
| |
| def __getitem__(self, key): |
| self._used_keys.add(key) |
| return self._map[key] |
| |
| def __setitem__(self, key, value): |
| self._map[key] = value |
| |
| def __contains__(self, key): |
| self._used_keys.add(key) |
| return key in self._map |
| |
| def __iter__(self): |
| return self._map.__iter__() |
| |
| def get(self, key, default=None): |
| self._used_keys.add(key) |
| return self._map.get(key, default) |
| |
| def keys(self): |
| return self._map.keys() |
| |
| def CheckUsage(self, logger): |
| for v in sorted(self._map.keys()): |
| if v not in self._used_keys: |
| logger.warn( |
| 'dict \'%s\' has unused key \'%s\'' % (self.name, v)) |
| |
| |
| class Set(MonitoredCollection): |
| """Wrapper for a set that reports unused keys.""" |
| |
| def __init__(self, name, a_set, dart2jsOnly=False): |
| super(Set, self).__init__(name, dart2jsOnly) |
| self._set = a_set |
| |
| def __contains__(self, key): |
| self._used_keys.add(key) |
| return key in self._set |
| |
| def __iter__(self): |
| return self._set.__iter__() |
| |
| def add(self, key): |
| self._set += [key] |
| |
| def CheckUsage(self, logger): |
| for v in sorted(self._set): |
| if v not in self._used_keys: |
| logger.warn('set \'%s\' has unused key \'%s\'' % (self.name, v)) |