[format] Sort visibility like deps
Bug: 189
Change-Id: I7e35b6811444c0656de8dc452d105cc92afa2c0d
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/9780
Commit-Queue: Petr Hosek <phosek@google.com>
Reviewed-by: Scott Graham <scottmg@chromium.org>
Reviewed-by: Petr Hosek <phosek@google.com>
Reviewed-by: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/command_format.cc b/src/gn/command_format.cc
index 67cd78b..7219131 100644
--- a/src/gn/command_format.cc
+++ b/src/gn/command_format.cc
@@ -156,11 +156,12 @@
// Whether there's a blank separator line at the current position.
bool HaveBlankLine();
- // Sort a list on the RHS if the LHS is 'sources', 'deps' or 'public_deps'.
- // The 'sources' are sorted alphabetically while the 'deps' and 'public_deps'
- // are sorted putting first the relative targets and then the global ones
- // (both sorted alphabetically).
- void SortIfSourcesOrDeps(const BinaryOpNode* binop);
+ // Sort a list on the RHS if the LHS is one of the following:
+ // 'sources': sorted alphabetically.
+ // 'deps' or ends in 'deps': sorted such that relative targets are first,
+ // followed by global targets, each internally sorted alphabetically.
+ // 'visibility': same as 'deps'.
+ void SortIfApplicable(const BinaryOpNode* binop);
// Sort contiguous import() function calls in the given ordered list of
// statements (the body of a block or scope).
@@ -383,7 +384,7 @@
return n > 2 && output_[n - 1] == '\n' && output_[n - 2] == '\n';
}
-void Printer::SortIfSourcesOrDeps(const BinaryOpNode* binop) {
+void Printer::SortIfApplicable(const BinaryOpNode* binop) {
if (const Comments* comments = binop->comments()) {
const std::vector<Token>& before = comments->before();
if (!before.empty() && (before.front().value() == "# NOSORT" ||
@@ -402,8 +403,9 @@
if (base::EndsWith(lhs, "sources", base::CompareCase::SENSITIVE) ||
lhs == "public")
const_cast<ListNode*>(list)->SortAsStringsList();
- else if (base::EndsWith(lhs, "deps", base::CompareCase::SENSITIVE))
- const_cast<ListNode*>(list)->SortAsDepsList();
+ else if (base::EndsWith(lhs, "deps", base::CompareCase::SENSITIVE) ||
+ lhs == "visibility")
+ const_cast<ListNode*>(list)->SortAsTargetsList();
}
}
@@ -725,7 +727,7 @@
} else if (const BinaryOpNode* binop = root->AsBinaryOp()) {
CHECK(precedence_.find(binop->op().value()) != precedence_.end());
- SortIfSourcesOrDeps(binop);
+ SortIfApplicable(binop);
Precedence prec = precedence_[binop->op().value()];
diff --git a/src/gn/format_test_data/063.gn b/src/gn/format_test_data/063.gn
index 418d90f..de5002e 100644
--- a/src/gn/format_test_data/063.gn
+++ b/src/gn/format_test_data/063.gn
@@ -39,4 +39,12 @@
"//a",
":z",
]
+
+ # Likewise for visibility
+ visibility = [
+ "//b:*",
+ "//a",
+ "//b/*",
+ ":z",
+ ]
}
diff --git a/src/gn/format_test_data/063.golden b/src/gn/format_test_data/063.golden
index 3ae77b2..8972886 100644
--- a/src/gn/format_test_data/063.golden
+++ b/src/gn/format_test_data/063.golden
@@ -39,4 +39,12 @@
":z",
"//a",
]
+
+ # Likewise for visibility
+ visibility = [
+ ":z",
+ "//a",
+ "//b:*",
+ "//b/*",
+ ]
}
diff --git a/src/gn/parse_tree.cc b/src/gn/parse_tree.cc
index d4c6290..e62b87e 100644
--- a/src/gn/parse_tree.cc
+++ b/src/gn/parse_tree.cc
@@ -748,7 +748,7 @@
});
}
-void ListNode::SortAsDepsList() {
+void ListNode::SortAsTargetsList() {
// Sorts first relative targets, then absolute, each group is sorted
// alphabetically.
SortList([](const ParseNode* a, const ParseNode* b) {
diff --git a/src/gn/parse_tree.h b/src/gn/parse_tree.h
index 13fa7d1..cb64661 100644
--- a/src/gn/parse_tree.h
+++ b/src/gn/parse_tree.h
@@ -425,7 +425,7 @@
}
void SortAsStringsList();
- void SortAsDepsList();
+ void SortAsTargetsList();
struct SortRange {
size_t begin;