formatted += '\n';
}
+void DumpTree::append_subtree(const vector<Branch> &branches)
+{
+ begin_sub();
+ for(vector<Branch>::const_iterator i=branches.begin(); i!=branches.end(); )
+ {
+ vector<Branch>::const_iterator j = increment(i, branches);
+ if(!j->text.empty())
+ {
+ if(j->node)
+ annotated_branch(j->text, *j->node);
+ else
+ append(j->text);
+ }
+ else
+ j->node->visit(*this);
+ }
+ end_sub();
+}
+
void DumpTree::begin_sub()
{
tree.back() = (tree.back()==BRANCH_LAST ? EMPTY : STRAIGHT);
void DumpTree::visit(BasicTypeDeclaration &type)
{
append(format("%%%d typedef %s", get_label(type), type.name));
- begin_sub();
- if(type.kind!=BasicTypeDeclaration::VECTOR && type.kind!=BasicTypeDeclaration::MATRIX)
- last_branch();
- if(type.base_type)
- append(format("%s: %%%d %s", (type.kind==BasicTypeDeclaration::ALIAS ? "Alias of" : "Base"), get_label(*type.base_type), type.base_type->name));
- last_branch();
+ vector<Branch> branches;
+ if(type.base_type)
+ branches.push_back(format("%s: %%%d %s", (type.kind==BasicTypeDeclaration::ALIAS ? "Alias of" : "Base"), get_label(*type.base_type), type.base_type->name));
if(type.kind==BasicTypeDeclaration::VECTOR)
- append(format("Vector: %d", type.size));
+ branches.push_back(format("Vector: %d", type.size));
else if(type.kind==BasicTypeDeclaration::MATRIX)
- append(format("Matrix: %dx%d", type.size&0xFFFF, type.size>>16));
- end_sub();
+ branches.push_back(format("Matrix: %dx%d", type.size&0xFFFF, type.size>>16));
+ append_subtree(branches);
}
void DumpTree::visit(ImageTypeDeclaration &type)
{
- append(format("%%%d typedef %s", get_label(type), type.name));
- begin_sub();
-
- if(!type.shadow && !type.base_type)
- last_branch();
static const char *dims[] = { "1D", "2D", "3D", "Cube" };
- append(format("Dimensions: %s%s", dims[type.dimensions-1], (type.array ? " array" : "")));
- if(!type.shadow)
- last_branch();
- if(type.base_type)
- append(format("Element type: %%%d %s", get_label(*type.base_type), type.base_type->name));
+ append(format("%%%d typedef %s", get_label(type), type.name));
- last_branch();
+ vector<Branch> branches;
+ branches.push_back(format("Dimensions: %s%s", dims[type.dimensions-1], (type.array ? " array" : "")));
+ if(type.base_type)
+ branches.push_back(format("Element type: %%%d %s", get_label(*type.base_type), type.base_type->name));
if(type.shadow)
- append("Shadow");
-
- end_sub();
+ branches.push_back("Shadow");
+ append_subtree(branches);
}
void DumpTree::visit(StructDeclaration &strct)
decl += " (linked)";
append(decl);
- begin_sub();
- if(!var.layout && !var.array && !var.init_expression)
- last_branch();
+ vector<Branch> branches;
if(var.type_declaration)
- append(format("Type: %%%d %s", get_label(*var.type_declaration), var.type_declaration->name));
-
- if(!var.array && !var.init_expression)
- last_branch();
+ branches.push_back(format("Type: %%%d %s", get_label(*var.type_declaration), var.type_declaration->name));
if(var.layout)
- var.layout->visit(*this);
-
- if(!var.init_expression)
- last_branch();
+ branches.push_back(var.layout.get());
if(var.array)
{
if(var.array_size)
- annotated_branch("Array []", *var.array_size);
+ branches.push_back(Branch("Array []", var.array_size.get()));
else
- append("Array []");
+ branches.push_back("Array []");
}
-
- last_branch();
if(var.init_expression)
- var.init_expression->visit(*this);
- end_sub();
+ branches.push_back(var.init_expression.get());
+ append_subtree(branches);
}
void DumpTree::visit(InterfaceBlock &block)
else if(!func.definition)
text += " (undefined)";
append(text);
+
begin_sub();
for(NodeArray<VariableDeclaration>::const_iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i)
(*i)->visit(*this);
void DumpTree::visit(Conditional &cond)
{
append("if()");
- begin_sub();
- cond.condition->visit(*this);
- if(cond.else_body.body.empty())
- last_branch();
- cond.body.visit(*this);
+
+ vector<Branch> branches;
+ branches.push_back(cond.condition.get());
+ branches.push_back(&cond.body);
if(!cond.else_body.body.empty())
- {
- last_branch();
- cond.else_body.visit(*this);
- }
- end_sub();
+ branches.push_back(&cond.else_body);
+ append_subtree(branches);
}
void DumpTree::visit(Iteration &iter)
{
append("for()");
- begin_sub();
+ begin_sub();
if(iter.init_statement)
annotated_branch("Initialization", *iter.init_statement);
if(iter.condition)
annotated_branch("Loop", *iter.loop_expression);
last_branch();
annotated_branch("Body", iter.body);
-
end_sub();
}
void DumpTree::visit(Passthrough &pass)
{
- append("passthrough");
if(pass.subscript)
- {
- begin_sub();
- last_branch();
- pass.subscript->visit(*this);
- end_sub();
- }
+ annotated_branch("passthrough[]", *pass.subscript);
+ else
+ append("passthrough;");
}
void DumpTree::visit(Return &ret)