Migrated the sources aspect to using a modern provider.

PiperOrigin-RevId: 206369816
diff --git a/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl b/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl
index 8e7ab7a..a79fb40 100644
--- a/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl
+++ b/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl
@@ -113,6 +113,28 @@
     "swiftmodule",
 ]
 
+TulsiSourcesAspectInfo = provider(
+    fields = {
+        "transitive_info_files": """
+The file actions used to save this rule's info and that of all of its transitive dependencies as
+well as any Info plists required for extensions.
+""",
+        "inheritable_attributes": """
+The inheritable attributes of this rule, expressed as a dict instead of a struct to allow easy
+joining.
+""",
+        "transitive_attributes": """
+Transitive attributes that should be applied to every rule that depends on this rule.
+""",
+        "artifacts": """
+Artifacts from this rule.
+""",
+        "filtering_info": """
+Filtering information for this target. Only for test target, otherwise is None.
+""",
+    },
+)
+
 TulsiOutputAspectInfo = provider(
     fields = {
         "transitive_generated_files": "Depset of tulsi generated files.",
@@ -357,7 +379,7 @@
         dep
         for dep in _getattr_as_list(rule_attr, attr_name)
         if type(dep) == "Target" and
-           (hasattr(dep, "tulsi_info_files") or TulsiOutputAspectInfo in dep)
+           (TulsiSourcesAspectInfo in dep or TulsiOutputAspectInfo in dep)
     ]
 
 def _collect_dependency_labels(rule, filter, attr_list):
@@ -568,15 +590,14 @@
     rule_attr = _get_opt_attr(rule, "attr")
     filter = _filter_for_rule(rule)
 
-    tulsi_info_files = depset()
+    transitive_info_files = depset()
     transitive_attributes = dict()
     for attr_name in _TULSI_COMPILE_DEPS:
         deps = _collect_dependencies(rule_attr, attr_name)
         for dep in _filter_deps(filter, deps):
-            if hasattr(dep, "tulsi_info_files"):
-                tulsi_info_files += dep.tulsi_info_files
-            if hasattr(dep, "transitive_attributes"):
-                transitive_attributes += dep.transitive_attributes
+            if TulsiSourcesAspectInfo in dep:
+                transitive_info_files += dep[TulsiSourcesAspectInfo].transitive_info_files
+                transitive_attributes += dep[TulsiSourcesAspectInfo].transitive_attributes
 
     artifacts = _get_opt_attr(target, "files")
     if artifacts:
@@ -777,32 +798,23 @@
     # Create an action to write out this target's info.
     output = ctx.new_file(target.label.name + ".tulsiinfo")
     ctx.file_action(output, info.to_json())
-    tulsi_info_files += depset([output])
+    transitive_info_files += depset([output])
 
     if infoplist:
-        tulsi_info_files += [infoplist]
+        transitive_info_files += [infoplist]
 
     artifacts_depset = depset(artifacts) if artifacts else depset()
 
-    return struct(
-        # Matches the --output_groups on the bazel commandline.
-        output_groups = {
-            "tulsi-info": tulsi_info_files,
-        },
-        # The file actions used to save this rule's info and that of all of its
-        # transitive dependencies.
-        tulsi_info_files = tulsi_info_files,
-        # The inheritable attributes of this rule, expressed as a dict instead of
-        # a struct to allow easy joining.
-        inheritable_attributes = inheritable_attributes,
-        # Transitive info that should be applied to every rule that depends on
-        # this rule.
-        transitive_attributes = transitive_attributes,
-        # Artifacts from this rule.
-        artifacts = artifacts_depset,
-        # Filtering information for this target.
-        filtering_info = _target_filtering_info(ctx),
-    )
+    return [
+        OutputGroupInfo(tulsi_info = transitive_info_files),
+        TulsiSourcesAspectInfo(
+            transitive_info_files = transitive_info_files,
+            inheritable_attributes = inheritable_attributes,
+            transitive_attributes = transitive_attributes,
+            artifacts = artifacts_depset,
+            filtering_info = _target_filtering_info(ctx),
+        ),
+    ]
 
 def _collect_bundle_info(target):
     """Returns Apple bundle info for the given target, None if not a bundle."""
@@ -883,7 +895,9 @@
 
     kept_deps = []
     for dep in deps:
-        info = dep.filtering_info
+        info = None
+        if TulsiSourcesAspectInfo in dep:
+            info = dep[TulsiSourcesAspectInfo].filtering_info
 
         # Only attempt to filter targets that support filtering.
         # test_suites in a test_suite are not filtered, but their
diff --git a/src/TulsiGenerator/BazelAspectInfoExtractor.swift b/src/TulsiGenerator/BazelAspectInfoExtractor.swift
index 62ecf3f..983d14a 100644
--- a/src/TulsiGenerator/BazelAspectInfoExtractor.swift
+++ b/src/TulsiGenerator/BazelAspectInfoExtractor.swift
@@ -229,7 +229,7 @@
         // Keep this consistent with bazel_build.py.
         "--aspects",
         "@tulsi//tulsi:tulsi_aspects.bzl%\(aspect)",
-        "--output_groups=tulsi-info,-_,-default",  // Build only the aspect artifacts.
+        "--output_groups=tulsi_info,-_,-default",  // Build only the aspect artifacts.
     ])
     arguments.append(contentsOf: targets)