source_line = line;
}
+void Formatter::visit(Block &block)
+{
+ unsigned brace_indent = indent;
+ bool use_braces = (block.use_braces || (indent && block.body.size()!=1));
+ if(use_braces)
+ append(format("%s{\n", string(brace_indent*2, ' ')));
+
+ SetForScope<unsigned> set(indent, indent+(indent>0 || use_braces));
+ string spaces(indent*2, ' ');
+ bool first = true;
+ for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
+ {
+ if((*i)->source<=BUILTIN_SOURCE)
+ continue;
+ if(!first)
+ append('\n');
+ first = false;
+ set_source((*i)->source, (*i)->line);
+ append(spaces);
+ (*i)->visit(*this);
+ }
+
+ if(use_braces)
+ append(format("\n%s}", string(brace_indent*2, ' ')));
+}
+
void Formatter::visit(Literal &literal)
{
append(literal.token);
void Formatter::visit(UnaryExpression &unary)
{
- if(unary.prefix)
- append(unary.oper);
+ if(unary.oper->type==Operator::PREFIX)
+ append(unary.oper->token);
unary.expression->visit(*this);
- if(!unary.prefix)
- append(unary.oper);
+ if(unary.oper->type==Operator::POSTFIX)
+ append(unary.oper->token);
}
void Formatter::visit(BinaryExpression &binary)
{
binary.left->visit(*this);
- append(binary.oper);
+ append(binary.oper->token);
binary.right->visit(*this);
- append(binary.after);
+ if(binary.oper->token[0]=='[')
+ append(']');
}
void Formatter::visit(Assignment &assign)
{
assign.left->visit(*this);
- append(format(" %s ", assign.oper));
+ append(format(" %s ", assign.oper->token));
assign.right->visit(*this);
}
append(';');
}
-void Formatter::visit(Block &block)
-{
- unsigned brace_indent = indent;
- bool use_braces = (block.use_braces || (indent && block.body.size()!=1));
- if(use_braces)
- append(format("%s{\n", string(brace_indent*2, ' ')));
-
- SetForScope<unsigned> set(indent, indent+(indent>0 || use_braces));
- string spaces(indent*2, ' ');
- for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
- {
- if(i!=block.body.begin())
- append('\n');
- set_source((*i)->source, (*i)->line);
- append(spaces);
- (*i)->visit(*this);
- }
-
- if(use_braces)
- append(format("\n%s}", string(brace_indent*2, ' ')));
-}
-
void Formatter::visit(Import &import)
{
append(format("import %s;", import.module));
append(format("%s ", var.interpolation));
if(!var.sampling.empty())
append(format("%s ", var.sampling));
- if(!var.interface.empty() && var.interface!=block_interface)
+ if(!var.interface.empty())
{
string interface = var.interface;
if(mode==Compiler::PROGRAM && stage && stage->required_features.glsl_version<Version(1, 30))
}
if(!var.precision.empty())
append(format("%s ", var.precision));
- append(format("%s %s", var.type, var.name));
+ string type_name = var.type_declaration->name;
+ if(var.array)
+ type_name = type_name.substr(0, type_name.find('['));
+ append(format("%s %s", type_name, var.name));
if(var.array)
{
append('[');
void Formatter::visit(InterfaceBlock &iface)
{
- SetForScope<string> set(block_interface, iface.interface);
append(format("%s %s\n", iface.interface, iface.name));
- iface.members.visit(*this);
+ if(iface.struct_declaration)
+ iface.struct_declaration->members.visit(*this);
if(!iface.instance_name.empty())
{
append(' ');
void Formatter::visit(FunctionDeclaration &func)
{
- append(format("%s %s(", func.return_type, func.name));
+ append(format("%s %s(", func.return_type_declaration->name, func.name));
for(NodeArray<VariableDeclaration>::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i)
{
if(i!=func.parameters.begin())