GN: Replace vector<ParseNode*> with vector<unique_ptr<ParseNode>> in parse_tree.h.
Chromium can now use std::unique_ptr.
BUG=602726
Review URL: https://codereview.chromium.org/1884503003
Cr-Original-Commit-Position: refs/heads/master@{#387958}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 6ce99c7025ebaca2747f659da3700a388f627919
diff --git a/tools/gn/command_format.cc b/tools/gn/command_format.cc
index a054b21..7b8f2f3 100644
--- a/tools/gn/command_format.cc
+++ b/tools/gn/command_format.cc
@@ -181,7 +181,7 @@
// bracket.
template <class PARSENODE> // Just for const covariance.
void Sequence(SequenceStyle style,
- const std::vector<PARSENODE*>& list,
+ const std::vector<std::unique_ptr<PARSENODE>>& list,
const ParseNode* end,
bool force_multiline);
@@ -194,7 +194,7 @@
void InitializeSub(Printer* sub);
template <class PARSENODE>
- bool ListWillBeMultiline(const std::vector<PARSENODE*>& list,
+ bool ListWillBeMultiline(const std::vector<std::unique_ptr<PARSENODE>>& list,
const ParseNode* end);
std::string output_; // Output buffer.
@@ -385,7 +385,7 @@
size_t i = 0;
for (const auto& stmt : block->statements()) {
- Expr(stmt, kPrecedenceLowest, std::string());
+ Expr(stmt.get(), kPrecedenceLowest, std::string());
Newline();
if (stmt->comments()) {
// Why are before() not printed here too? before() are handled inside
@@ -399,8 +399,8 @@
}
}
if (i < block->statements().size() - 1 &&
- (ShouldAddBlankLineInBetween(block->statements()[i],
- block->statements()[i + 1]))) {
+ (ShouldAddBlankLineInBetween(block->statements()[i].get(),
+ block->statements()[i + 1].get()))) {
Newline();
}
++i;
@@ -648,7 +648,7 @@
template <class PARSENODE>
void Printer::Sequence(SequenceStyle style,
- const std::vector<PARSENODE*>& list,
+ const std::vector<std::unique_ptr<PARSENODE>>& list,
const ParseNode* end,
bool force_multiline) {
if (style == kSequenceStyleList)
@@ -665,7 +665,7 @@
// No elements, and not forcing newlines, print nothing.
} else if (list.size() == 1 && !force_multiline) {
Print(" ");
- Expr(list[0], kPrecedenceLowest, std::string());
+ Expr(list[0].get(), kPrecedenceLowest, std::string());
CHECK(!list[0]->comments() || list[0]->comments()->after().empty());
Print(" ");
} else {
@@ -687,11 +687,11 @@
bool body_of_list = i < list.size() - 1 || style == kSequenceStyleList;
bool want_comma =
body_of_list && (style == kSequenceStyleList && !x->AsBlockComment());
- Expr(x, kPrecedenceLowest, want_comma ? "," : std::string());
+ Expr(x.get(), kPrecedenceLowest, want_comma ? "," : std::string());
CHECK(!x->comments() || x->comments()->after().empty());
if (body_of_list) {
if (i < list.size() - 1 &&
- ShouldAddBlankLineInBetween(list[i], list[i + 1]))
+ ShouldAddBlankLineInBetween(list[i].get(), list[i + 1].get()))
Newline();
}
++i;
@@ -734,7 +734,7 @@
bool have_block = func_call->block() != nullptr;
bool force_multiline = false;
- const std::vector<const ParseNode*>& list = func_call->args()->contents();
+ const auto& list = func_call->args()->contents();
const ParseNode* end = func_call->args()->End();
if (end && end->comments() && !end->comments()->before().empty())
@@ -767,7 +767,7 @@
IndentState(CurrentColumn(), continuation_requires_indent, false));
int penalty_one_line = 0;
for (size_t i = 0; i < list.size(); ++i) {
- penalty_one_line += sub1.Expr(list[i], kPrecedenceLowest,
+ penalty_one_line += sub1.Expr(list[i].get(), kPrecedenceLowest,
i < list.size() - 1 ? ", " : std::string());
}
sub1.Print(terminator);
@@ -785,8 +785,9 @@
IndentState(CurrentColumn(), continuation_requires_indent, false));
int penalty_multiline_start_same_line = 0;
for (size_t i = 0; i < list.size(); ++i) {
- penalty_multiline_start_same_line += sub2.Expr(
- list[i], kPrecedenceLowest, i < list.size() - 1 ? "," : std::string());
+ penalty_multiline_start_same_line +=
+ sub2.Expr(list[i].get(), kPrecedenceLowest,
+ i < list.size() - 1 ? "," : std::string());
if (i < list.size() - 1) {
sub2.Newline();
}
@@ -807,8 +808,9 @@
std::abs(sub3.CurrentColumn() - start_column) *
kPenaltyHorizontalSeparation;
}
- penalty_multiline_start_next_line += sub3.Expr(
- list[i], kPrecedenceLowest, i < list.size() - 1 ? "," : std::string());
+ penalty_multiline_start_next_line +=
+ sub3.Expr(list[i].get(), kPrecedenceLowest,
+ i < list.size() - 1 ? "," : std::string());
if (i < list.size() - 1) {
sub3.Newline();
}
@@ -852,7 +854,7 @@
Newline();
}
bool want_comma = i < list.size() - 1 && !x->AsBlockComment();
- Expr(x, kPrecedenceLowest, want_comma ? "," : std::string());
+ Expr(x.get(), kPrecedenceLowest, want_comma ? "," : std::string());
CHECK(!x->comments() || x->comments()->after().empty());
if (i < list.size() - 1) {
if (!want_comma)
@@ -900,8 +902,9 @@
}
template <class PARSENODE>
-bool Printer::ListWillBeMultiline(const std::vector<PARSENODE*>& list,
- const ParseNode* end) {
+bool Printer::ListWillBeMultiline(
+ const std::vector<std::unique_ptr<PARSENODE>>& list,
+ const ParseNode* end) {
if (list.size() > 1)
return true;
diff --git a/tools/gn/function_foreach.cc b/tools/gn/function_foreach.cc
index 549ebe4..b74fc18 100644
--- a/tools/gn/function_foreach.cc
+++ b/tools/gn/function_foreach.cc
@@ -47,7 +47,7 @@
const FunctionCallNode* function,
const ListNode* args_list,
Err* err) {
- const std::vector<const ParseNode*>& args_vector = args_list->contents();
+ const auto& args_vector = args_list->contents();
if (args_vector.size() != 2) {
*err = Err(function, "Wrong number of arguments to foreach().",
"Expecting exactly two.");
@@ -57,7 +57,8 @@
// Extract the loop variable.
const IdentifierNode* identifier = args_vector[0]->AsIdentifier();
if (!identifier) {
- *err = Err(args_vector[0], "Expected an identifier for the loop var.");
+ *err =
+ Err(args_vector[0].get(), "Expected an identifier for the loop var.");
return Value();
}
base::StringPiece loop_var(identifier->value().value());
@@ -69,7 +70,7 @@
if (list_identifier) {
list_value = scope->GetValue(list_identifier->value().value(), true);
if (!list_value) {
- *err = Err(args_vector[1], "Undefined identifier.");
+ *err = Err(args_vector[1].get(), "Undefined identifier.");
return Value();
}
} else {
diff --git a/tools/gn/function_forward_variables_from.cc b/tools/gn/function_forward_variables_from.cc
index ee14128..dd3629b 100644
--- a/tools/gn/function_forward_variables_from.cc
+++ b/tools/gn/function_forward_variables_from.cc
@@ -153,7 +153,7 @@
const FunctionCallNode* function,
const ListNode* args_list,
Err* err) {
- const std::vector<const ParseNode*>& args_vector = args_list->contents();
+ const auto& args_vector = args_list->contents();
if (args_vector.size() != 2 && args_vector.size() != 3) {
*err = Err(function, "Wrong number of arguments.",
"Expecting two or three arguments.");
@@ -166,7 +166,7 @@
// to execute the ParseNode and get the value out if it's not an identifer.
const IdentifierNode* identifier = args_vector[0]->AsIdentifier();
if (!identifier) {
- *err = Err(args_vector[0], "Expected an identifier for the scope.");
+ *err = Err(args_vector[0].get(), "Expected an identifier for the scope.");
return Value();
}
diff --git a/tools/gn/functions.cc b/tools/gn/functions.cc
index f6d405d..af413d6 100644
--- a/tools/gn/functions.cc
+++ b/tools/gn/functions.cc
@@ -464,7 +464,7 @@
const FunctionCallNode* function,
const ListNode* args_list,
Err* err) {
- const std::vector<const ParseNode*>& args_vector = args_list->contents();
+ const auto& args_vector = args_list->contents();
if (args_vector.size() != 1) {
*err = Err(function, "Wrong number of arguments to defined().",
"Expecting exactly one.");
diff --git a/tools/gn/parse_tree.cc b/tools/gn/parse_tree.cc
index 167531c..dc80514 100644
--- a/tools/gn/parse_tree.cc
+++ b/tools/gn/parse_tree.cc
@@ -297,7 +297,6 @@
}
BlockNode::~BlockNode() {
- STLDeleteContainerPointers(statements_.begin(), statements_.end());
}
const BlockNode* BlockNode::AsBlock() const {
@@ -307,7 +306,7 @@
Value BlockNode::Execute(Scope* scope, Err* err) const {
for (size_t i = 0; i < statements_.size() && !err->has_error(); i++) {
// Check for trying to execute things with no side effects in a block.
- const ParseNode* cur = statements_[i];
+ const ParseNode* cur = statements_[i].get();
if (cur->AsList() || cur->AsLiteral() || cur->AsUnaryOp() ||
cur->AsIdentifier()) {
*err = cur->MakeErrorDescribing(
@@ -492,7 +491,6 @@
}
ListNode::~ListNode() {
- STLDeleteContainerPointers(contents_.begin(), contents_.end());
}
const ListNode* ListNode::AsList() const {
@@ -547,7 +545,7 @@
bool skip = false;
for (size_t i = sr.begin; i != sr.end; ++i) {
// Bails out if any of the nodes are unsupported.
- const ParseNode* node = contents_[i];
+ const ParseNode* node = contents_[i].get();
if (!node->AsLiteral() && !node->AsIdentifier() && !node->AsAccessor()) {
skip = true;
continue;
@@ -561,15 +559,19 @@
// to determine whether two nodes were initially separated by a blank line
// or not.
int start_line = contents_[sr.begin]->GetRange().begin().line_number();
- const ParseNode* original_first = contents_[sr.begin];
+ const ParseNode* original_first = contents_[sr.begin].get();
std::sort(contents_.begin() + sr.begin, contents_.begin() + sr.end,
- comparator);
+ [&comparator](const std::unique_ptr<const ParseNode>& a,
+ const std::unique_ptr<const ParseNode>& b) {
+ return comparator(a.get(), b.get());
+ });
// If the beginning of the range had before comments, and the first node
// moved during the sort, then move its comments to the new head of the
// range.
- if (original_first->comments() && contents_[sr.begin] != original_first) {
+ if (original_first->comments() &&
+ contents_[sr.begin].get() != original_first) {
for (const auto& hc : original_first->comments()->before()) {
- const_cast<ParseNode*>(contents_[sr.begin])
+ const_cast<ParseNode*>(contents_[sr.begin].get())
->comments_mutable()
->append_before(hc);
}
@@ -579,7 +581,7 @@
}
const ParseNode* prev = nullptr;
for (size_t i = sr.begin; i != sr.end; ++i) {
- const ParseNode* node = contents_[i];
+ const ParseNode* node = contents_[i].get();
DCHECK(node->AsLiteral() || node->AsIdentifier() || node->AsAccessor());
int line_number =
prev ? prev->GetRange().end().line_number() + 1 : start_line;
@@ -627,8 +629,8 @@
std::vector<SortRange> ranges;
const ParseNode* prev = nullptr;
size_t begin = 0;
- for (size_t i = begin; i < contents_.size(); prev = contents_[i++]) {
- if (IsSortRangeSeparator(contents_[i], prev)) {
+ for (size_t i = begin; i < contents_.size(); prev = contents_[i++].get()) {
+ if (IsSortRangeSeparator(contents_[i].get(), prev)) {
if (i > begin) {
ranges.push_back(SortRange(begin, i));
// If |i| is an item with an attached comment, then we start the next
diff --git a/tools/gn/parse_tree.h b/tools/gn/parse_tree.h
index 2853799..48313be 100644
--- a/tools/gn/parse_tree.h
+++ b/tools/gn/parse_tree.h
@@ -227,9 +227,11 @@
void set_end(std::unique_ptr<EndNode> e) { end_ = std::move(e); }
const EndNode* End() const { return end_.get(); }
- const std::vector<ParseNode*>& statements() const { return statements_; }
+ const std::vector<std::unique_ptr<ParseNode>>& statements() const {
+ return statements_;
+ }
void append_statement(std::unique_ptr<ParseNode> s) {
- statements_.push_back(s.release());
+ statements_.push_back(std::move(s));
}
private:
@@ -238,8 +240,7 @@
Token begin_token_;
std::unique_ptr<EndNode> end_;
- // Owning pointers, use unique_ptr when we can use C++11.
- std::vector<ParseNode*> statements_;
+ std::vector<std::unique_ptr<ParseNode>> statements_;
DISALLOW_COPY_AND_ASSIGN(BlockNode);
};
@@ -364,9 +365,11 @@
const EndNode* End() const { return end_.get(); }
void append_item(std::unique_ptr<ParseNode> s) {
- contents_.push_back(s.release());
+ contents_.push_back(std::move(s));
}
- const std::vector<const ParseNode*>& contents() const { return contents_; }
+ const std::vector<std::unique_ptr<const ParseNode>>& contents() const {
+ return contents_;
+ }
void SortAsStringsList();
void SortAsDepsList();
@@ -397,8 +400,7 @@
std::unique_ptr<EndNode> end_;
bool prefer_multiline_;
- // Owning pointers, use unique_ptr when we can use C++11.
- std::vector<const ParseNode*> contents_;
+ std::vector<std::unique_ptr<const ParseNode>> contents_;
DISALLOW_COPY_AND_ASSIGN(ListNode);
};
diff --git a/tools/gn/parser.cc b/tools/gn/parser.cc
index 33abfd0..977ddad 100644
--- a/tools/gn/parser.cc
+++ b/tools/gn/parser.cc
@@ -671,7 +671,7 @@
TraverseOrder(binop->right(), pre, post);
} else if (const BlockNode* block = root->AsBlock()) {
for (const auto& statement : block->statements())
- TraverseOrder(statement, pre, post);
+ TraverseOrder(statement.get(), pre, post);
TraverseOrder(block->End(), pre, post);
} else if (const ConditionNode* condition = root->AsConditionNode()) {
TraverseOrder(condition->condition(), pre, post);
@@ -684,7 +684,7 @@
// Nothing.
} else if (const ListNode* list = root->AsList()) {
for (const auto& node : list->contents())
- TraverseOrder(node, pre, post);
+ TraverseOrder(node.get(), pre, post);
TraverseOrder(list->End(), pre, post);
} else if (root->AsLiteral()) {
// Nothing.