From 0b49981e681a563974c3693c0510778245b3d7f2 Mon Sep 17 00:00:00 2001 From: Awe Srush Date: Fri, 17 Jul 2026 16:19:07 -0700 Subject: [PATCH] bug(language_parsers): fix subclass discovery to support multi-level parser hierarchies --- vanir/language_parsers/language_parsers.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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():