diff --git a/src/gn/build_file_editor.h b/src/gn/build_file_editor.h
index a003816..c4a2813 100644
--- a/src/gn/build_file_editor.h
+++ b/src/gn/build_file_editor.h
@@ -78,20 +78,17 @@
     results->push_back(std::move(*mapped));
   }
 
-  if (auto* block = node->AsBlock()) {
+  if (auto* block = node->AsBlockMut()) {
     for (const auto& stmt : block->statements()) {
       FindStatementRecursive(stmt.get(), stack, transform, results);
     }
-  } else if (auto* condition = node->AsCondition()) {
-    FindStatementRecursive(const_cast<BlockNode*>(condition->if_true()), stack,
-                           transform, results);
+  } else if (auto* condition = node->AsConditionMut()) {
+    FindStatementRecursive(condition->if_true(), stack, transform, results);
     if (condition->if_false()) {
-      FindStatementRecursive(const_cast<ParseNode*>(condition->if_false()),
-                             stack, transform, results);
+      FindStatementRecursive(condition->if_false(), stack, transform, results);
     }
-  } else if (auto* func = node->AsFunctionCall(); func && func->block()) {
-    FindStatementRecursive(const_cast<BlockNode*>(func->block()), stack,
-                           transform, results);
+  } else if (auto* func = node->AsFunctionCallMut(); func && func->block()) {
+    FindStatementRecursive(func->block(), stack, transform, results);
   }
 
   stack.pop_back();
diff --git a/src/gn/parse_tree.cc b/src/gn/parse_tree.cc
index 8173c90..03fec79 100644
--- a/src/gn/parse_tree.cc
+++ b/src/gn/parse_tree.cc
@@ -995,8 +995,8 @@
     int start_line = contents_[sr.begin]->GetRange().begin().line_number();
     const ParseNode* original_first = contents_[sr.begin].get();
     std::sort(contents_.begin() + sr.begin, contents_.begin() + sr.end,
-              [&comparator](const std::unique_ptr<const ParseNode>& a,
-                            const std::unique_ptr<const ParseNode>& b) {
+              [&comparator](const std::unique_ptr<ParseNode>& a,
+                            const std::unique_ptr<ParseNode>& b) {
                 return comparator(a.get(), b.get());
               });
     // If the beginning of the range had before comments, and the first node
@@ -1005,9 +1005,7 @@
     if (original_first->comments() &&
         contents_[sr.begin].get() != original_first) {
       for (const auto& hc : original_first->comments()->before()) {
-        const_cast<ParseNode*>(contents_[sr.begin].get())
-            ->comments_mutable()
-            ->append_before(hc);
+        contents_[sr.begin]->comments_mutable()->append_before(hc);
       }
       const_cast<ParseNode*>(original_first)
           ->comments_mutable()
diff --git a/src/gn/parse_tree.h b/src/gn/parse_tree.h
index 08b5dbc..f30c59e 100644
--- a/src/gn/parse_tree.h
+++ b/src/gn/parse_tree.h
@@ -272,9 +272,11 @@
   void set_op(const Token& t) { op_ = t; }
 
   const ParseNode* left() const { return left_.get(); }
+  ParseNode* left() { return left_.get(); }
   void set_left(std::unique_ptr<ParseNode> left) { left_ = std::move(left); }
 
   const ParseNode* right() const { return right_.get(); }
+  ParseNode* right() { return right_.get(); }
   void set_right(std::unique_ptr<ParseNode> right) {
     right_ = std::move(right);
   }
@@ -371,16 +373,19 @@
   void set_if_token(const Token& token) { if_token_ = token; }
 
   const ParseNode* condition() const { return condition_.get(); }
+  ParseNode* condition() { return condition_.get(); }
   void set_condition(std::unique_ptr<ParseNode> c) {
     condition_ = std::move(c);
   }
 
   const BlockNode* if_true() const { return if_true_.get(); }
+  BlockNode* if_true() { return if_true_.get(); }
   void set_if_true(std::unique_ptr<BlockNode> t) { if_true_ = std::move(t); }
 
   // This is either empty, a block (for the else clause), or another
   // condition.
   const ParseNode* if_false() const { return if_false_.get(); }
+  ParseNode* if_false() { return if_false_.get(); }
   void set_if_false(std::unique_ptr<ParseNode> f) { if_false_ = std::move(f); }
 
   static constexpr const char* kDumpNodeName = "CONDITION";
@@ -418,6 +423,7 @@
   void set_function(Token t) { function_ = t; }
 
   const ListNode* args() const { return args_.get(); }
+  ListNode* args() { return args_.get(); }
   void set_args(std::unique_ptr<ListNode> a);
 
   const BlockNode* block() const { return block_.get(); }
@@ -492,12 +498,10 @@
   void append_item(std::unique_ptr<ParseNode> s) {
     contents_.push_back(std::move(s));
   }
-  const std::vector<std::unique_ptr<const ParseNode>>& contents() const {
+  const std::vector<std::unique_ptr<ParseNode>>& contents() const {
     return contents_;
   }
-  std::vector<std::unique_ptr<const ParseNode>>& contents() {
-    return contents_;
-  }
+  std::vector<std::unique_ptr<ParseNode>>& contents() { return contents_; }
 
   void ShortenTargets();
   void SortAsStringsList();
@@ -523,7 +527,7 @@
   Token begin_token_;
   std::unique_ptr<EndNode> end_;
 
-  std::vector<std::unique_ptr<const ParseNode>> contents_;
+  std::vector<std::unique_ptr<ParseNode>> contents_;
 
   ListNode(const ListNode&) = delete;
   ListNode& operator=(const ListNode&) = delete;
diff --git a/src/gn/parse_tree_unittest.cc b/src/gn/parse_tree_unittest.cc
index 49a3fd1..e5f41ff 100644
--- a/src/gn/parse_tree_unittest.cc
+++ b/src/gn/parse_tree_unittest.cc
@@ -196,11 +196,11 @@
   ASSERT_EQ(7u, contents.size());
 
   auto all_elements_are_literal_nodes =
-      [](base::span<const std::unique_ptr<const ParseNode>> container) -> bool {
-    return std::ranges::all_of(
-        container, [](const std::unique_ptr<const ParseNode>& element) {
-          return element->AsLiteral();
-        });
+      [](base::span<const std::unique_ptr<ParseNode>> container) -> bool {
+    return std::ranges::all_of(container,
+                               [](const std::unique_ptr<ParseNode>& element) {
+                                 return element->AsLiteral();
+                               });
   };
 
   auto get_literal_value = [](const ParseNode& node) {
