diff --git a/src/gn/parse_tree.cc b/src/gn/parse_tree.cc
index 34602b1..feccdb2 100644
--- a/src/gn/parse_tree.cc
+++ b/src/gn/parse_tree.cc
@@ -26,6 +26,9 @@
 const char kJsonBeforeComment[] = "before_comment";
 const char kJsonSuffixComment[] = "suffix_comment";
 const char kJsonAfterComment[] = "after_comment";
+
+namespace {
+
 const char kJsonLocation[] = "location";
 const char kJsonLocationBeginLine[] = "begin_line";
 const char kJsonLocationBeginColumn[] = "begin_column";
@@ -36,8 +39,6 @@
 const char kJsonBeginToken[] = "begin_token";
 const char kJsonEnd[] = "end";
 
-namespace {
-
 enum DepsCategory {
   DEPS_CATEGORY_LOCAL,
   DEPS_CATEGORY_RELATIVE,
@@ -231,25 +232,27 @@
 }
 
 void ParseNode::AddCommentsJSONNodes(base::Value* out_value) const {
-  if (comments_) {
-    if (comments_->before().size()) {
-      base::Value comment_values(base::Value::Type::LIST);
-      for (const auto& token : comments_->before())
-        comment_values.GetList().push_back(base::Value(token.value()));
-      out_value->SetKey(kJsonBeforeComment, std::move(comment_values));
-    }
-    if (comments_->suffix().size()) {
-      base::Value comment_values(base::Value::Type::LIST);
-      for (const auto& token : comments_->suffix())
-        comment_values.GetList().push_back(base::Value(token.value()));
-      out_value->SetKey(kJsonSuffixComment, std::move(comment_values));
-    }
-    if (comments_->after().size()) {
-      base::Value comment_values(base::Value::Type::LIST);
-      for (const auto& token : comments_->after())
-        comment_values.GetList().push_back(base::Value(token.value()));
-      out_value->SetKey(kJsonAfterComment, std::move(comment_values));
-    }
+  if (!comments_) {
+    return;
+  }
+
+  if (comments_->before().size()) {
+    base::Value comment_values(base::Value::Type::LIST);
+    for (const auto& token : comments_->before())
+      comment_values.GetList().push_back(base::Value(token.value()));
+    out_value->SetKey(kJsonBeforeComment, std::move(comment_values));
+  }
+  if (comments_->suffix().size()) {
+    base::Value comment_values(base::Value::Type::LIST);
+    for (const auto& token : comments_->suffix())
+      comment_values.GetList().push_back(base::Value(token.value()));
+    out_value->SetKey(kJsonSuffixComment, std::move(comment_values));
+  }
+  if (comments_->after().size()) {
+    base::Value comment_values(base::Value::Type::LIST);
+    for (const auto& token : comments_->after())
+      comment_values.GetList().push_back(base::Value(token.value()));
+    out_value->SetKey(kJsonAfterComment, std::move(comment_values));
   }
 }
 
@@ -279,7 +282,7 @@
 #undef RETURN_IF_MATCHES_NAME
 
   NOTREACHED() << str_type;
-  return std::unique_ptr<ParseNode>();
+  return nullptr;
 }
 
 // AccessorNode ---------------------------------------------------------------
@@ -295,7 +298,7 @@
 Value AccessorNode::Execute(Scope* scope, Err* err) const {
   if (subscript_)
     return ExecuteSubscriptAccess(scope, err);
-  else if (member_)
+  if (member_)
     return ExecuteScopeAccess(scope, err);
   NOTREACHED();
   return Value();
@@ -304,7 +307,7 @@
 LocationRange AccessorNode::GetRange() const {
   if (subscript_)
     return LocationRange(base_.location(), subscript_->GetRange().end());
-  else if (member_)
+  if (member_)
     return LocationRange(base_.location(), member_->GetRange().end());
   NOTREACHED();
   return LocationRange();
@@ -361,14 +364,15 @@
   }
   if (base_value->type() == Value::LIST) {
     return ExecuteArrayAccess(scope, base_value, err);
-  } else if (base_value->type() == Value::SCOPE) {
-    return ExecuteScopeSubscriptAccess(scope, base_value, err);
-  } else {
-    *err = MakeErrorDescribing(
-        std::string("Expecting either a list or a scope for subscript, got ") +
-        Value::DescribeType(base_value->type()) + ".");
-    return Value();
   }
+  if (base_value->type() == Value::SCOPE) {
+    return ExecuteScopeSubscriptAccess(scope, base_value, err);
+  }
+
+  *err = MakeErrorDescribing(
+      std::string("Expecting either a list or a scope for subscript, got ") +
+      Value::DescribeType(base_value->type()) + ".");
+  return Value();
 }
 
 Value AccessorNode::ExecuteArrayAccess(Scope* scope,
@@ -376,8 +380,9 @@
                                        Err* err) const {
   size_t index = 0;
   if (!ComputeAndValidateListIndex(scope, base_value->list_value().size(),
-                                   &index, err))
+                                   &index, err)) {
     return Value();
+  }
   return base_value->list_value()[index];
 }
 
@@ -593,7 +598,8 @@
   if (begin_token_.type() != Token::INVALID &&
       end_->value().type() != Token::INVALID) {
     return begin_token_.range().Union(end_->value().range());
-  } else if (!statements_.empty()) {
+  }
+  if (!statements_.empty()) {
     return statements_[0]->GetRange().Union(
         statements_[statements_.size() - 1]->GetRange());
   }
@@ -634,9 +640,9 @@
   std::unique_ptr<BlockNode> ret;
 
   if (result_mode == kDumpResultModeReturnsScope) {
-    ret.reset(new BlockNode(BlockNode::RETURNS_SCOPE));
+    ret = std::make_unique<BlockNode>(BlockNode::RETURNS_SCOPE);
   } else if (result_mode == kDumpResultModeDiscardsResult) {
-    ret.reset(new BlockNode(BlockNode::DISCARDS_RESULT));
+    ret = std::make_unique<BlockNode>(BlockNode::DISCARDS_RESULT);
   } else {
     NOTREACHED();
   }
@@ -691,9 +697,8 @@
 }
 
 LocationRange ConditionNode::GetRange() const {
-  if (if_false_)
-    return if_token_.range().Union(if_false_->GetRange());
-  return if_token_.range().Union(if_true_->GetRange());
+  return if_token_.range().Union(if_false_ ? if_false_->GetRange()
+                                           : if_true_->GetRange());
 }
 
 Err ConditionNode::MakeErrorDescribing(const std::string& msg,
@@ -749,9 +754,8 @@
 LocationRange FunctionCallNode::GetRange() const {
   if (function_.type() == Token::INVALID)
     return LocationRange();  // This will be null in some tests.
-  if (block_)
-    return function_.range().Union(block_->GetRange());
-  return function_.range().Union(args_->GetRange());
+  return function_.range().Union(block_ ? block_->GetRange()
+                                        : args_->GetRange());
 }
 
 Err FunctionCallNode::MakeErrorDescribing(const std::string& msg,
@@ -859,7 +863,7 @@
 
 // ListNode -------------------------------------------------------------------
 
-ListNode::ListNode() {}
+ListNode::ListNode() = default;
 
 ListNode::~ListNode() = default;
 
@@ -938,11 +942,13 @@
       const ParseNode* node = contents_[i].get();
       if (!node->AsLiteral() && !node->AsIdentifier() && !node->AsAccessor()) {
         skip = true;
-        continue;
+        break;
       }
     }
-    if (skip)
+    if (skip) {
       continue;
+    }
+
     // Save the original line number so that we can re-assign ranges. We assume
     // they're contiguous lines because GetSortRanges() does so above. We need
     // to re-assign these line numbers primiarily because `gn format` uses them
