Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Unified Diff: tools/gn/parse_tree.h

Issue 607173002: gn format: fix comments at end of blocks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/format_test_data/017.golden ('k') | tools/gn/parse_tree.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/parse_tree.h
diff --git a/tools/gn/parse_tree.h b/tools/gn/parse_tree.h
index 73ac0e5196f7fd3fce9b7552041730a6ce8cf4df..06300586ece115217bd9ffef87307cc96fa5c652 100644
--- a/tools/gn/parse_tree.h
+++ b/tools/gn/parse_tree.h
@@ -16,15 +16,16 @@
class AccessorNode;
class BinaryOpNode;
+class BlockCommentNode;
class BlockNode;
class ConditionNode;
+class EndNode;
class FunctionCallNode;
class IdentifierNode;
class ListNode;
class LiteralNode;
class Scope;
class UnaryOpNode;
-class BlockCommentNode;
class Comments {
public:
@@ -74,14 +75,15 @@ class ParseNode {
virtual const AccessorNode* AsAccessor() const;
virtual const BinaryOpNode* AsBinaryOp() const;
+ virtual const BlockCommentNode* AsBlockComment() const;
virtual const BlockNode* AsBlock() const;
virtual const ConditionNode* AsConditionNode() const;
+ virtual const EndNode* AsEnd() const;
virtual const FunctionCallNode* AsFunctionCall() const;
virtual const IdentifierNode* AsIdentifier() const;
virtual const ListNode* AsList() const;
virtual const LiteralNode* AsLiteral() const;
virtual const UnaryOpNode* AsUnaryOp() const;
- virtual const BlockCommentNode* AsBlockComment() const;
virtual Value Execute(Scope* scope, Err* err) const = 0;
@@ -226,7 +228,8 @@ class BlockNode : public ParseNode {
virtual void Print(std::ostream& out, int indent) const OVERRIDE;
void set_begin_token(const Token& t) { begin_token_ = t; }
- void set_end_token(const Token& t) { end_token_ = t; }
+ void set_end(scoped_ptr<EndNode> e) { end_ = e.Pass(); }
+ const EndNode* End() const { return end_.get(); }
const std::vector<ParseNode*>& statements() const { return statements_; }
void append_statement(scoped_ptr<ParseNode> s) {
@@ -239,9 +242,10 @@ class BlockNode : public ParseNode {
private:
bool has_scope_;
- // Tokens corresponding to { and }, if any (may be NULL).
+ // Tokens corresponding to { and }, if any (may be NULL). The end is stored
+ // in a custom parse node so that it can have comments hung off of it.
Token begin_token_;
- Token end_token_;
+ scoped_ptr<EndNode> end_;
// Owning pointers, use unique_ptr when we can use C++11.
std::vector<ParseNode*> statements_;
@@ -367,7 +371,8 @@ class ListNode : public ParseNode {
virtual void Print(std::ostream& out, int indent) const OVERRIDE;
void set_begin_token(const Token& t) { begin_token_ = t; }
- void set_end_token(const Token& t) { end_token_ = t; }
+ void set_end(scoped_ptr<EndNode> e) { end_ = e.Pass(); }
+ const EndNode* End() const { return end_.get(); }
void append_item(scoped_ptr<ParseNode> s) {
contents_.push_back(s.release());
@@ -375,9 +380,10 @@ class ListNode : public ParseNode {
const std::vector<const ParseNode*>& contents() const { return contents_; }
private:
- // Tokens corresponding to the [ and ].
+ // Tokens corresponding to the [ and ]. The end token is stored in inside an
+ // custom parse node so that it can have comments hung off of it.
Token begin_token_;
- Token end_token_;
+ scoped_ptr<EndNode> end_;
// Owning pointers, use unique_ptr when we can use C++11.
std::vector<const ParseNode*> contents_;
@@ -469,4 +475,32 @@ class BlockCommentNode : public ParseNode {
DISALLOW_COPY_AND_ASSIGN(BlockCommentNode);
};
+// EndNode ---------------------------------------------------------------------
+
+// This node type is used as the end_ object for lists and blocks (rather than
+// just the end ']', '}', or ')' token). This is so that during formatting
+// traversal there is a node that appears at the end of the block to which
+// comments can be attached.
+class EndNode : public ParseNode {
+ public:
+ EndNode(const Token& token);
+ virtual ~EndNode();
+
+ virtual const EndNode* AsEnd() const OVERRIDE;
+ virtual Value Execute(Scope* scope, Err* err) const OVERRIDE;
+ virtual LocationRange GetRange() const OVERRIDE;
+ virtual Err MakeErrorDescribing(
+ const std::string& msg,
+ const std::string& help = std::string()) const OVERRIDE;
+ virtual void Print(std::ostream& out, int indent) const OVERRIDE;
+
+ const Token& value() const { return value_; }
+ void set_value(const Token& t) { value_ = t; }
+
+ private:
+ Token value_;
+
+ DISALLOW_COPY_AND_ASSIGN(EndNode);
+};
+
#endif // TOOLS_GN_PARSE_TREE_H_
« no previous file with comments | « tools/gn/format_test_data/017.golden ('k') | tools/gn/parse_tree.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698