diff --git a/src/gn/filesystem_utils.cc b/src/gn/filesystem_utils.cc
index e7244e3..b2772ed 100644
--- a/src/gn/filesystem_utils.cc
+++ b/src/gn/filesystem_utils.cc
@@ -177,7 +177,7 @@
 // other generated sources and outputs.
 void AppendFixedAbsolutePathSuffix(const BuildSettings* build_settings,
                                    const SourceDir& source_dir,
-                                   OutputFile* result) {
+                                   std::string* result) {
   const std::string& build_dir = build_settings->build_dir().value();
 
   if (source_dir.value().starts_with(build_dir)) {
@@ -1032,17 +1032,15 @@
       toolchain_label(in_toolchain_label),
       is_default_toolchain(in_is_default_toolchain) {}
 
-SourceDir GetBuildDirAsSourceDir(const BuildDirContext& context,
-                                 BuildDirType type) {
-  return GetBuildDirAsOutputFile(context, type)
-      .AsSourceDir(context.build_settings);
+SourceDir GetSourceDir(const BuildDirContext& context, BuildDirType type) {
+  return SourceDir(context.build_settings->build_dir().value() +
+                   GetBuildDir(context, type));
 }
 
-OutputFile GetBuildDirAsOutputFile(const BuildDirContext& context,
-                                   BuildDirType type) {
-  OutputFile result(GetOutputSubdirName(context.toolchain_label,
-                                        context.is_default_toolchain));
-  DCHECK(result.value().empty() || result.value().back() == '/');
+std::string GetBuildDir(const BuildDirContext& context, BuildDirType type) {
+  std::string result(GetOutputSubdirName(context.toolchain_label,
+                                         context.is_default_toolchain));
+  DCHECK(result.empty() || result.back() == '/');
 
   if (type == BuildDirType::GEN)
     result.append("gen/");
@@ -1053,18 +1051,20 @@
   return result;
 }
 
-SourceDir GetSubBuildDirAsSourceDir(const BuildDirContext& context,
-                                    const SourceDir& source_dir,
-                                    BuildDirType type) {
-  return GetSubBuildDirAsOutputFile(context, source_dir, type)
-      .AsSourceDir(context.build_settings);
+SourceDir GetSourceDir(const BuildDirContext& context,
+                       const SourceDir& source_dir,
+                       BuildDirType type) {
+  std::string path = context.build_settings->build_dir().value();
+  path.append(GetBuildDir(context, source_dir, type));
+  NormalizePath(&path);
+  return SourceDir(std::move(path));
 }
 
-OutputFile GetSubBuildDirAsOutputFile(const BuildDirContext& context,
-                                      const SourceDir& source_dir,
-                                      BuildDirType type) {
+std::string GetBuildDir(const BuildDirContext& context,
+                        const SourceDir& source_dir,
+                        BuildDirType type) {
   DCHECK(type != BuildDirType::TOOLCHAIN_ROOT);
-  OutputFile result = GetBuildDirAsOutputFile(context, type);
+  std::string result_path(GetBuildDir(context, type));
 
   if (source_dir.is_source_absolute()) {
     std::string_view build_dir = context.build_settings->build_dir().value();
@@ -1077,38 +1077,33 @@
       // it with `BUILD_DIR`. This will create results like `obj/BUILD_DIR/gen`
       // or `toolchain2/obj/BUILD_DIR/toolchain1/gen` which look surprising,
       // but guarantee unicity.
-      result.append("BUILD_DIR/");
-      result.append(source_dir_path.substr(build_dir.size()));
+      result_path.append("BUILD_DIR/");
+      result_path.append(source_dir_path.substr(build_dir.size()));
 
     } else {
       // The source dir is source-absolute, so we trim off the two leading
       // slashes to append to the toolchain object directory.
-      result.append(std::string_view(&source_dir.value()[2],
-                                     source_dir.value().size() - 2));
+      result_path.append(std::string_view(&source_dir.value()[2],
+                                          source_dir.value().size() - 2));
     }
   } else {
     // System-absolute.
-    AppendFixedAbsolutePathSuffix(context.build_settings, source_dir, &result);
+    AppendFixedAbsolutePathSuffix(context.build_settings, source_dir,
+                                  &result_path);
   }
-  return result;
+  return result_path;
 }
 
-SourceDir GetBuildDirForTargetAsSourceDir(const Target* target,
-                                          BuildDirType type) {
-  return GetSubBuildDirAsSourceDir(BuildDirContext(target),
-                                   target->label().dir(), type);
+SourceDir GetSourceDir(const Target& target, BuildDirType type) {
+  return GetSourceDir(BuildDirContext(&target), target.label().dir(), type);
 }
 
-OutputFile GetBuildDirForTargetAsOutputFile(const Target* target,
-                                            BuildDirType type) {
-  return GetSubBuildDirAsOutputFile(BuildDirContext(target),
-                                    target->label().dir(), type);
+std::string GetBuildDir(const Target& target, BuildDirType type) {
+  return GetBuildDir(BuildDirContext(&target), target.label().dir(), type);
 }
 
-SourceDir GetScopeCurrentBuildDirAsSourceDir(const Scope* scope,
-                                             BuildDirType type) {
+SourceDir GetSourceDir(const Scope& scope, BuildDirType type) {
   if (type == BuildDirType::TOOLCHAIN_ROOT)
-    return GetBuildDirAsSourceDir(BuildDirContext(scope), type);
-  return GetSubBuildDirAsSourceDir(BuildDirContext(scope),
-                                   scope->GetSourceDir(), type);
+    return GetSourceDir(BuildDirContext(&scope), type);
+  return GetSourceDir(BuildDirContext(&scope), scope.GetSourceDir(), type);
 }
diff --git a/src/gn/filesystem_utils.h b/src/gn/filesystem_utils.h
index 091a37c..2472c54 100644
--- a/src/gn/filesystem_utils.h
+++ b/src/gn/filesystem_utils.h
@@ -271,31 +271,54 @@
 // root_obj_dir variable) so BuildDirType::OBJ would normally never be passed
 // to this function except when it's called by one of the variants below that
 // append paths to it.
-SourceDir GetBuildDirAsSourceDir(const BuildDirContext& context,
-                                 BuildDirType type);
-OutputFile GetBuildDirAsOutputFile(const BuildDirContext& context,
-                                   BuildDirType type);
+SourceDir GetSourceDir(const BuildDirContext& context, BuildDirType type);
+std::string GetBuildDir(const BuildDirContext& context, BuildDirType type);
 
 // Returns the output or generated file directory corresponding to the given
 // source directory.
-SourceDir GetSubBuildDirAsSourceDir(const BuildDirContext& context,
-                                    const SourceDir& source_dir,
-                                    BuildDirType type);
-OutputFile GetSubBuildDirAsOutputFile(const BuildDirContext& context,
-                                      const SourceDir& source_dir,
-                                      BuildDirType type);
+SourceDir GetSourceDir(const BuildDirContext& context,
+                       const SourceDir& source_dir,
+                       BuildDirType type);
+std::string GetBuildDir(const BuildDirContext& context,
+                        const SourceDir& source_dir,
+                        BuildDirType type);
 
 // Returns the output or generated file directory corresponding to the given
 // target.
-SourceDir GetBuildDirForTargetAsSourceDir(const Target* target,
-                                          BuildDirType type);
-OutputFile GetBuildDirForTargetAsOutputFile(const Target* target,
-                                            BuildDirType type);
+SourceDir GetSourceDir(const Target& target, BuildDirType type);
+std::string GetBuildDir(const Target& target, BuildDirType type);
 
 // Returns the scope's current directory.
-SourceDir GetScopeCurrentBuildDirAsSourceDir(const Scope* scope,
-                                             BuildDirType type);
-// Lack of OutputDir version is due only to it not currently being needed,
+SourceDir GetSourceDir(const Scope& scope, BuildDirType type);
+// Lack of GetBuildDir version is due only to it not currently being needed,
 // please add one if you need it.
 
+template <typename... Args>
+OutputFile GetOutputFile(const BuildDirContext& context,
+                         BuildDirType type,
+                         Args&&... args) {
+  std::string path = GetBuildDir(context, type);
+  (path.append(std::forward<Args>(args)), ...);
+  return OutputFile(path);
+}
+
+template <typename... Args>
+OutputFile GetOutputFile(const BuildDirContext& context,
+                         const SourceDir& source_dir,
+                         BuildDirType type,
+                         Args&&... args) {
+  std::string path = GetBuildDir(context, source_dir, type);
+  (path.append(std::forward<Args>(args)), ...);
+  return OutputFile(path);
+}
+
+template <typename... Args>
+OutputFile GetOutputFile(const Target& target,
+                         BuildDirType type,
+                         Args&&... args) {
+  std::string path = GetBuildDir(target, type);
+  (path.append(std::forward<Args>(args)), ...);
+  return OutputFile(path);
+}
+
 #endif  // TOOLS_GN_FILESYSTEM_UTILS_H_
diff --git a/src/gn/filesystem_utils_unittest.cc b/src/gn/filesystem_utils_unittest.cc
index 7b69a63..f533bde 100644
--- a/src/gn/filesystem_utils_unittest.cc
+++ b/src/gn/filesystem_utils_unittest.cc
@@ -660,24 +660,23 @@
   BuildDirContext default_context(&default_settings);
 
   // Default toolchain out dir as source dirs.
-  EXPECT_EQ("//out/Debug/", GetBuildDirAsSourceDir(default_context,
-                                                   BuildDirType::TOOLCHAIN_ROOT)
-                                .value());
+  EXPECT_EQ(
+      "//out/Debug/",
+      GetSourceDir(default_context, BuildDirType::TOOLCHAIN_ROOT).value());
   EXPECT_EQ("//out/Debug/obj/",
-            GetBuildDirAsSourceDir(default_context, BuildDirType::OBJ).value());
+            GetSourceDir(default_context, BuildDirType::OBJ).value());
   EXPECT_EQ("//out/Debug/gen/",
-            GetBuildDirAsSourceDir(default_context, BuildDirType::GEN).value());
+            GetSourceDir(default_context, BuildDirType::GEN).value());
 
   // Default toolchain our dir as output files.
   EXPECT_EQ(
-      "", GetBuildDirAsOutputFile(default_context, BuildDirType::TOOLCHAIN_ROOT)
-              .value());
-  EXPECT_EQ(
-      "obj/",
-      GetBuildDirAsOutputFile(default_context, BuildDirType::OBJ).value());
-  EXPECT_EQ(
-      "gen/",
-      GetBuildDirAsOutputFile(default_context, BuildDirType::GEN).value());
+      "", GetOutputFile(default_context, BuildDirType::TOOLCHAIN_ROOT).value());
+  EXPECT_EQ("obj/", GetOutputFile(default_context, BuildDirType::OBJ).value());
+  EXPECT_EQ("gen/", GetOutputFile(default_context, BuildDirType::GEN).value());
+  // Test raw string version.
+  EXPECT_EQ("", GetBuildDir(default_context, BuildDirType::TOOLCHAIN_ROOT));
+  EXPECT_EQ("obj/", GetBuildDir(default_context, BuildDirType::OBJ));
+  EXPECT_EQ("gen/", GetBuildDir(default_context, BuildDirType::GEN));
 
   // Check a secondary toolchain.
   Settings other_settings(&build_settings, "two/");
@@ -688,21 +687,19 @@
 
   // Secondary toolchain out dir as source dirs.
   EXPECT_EQ("//out/Debug/two/",
-            GetBuildDirAsSourceDir(other_context, BuildDirType::TOOLCHAIN_ROOT)
-                .value());
+            GetSourceDir(other_context, BuildDirType::TOOLCHAIN_ROOT).value());
   EXPECT_EQ("//out/Debug/two/obj/",
-            GetBuildDirAsSourceDir(other_context, BuildDirType::OBJ).value());
+            GetSourceDir(other_context, BuildDirType::OBJ).value());
   EXPECT_EQ("//out/Debug/two/gen/",
-            GetBuildDirAsSourceDir(other_context, BuildDirType::GEN).value());
+            GetSourceDir(other_context, BuildDirType::GEN).value());
 
   // Secondary toolchain out dir as output files.
   EXPECT_EQ("two/",
-            GetBuildDirAsOutputFile(other_context, BuildDirType::TOOLCHAIN_ROOT)
-                .value());
+            GetOutputFile(other_context, BuildDirType::TOOLCHAIN_ROOT).value());
   EXPECT_EQ("two/obj/",
-            GetBuildDirAsOutputFile(other_context, BuildDirType::OBJ).value());
+            GetOutputFile(other_context, BuildDirType::OBJ).value());
   EXPECT_EQ("two/gen/",
-            GetBuildDirAsOutputFile(other_context, BuildDirType::GEN).value());
+            GetOutputFile(other_context, BuildDirType::GEN).value());
 }
 
 TEST(FilesystemUtils, GetSubBuildDir) {
@@ -718,22 +715,21 @@
 
   // Target in the root.
   EXPECT_EQ("//out/Debug/obj/",
-            GetSubBuildDirAsSourceDir(default_context, SourceDir("//"),
-                                      BuildDirType::OBJ)
+            GetSourceDir(default_context, SourceDir("//"), BuildDirType::OBJ)
                 .value());
-  EXPECT_EQ("gen/", GetSubBuildDirAsOutputFile(default_context, SourceDir("//"),
-                                               BuildDirType::GEN)
-                        .value());
+  EXPECT_EQ("gen/",
+            GetOutputFile(default_context, SourceDir("//"), BuildDirType::GEN)
+                .value());
 
   // Target in another directory.
-  EXPECT_EQ("//out/Debug/obj/foo/bar/",
-            GetSubBuildDirAsSourceDir(default_context, SourceDir("//foo/bar/"),
-                                      BuildDirType::OBJ)
-                .value());
-  EXPECT_EQ("gen/foo/bar/",
-            GetSubBuildDirAsOutputFile(default_context, SourceDir("//foo/bar/"),
-                                       BuildDirType::GEN)
-                .value());
+  EXPECT_EQ(
+      "//out/Debug/obj/foo/bar/",
+      GetSourceDir(default_context, SourceDir("//foo/bar/"), BuildDirType::OBJ)
+          .value());
+  EXPECT_EQ(
+      "gen/foo/bar/",
+      GetOutputFile(default_context, SourceDir("//foo/bar/"), BuildDirType::GEN)
+          .value());
 
   // Secondary toolchain.
   Settings other_settings(&build_settings, "two/");
@@ -742,42 +738,39 @@
   BuildDirContext other_context(&other_settings);
 
   // Target in the root.
-  EXPECT_EQ("//out/Debug/two/obj/",
-            GetSubBuildDirAsSourceDir(other_context, SourceDir("//"),
-                                      BuildDirType::OBJ)
-                .value());
-  EXPECT_EQ("two/gen/", GetSubBuildDirAsOutputFile(
-                            other_context, SourceDir("//"), BuildDirType::GEN)
-                            .value());
+  EXPECT_EQ(
+      "//out/Debug/two/obj/",
+      GetSourceDir(other_context, SourceDir("//"), BuildDirType::OBJ).value());
+  EXPECT_EQ(
+      "two/gen/",
+      GetOutputFile(other_context, SourceDir("//"), BuildDirType::GEN).value());
 
   // Target in another directory.
-  EXPECT_EQ("//out/Debug/two/obj/foo/bar/",
-            GetSubBuildDirAsSourceDir(other_context, SourceDir("//foo/bar/"),
-                                      BuildDirType::OBJ)
-                .value());
-  EXPECT_EQ("two/gen/foo/bar/",
-            GetSubBuildDirAsOutputFile(other_context, SourceDir("//foo/bar/"),
-                                       BuildDirType::GEN)
-                .value());
+  EXPECT_EQ(
+      "//out/Debug/two/obj/foo/bar/",
+      GetSourceDir(other_context, SourceDir("//foo/bar/"), BuildDirType::OBJ)
+          .value());
+  EXPECT_EQ(
+      "two/gen/foo/bar/",
+      GetOutputFile(other_context, SourceDir("//foo/bar/"), BuildDirType::GEN)
+          .value());
 
   // Absolute source path
   EXPECT_EQ("//out/Debug/obj/ABS_PATH/abs/",
-            GetSubBuildDirAsSourceDir(default_context, SourceDir("/abs"),
-                                      BuildDirType::OBJ)
+            GetSourceDir(default_context, SourceDir("/abs"), BuildDirType::OBJ)
                 .value());
   EXPECT_EQ("gen/ABS_PATH/abs/",
-            GetSubBuildDirAsOutputFile(default_context, SourceDir("/abs"),
-                                       BuildDirType::GEN)
+            GetOutputFile(default_context, SourceDir("/abs"), BuildDirType::GEN)
                 .value());
 #if defined(OS_WIN)
-  EXPECT_EQ("//out/Debug/obj/ABS_PATH/C/abs/",
-            GetSubBuildDirAsSourceDir(default_context, SourceDir("/C:/abs"),
-                                      BuildDirType::OBJ)
-                .value());
-  EXPECT_EQ("gen/ABS_PATH/C/abs/",
-            GetSubBuildDirAsOutputFile(default_context, SourceDir("/C:/abs"),
-                                       BuildDirType::GEN)
-                .value());
+  EXPECT_EQ(
+      "//out/Debug/obj/ABS_PATH/C/abs/",
+      GetSourceDir(default_context, SourceDir("/C:/abs"), BuildDirType::OBJ)
+          .value());
+  EXPECT_EQ(
+      "gen/ABS_PATH/C/abs/",
+      GetOutputFile(default_context, SourceDir("/C:/abs"), BuildDirType::GEN)
+          .value());
 #endif
 }
 
@@ -788,13 +781,12 @@
 
   Target a(&settings, Label(SourceDir("//foo/bar/"), "baz"));
   EXPECT_EQ("//out/Debug/obj/foo/bar/",
-            GetBuildDirForTargetAsSourceDir(&a, BuildDirType::OBJ).value());
-  EXPECT_EQ("obj/foo/bar/",
-            GetBuildDirForTargetAsOutputFile(&a, BuildDirType::OBJ).value());
+            GetSourceDir(a, BuildDirType::OBJ).value());
+  EXPECT_EQ("obj/foo/bar/", GetOutputFile(a, BuildDirType::OBJ).value());
+  EXPECT_EQ("obj/foo/bar/", GetBuildDir(a, BuildDirType::OBJ));
   EXPECT_EQ("//out/Debug/gen/foo/bar/",
-            GetBuildDirForTargetAsSourceDir(&a, BuildDirType::GEN).value());
-  EXPECT_EQ("gen/foo/bar/",
-            GetBuildDirForTargetAsOutputFile(&a, BuildDirType::GEN).value());
+            GetSourceDir(a, BuildDirType::GEN).value());
+  EXPECT_EQ("gen/foo/bar/", GetOutputFile(a, BuildDirType::GEN).value());
 }
 
 // Tests handling of output dirs when build dir is the same as the root.
@@ -805,21 +797,13 @@
 
   BuildDirContext context(&settings);
 
-  EXPECT_EQ(
-      "//",
-      GetBuildDirAsSourceDir(context, BuildDirType::TOOLCHAIN_ROOT).value());
-  EXPECT_EQ("//gen/",
-            GetBuildDirAsSourceDir(context, BuildDirType::GEN).value());
-  EXPECT_EQ("//obj/",
-            GetBuildDirAsSourceDir(context, BuildDirType::OBJ).value());
+  EXPECT_EQ("//", GetSourceDir(context, BuildDirType::TOOLCHAIN_ROOT).value());
+  EXPECT_EQ("//gen/", GetSourceDir(context, BuildDirType::GEN).value());
+  EXPECT_EQ("//obj/", GetSourceDir(context, BuildDirType::OBJ).value());
 
-  EXPECT_EQ(
-      "",
-      GetBuildDirAsOutputFile(context, BuildDirType::TOOLCHAIN_ROOT).value());
-  EXPECT_EQ("gen/",
-            GetBuildDirAsOutputFile(context, BuildDirType::GEN).value());
-  EXPECT_EQ("obj/",
-            GetBuildDirAsOutputFile(context, BuildDirType::OBJ).value());
+  EXPECT_EQ("", GetOutputFile(context, BuildDirType::TOOLCHAIN_ROOT).value());
+  EXPECT_EQ("gen/", GetOutputFile(context, BuildDirType::GEN).value());
+  EXPECT_EQ("obj/", GetOutputFile(context, BuildDirType::OBJ).value());
 }
 
 TEST(FilesystemUtils, ResolveRelativeTest) {
diff --git a/src/gn/function_get_label_info.cc b/src/gn/function_get_label_info.cc
index 04fa9a7..2d07617 100644
--- a/src/gn/function_get_label_info.cc
+++ b/src/gn/function_get_label_info.cc
@@ -105,23 +105,23 @@
     result.string_value() = DirectoryWithNoLastSlash(label.dir());
 
   } else if (what == "target_gen_dir") {
-    result.string_value() = DirectoryWithNoLastSlash(GetSubBuildDirAsSourceDir(
-        BuildDirContext(scope, label.GetToolchainLabel()), label.dir(),
-        BuildDirType::GEN));
+    result.string_value() = DirectoryWithNoLastSlash(
+        GetSourceDir(BuildDirContext(scope, label.GetToolchainLabel()),
+                     label.dir(), BuildDirType::GEN));
 
   } else if (what == "root_gen_dir") {
-    result.string_value() = DirectoryWithNoLastSlash(GetBuildDirAsSourceDir(
+    result.string_value() = DirectoryWithNoLastSlash(GetSourceDir(
         BuildDirContext(scope, label.GetToolchainLabel()), BuildDirType::GEN));
 
   } else if (what == "target_out_dir") {
-    result.string_value() = DirectoryWithNoLastSlash(GetSubBuildDirAsSourceDir(
-        BuildDirContext(scope, label.GetToolchainLabel()), label.dir(),
-        BuildDirType::OBJ));
+    result.string_value() = DirectoryWithNoLastSlash(
+        GetSourceDir(BuildDirContext(scope, label.GetToolchainLabel()),
+                     label.dir(), BuildDirType::OBJ));
 
   } else if (what == "root_out_dir") {
-    result.string_value() = DirectoryWithNoLastSlash(GetBuildDirAsSourceDir(
-        BuildDirContext(scope, label.GetToolchainLabel()),
-        BuildDirType::TOOLCHAIN_ROOT));
+    result.string_value() = DirectoryWithNoLastSlash(
+        GetSourceDir(BuildDirContext(scope, label.GetToolchainLabel()),
+                     BuildDirType::TOOLCHAIN_ROOT));
 
   } else if (what == "toolchain") {
     result.string_value() = label.GetToolchainLabel().GetUserVisibleName(false);
diff --git a/src/gn/function_get_path_info.cc b/src/gn/function_get_path_info.cc
index 00ed043..a263a8f 100644
--- a/src/gn/function_get_path_info.cc
+++ b/src/gn/function_get_path_info.cc
@@ -90,12 +90,12 @@
       return std::string(dir_incl_slash.substr(0, dir_incl_slash.size() - 1));
     }
     case WHAT_GEN_DIR: {
-      return DirectoryWithNoLastSlash(GetSubBuildDirAsSourceDir(
+      return DirectoryWithNoLastSlash(GetSourceDir(
           BuildDirContext(settings),
           DirForInput(settings, current_dir, input, err), BuildDirType::GEN));
     }
     case WHAT_OUT_DIR: {
-      return DirectoryWithNoLastSlash(GetSubBuildDirAsSourceDir(
+      return DirectoryWithNoLastSlash(GetSourceDir(
           BuildDirContext(settings),
           DirForInput(settings, current_dir, input, err), BuildDirType::OBJ));
     }
diff --git a/src/gn/ninja_binary_target_writer.cc b/src/gn/ninja_binary_target_writer.cc
index c4bbd2b..8c8d2a0 100644
--- a/src/gn/ninja_binary_target_writer.cc
+++ b/src/gn/ninja_binary_target_writer.cc
@@ -196,17 +196,13 @@
     // Make a phony target. We don't need to worry about an empty phony target,
     // as those would have been peeled off already.
     CHECK(!inputs.empty());
-    stamp_or_phony =
-        GetBuildDirForTargetAsOutputFile(target_, BuildDirType::PHONY);
-    stamp_or_phony.append(target_->label().name());
-    stamp_or_phony.append(".inputs");
+    stamp_or_phony = GetOutputFile(*target_, BuildDirType::PHONY,
+                                   target_->label().name(), ".inputs");
     tool = BuiltinTool::kBuiltinToolPhony;
   } else {
     // Make a stamp target.
-    stamp_or_phony =
-        GetBuildDirForTargetAsOutputFile(target_, BuildDirType::OBJ);
-    stamp_or_phony.append(target_->label().name());
-    stamp_or_phony.append(".inputs.stamp");
+    stamp_or_phony = GetOutputFile(*target_, BuildDirType::OBJ,
+                                   target_->label().name(), ".inputs.stamp");
     tool = GetNinjaRulePrefixForToolchain(settings_) +
            GeneralTool::kGeneralToolStamp;
   }
diff --git a/src/gn/ninja_create_bundle_target_writer.cc b/src/gn/ninja_create_bundle_target_writer.cc
index 5b9e733..c91d41c 100644
--- a/src/gn/ninja_create_bundle_target_writer.cc
+++ b/src/gn/ninja_create_bundle_target_writer.cc
@@ -347,15 +347,13 @@
   std::string tool;
   if (settings_->build_settings()->no_stamp_files()) {
     xcassets_input_stamp_or_phony =
-        GetBuildDirForTargetAsOutputFile(target_, BuildDirType::PHONY);
-    xcassets_input_stamp_or_phony.append(target_->label().name());
-    xcassets_input_stamp_or_phony.append(".xcassets.inputdeps");
+        GetOutputFile(*target_, BuildDirType::PHONY, target_->label().name(),
+                      ".xcassets.inputdeps");
     tool = BuiltinTool::kBuiltinToolPhony;
   } else {
     xcassets_input_stamp_or_phony =
-        GetBuildDirForTargetAsOutputFile(target_, BuildDirType::OBJ);
-    xcassets_input_stamp_or_phony.append(target_->label().name());
-    xcassets_input_stamp_or_phony.append(".xcassets.inputdeps.stamp");
+        GetOutputFile(*target_, BuildDirType::OBJ, target_->label().name(),
+                      ".xcassets.inputdeps.stamp");
     tool = GetNinjaRulePrefixForToolchain(settings_) +
            GeneralTool::kGeneralToolStamp;
   }
@@ -434,16 +432,14 @@
     // Make a phony target. We don't need to worry about an empty phony target,
     // as those would have been peeled off already.
     stamp_or_phony =
-        GetBuildDirForTargetAsOutputFile(target_, BuildDirType::PHONY);
-    stamp_or_phony.append(target_->label().name());
-    stamp_or_phony.append(".postprocessing.inputdeps");
+        GetOutputFile(*target_, BuildDirType::PHONY, target_->label().name(),
+                      ".postprocessing.inputdeps");
     tool = BuiltinTool::kBuiltinToolPhony;
   } else {
     // Make a stamp target.
     stamp_or_phony =
-        GetBuildDirForTargetAsOutputFile(target_, BuildDirType::OBJ);
-    stamp_or_phony.append(target_->label().name());
-    stamp_or_phony.append(".postprocessing.inputdeps.stamp");
+        GetOutputFile(*target_, BuildDirType::OBJ, target_->label().name(),
+                      ".postprocessing.inputdeps.stamp");
     tool = GetNinjaRulePrefixForToolchain(settings_) +
            GeneralTool::kGeneralToolStamp;
   }
diff --git a/src/gn/ninja_target_command_util.cc b/src/gn/ninja_target_command_util.cc
index 928851b..825d644 100644
--- a/src/gn/ninja_target_command_util.cc
+++ b/src/gn/ninja_target_command_util.cc
@@ -32,13 +32,8 @@
 OutputFile GetWindowsPCHFile(const Target* target, const char* tool_name) {
   // Use "obj/{dir}/{target_name}_{lang}.pch" which ends up
   // looking like "obj/chrome/browser/browser_cc.pch"
-  OutputFile ret = GetBuildDirForTargetAsOutputFile(target, BuildDirType::OBJ);
-  ret.append(target->label().name());
-  ret.append("_");
-  ret.append(GetPCHLangSuffixForToolType(tool_name));
-  ret.append(".pch");
-
-  return ret;
+  return GetOutputFile(*target, BuildDirType::OBJ, target->label().name(), "_",
+                       GetPCHLangSuffixForToolType(tool_name), ".pch");
 }
 
 void WriteOneFlag(RecursiveWriterConfig config,
diff --git a/src/gn/ninja_target_writer.cc b/src/gn/ninja_target_writer.cc
index 4f3e80d..d3d1eb1 100644
--- a/src/gn/ninja_target_writer.cc
+++ b/src/gn/ninja_target_writer.cc
@@ -650,17 +650,14 @@
   if (settings_->build_settings()->no_stamp_files()) {
     // Make a phony target. We don't need to worry about an empty phony target,
     // as we would return early if there were no inputs.
-    input_stamp_or_phony =
-        GetBuildDirForTargetAsOutputFile(target_, BuildDirType::PHONY);
-    input_stamp_or_phony.append(target_->label().name());
-    input_stamp_or_phony.append(".inputdeps");
+    input_stamp_or_phony = GetOutputFile(*target_, BuildDirType::PHONY,
+                                         target_->label().name(), ".inputdeps");
     tool = BuiltinTool::kBuiltinToolPhony;
   } else {
     // Make a stamp file.
     input_stamp_or_phony =
-        GetBuildDirForTargetAsOutputFile(target_, BuildDirType::OBJ);
-    input_stamp_or_phony.append(target_->label().name());
-    input_stamp_or_phony.append(".inputdeps.stamp");
+        GetOutputFile(*target_, BuildDirType::OBJ, target_->label().name(),
+                      ".inputdeps.stamp");
 
     tool = GetNinjaRulePrefixForToolchain(settings_) +
            GeneralTool::kGeneralToolStamp;
diff --git a/src/gn/ninja_utils.cc b/src/gn/ninja_utils.cc
index ae03c82..8a4ae8c 100644
--- a/src/gn/ninja_utils.cc
+++ b/src/gn/ninja_utils.cc
@@ -11,16 +11,15 @@
 #include "gn/target.h"
 
 SourceFile GetNinjaFileForTarget(const Target* target) {
-  return SourceFile(
-      GetBuildDirForTargetAsSourceDir(target, BuildDirType::OBJ).value() +
-      target->label().name() + ".ninja");
+  return SourceFile(GetSourceDir(*target, BuildDirType::OBJ).value() +
+                    target->label().name() + ".ninja");
 }
 
 SourceFile GetNinjaFileForToolchain(const Settings* settings) {
-  return SourceFile(GetBuildDirAsSourceDir(BuildDirContext(settings),
-                                           BuildDirType::TOOLCHAIN_ROOT)
-                        .value() +
-                    "toolchain.ninja");
+  return SourceFile(
+      GetSourceDir(BuildDirContext(settings), BuildDirType::TOOLCHAIN_ROOT)
+          .value() +
+      "toolchain.ninja");
 }
 
 std::string GetNinjaRulePrefixForToolchain(const Settings* settings) {
@@ -35,13 +34,10 @@
                                      const BuildSettings* build_settings) {
   OutputFile result;
   if (build_settings->no_stamp_files()) {
-    result = GetBuildDirForTargetAsOutputFile(target, BuildDirType::PHONY);
-    result.append(target->label().name());
-    result.append(".public_inputs");
+    return GetOutputFile(*target, BuildDirType::PHONY, target->label().name(),
+                         ".public_inputs");
   } else {
-    result = GetBuildDirForTargetAsOutputFile(target, BuildDirType::OBJ);
-    result.append(target->label().name());
-    result.append(".public_inputs.stamp");
+    return GetOutputFile(*target, BuildDirType::OBJ, target->label().name(),
+                         ".public_inputs.stamp");
   }
-  return result;
 }
diff --git a/src/gn/runtime_deps.cc b/src/gn/runtime_deps.cc
index 1eacee5..855365d 100644
--- a/src/gn/runtime_deps.cc
+++ b/src/gn/runtime_deps.cc
@@ -193,9 +193,8 @@
       // is either a phony alias or was elided entirely (due to lack of real
       // inputs). In either case, there is no file to add an additional
       // extension to, so we should compute our own name in the OBJ BuildDir.
-      output_file = GetBuildDirForTargetAsOutputFile(target, BuildDirType::OBJ);
-      output_file->append(target->GetComputedOutputName());
-      output_file->append(extension);
+      output_file = GetOutputFile(*target, BuildDirType::OBJ,
+                                  target->GetComputedOutputName(), extension);
     }
     if (output_file)
       files_to_write->emplace_back(*output_file, target);
diff --git a/src/gn/rust_project_writer.cc b/src/gn/rust_project_writer.cc
index eb2d4e2..17e92d4 100644
--- a/src/gn/rust_project_writer.cc
+++ b/src/gn/rust_project_writer.cc
@@ -223,8 +223,7 @@
   // Unfortunately this doesn't help if the buildfile author places unrelated
   // generated sources for multiple crates in the same directory, but that's
   // impossible to solve anyway.
-  auto gen_dir = GetBuildDirForTargetAsSourceDir(target, BuildDirType::GEN)
-                     .Resolve(source_root);
+  auto gen_dir = GetSourceDir(*target, BuildDirType::GEN).Resolve(source_root);
   std::vector<SourceDir> include_dirs;
   for (const SourceFile& source : target->sources()) {
     if (gen_dir.IsParent(source.Resolve(source_root))) {
diff --git a/src/gn/scope_per_file_provider.cc b/src/gn/scope_per_file_provider.cc
index 8d706b6..fa7a1d0 100644
--- a/src/gn/scope_per_file_provider.cc
+++ b/src/gn/scope_per_file_provider.cc
@@ -103,8 +103,8 @@
 const Value* ScopePerFileProvider::GetRootGenDir() {
   if (!root_gen_dir_) {
     root_gen_dir_ = std::make_unique<Value>(
-        nullptr, DirectoryWithNoLastSlash(GetBuildDirAsSourceDir(
-                     BuildDirContext(scope_), BuildDirType::GEN)));
+        nullptr, DirectoryWithNoLastSlash(
+                     GetSourceDir(BuildDirContext(scope_), BuildDirType::GEN)));
   }
   return root_gen_dir_.get();
 }
@@ -112,8 +112,8 @@
 const Value* ScopePerFileProvider::GetRootOutDir() {
   if (!root_out_dir_) {
     root_out_dir_ = std::make_unique<Value>(
-        nullptr, DirectoryWithNoLastSlash(GetScopeCurrentBuildDirAsSourceDir(
-                     scope_, BuildDirType::TOOLCHAIN_ROOT)));
+        nullptr, DirectoryWithNoLastSlash(
+                     GetSourceDir(*scope_, BuildDirType::TOOLCHAIN_ROOT)));
   }
   return root_out_dir_.get();
 }
@@ -121,8 +121,8 @@
 const Value* ScopePerFileProvider::GetTargetGenDir() {
   if (!target_gen_dir_) {
     target_gen_dir_ = std::make_unique<Value>(
-        nullptr, DirectoryWithNoLastSlash(GetScopeCurrentBuildDirAsSourceDir(
-                     scope_, BuildDirType::GEN)));
+        nullptr,
+        DirectoryWithNoLastSlash(GetSourceDir(*scope_, BuildDirType::GEN)));
   }
   return target_gen_dir_.get();
 }
@@ -130,8 +130,8 @@
 const Value* ScopePerFileProvider::GetTargetOutDir() {
   if (!target_out_dir_) {
     target_out_dir_ = std::make_unique<Value>(
-        nullptr, DirectoryWithNoLastSlash(GetScopeCurrentBuildDirAsSourceDir(
-                     scope_, BuildDirType::OBJ)));
+        nullptr,
+        DirectoryWithNoLastSlash(GetSourceDir(*scope_, BuildDirType::OBJ)));
   }
   return target_out_dir_.get();
 }
diff --git a/src/gn/substitution_writer.cc b/src/gn/substitution_writer.cc
index 76a5a5c..52d0c81 100644
--- a/src/gn/substitution_writer.cc
+++ b/src/gn/substitution_writer.cc
@@ -368,10 +368,10 @@
                       SourceDir("//"),
                       settings->build_settings()->root_path_utf8());
   } else if (type == &SubstitutionSourceGenDir) {
-    to_rebase = DirectoryWithNoLastSlash(GetSubBuildDirAsSourceDir(
+    to_rebase = DirectoryWithNoLastSlash(GetSourceDir(
         BuildDirContext(settings), source.GetDir(), BuildDirType::GEN));
   } else if (type == &SubstitutionSourceOutDir) {
-    to_rebase = DirectoryWithNoLastSlash(GetSubBuildDirAsSourceDir(
+    to_rebase = DirectoryWithNoLastSlash(GetSourceDir(
         BuildDirContext(settings), source.GetDir(), BuildDirType::OBJ));
   } else if (type == &SubstitutionSourceTargetRelative) {
     if (target) {
@@ -442,20 +442,14 @@
     *result = target->label().GetUserVisibleName(false);
   } else if (type == &SubstitutionRootGenDir) {
     SetDirOrDotWithNoSlash(
-        GetBuildDirAsOutputFile(BuildDirContext(target), BuildDirType::GEN)
-            .value(),
-        result);
+        GetBuildDir(BuildDirContext(target), BuildDirType::GEN), result);
   } else if (type == &SubstitutionRootOutDir) {
     SetDirOrDotWithNoSlash(
         target->settings()->toolchain_output_subdir().value(), result);
   } else if (type == &SubstitutionTargetGenDir) {
-    SetDirOrDotWithNoSlash(
-        GetBuildDirForTargetAsOutputFile(target, BuildDirType::GEN).value(),
-        result);
+    SetDirOrDotWithNoSlash(GetBuildDir(*target, BuildDirType::GEN), result);
   } else if (type == &SubstitutionTargetOutDir) {
-    SetDirOrDotWithNoSlash(
-        GetBuildDirForTargetAsOutputFile(target, BuildDirType::OBJ).value(),
-        result);
+    SetDirOrDotWithNoSlash(GetBuildDir(*target, BuildDirType::OBJ), result);
   } else if (type == &SubstitutionTargetOutputName) {
     *result = target->GetComputedOutputName();
   } else {
diff --git a/src/gn/target.cc b/src/gn/target.cc
index 0048341..c6cef20 100644
--- a/src/gn/target.cc
+++ b/src/gn/target.cc
@@ -979,8 +979,7 @@
       if (settings()->build_settings()->no_stamp_files()) {
         if (HasRealInputs()) {
           dependency_output_alias_ =
-              GetBuildDirForTargetAsOutputFile(this, BuildDirType::PHONY);
-          dependency_output_alias_.append(label().name());
+              GetOutputFile(*this, BuildDirType::PHONY, label().name());
         }
       } else {
         // These don't get linked to and use stamps which should be the first
@@ -989,9 +988,7 @@
         // affect the stamp file name: it is always based on the original target
         // name.
         dependency_output_file_ =
-            GetBuildDirForTargetAsOutputFile(this, BuildDirType::OBJ);
-        dependency_output_file_.append(label().name());
-        dependency_output_file_.append(".stamp");
+            GetOutputFile(*this, BuildDirType::OBJ, label().name(), ".stamp");
       }
       break;
     }
@@ -1409,8 +1406,7 @@
 void Target::set_module_type(ModuleType type) {
   module_type_ = type;
   if (module_type_.test(MODULEMAP_IS_GENERATED)) {
-    auto source_dir = GetBuildDirForTargetAsOutputFile(this, BuildDirType::GEN)
-                          .AsSourceDir(settings()->build_settings());
+    auto source_dir = GetSourceDir(*this, BuildDirType::GEN);
 
     generated_modulemap_file_ = SourceFile(base::StringPrintf(
         "%s%s.modulemap", source_dir.value().c_str(), label().name().c_str()));
diff --git a/src/gn/visual_studio_writer.cc b/src/gn/visual_studio_writer.cc
index d660be8..13e54d4 100644
--- a/src/gn/visual_studio_writer.cc
+++ b/src/gn/visual_studio_writer.cc
@@ -413,7 +413,7 @@
   }
 
   SourceFile target_file =
-      GetBuildDirForTargetAsSourceDir(target, BuildDirType::OBJ)
+      GetSourceDir(*target, BuildDirType::OBJ)
           .ResolveRelativeFile(Value(nullptr, project_name + ".vcxproj"), err);
   if (target_file.is_null())
     return false;
@@ -459,9 +459,9 @@
     const std::string& ninja_executable,
     SourceFileCompileTypePairs* source_types,
     Err* err) {
-  PathOutput path_output(
-      GetBuildDirForTargetAsSourceDir(target, BuildDirType::OBJ),
-      build_settings_->root_path_utf8(), EscapingMode::ESCAPE_NONE);
+  PathOutput path_output(GetSourceDir(*target, BuildDirType::OBJ),
+                         build_settings_->root_path_utf8(),
+                         EscapingMode::ESCAPE_NONE);
 
   out << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl;
   XmlElementWriter project(
@@ -704,9 +704,9 @@
     // File paths are relative to vcxproj files which are generated to out dirs.
     // Filters tree structure need to reflect source directories and be relative
     // to target file. We need two path outputs then.
-    PathOutput file_path_output(
-        GetBuildDirForTargetAsSourceDir(target, BuildDirType::OBJ),
-        build_settings_->root_path_utf8(), EscapingMode::ESCAPE_NONE);
+    PathOutput file_path_output(GetSourceDir(*target, BuildDirType::OBJ),
+                                build_settings_->root_path_utf8(),
+                                EscapingMode::ESCAPE_NONE);
     PathOutput filter_path_output(target->label().dir(),
                                   build_settings_->root_path_utf8(),
                                   EscapingMode::ESCAPE_NONE);
