#!/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))