Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef TOOLS_GN_PARSE_TREE_H_ | 5 #ifndef TOOLS_GN_PARSE_TREE_H_ |
| 6 #define TOOLS_GN_PARSE_TREE_H_ | 6 #define TOOLS_GN_PARSE_TREE_H_ |
| 7 | 7 |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| 11 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "tools/gn/err.h" | 13 #include "tools/gn/err.h" |
| 14 #include "tools/gn/token.h" | 14 #include "tools/gn/token.h" |
| 15 #include "tools/gn/value.h" | 15 #include "tools/gn/value.h" |
| 16 | 16 |
| 17 class AccessorNode; | 17 class AccessorNode; |
| 18 class BinaryOpNode; | 18 class BinaryOpNode; |
| 19 class BlockNode; | 19 class BlockNode; |
| 20 class ConditionNode; | 20 class ConditionNode; |
| 21 class FunctionCallNode; | 21 class FunctionCallNode; |
| 22 class IdentifierNode; | 22 class IdentifierNode; |
| 23 class ListNode; | 23 class ListNode; |
| 24 class LiteralNode; | 24 class LiteralNode; |
| 25 class Scope; | 25 class Scope; |
| 26 class UnaryOpNode; | 26 class UnaryOpNode; |
| 27 class BlockCommentNode; | 27 class BlockCommentNode; |
| 28 class EndNode; | |
|
brettw
2014/09/26 21:37:34
Can you sort this list?
scottmg
2014/09/26 21:47:32
Done.
| |
| 28 | 29 |
| 29 class Comments { | 30 class Comments { |
| 30 public: | 31 public: |
| 31 Comments(); | 32 Comments(); |
| 32 virtual ~Comments(); | 33 virtual ~Comments(); |
| 33 | 34 |
| 34 const std::vector<Token>& before() const { return before_; } | 35 const std::vector<Token>& before() const { return before_; } |
| 35 void append_before(Token c) { | 36 void append_before(Token c) { |
| 36 before_.push_back(c); | 37 before_.push_back(c); |
| 37 } | 38 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 75 virtual const AccessorNode* AsAccessor() const; | 76 virtual const AccessorNode* AsAccessor() const; |
| 76 virtual const BinaryOpNode* AsBinaryOp() const; | 77 virtual const BinaryOpNode* AsBinaryOp() const; |
| 77 virtual const BlockNode* AsBlock() const; | 78 virtual const BlockNode* AsBlock() const; |
| 78 virtual const ConditionNode* AsConditionNode() const; | 79 virtual const ConditionNode* AsConditionNode() const; |
| 79 virtual const FunctionCallNode* AsFunctionCall() const; | 80 virtual const FunctionCallNode* AsFunctionCall() const; |
| 80 virtual const IdentifierNode* AsIdentifier() const; | 81 virtual const IdentifierNode* AsIdentifier() const; |
| 81 virtual const ListNode* AsList() const; | 82 virtual const ListNode* AsList() const; |
| 82 virtual const LiteralNode* AsLiteral() const; | 83 virtual const LiteralNode* AsLiteral() const; |
| 83 virtual const UnaryOpNode* AsUnaryOp() const; | 84 virtual const UnaryOpNode* AsUnaryOp() const; |
| 84 virtual const BlockCommentNode* AsBlockComment() const; | 85 virtual const BlockCommentNode* AsBlockComment() const; |
| 86 virtual const EndNode* AsEnd() const; | |
| 85 | 87 |
| 86 virtual Value Execute(Scope* scope, Err* err) const = 0; | 88 virtual Value Execute(Scope* scope, Err* err) const = 0; |
| 87 | 89 |
| 88 virtual LocationRange GetRange() const = 0; | 90 virtual LocationRange GetRange() const = 0; |
| 89 | 91 |
| 90 // Returns an error with the given messages and the range set to something | 92 // Returns an error with the given messages and the range set to something |
| 91 // that indicates this node. | 93 // that indicates this node. |
| 92 virtual Err MakeErrorDescribing( | 94 virtual Err MakeErrorDescribing( |
| 93 const std::string& msg, | 95 const std::string& msg, |
| 94 const std::string& help = std::string()) const = 0; | 96 const std::string& help = std::string()) const = 0; |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 219 | 221 |
| 220 virtual const BlockNode* AsBlock() const OVERRIDE; | 222 virtual const BlockNode* AsBlock() const OVERRIDE; |
| 221 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; | 223 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; |
| 222 virtual LocationRange GetRange() const OVERRIDE; | 224 virtual LocationRange GetRange() const OVERRIDE; |
| 223 virtual Err MakeErrorDescribing( | 225 virtual Err MakeErrorDescribing( |
| 224 const std::string& msg, | 226 const std::string& msg, |
| 225 const std::string& help = std::string()) const OVERRIDE; | 227 const std::string& help = std::string()) const OVERRIDE; |
| 226 virtual void Print(std::ostream& out, int indent) const OVERRIDE; | 228 virtual void Print(std::ostream& out, int indent) const OVERRIDE; |
| 227 | 229 |
| 228 void set_begin_token(const Token& t) { begin_token_ = t; } | 230 void set_begin_token(const Token& t) { begin_token_ = t; } |
| 229 void set_end_token(const Token& t) { end_token_ = t; } | 231 void set_end(scoped_ptr<EndNode> e) { end_ = e.Pass(); } |
| 232 const EndNode* End() const { return end_.get(); } | |
| 230 | 233 |
| 231 const std::vector<ParseNode*>& statements() const { return statements_; } | 234 const std::vector<ParseNode*>& statements() const { return statements_; } |
| 232 void append_statement(scoped_ptr<ParseNode> s) { | 235 void append_statement(scoped_ptr<ParseNode> s) { |
| 233 statements_.push_back(s.release()); | 236 statements_.push_back(s.release()); |
| 234 } | 237 } |
| 235 | 238 |
| 236 // Doesn't create a nested scope. | 239 // Doesn't create a nested scope. |
| 237 Value ExecuteBlockInScope(Scope* our_scope, Err* err) const; | 240 Value ExecuteBlockInScope(Scope* our_scope, Err* err) const; |
| 238 | 241 |
| 239 private: | 242 private: |
| 240 bool has_scope_; | 243 bool has_scope_; |
| 241 | 244 |
| 242 // Tokens corresponding to { and }, if any (may be NULL). | 245 // Tokens corresponding to { and }, if any (may be NULL). The end is stored |
| 246 // in a custom parse node so that it can have comments hung off of it. | |
| 243 Token begin_token_; | 247 Token begin_token_; |
| 244 Token end_token_; | 248 scoped_ptr<EndNode> end_; |
| 245 | 249 |
| 246 // Owning pointers, use unique_ptr when we can use C++11. | 250 // Owning pointers, use unique_ptr when we can use C++11. |
| 247 std::vector<ParseNode*> statements_; | 251 std::vector<ParseNode*> statements_; |
| 248 | 252 |
| 249 DISALLOW_COPY_AND_ASSIGN(BlockNode); | 253 DISALLOW_COPY_AND_ASSIGN(BlockNode); |
| 250 }; | 254 }; |
| 251 | 255 |
| 252 // ConditionNode --------------------------------------------------------------- | 256 // ConditionNode --------------------------------------------------------------- |
| 253 | 257 |
| 254 class ConditionNode : public ParseNode { | 258 class ConditionNode : public ParseNode { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 360 | 364 |
| 361 virtual const ListNode* AsList() const OVERRIDE; | 365 virtual const ListNode* AsList() const OVERRIDE; |
| 362 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; | 366 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; |
| 363 virtual LocationRange GetRange() const OVERRIDE; | 367 virtual LocationRange GetRange() const OVERRIDE; |
| 364 virtual Err MakeErrorDescribing( | 368 virtual Err MakeErrorDescribing( |
| 365 const std::string& msg, | 369 const std::string& msg, |
| 366 const std::string& help = std::string()) const OVERRIDE; | 370 const std::string& help = std::string()) const OVERRIDE; |
| 367 virtual void Print(std::ostream& out, int indent) const OVERRIDE; | 371 virtual void Print(std::ostream& out, int indent) const OVERRIDE; |
| 368 | 372 |
| 369 void set_begin_token(const Token& t) { begin_token_ = t; } | 373 void set_begin_token(const Token& t) { begin_token_ = t; } |
| 370 void set_end_token(const Token& t) { end_token_ = t; } | 374 void set_end(scoped_ptr<EndNode> e) { end_ = e.Pass(); } |
| 375 const EndNode* End() const { return end_.get(); } | |
| 371 | 376 |
| 372 void append_item(scoped_ptr<ParseNode> s) { | 377 void append_item(scoped_ptr<ParseNode> s) { |
| 373 contents_.push_back(s.release()); | 378 contents_.push_back(s.release()); |
| 374 } | 379 } |
| 375 const std::vector<const ParseNode*>& contents() const { return contents_; } | 380 const std::vector<const ParseNode*>& contents() const { return contents_; } |
| 376 | 381 |
| 377 private: | 382 private: |
| 378 // Tokens corresponding to the [ and ]. | 383 // Tokens corresponding to the [ and ]. The end token is stored in inside an |
| 384 // custom parse node so that it can have comments hung off of it. | |
| 379 Token begin_token_; | 385 Token begin_token_; |
| 380 Token end_token_; | 386 scoped_ptr<EndNode> end_; |
| 381 | 387 |
| 382 // Owning pointers, use unique_ptr when we can use C++11. | 388 // Owning pointers, use unique_ptr when we can use C++11. |
| 383 std::vector<const ParseNode*> contents_; | 389 std::vector<const ParseNode*> contents_; |
| 384 | 390 |
| 385 DISALLOW_COPY_AND_ASSIGN(ListNode); | 391 DISALLOW_COPY_AND_ASSIGN(ListNode); |
| 386 }; | 392 }; |
| 387 | 393 |
| 388 // LiteralNode ----------------------------------------------------------------- | 394 // LiteralNode ----------------------------------------------------------------- |
| 389 | 395 |
| 390 class LiteralNode : public ParseNode { | 396 class LiteralNode : public ParseNode { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 462 | 468 |
| 463 const Token& comment() const { return comment_; } | 469 const Token& comment() const { return comment_; } |
| 464 void set_comment(const Token& t) { comment_ = t; } | 470 void set_comment(const Token& t) { comment_ = t; } |
| 465 | 471 |
| 466 private: | 472 private: |
| 467 Token comment_; | 473 Token comment_; |
| 468 | 474 |
| 469 DISALLOW_COPY_AND_ASSIGN(BlockCommentNode); | 475 DISALLOW_COPY_AND_ASSIGN(BlockCommentNode); |
| 470 }; | 476 }; |
| 471 | 477 |
| 478 // EndNode --------------------------------------------------------------------- | |
| 479 | |
| 480 class EndNode : public IdentifierNode { | |
|
brettw
2014/09/26 21:37:34
Can you document here what this is for? It's not s
scottmg
2014/09/26 21:47:32
Done.
| |
| 481 public: | |
| 482 EndNode(); | |
| 483 EndNode(const Token& token); | |
| 484 virtual ~EndNode(); | |
| 485 | |
| 486 virtual const IdentifierNode* AsIdentifier() const OVERRIDE; | |
| 487 virtual const EndNode* AsEnd() const OVERRIDE; | |
| 488 virtual void Print(std::ostream& out, int indent) const OVERRIDE; | |
| 489 }; | |
| 490 | |
| 472 #endif // TOOLS_GN_PARSE_TREE_H_ | 491 #endif // TOOLS_GN_PARSE_TREE_H_ |
| OLD | NEW |