diff --git a/libcst/metadata/accessor_provider.py b/libcst/metadata/accessor_provider.py index 5d4f22e42..8fe506090 100644 --- a/libcst/metadata/accessor_provider.py +++ b/libcst/metadata/accessor_provider.py @@ -6,6 +6,8 @@ import dataclasses +from typing import Sequence + import libcst as cst from libcst.metadata.base_provider import VisitorMetadataProvider @@ -15,5 +17,9 @@ class AccessorProvider(VisitorMetadataProvider[str]): def on_visit(self, node: cst.CSTNode) -> bool: for f in dataclasses.fields(node): child = getattr(node, f.name) - self.set_metadata(child, f.name) + if isinstance(child, cst.CSTNode): + self.set_metadata(child, f.name) + elif isinstance(child, Sequence): + for idx, subchild in enumerate(child): + self.set_metadata(subchild, f.name + "[" + str(idx) + "]") return True diff --git a/libcst/metadata/tests/test_accessor_provider.py b/libcst/metadata/tests/test_accessor_provider.py index 6ccfad5ee..8905bcc22 100644 --- a/libcst/metadata/tests/test_accessor_provider.py +++ b/libcst/metadata/tests/test_accessor_provider.py @@ -7,6 +7,8 @@ from textwrap import dedent +from typing import Sequence + import libcst as cst from libcst.metadata import AccessorProvider, MetadataWrapper from libcst.testing.utils import data_provider, UnitTest @@ -22,8 +24,13 @@ def on_visit(self, node: cst.CSTNode) -> bool: for f in dataclasses.fields(node): child = getattr(node, f.name) if type(child) is cst.CSTNode: - accessor = self.get_metadata(AccessorProvider, child) + accessor = self.get_metadata(AccessorProvider, child, None) self.test.assertEqual(accessor, f.name) + elif isinstance(child, Sequence): + for idx, subchild in enumerate(child): + if type(subchild) is cst.CSTNode: + accessor = self.get_metadata(AccessorProvider, subchild, None) + self.test.assertEqual(accessor, f.name + "[" + str(idx) + "]") return True