diff --git a/src/gn/analyzer.cc b/src/gn/analyzer.cc
index 1e8ff3e..a4ee31f 100644
--- a/src/gn/analyzer.cc
+++ b/src/gn/analyzer.cc
@@ -444,8 +444,7 @@
   for (const auto& cur_file : target->data()) {
     if (cur_file == file->value())
       return true;
-    if (cur_file.back() == '/' &&
-        base::StartsWith(file->value(), cur_file, base::CompareCase::SENSITIVE))
+    if (cur_file.back() == '/' && file->value().starts_with(cur_file))
       return true;
   }
 
diff --git a/src/gn/bundle_data.cc b/src/gn/bundle_data.cc
index 3615731..62791c3 100644
--- a/src/gn/bundle_data.cc
+++ b/src/gn/bundle_data.cc
@@ -35,19 +35,13 @@
   //    .*\.xcassets/[^/]*\.symbolset/[^/]*
   bool is_file_from_asset_catalog = false;
   std::string_view dir = FindDirNoTrailingSeparator(source);
-  if (base::EndsWith(source, "/Contents.json", base::CompareCase::SENSITIVE) &&
-      base::EndsWith(dir, ".xcassets", base::CompareCase::SENSITIVE)) {
+  if (source.ends_with("/Contents.json") && dir.ends_with(".xcassets")) {
     is_file_from_asset_catalog = true;
-  } else if (base::EndsWith(dir, ".appiconset", base::CompareCase::SENSITIVE) ||
-             base::EndsWith(dir, ".colorset", base::CompareCase::SENSITIVE) ||
-             base::EndsWith(dir, ".dataset", base::CompareCase::SENSITIVE) ||
-             base::EndsWith(dir, ".imageset", base::CompareCase::SENSITIVE) ||
-             base::EndsWith(dir, ".launchimage",
-                            base::CompareCase::SENSITIVE) ||
-             base::EndsWith(dir, ".symbolset", base::CompareCase::SENSITIVE)) {
+  } else if (dir.ends_with(".appiconset") || dir.ends_with(".colorset") ||
+             dir.ends_with(".dataset") || dir.ends_with(".imageset") ||
+             dir.ends_with(".launchimage") || dir.ends_with(".symbolset")) {
     dir = FindDirNoTrailingSeparator(dir);
-    is_file_from_asset_catalog =
-        base::EndsWith(dir, ".xcassets", base::CompareCase::SENSITIVE);
+    is_file_from_asset_catalog = dir.ends_with(".xcassets");
   }
   if (is_file_from_asset_catalog && asset_catalog) {
     std::string asset_catalog_path(dir);
diff --git a/src/gn/c_include_iterator.cc b/src/gn/c_include_iterator.cc
index e4cd7d4..c747034 100644
--- a/src/gn/c_include_iterator.cc
+++ b/src/gn/c_include_iterator.cc
@@ -42,12 +42,11 @@
 // We assume the line has leading whitespace trimmed. We also assume that empty
 // lines have already been filtered out.
 bool ShouldCountTowardNonIncludeLines(std::string_view line) {
-  if (base::StartsWith(line, "//", base::CompareCase::SENSITIVE))
+  if (line.starts_with("//"))
     return false;  // Don't count comments.
-  if (base::StartsWith(line, "/*", base::CompareCase::SENSITIVE) ||
-      base::StartsWith(line, " *", base::CompareCase::SENSITIVE))
+  if (line.starts_with("/*") || line.starts_with(" *"))
     return false;  // C-style comment blocks with stars along the left side.
-  if (base::StartsWith(line, "#", base::CompareCase::SENSITIVE))
+  if (line.starts_with("#"))
     return false;  // Don't count preprocessor.
   if (base::ContainsOnlyChars(line, base::kWhitespaceASCII))
     return false;  // Don't count whitespace lines.
@@ -78,11 +77,9 @@
   trimmed = TrimLeadingWhitespace(trimmed.substr(1));
 
   std::string_view contents;
-  if (base::StartsWith(trimmed, std::string_view(kInclude, kIncludeLen),
-                       base::CompareCase::SENSITIVE))
+  if (trimmed.starts_with(std::string_view(kInclude, kIncludeLen)))
     contents = TrimLeadingWhitespace(trimmed.substr(kIncludeLen));
-  else if (base::StartsWith(trimmed, std::string_view(kImport, kImportLen),
-                            base::CompareCase::SENSITIVE))
+  else if (trimmed.starts_with(std::string_view(kImport, kImportLen)))
     contents = TrimLeadingWhitespace(trimmed.substr(kImportLen));
 
   if (contents.empty())
diff --git a/src/gn/command_format.cc b/src/gn/command_format.cc
index 7f22493..1a6f9ec 100644
--- a/src/gn/command_format.cc
+++ b/src/gn/command_format.cc
@@ -411,15 +411,13 @@
        binop->op().value() == "-=") &&
       ident) {
     const std::string_view lhs = ident->value().value();
-    if (base::EndsWith(lhs, "sources", base::CompareCase::SENSITIVE) ||
-        lhs == "public") {
+    if (lhs.ends_with("sources") || lhs == "public") {
       TraverseBinaryOpNode(binop->right(), [](const ParseNode* node) {
         const ListNode* list = node->AsList();
         if (list)
           const_cast<ListNode*>(list)->SortAsStringsList();
       });
-    } else if (base::EndsWith(lhs, "deps", base::CompareCase::SENSITIVE) ||
-               lhs == "visibility") {
+    } else if (lhs.ends_with("deps") || lhs == "visibility") {
       TraverseBinaryOpNode(binop->right(), [](const ParseNode* node) {
         const ListNode* list = node->AsList();
         if (list)
diff --git a/src/gn/commands.cc b/src/gn/commands.cc
index 0f607d9..ba7cff0 100644
--- a/src/gn/commands.cc
+++ b/src/gn/commands.cc
@@ -327,8 +327,7 @@
   for (const auto& cur_file : target->data()) {
     if (cur_file == file.value())
       return HowTargetContainsFile::kData;
-    if (cur_file.back() == '/' &&
-        base::StartsWith(file.value(), cur_file, base::CompareCase::SENSITIVE))
+    if (cur_file.back() == '/' && file.value().starts_with(cur_file))
       return HowTargetContainsFile::kData;
   }
 
diff --git a/src/gn/config_values_generator.cc b/src/gn/config_values_generator.cc
index d8b481f..a2ae225 100644
--- a/src/gn/config_values_generator.cc
+++ b/src/gn/config_values_generator.cc
@@ -148,7 +148,7 @@
 
     // Check for common errors. This is a string and not a file.
     const std::string& pch_string = precompiled_header_value->string_value();
-    if (base::StartsWith(pch_string, "//", base::CompareCase::SENSITIVE)) {
+    if (pch_string.starts_with("//")) {
       *err_ = Err(
           *precompiled_header_value, "This precompiled_header value is wrong. ",
           "You need to specify a string that the compiler will match against\n"
diff --git a/src/gn/filesystem_utils.cc b/src/gn/filesystem_utils.cc
index d0ad23c..d37750b 100644
--- a/src/gn/filesystem_utils.cc
+++ b/src/gn/filesystem_utils.cc
@@ -179,8 +179,7 @@
                                    OutputFile* result) {
   const std::string& build_dir = build_settings->build_dir().value();
 
-  if (base::StartsWith(source_dir.value(), build_dir,
-                       base::CompareCase::SENSITIVE)) {
+  if (source_dir.value().starts_with(build_dir)) {
     size_t build_dir_size = build_dir.size();
     result->value().append(&source_dir.value()[build_dir_size],
                            source_dir.value().size() - build_dir_size);
@@ -709,8 +708,7 @@
                        const SourceDir& dest_dir,
                        std::string_view source_root) {
   std::string ret;
-  DCHECK(source_root.empty() ||
-         !base::EndsWith(source_root, "/", base::CompareCase::SENSITIVE));
+  DCHECK(source_root.empty() || !source_root.ends_with("/"));
 
   bool input_is_source_path =
       (input.size() >= 2 && input[0] == '/' && input[1] == '/');
diff --git a/src/gn/input_conversion.cc b/src/gn/input_conversion.cc
index 596eba3..9898e9e 100644
--- a/src/gn/input_conversion.cc
+++ b/src/gn/input_conversion.cc
@@ -210,8 +210,7 @@
     return Value();  // Empty string means discard the result.
 
   const char kTrimPrefix[] = "trim ";
-  if (base::StartsWith(input_conversion, kTrimPrefix,
-                       base::CompareCase::SENSITIVE)) {
+  if (input_conversion.starts_with(kTrimPrefix)) {
     std::string trimmed;
     base::TrimWhitespaceASCII(input, base::TRIM_ALL, &trimmed);
 
diff --git a/src/gn/parse_tree.cc b/src/gn/parse_tree.cc
index 4041781..34602b1 100644
--- a/src/gn/parse_tree.cc
+++ b/src/gn/parse_tree.cc
@@ -61,8 +61,7 @@
 std::tuple<std::string_view, std::string_view> SplitAtFirst(
     std::string_view str,
     char c) {
-  if (!base::StartsWith(str, "\"", base::CompareCase::SENSITIVE) ||
-      !base::EndsWith(str, "\"", base::CompareCase::SENSITIVE))
+  if (!str.starts_with("\"") || !str.ends_with("\""))
     return std::make_tuple(str, std::string_view());
 
   str = str.substr(1, str.length() - 2);
@@ -1090,9 +1089,7 @@
       return Value(this, false);
     case Token::INTEGER: {
       std::string_view s = value_.value();
-      if ((base::StartsWith(s, "0", base::CompareCase::SENSITIVE) &&
-           s.size() > 1) ||
-          base::StartsWith(s, "-0", base::CompareCase::SENSITIVE)) {
+      if ((s.starts_with("0") && s.size() > 1) || s.starts_with("-0")) {
         if (s == "-0")
           *err = MakeErrorDescribing("Negative zero doesn't make sense");
         else
diff --git a/src/gn/target.cc b/src/gn/target.cc
index 500dda5..b6c6ca0 100644
--- a/src/gn/target.cc
+++ b/src/gn/target.cc
@@ -575,9 +575,7 @@
   if (tool) {
     // Only add the prefix if the name doesn't already have it and it's not
     // being overridden.
-    if (!output_prefix_override_ &&
-        !base::StartsWith(name, tool->output_prefix(),
-                          base::CompareCase::SENSITIVE))
+    if (!output_prefix_override_ && !name.starts_with(tool->output_prefix()))
       result = tool->output_prefix();
   }
   result.append(name);
diff --git a/src/gn/visual_studio_utils.cc b/src/gn/visual_studio_utils.cc
index 5282d0e..530663e 100644
--- a/src/gn/visual_studio_utils.cc
+++ b/src/gn/visual_studio_utils.cc
@@ -116,7 +116,7 @@
 // Parses |ldflags| value and stores it in |options|.
 void ParseLinkerOption(const std::string& ldflag, LinkerOptions* options) {
   const char kSubsytemPrefix[] = "/SUBSYSTEM:";
-  if (base::StartsWith(ldflag, kSubsytemPrefix, base::CompareCase::SENSITIVE)) {
+  if (ldflag.starts_with(kSubsytemPrefix)) {
     const std::string subsystem(
         ldflag.begin() + std::string(kSubsytemPrefix).length(), ldflag.end());
     const std::vector<std::string> tokens = base::SplitString(
diff --git a/src/gn/visual_studio_writer.cc b/src/gn/visual_studio_writer.cc
index 86fb2a1..037450e 100644
--- a/src/gn/visual_studio_writer.cc
+++ b/src/gn/visual_studio_writer.cc
@@ -916,8 +916,7 @@
   std::vector<SolutionEntry*> parents;
   for (const std::unique_ptr<SolutionEntry>& folder : folders_) {
     while (!parents.empty()) {
-      if (base::StartsWith(folder->path, parents.back()->path,
-                           base::CompareCase::SENSITIVE)) {
+      if (folder->path.starts_with(parents.back()->path)) {
         folder->parent_folder = parents.back();
         break;
       } else {
diff --git a/src/gn/xcode_writer.cc b/src/gn/xcode_writer.cc
index 9577295..83c7c16 100644
--- a/src/gn/xcode_writer.cc
+++ b/src/gn/xcode_writer.cc
@@ -134,32 +134,27 @@
 
 bool IsXCUITestRunnerTarget(const Target* target) {
   return IsApplicationTarget(target) &&
-         base::EndsWith(target->label().name(),
-                        kXCUITestRunnerTargetNamePostfix,
-                        base::CompareCase::SENSITIVE);
+         target->label().name().ends_with(kXCUITestRunnerTargetNamePostfix);
 }
 
 bool IsXCTestModuleTarget(const Target* target) {
   return target->output_type() == Target::CREATE_BUNDLE &&
          target->bundle_data().product_type() ==
              "com.apple.product-type.bundle.unit-test" &&
-         base::EndsWith(target->label().name(), kXCTestModuleTargetNamePostfix,
-                        base::CompareCase::SENSITIVE);
+         target->label().name().ends_with(kXCTestModuleTargetNamePostfix);
 }
 
 bool IsXCUITestModuleTarget(const Target* target) {
   return target->output_type() == Target::CREATE_BUNDLE &&
          target->bundle_data().product_type() ==
              "com.apple.product-type.bundle.ui-testing" &&
-         base::EndsWith(target->label().name(), kXCTestModuleTargetNamePostfix,
-                        base::CompareCase::SENSITIVE);
+         target->label().name().ends_with(kXCTestModuleTargetNamePostfix);
 }
 
 bool IsXCTestFile(const SourceFile& file) {
   std::string file_name = file.GetName();
   for (size_t i = 0; i < std::size(kXCTestFileSuffixes); ++i) {
-    if (base::EndsWith(file_name, kXCTestFileSuffixes[i],
-                       base::CompareCase::SENSITIVE)) {
+    if (file_name.ends_with(kXCTestFileSuffixes[i])) {
       return true;
     }
   }
