Modify indexer includes to no longer duplicate paths

- Pick the workspace root or exec root based on whether or not the
  path is in the tulsi includes folder

PiperOrigin-RevId: 298606243
diff --git a/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl b/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl
index dda397f..2d8d4ba 100644
--- a/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl
+++ b/src/TulsiGenerator/Bazel/tulsi/tulsi_aspects.bzl
@@ -843,10 +843,12 @@
         includes_depsets = [cc_ctx.includes, cc_ctx.quote_includes, cc_ctx.system_includes]
 
     if includes_depsets:
-        target_includes = [
+        # Use a depset here to remove duplicates which is possible since
+        # converting the output path can strip some path information.
+        target_includes = depset([
             _convert_outpath_to_symlink_path(x)
             for x in depset(transitive = includes_depsets).to_list()
-        ]
+        ]).to_list()
     else:
         target_includes = []
 
diff --git a/src/TulsiGenerator/PBXTargetGenerator.swift b/src/TulsiGenerator/PBXTargetGenerator.swift
index 2b50d3d..39e5365 100644
--- a/src/TulsiGenerator/PBXTargetGenerator.swift
+++ b/src/TulsiGenerator/PBXTargetGenerator.swift
@@ -1226,26 +1226,19 @@
                            toSet includes: NSMutableOrderedSet) {
     if let includePaths = ruleEntry.includePaths {
       let rootedPaths: [String] = includePaths.map() { (path, recursive) in
-        let rootedPath = "$(\(PBXTargetGenerator.WorkspaceRootVarName))/\(path)"
+        // Any paths of the tulsi-includes form will only be in the bazel workspace symlink since
+        // they refer to generated files from a build.
+        // Otherwise we assume the file exists in the workspace.
+        let prefixVar = path.hasPrefix(PBXTargetGenerator.tulsiIncludesPath)
+            ? PBXTargetGenerator.BazelWorkspaceSymlinkVarName
+            : PBXTargetGenerator.WorkspaceRootVarName
+        let rootedPath = "$(\(prefixVar))/\(path)"
         if recursive {
           return "\(rootedPath)/**"
         }
         return rootedPath
       }
       includes.addObjects(from: rootedPaths)
-
-      /// Some targets that generate sources also provide header search paths into non-generated
-      /// sources. Using workspace root is needed for the former, but the latter has to be
-      /// included via the Bazel workspace root.
-      /// TODO(tulsi-team): See if we can merge the two locations to just Bazel workspace.
-      let bazelWorkspaceRootedPaths: [String] = includePaths.map() { (path, recursive) in
-        let rootedPath = "$(\(PBXTargetGenerator.BazelWorkspaceSymlinkVarName))/\(path)"
-        if recursive {
-          return "\(rootedPath)/**"
-        }
-        return rootedPath
-      }
-      includes.addObjects(from: bazelWorkspaceRootedPaths)
     }
 
     // TODO(rdar://36107040): Once Xcode supports indexing with multiple -fmodule-map-file