diff --git a/vanir/language_parsers/language_parsers.py b/vanir/language_parsers/language_parsers.py index f2d5b8b..5578004 100644 --- a/vanir/language_parsers/language_parsers.py +++ b/vanir/language_parsers/language_parsers.py @@ -28,9 +28,19 @@ _P = TypeVar('_P', bound=abstract_language_parser.AbstractLanguageParser) +def _all_subclasses(cls): + """Recursively collect all concrete (non-abstract) subclasses of cls.""" + result = [] + for sub in cls.__subclasses__(): + if not sub.__abstractmethods__: + result.append(sub) + result.extend(_all_subclasses(sub)) + return result + + def get_parser_class(filename: str) -> Optional[Type[_P]]: """Returns the language parser class that handles the given file, or None.""" - parsers = abstract_language_parser.AbstractLanguageParser.__subclasses__() + parsers = _all_subclasses(abstract_language_parser.AbstractLanguageParser) ext = os.path.splitext(filename)[1] for parser_class in parsers: if ext in parser_class.get_supported_extensions():