Index: src/prettyprinter.h |
=================================================================== |
--- src/prettyprinter.h (revision 3048) |
+++ src/prettyprinter.h (working copy) |
@@ -46,14 +46,15 @@ |
const char* PrintExpression(FunctionLiteral* program); |
const char* PrintProgram(FunctionLiteral* program); |
+ void Print(const char* format, ...); |
+ |
// Print a node to stdout. |
static void PrintOut(AstNode* node); |
// Individual nodes |
-#define DEF_VISIT(type) \ |
- virtual void Visit##type(type* node); |
- AST_NODE_LIST(DEF_VISIT) |
-#undef DEF_VISIT |
+#define DECLARE_VISIT(type) virtual void Visit##type(type* node); |
+ AST_NODE_LIST(DECLARE_VISIT) |
+#undef DECLARE_VISIT |
private: |
char* output_; // output string buffer |
@@ -62,7 +63,6 @@ |
protected: |
void Init(); |
- void Print(const char* format, ...); |
const char* Output() const { return output_; } |
virtual void PrintStatements(ZoneList<Statement*>* statements); |
@@ -85,10 +85,9 @@ |
const char* PrintProgram(FunctionLiteral* program); |
// Individual nodes |
-#define DEF_VISIT(type) \ |
- virtual void Visit##type(type* node); |
- AST_NODE_LIST(DEF_VISIT) |
-#undef DEF_VISIT |
+#define DECLARE_VISIT(type) virtual void Visit##type(type* node); |
+ AST_NODE_LIST(DECLARE_VISIT) |
+#undef DECLARE_VISIT |
private: |
friend class IndentedScope; |
void PrintIndented(const char* txt); |
@@ -112,6 +111,107 @@ |
static int indent_; |
}; |
+ |
+// Forward declaration of helper classes. |
+class TagScope; |
+class AttributesScope; |
+ |
+// Build a C string containing a JSON representation of a function's |
+// AST. The representation is based on JsonML (www.jsonml.org). |
+class JsonAstBuilder: public PrettyPrinter { |
+ public: |
+ JsonAstBuilder() |
+ : indent_(0), top_tag_scope_(NULL), attributes_scope_(NULL) { |
+ } |
+ virtual ~JsonAstBuilder() {} |
+ |
+ // Controls the indentation of subsequent lines of a tag body after |
+ // the first line. |
+ static const int kTagIndentSize = 2; |
+ |
+ // Controls the indentation of subsequent lines of an attributes |
+ // blocks's body after the first line. |
+ static const int kAttributesIndentSize = 1; |
+ |
+ // Construct a JSON representation of a function literal. |
+ const char* BuildProgram(FunctionLiteral* program); |
+ |
+ // Print text indented by the current indentation level. |
+ void PrintIndented(const char* text) { Print("%*s%s", indent_, "", text); } |
+ |
+ // Change the indentation level. |
+ void increase_indent(int amount) { indent_ += amount; } |
+ void decrease_indent(int amount) { indent_ -= amount; } |
+ |
+ // The builder maintains a stack of opened AST node constructors. |
+ // Each node constructor corresponds to a JsonML tag. |
+ TagScope* tag() { return top_tag_scope_; } |
+ void set_tag(TagScope* scope) { top_tag_scope_ = scope; } |
+ |
+ // The builder maintains a pointer to the currently opened attributes |
+ // of current AST node or NULL if the attributes are not opened. |
+ AttributesScope* attributes() { return attributes_scope_; } |
+ void set_attributes(AttributesScope* scope) { attributes_scope_ = scope; } |
+ |
+ // Add an attribute to the currently opened attributes. |
+ void AddAttribute(const char* name, Handle<String> value); |
+ void AddAttribute(const char* name, const char* value); |
+ void AddAttribute(const char* name, int value); |
+ void AddAttribute(const char* name, bool value); |
+ |
+ // AST node visit functions. |
+#define DECLARE_VISIT(type) virtual void Visit##type(type* node); |
+ AST_NODE_LIST(DECLARE_VISIT) |
+#undef DECLARE_VISIT |
+ |
+ private: |
+ int indent_; |
+ TagScope* top_tag_scope_; |
+ AttributesScope* attributes_scope_; |
+ |
+ // Utility function used by AddAttribute implementations. |
+ void AddAttributePrefix(const char* name); |
+}; |
+ |
+ |
+// The JSON AST builder keeps a stack of open element tags (AST node |
+// constructors from the current iteration point to the root of the |
+// AST). TagScope is a helper class to manage the opening and closing |
+// of tags, the indentation of their bodies, and comma separating their |
+// contents. |
+class TagScope BASE_EMBEDDED { |
+ public: |
+ TagScope(JsonAstBuilder* builder, const char* name); |
+ ~TagScope(); |
+ |
+ void use() { has_body_ = true; } |
+ |
+ private: |
+ JsonAstBuilder* builder_; |
+ TagScope* next_; |
+ bool has_body_; |
+}; |
+ |
+ |
+// AttributesScope is a helper class to manage the opening and closing |
+// of attribute blocks, the indentation of their bodies, and comma |
+// separating their contents. JsonAstBuilder::AddAttribute adds an |
+// attribute to the currently open AttributesScope. They cannot be |
+// nested so the builder keeps an optional single scope rather than a |
+// stack. |
+class AttributesScope BASE_EMBEDDED { |
+ public: |
+ explicit AttributesScope(JsonAstBuilder* builder); |
+ ~AttributesScope(); |
+ |
+ bool is_used() { return attribute_count_ > 0; } |
+ void use() { ++attribute_count_; } |
+ |
+ private: |
+ JsonAstBuilder* builder_; |
+ int attribute_count_; |
+}; |
+ |
#endif // DEBUG |
} } // namespace v8::internal |