OpenVDB  12.0.0
Public Types | Public Member Functions | Friends | List of all members
Logger Class Reference

Logger for collecting errors and warnings that occur during AX compilation. More...

#include <openvdb_ax/compiler/Logger.h>

Public Types

using Ptr = std::shared_ptr< Logger >
 
using CodeLocation = std::pair< size_t, size_t >
 
using OutputFunction = std::function< void(const std::string &)>
 

Public Member Functions

 Logger (const OutputFunction &errors=[](const std::string &msg){std::cerr<< msg<< std::endl;}, const OutputFunction &warnings=[](const std::string &){})
 Construct a Logger with optional error and warning output functions, defaults stream errors to std::cerr and suppress warnings. More...
 
 ~Logger ()
 
bool error (const std::string &message, const CodeLocation &lineCol=CodeLocation(0, 0))
 Log a compiler error and its offending code location. If the offending location is (0,0), the message is treated as not having an associated code location. More...
 
bool error (const std::string &message, const ax::ast::Node *node)
 Log a compiler error using the offending AST node. Used in AST traversal. More...
 
bool warning (const std::string &message, const CodeLocation &lineCol=CodeLocation(0, 0))
 Log a compiler warning and its offending code location. If the offending location is (0,0), the message is treated as not having an associated code location. More...
 
bool warning (const std::string &message, const ax::ast::Node *node)
 Log a compiler warning using the offending AST node. Used in AST traversal. More...
 
size_t errors () const
 Returns the number of errors that have been encountered. More...
 
size_t warnings () const
 Returns the number of warnings that have been encountered. More...
 
bool hasError () const
 Returns true if an error has been found, false otherwise. More...
 
bool hasWarning () const
 Returns true if a warning has been found, false otherwise. More...
 
bool atErrorLimit () const
 Returns true if it has errored and the max errors has been hit. More...
 
void clear ()
 Clear the tree-code mapping and reset the number of errors/warnings. More...
 
void setWarningsAsErrors (const bool warnAsError=false)
 Set any warnings that are encountered to be promoted to errors. More...
 
bool getWarningsAsErrors () const
 Returns if warning are promoted to errors. More...
 
void setMaxErrors (const size_t maxErrors=0)
 Sets the maximum number of errors that are allowed before compilation should exit. More...
 
size_t getMaxErrors () const
 Returns the number of allowed errors. More...
 
void setNumberedOutput (const bool numbered=true)
 Error/warning formatting options. More...
 
void setIndent (const size_t ident=0)
 Number of spaces to indent every new line before the message is formatted. More...
 
void setErrorPrefix (const char *prefix="error: ")
 Set a prefix for each warning message. More...
 
void setWarningPrefix (const char *prefix="warning: ")
 Set a prefix for each warning message. More...
 
void setPrintLines (const bool print=true)
 Set whether the output should include the offending line of code. More...
 
bool getNumberedOutput () const
 Returns whether the messages will be numbered. More...
 
size_t getIndent () const
 Returns the number of spaces to be printed before every new line. More...
 
const char * getErrorPrefix () const
 Returns the prefix for each error message. More...
 
const char * getWarningPrefix () const
 Returns the prefix for each warning message. More...
 
bool getPrintLines () const
 Returns whether the messages will include the line of offending code. More...
 
void setSourceCode (const char *code)
 Set the source code that lines can be printed from if an error or warning is raised. More...
 
void setSourceTree (openvdb::ax::ast::Tree::ConstPtr tree)
 Set the AST source tree which will be used as reference for the locations of nodes when resolving line and column numbers during AST traversal. More...
 
void addNodeLocation (const ax::ast::Node *node, const CodeLocation &location)
 Add a node to the code location map. More...
 

Friends

class ::TestLogger
 

Detailed Description

Logger for collecting errors and warnings that occur during AX compilation.

Error and warning output can be customised using the function pointer arguments. These require a function that takes the formatted error or warning string and handles the output, returning void. e.g. void streamCerr(const std::string& message) { std::cerr << message << std::endl; }

The Logger handles formatting of messages, tracking of number of errors or warnings and retrieval of errored lines of code to be printed if needed. Use of the Logger to track new errors or warnings can be done either with the line/column numbers directly (e.g during lexing and parsing where the code is being iterated through) or referring to the AST node using its position in the Tree (e.g. during codegen where only the AST node is known directly, not the corresponding line/column numbers). To find the line or column numbers for events logged using AST nodes, the Logger stores a map of Node* to line and column numbers. This must be populated e.g. during parsing, to allow resolution of code locations when they are not explicitly available. The Logger also stores a pointer to the AST Tree that these nodes belong to and the code used to create it.

Warning
The logger is not thread safe. A unique instance of the Logger should be used for unique invocations of ax pipelines.

Member Typedef Documentation

using CodeLocation = std::pair<size_t, size_t>
using OutputFunction = std::function<void(const std::string&)>
using Ptr = std::shared_ptr<Logger>

Constructor & Destructor Documentation

Logger ( const OutputFunction errors = [](const std::string &msg){std::cerr<< msg<< std::endl;},
const OutputFunction warnings = [](const std::string &){} 
)

Construct a Logger with optional error and warning output functions, defaults stream errors to std::cerr and suppress warnings.

Parameters
errorsOptional error output function
warningsOptional warning output function
~Logger ( )

Member Function Documentation

void addNodeLocation ( const ax::ast::Node node,
const CodeLocation location 
)

Add a node to the code location map.

Parameters
nodePointer to AST node
locationLine and column number in code
bool atErrorLimit ( ) const
inline

Returns true if it has errored and the max errors has been hit.

void clear ( )

Clear the tree-code mapping and reset the number of errors/warnings.

Note
The tree-code mapping must be repopulated to retrieve line and column numbers during AST traversal i.e. code generation. The openvdb::ax::ast::parse() function does this for a given input code string.
bool error ( const std::string &  message,
const CodeLocation lineCol = CodeLocation(0, 0) 
)

Log a compiler error and its offending code location. If the offending location is (0,0), the message is treated as not having an associated code location.

Parameters
messageThe error message
lineColThe line/column number of the offending code
Returns
true if can continue to capture future messages.
bool error ( const std::string &  message,
const ax::ast::Node node 
)

Log a compiler error using the offending AST node. Used in AST traversal.

Parameters
messageThe error message
nodeThe offending AST node causing the error
Returns
true if can continue to capture future messages.
size_t errors ( ) const
inline

Returns the number of errors that have been encountered.

const char* getErrorPrefix ( ) const

Returns the prefix for each error message.

size_t getIndent ( ) const

Returns the number of spaces to be printed before every new line.

size_t getMaxErrors ( ) const

Returns the number of allowed errors.

bool getNumberedOutput ( ) const

Returns whether the messages will be numbered.

bool getPrintLines ( ) const

Returns whether the messages will include the line of offending code.

const char* getWarningPrefix ( ) const

Returns the prefix for each warning message.

bool getWarningsAsErrors ( ) const

Returns if warning are promoted to errors.

bool hasError ( ) const
inline

Returns true if an error has been found, false otherwise.

bool hasWarning ( ) const
inline

Returns true if a warning has been found, false otherwise.

void setErrorPrefix ( const char *  prefix = "error: ")

Set a prefix for each warning message.

void setIndent ( const size_t  ident = 0)

Number of spaces to indent every new line before the message is formatted.

void setMaxErrors ( const size_t  maxErrors = 0)

Sets the maximum number of errors that are allowed before compilation should exit.

Note
The logger will continue to increment the error counter beyond this value but, once reached, it will not invoke the error callback.
Parameters
maxErrorsThe number of allowed errors
void setNumberedOutput ( const bool  numbered = true)

Error/warning formatting options.

Set whether the output should number the errors/warnings

Parameters
numberedIf true, messages will be numbered
void setPrintLines ( const bool  print = true)

Set whether the output should include the offending line of code.

Parameters
printIf true, offending lines of code will be appended to the output message
void setSourceCode ( const char *  code)

Set the source code that lines can be printed from if an error or warning is raised.

Parameters
codeThe AX code as a c-style string
void setSourceTree ( openvdb::ax::ast::Tree::ConstPtr  tree)

Set the AST source tree which will be used as reference for the locations of nodes when resolving line and column numbers during AST traversal.

These functions are only to be used during parsing to allow line and column number retrieval during later stages of compilation when working solely with an AST

Note
To be used just by ax::parse before any AST modifications to ensure traversal of original source tree is possible, when adding messages using Node* which may correspond to modified trees
Parameters
treePointer to const AST
void setWarningPrefix ( const char *  prefix = "warning: ")

Set a prefix for each warning message.

void setWarningsAsErrors ( const bool  warnAsError = false)

Set any warnings that are encountered to be promoted to errors.

Parameters
warnAsErrorIf true, warnings will be treated as errors
bool warning ( const std::string &  message,
const CodeLocation lineCol = CodeLocation(0, 0) 
)

Log a compiler warning and its offending code location. If the offending location is (0,0), the message is treated as not having an associated code location.

Parameters
messageThe warning message
lineColThe line/column number of the offending code
Returns
true if can continue to capture future messages.
bool warning ( const std::string &  message,
const ax::ast::Node node 
)

Log a compiler warning using the offending AST node. Used in AST traversal.

Parameters
messageThe warning message
nodeThe offending AST node causing the warning
Returns
true if can continue to capture future messages.
size_t warnings ( ) const
inline

Returns the number of warnings that have been encountered.

Friends And Related Function Documentation

friend class ::TestLogger
friend