]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programparser.cpp
Record statement source lines and emit #line directives to output
[libs/gl.git] / source / programparser.cpp
index 393936624556df0a0c9fe5b2fef6a8576a1f5b0c..ca554f427464b8863b03ed8211c0f8598e2c7c03 100644 (file)
@@ -70,18 +70,20 @@ ProgramParser::~ProgramParser()
        delete module;
 }
 
-Module &ProgramParser::parse(const string &s, const string &n)
+Module &ProgramParser::parse(const string &s, const string &n, unsigned i)
 {
        source = s;
        source_name = n;
+       source_index = i;
        parse_source();
        return *module;
 }
 
-Module &ProgramParser::parse(IO::Base &io, const string &n)
+Module &ProgramParser::parse(IO::Base &io, const string &n, unsigned i)
 {
        source = string();
        source_name = n;
+       source_index = i;
        while(!io.eof())
        {
                char buffer[4096];
@@ -443,6 +445,8 @@ RefPtr<Statement> ProgramParser::parse_global_declaration()
                if(is_interface_qualifier(token) && peek_token(1)==";")
                {
                        RefPtr<InterfaceLayout> iface_lo = new InterfaceLayout;
+                       iface_lo->source = source_index;
+                       iface_lo->line = current_line;
                        iface_lo->layout.qualifiers = layout->qualifiers;
                        iface_lo->interface = parse_token();
                        expect(";");
@@ -496,6 +500,8 @@ RefPtr<Statement> ProgramParser::parse_statement()
        else if(token=="break" || token=="continue" || token=="discard")
        {
                RefPtr<Jump> jump = new Jump;
+               jump->source = source_index;
+               jump->line = current_line;
                jump->keyword = parse_token();
                expect(";");
 
@@ -506,6 +512,8 @@ RefPtr<Statement> ProgramParser::parse_statement()
        else if(!token.empty())
        {
                RefPtr<ExpressionStatement> expr = new ExpressionStatement;
+               expr->source = source_index;
+               expr->line = current_line;
                expr->expression = parse_expression();
                expect(";");
 
@@ -522,6 +530,8 @@ RefPtr<Import> ProgramParser::parse_import()
 
        expect("import");
        RefPtr<Import> import = new Import;
+       import->source = source_index;
+       import->line = current_line;
        import->module = expect_identifier();
        expect(";");
        return import;
@@ -531,6 +541,8 @@ RefPtr<Precision> ProgramParser::parse_precision()
 {
        expect("precision");
        RefPtr<Precision> precision = new Precision;
+       precision->source = source_index;
+       precision->line = current_line;
 
        precision->precision = parse_token();
        if(!is_precision_qualifier(precision->precision))
@@ -717,6 +729,8 @@ RefPtr<StructDeclaration> ProgramParser::parse_struct_declaration()
 {
        expect("struct");
        RefPtr<StructDeclaration> strct = new StructDeclaration;
+       strct->source = source_index;
+       strct->line = current_line;
 
        strct->name = expect_identifier();
        parse_block(strct->members, true);
@@ -729,6 +743,8 @@ RefPtr<StructDeclaration> ProgramParser::parse_struct_declaration()
 RefPtr<VariableDeclaration> ProgramParser::parse_variable_declaration()
 {
        RefPtr<VariableDeclaration> var = new VariableDeclaration;
+       var->source = source_index;
+       var->line = current_line;
 
        string token = peek_token();
        while(is_qualifier(token))
@@ -770,6 +786,8 @@ RefPtr<VariableDeclaration> ProgramParser::parse_variable_declaration()
 RefPtr<FunctionDeclaration> ProgramParser::parse_function_declaration()
 {
        RefPtr<FunctionDeclaration> func = new FunctionDeclaration;
+       func->source = source_index;
+       func->line = current_line;
 
        func->return_type = expect_type();
        func->name = expect_identifier();
@@ -806,6 +824,8 @@ RefPtr<FunctionDeclaration> ProgramParser::parse_function_declaration()
 RefPtr<InterfaceBlock> ProgramParser::parse_interface_block()
 {
        RefPtr<InterfaceBlock> iface = new InterfaceBlock;
+       iface->source = source_index;
+       iface->line = current_line;
 
        iface->interface = parse_token();
        if(!is_interface_qualifier(iface->interface))
@@ -830,8 +850,10 @@ RefPtr<InterfaceBlock> ProgramParser::parse_interface_block()
 RefPtr<Conditional> ProgramParser::parse_conditional()
 {
        expect("if");
-       expect("(");
        RefPtr<Conditional> cond = new Conditional;
+       cond->source = source_index;
+       cond->line = current_line;
+       expect("(");
        cond->condition = parse_expression();
        expect(")");
 
@@ -850,8 +872,10 @@ RefPtr<Conditional> ProgramParser::parse_conditional()
 RefPtr<Iteration> ProgramParser::parse_for()
 {
        expect("for");
-       expect("(");
        RefPtr<Iteration> loop = new Iteration;
+       loop->source = source_index;
+       loop->line = current_line;
+       expect("(");
        string token = peek_token();
        if(is_type(token))
                loop->init_statement = parse_statement();
@@ -880,8 +904,10 @@ RefPtr<Iteration> ProgramParser::parse_for()
 RefPtr<Iteration> ProgramParser::parse_while()
 {
        expect("while");
-       expect("(");
        RefPtr<Iteration> loop = new Iteration;
+       loop->source = source_index;
+       loop->line = current_line;
+       expect("(");
        loop->condition = parse_expression();
        expect(")");
 
@@ -894,6 +920,8 @@ RefPtr<Passthrough> ProgramParser::parse_passthrough()
 {
        expect("passthrough");
        RefPtr<Passthrough> pass = new Passthrough;
+       pass->source = source_index;
+       pass->line = current_line;
        if(cur_stage->type==GEOMETRY)
        {
                expect("[");
@@ -908,6 +936,8 @@ RefPtr<Return> ProgramParser::parse_return()
 {
        expect("return");
        RefPtr<Return> ret = new Return;
+       ret->source = source_index;
+       ret->line = current_line;
        if(peek_token()!=";")
                ret->expression = parse_expression();
        expect(";");