123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- import re
- import checksymbolslib.br as br
- choice = 'part of a choice'
- definition = 'definition'
- helper = 'possible config helper'
- legacy_definition = 'legacy definition'
- legacy_note = 'legacy note'
- legacy_usage = 'legacy usage'
- select = 'selected'
- usage = 'normal usage'
- usage_in_legacy = 'usage inside legacy'
- virtual = 'virtual'
- class DB:
- def __init__(self):
- self.all_symbols = {}
- def __str__(self):
- return str(self.all_symbols)
- def add_symbol_entry(self, symbol, filename, lineno, entry_type):
- if symbol not in self.all_symbols:
- self.all_symbols[symbol] = {}
- if entry_type not in self.all_symbols[symbol]:
- self.all_symbols[symbol][entry_type] = {}
- if filename not in self.all_symbols[symbol][entry_type]:
- self.all_symbols[symbol][entry_type][filename] = []
- self.all_symbols[symbol][entry_type][filename].append(lineno)
- def add_symbol_choice(self, symbol, filename, lineno):
- self.add_symbol_entry(symbol, filename, lineno, choice)
- def add_symbol_definition(self, symbol, filename, lineno):
- self.add_symbol_entry(symbol, filename, lineno, definition)
- def add_symbol_helper(self, symbol, filename, lineno):
- self.add_symbol_entry(symbol, filename, lineno, helper)
- def add_symbol_legacy_definition(self, symbol, filename, lineno):
- self.add_symbol_entry(symbol, filename, lineno, legacy_definition)
- def add_symbol_legacy_note(self, symbol, filename, lineno):
- self.add_symbol_entry(symbol, filename, lineno, legacy_note)
- def add_symbol_legacy_usage(self, symbol, filename, lineno):
- self.add_symbol_entry(symbol, filename, lineno, legacy_usage)
- def add_symbol_select(self, symbol, filename, lineno):
- self.add_symbol_entry(symbol, filename, lineno, select)
- def add_symbol_usage(self, symbol, filename, lineno):
- self.add_symbol_entry(symbol, filename, lineno, usage)
- def add_symbol_usage_in_legacy(self, symbol, filename, lineno):
- self.add_symbol_entry(symbol, filename, lineno, usage_in_legacy)
- def add_symbol_virtual(self, symbol, filename, lineno):
- self.add_symbol_entry(symbol, filename, lineno, virtual)
- def get_symbols_with_pattern(self, pattern):
- re_pattern = re.compile(r'{}'.format(pattern))
- found_symbols = {}
- for symbol, entries in self.all_symbols.items():
- if not re_pattern.search(symbol):
- continue
- found_symbols[symbol] = entries
- return found_symbols
- def get_warnings_for_choices_selected(self):
- warnings = []
- for symbol, entries in self.all_symbols.items():
- if choice not in entries:
- continue
- if select not in entries:
- continue
- all_items = []
- all_items += entries.get(select, {}).items()
- for filename, linenos in all_items:
- for lineno in linenos:
- msg = '{} is part of a "choice" and should not be "select"ed'.format(symbol)
- warnings.append((filename, lineno, msg))
- return warnings
- def get_warnings_for_legacy_symbols_being_used(self):
- warnings = []
- for symbol, entries in self.all_symbols.items():
- if legacy_definition not in entries:
- continue
- if usage not in entries:
- continue
- all_items = []
- all_items += entries.get(usage, {}).items()
- for filename, linenos in all_items:
- for lineno in linenos:
- msg = '{} is a legacy symbol and should not be referenced'.format(symbol)
- warnings.append((filename, lineno, msg))
- return warnings
- def get_warnings_for_legacy_symbols_being_defined(self):
- warnings = []
- for symbol, entries in self.all_symbols.items():
- if legacy_definition not in entries:
- continue
- if definition not in entries:
- continue
- all_items = []
- all_items += entries.get(definition, {}).items()
- for filename, linenos in all_items:
- for lineno in linenos:
- msg = '{} is a legacy symbol and should not be redefined'.format(symbol)
- warnings.append((filename, lineno, msg))
- return warnings
- def get_warnings_for_symbols_without_definition(self):
- warnings = []
- for symbol, entries in self.all_symbols.items():
- if definition in entries:
- continue
- if legacy_definition in entries:
- continue
- if br.re_host_symbol.search(symbol):
- continue
- if br.is_an_optional_symbol_for_a_roofts(symbol):
- continue
- if symbol in br.symbols_defined_only_at_command_line:
- continue
- if symbol in br.symbols_defined_only_when_using_br2_external:
- continue
- if symbol in br.symbols_defined_only_for_barebox_variant:
- continue
- if symbol in br.symbols_not_defined_for_fake_virtual_packages:
- continue
- if virtual in entries:
- continue
- all_items = []
- all_items += entries.get(usage, {}).items()
- all_items += entries.get(legacy_usage, {}).items()
- all_items += entries.get(usage_in_legacy, {}).items()
- for filename, linenos in all_items:
- for lineno in linenos:
- msg = '{} referenced but not defined'.format(symbol)
- warnings.append((filename, lineno, msg))
- return warnings
- def get_warnings_for_symbols_without_usage(self):
- warnings = []
- for symbol, entries in self.all_symbols.items():
- if usage in entries:
- continue
- if usage_in_legacy in entries:
- continue
- if legacy_usage in entries:
- continue
- if symbol in br.symbols_used_only_in_source_code:
- continue
- if symbol in br.symbols_used_only_for_host_variant:
- continue
- if helper in entries:
- continue
- if choice in entries:
- continue
- all_items = []
- all_items += entries.get(definition, {}).items()
- all_items += entries.get(legacy_definition, {}).items()
- for filename, linenos in all_items:
- for lineno in linenos:
- msg = '{} defined but not referenced'.format(symbol)
- warnings.append((filename, lineno, msg))
- return warnings
- def get_warnings_for_symbols_with_legacy_note_and_no_comment_on_usage(self):
- warnings = []
- for symbol, entries in self.all_symbols.items():
- if legacy_note not in entries:
- continue
- if legacy_usage in entries:
- continue
- all_items = []
- all_items += entries.get(usage, {}).items()
- for filename, linenos in all_items:
- for lineno in linenos:
- msg = '{} missing "# legacy"'.format(symbol)
- warnings.append((filename, lineno, msg))
- return warnings
- def get_warnings_for_symbols_with_legacy_note_and_no_usage(self):
- warnings = []
- for symbol, entries in self.all_symbols.items():
- if legacy_note not in entries:
- continue
- if legacy_usage in entries:
- continue
- if usage in entries:
- continue
- all_items = []
- all_items += entries.get(legacy_note, {}).items()
- for filename, linenos in all_items:
- for lineno in linenos:
- msg = '{} not referenced but has a comment stating it is'.format(symbol)
- warnings.append((filename, lineno, msg))
- return warnings
|