kconfig.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import os
  2. import checksymbolslib.br as br
  3. def all_symbols_from(line):
  4. clean_line = br.re_comments.sub('', line)
  5. symbols = br.re_kconfig_symbol.findall(clean_line)
  6. return symbols
  7. def handle_definition(db, filename, lineno, line, legacy):
  8. for symbol in all_symbols_from(line):
  9. if legacy:
  10. db.add_symbol_legacy_definition(symbol, filename, lineno)
  11. else:
  12. db.add_symbol_definition(symbol, filename, lineno)
  13. def handle_usage(db, filename, lineno, line, legacy):
  14. for symbol in all_symbols_from(line):
  15. if legacy:
  16. db.add_symbol_usage_in_legacy(symbol, filename, lineno)
  17. else:
  18. db.add_symbol_usage(symbol, filename, lineno)
  19. def handle_default(db, filename, lineno, line, legacy):
  20. if legacy:
  21. handle_usage(db, filename, lineno, line, legacy)
  22. return
  23. if not br.re_kconfig_default_legacy_comment.search(line):
  24. handle_usage(db, filename, lineno, line, legacy)
  25. return
  26. after = br.re_kconfig_default_before_conditional.sub('', line)
  27. for symbol in all_symbols_from(after):
  28. db.add_symbol_legacy_usage(symbol, filename, lineno)
  29. def handle_select(db, filename, lineno, line, legacy):
  30. handle_usage(db, filename, lineno, line, legacy)
  31. before = br.re_kconfig_select_conditional.sub('', line)
  32. for symbol in all_symbols_from(before):
  33. db.add_symbol_select(symbol, filename, lineno)
  34. line_type_handlers = {
  35. br.re_kconfig_config: handle_definition,
  36. br.re_kconfig_default: handle_default,
  37. br.re_kconfig_depends: handle_usage,
  38. br.re_kconfig_if: handle_usage,
  39. br.re_kconfig_select: handle_select,
  40. br.re_kconfig_source: handle_usage,
  41. }
  42. def handle_line(db, filename, lineno, line, legacy):
  43. if not br.re_kconfig_symbol.search(line):
  44. return
  45. for regexp, line_type_handler in line_type_handlers.items():
  46. if regexp.search(line):
  47. line_type_handler(db, filename, lineno, line, legacy)
  48. def handle_config_helper(db, filename, file_content):
  49. symbol = None
  50. lineno = None
  51. state = 'none'
  52. for cur_lineno, line in file_content:
  53. if state == 'none':
  54. m = br.re_kconfig_config.search(line)
  55. if m is not None:
  56. symbol = m.group(2)
  57. lineno = cur_lineno
  58. state = 'config'
  59. continue
  60. if state == 'config':
  61. if br.re_kconfig_select.search(line):
  62. db.add_symbol_helper(symbol, filename, lineno)
  63. state = 'none'
  64. continue
  65. m = br.re_kconfig_config.search(line)
  66. if m is not None:
  67. symbol = m.group(2)
  68. lineno = cur_lineno
  69. continue
  70. def handle_config_choice(db, filename, file_content):
  71. state = 'none'
  72. for lineno, line in file_content:
  73. if state == 'none':
  74. if br.re_kconfig_choice.search(line):
  75. state = 'choice'
  76. continue
  77. if state == 'choice':
  78. if br.re_kconfig_endchoice.search(line):
  79. state = 'none'
  80. continue
  81. m = br.re_kconfig_config.search(line)
  82. if m is not None:
  83. symbol = m.group(2)
  84. db.add_symbol_choice(symbol, filename, lineno)
  85. continue
  86. def handle_note(db, filename, file_content):
  87. state = 'none'
  88. for lineno, line in file_content:
  89. if state == 'none':
  90. if br.re_menu.search(line):
  91. state = 'menu'
  92. continue
  93. if state == 'menu':
  94. if br.re_endmenu.search(line):
  95. state = 'none'
  96. continue
  97. m = br.re_legacy_special_comment.search(line)
  98. if m is not None:
  99. symbol = m.group(1)
  100. db.add_symbol_legacy_note(symbol, filename, lineno)
  101. continue
  102. def populate_db(db, filename, file_content):
  103. legacy = filename.endswith('.legacy')
  104. for lineno, line in file_content:
  105. handle_line(db, filename, lineno, line, legacy)
  106. handle_config_helper(db, filename, file_content)
  107. handle_config_choice(db, filename, file_content)
  108. if legacy:
  109. handle_note(db, filename, file_content)
  110. def check_filename(filename):
  111. if os.path.basename(filename).startswith('Config.'):
  112. return True
  113. return False