]> git.tdb.fi Git - libs/gl.git/commitdiff
Record information of the provoking location of a diagnostic
authorMikko Rasa <tdb@tdb.fi>
Mon, 8 Mar 2021 20:13:55 +0000 (22:13 +0200)
committerMikko Rasa <tdb@tdb.fi>
Tue, 9 Mar 2021 08:15:11 +0000 (10:15 +0200)
In case of diagnostics providing extra information to a previous one,
this can be different from the direct location.

source/glsl/glsl_error.h
source/glsl/validate.cpp
source/glsl/validate.h

index 46854744699c183f8df2e88efd019b5f01e68236..84aa2f52a60a45c42f6bdbe30a5fbc676e418d25 100644 (file)
@@ -50,6 +50,8 @@ struct Diagnostic
        Severity severity;
        int source;
        unsigned line;
+       int provoking_source;
+       unsigned provoking_line;
        std::string message;
 
        Diagnostic(): severity(INFO), source(-2), line(0) { }
index 4523b7461730e4fadb6a2faec9d904cea70d1c42..ea2e956d023f1e02d66b44b7771186542076dd28 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)
index b64973276536e2dbc653ac30f142866ccb3b3fcb..9477b67d70cb7a7ecc9acc38ad81e76d81af1c97 100644 (file)
@@ -14,11 +14,14 @@ class Validator: protected TraversingVisitor
 {
 protected:
        Stage *stage;
+       Node *last_provoker;
 
        Validator();
 
-       void diagnose(Node &, Diagnostic::Severity, const std::string &);
+       void diagnose(Node &, Node &, Diagnostic::Severity, const std::string &);
+       void diagnose(Node &n, Diagnostic::Severity s, const std::string &m) { diagnose(n, n, s, m); }
        void error(Node &n, const std::string &m) { diagnose(n, Diagnostic::ERR, m); }
+       void add_info(Node &, const std::string &);
 };
 
 class TypeValidator: private Validator