linter.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import os
  2. from collections import defaultdict
  3. from openhands.linter.base import BaseLinter, LinterException, LintResult
  4. from openhands.linter.languages.python import PythonLinter
  5. from openhands.linter.languages.treesitter import TreesitterBasicLinter
  6. class DefaultLinter(BaseLinter):
  7. def __init__(self):
  8. self.linters: dict[str, list[BaseLinter]] = defaultdict(list)
  9. self.linters['.py'] = [PythonLinter()]
  10. # Add treesitter linter as a fallback for all linters
  11. self.basic_linter = TreesitterBasicLinter()
  12. for extension in self.basic_linter.supported_extensions:
  13. self.linters[extension].append(self.basic_linter)
  14. self._supported_extensions = list(self.linters.keys())
  15. @property
  16. def supported_extensions(self) -> list[str]:
  17. return self._supported_extensions
  18. def lint(self, file_path: str) -> list[LintResult]:
  19. if not os.path.isabs(file_path):
  20. raise LinterException(f'File path {file_path} is not an absolute path')
  21. file_extension = os.path.splitext(file_path)[1]
  22. linters: list[BaseLinter] = self.linters.get(file_extension, [])
  23. for linter in linters:
  24. res = linter.lint(file_path)
  25. # We always return the first linter's result (higher priority)
  26. if res:
  27. return res
  28. return []