Migrated the output aspect to using a modern provider.

PiperOrigin-RevId: 206201263
diff --git a/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl b/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl
index e726cfb..8e7ab7a 100644
--- a/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl
+++ b/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl
@@ -113,6 +113,13 @@
     "swiftmodule",
 ]
 
+TulsiOutputAspectInfo = provider(
+    fields = {
+        "transitive_generated_files": "Depset of tulsi generated files.",
+        "transitive_embedded_bundles": "Depset of all bundles embedded into this target.",
+    },
+)
+
 def _dict_omitting_none(**kwargs):
     """Creates a dict from the args, dropping keys with None or [] values."""
     return {
@@ -349,8 +356,8 @@
     return [
         dep
         for dep in _getattr_as_list(rule_attr, attr_name)
-        if hasattr(dep, "tulsi_info_files") or
-           hasattr(dep, "tulsi_generated_files")
+        if type(dep) == "Target" and
+           (hasattr(dep, "tulsi_info_files") or TulsiOutputAspectInfo in dep)
     ]
 
 def _collect_dependency_labels(rule, filter, attr_list):
@@ -891,7 +898,7 @@
     rule = ctx.rule
     target_kind = rule.kind
     rule_attr = _get_opt_attr(rule, "attr")
-    tulsi_generated_files = depset()
+    generated_files = depset()
 
     # A set of all bundles embedded into this target, including deps.
     # We intentionally do not collect info about _current_ target to exclude the
@@ -902,16 +909,15 @@
     for attr_name in _TULSI_COMPILE_DEPS:
         deps = _collect_dependencies(rule_attr, attr_name)
         for dep in deps:
-            if hasattr(dep, "tulsi_generated_files"):
-                tulsi_generated_files += dep.tulsi_generated_files
+            if TulsiOutputAspectInfo in dep:
+                generated_files += dep[TulsiOutputAspectInfo].transitive_generated_files
+                embedded_bundles += dep[TulsiOutputAspectInfo].transitive_embedded_bundles
 
             # Retrieve the bundle info for embeddable attributes.
             if attr_name not in _TULSI_NON_EMBEDDEDABLE_ATTRS:
                 dep_bundle_info = _collect_bundle_info(dep)
                 if dep_bundle_info:
                     embedded_bundles += dep_bundle_info
-            if hasattr(dep, "transitive_embedded_bundles"):
-                embedded_bundles += dep.transitive_embedded_bundles
 
     artifact = None
     bundle_name = None
@@ -966,7 +972,7 @@
         source_files.append(infoplist)
     all_files = depset(source_files, transitive = [all_files])
 
-    tulsi_generated_files += depset(
+    generated_files += depset(
         [x for x in all_files.to_list() if not x.is_source],
     )
 
@@ -980,7 +986,7 @@
         artifact = artifact,
         bundle_dir = bundle_dir,
         archive_root = archive_root,
-        generated_sources = [(x.path, x.short_path) for x in tulsi_generated_files],
+        generated_sources = [(x.path, x.short_path) for x in generated_files],
         bundle_name = bundle_name,
         embedded_bundles = embedded_bundles.to_list(),
         has_dsym = has_dsym,
@@ -989,13 +995,13 @@
     output = ctx.new_file(target.label.name + ".tulsiouts")
     ctx.file_action(output, info.to_json())
 
-    return struct(
-        output_groups = {
-            "tulsi-outputs": [output],
-        },
-        tulsi_generated_files = tulsi_generated_files,
-        transitive_embedded_bundles = embedded_bundles,
-    )
+    return [
+        OutputGroupInfo(tulsi_outputs = [output]),
+        TulsiOutputAspectInfo(
+            transitive_generated_files = generated_files,
+            transitive_embedded_bundles = embedded_bundles,
+        ),
+    ]
 
 tulsi_sources_aspect = aspect(
     attr_aspects = _TULSI_COMPILE_DEPS,
diff --git a/src/TulsiGenerator/Scripts/bazel_build.py b/src/TulsiGenerator/Scripts/bazel_build.py
index b8bc396..925b24e 100755
--- a/src/TulsiGenerator/Scripts/bazel_build.py
+++ b/src/TulsiGenerator/Scripts/bazel_build.py
@@ -632,9 +632,9 @@
         '--aspects', '@tulsi//tulsi:tulsi_aspects.bzl%tulsi_outputs_aspect'])
 
     if self.is_test and self.gen_runfiles:
-      bazel_command.append('--output_groups=+tulsi-outputs')
+      bazel_command.append('--output_groups=+tulsi_outputs')
     else:
-      bazel_command.append('--output_groups=tulsi-outputs,default')
+      bazel_command.append('--output_groups=tulsi_outputs,default')
 
     bazel_command.extend(options.targets)