]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/validate.cpp
Add support for function overloading
[libs/gl.git] / source / glsl / validate.cpp
index 4523b7461730e4fadb6a2faec9d904cea70d1c42..f8ecc5eeefd34aaad243accf7034d9cee8513ca0 100644 (file)
@@ -11,17 +11,29 @@ namespace GL {
 namespace SL {
 
 Validator::Validator():
-       stage(0)
+       stage(0),
+       last_provoker(0)
 { }
 
-void Validator::diagnose(Node &node, Diagnostic::Severity severity, const string &message)
+void Validator::diagnose(Node &node, Node &provoking_node, Diagnostic::Severity severity, const string &message)
 {
        Diagnostic diag;
        diag.severity = severity;
        diag.source = node.source;
        diag.line = node.line;
+       diag.provoking_source = provoking_node.source;
+       diag.provoking_line = provoking_node.line;
        diag.message = message;
        stage->diagnostics.push_back(diag);
+
+       last_provoker = &provoking_node;
+}
+
+void Validator::add_info(Node &node, const string &message)
+{
+       if(!last_provoker)
+               throw logic_error("Tried to add info without a previous provoker");
+       diagnose(node, *last_provoker, Diagnostic::INFO, message);
 }
 
 
@@ -83,7 +95,7 @@ DeclarationValidator::DeclarationValidator():
 void DeclarationValidator::multiple_definition(const string &name, Statement &statement, Statement &previous)
 {
        error(statement, format("Multiple definition of %s", name));
-       diagnose(previous, Diagnostic::INFO, "Previous definition is here");
+       add_info(previous, "Previous definition is here");
 }
 
 Statement *DeclarationValidator::find_definition(const string &name)
@@ -163,15 +175,15 @@ void DeclarationValidator::visit(FunctionDeclaration &func)
 {
        if(Statement *previous = find_definition(func.name))
        {
-               FunctionDeclaration *prev_func = dynamic_cast<FunctionDeclaration *>(previous);
-               if(prev_func && prev_func->definition==&func)
-                       declarations[current_block][func.name] = &func;
-               else
+               if(!dynamic_cast<FunctionDeclaration *>(previous))
                        multiple_definition(format("'%s'", func.name), func, *previous);
        }
        else
                record_definition(func.name, func);
 
+       if(func.definition==&func)
+               check_definition(func.name+func.signature, func);
+
        TraversingVisitor::visit(func);
 }