ArkScript
A small, fast, functional and scripting language for video games
|
#include <NameResolutionPass.hpp>
Public Member Functions | |
NameResolutionPass (unsigned debug) | |
Create a NameResolutionPass. | |
void | process (const Node &ast) override |
Start visiting the given AST, checking for mutability violation and unbound variables. | |
const Node & | ast () const noexcept override |
Unused overload that return the input AST (untouched as this pass only generates errors) | |
std::string | addDefinedSymbol (const std::string &sym, bool is_mutable) |
Register a symbol as defined, so that later we can throw errors on undefined symbols. | |
Public Member Functions inherited from Ark::internal::Pass | |
Pass (std::string name, unsigned debug_level) | |
Construct a new Pass object. | |
virtual | ~Pass ()=default |
Private Member Functions | |
void | visit (Node &node, bool register_declarations) |
Recursively visit nodes. | |
void | visitKeyword (Node &node, Keyword keyword, bool register_declarations) |
void | addSymbolNode (const Node &symbol, const std::string &old_name="") |
Register a given node in the symbol table. | |
bool | mayBeFromPlugin (const std::string &name) const noexcept |
Checking if a symbol may be coming from a plugin. | |
std::string | updateSymbolWithFullyQualifiedName (Node &symbol) |
void | checkForUndefinedSymbol () const |
Checks for undefined symbols, not present in the defined symbols table. | |
std::string | offerSuggestion (const std::string &str) const |
Suggest a symbol of what the user may have meant to input. | |
Private Attributes | |
Node | m_ast |
std::unordered_set< std::string > | m_language_symbols |
Precomputed set of language symbols that can't be used to define variables. | |
std::vector< Node > | m_symbol_nodes |
std::unordered_set< std::string > | m_defined_symbols |
std::vector< std::string > | m_plugin_names |
ScopeResolver | m_scope_resolver |
Additional Inherited Members | |
Protected Attributes inherited from Ark::internal::Pass | |
Logger | m_logger |
Definition at line 24 of file NameResolutionPass.hpp.
|
explicit |
Create a NameResolutionPass.
debug | debug level |
Definition at line 9 of file NameResolutionPass.cpp.
References Ark::internal::Language::And, Ark::internal::Builtins::builtins, Ark::internal::Language::listInstructions, m_language_symbols, Ark::internal::Language::operators, Ark::internal::Language::Or, and Ark::internal::Language::SysArgs.
std::string Ark::internal::NameResolutionPass::addDefinedSymbol | ( | const std::string & | sym, |
bool | is_mutable ) |
Register a symbol as defined, so that later we can throw errors on undefined symbols.
sym | |
is_mutable | true if the symbol is inside mut/set, false otherwise (let) |
Definition at line 48 of file NameResolutionPass.cpp.
References m_defined_symbols, m_scope_resolver, and Ark::internal::ScopeResolver::registerInCurrent().
Referenced by Ark::Welder::registerSymbol(), and visitKeyword().
|
private |
Register a given node in the symbol table.
symbol | |
old_name | old name for symbol, to replace it with the new one if it was renamed |
Definition at line 269 of file NameResolutionPass.cpp.
References Ark::internal::Node::col(), Ark::internal::Node::filename(), Ark::internal::Node::line(), m_language_symbols, m_symbol_nodes, and Ark::internal::Node::string().
Referenced by visit().
|
nodiscardoverridevirtualnoexcept |
Unused overload that return the input AST (untouched as this pass only generates errors)
Implements Ark::internal::Pass.
Definition at line 43 of file NameResolutionPass.cpp.
References m_ast.
Referenced by Ark::Welder::computeAST(), and process().
|
private |
Checks for undefined symbols, not present in the defined symbols table.
Definition at line 348 of file NameResolutionPass.cpp.
References m_defined_symbols, m_symbol_nodes, mayBeFromPlugin(), and offerSuggestion().
Referenced by process().
|
nodiscardprivatenoexcept |
Checking if a symbol may be coming from a plugin.
name | symbol name |
Definition at line 300 of file NameResolutionPass.cpp.
References Ark::Utils::splitString().
Referenced by checkForUndefinedSymbol().
|
nodiscardprivate |
Suggest a symbol of what the user may have meant to input.
str | the string |
Definition at line 378 of file NameResolutionPass.cpp.
References Ark::Utils::levenshteinDistance(), m_defined_symbols, and m_language_symbols.
Referenced by checkForUndefinedSymbol().
|
overridevirtual |
Start visiting the given AST, checking for mutability violation and unbound variables.
ast | AST to analyze |
Implements Ark::internal::Pass.
Definition at line 25 of file NameResolutionPass.cpp.
References ast(), checkForUndefinedSymbol(), Ark::internal::Node::debugPrint(), m_ast, Ark::internal::Pass::m_logger, Ark::internal::Logger::shouldTrace(), Ark::internal::Logger::trace(), Ark::internal::Logger::traceEnd(), Ark::internal::Logger::traceStart(), and visit().
Referenced by Ark::Welder::computeAST().
|
private |
Definition at line 311 of file NameResolutionPass.cpp.
References Ark::internal::ScopeResolver::canFullyQualifyName(), Ark::internal::Node::col(), Ark::internal::Node::filename(), Ark::internal::Node::line(), m_language_symbols, m_scope_resolver, Ark::internal::Node::repr(), Ark::internal::Node::setString(), and Ark::internal::Node::string().
Referenced by visit(), and visitKeyword().
|
private |
Recursively visit nodes.
node | node to visit |
register_declarations | whether or not the visit should register declarations |
Definition at line 55 of file NameResolutionPass.cpp.
References addSymbolNode(), Ark::internal::Language::AppendInPlace, Ark::internal::Node::arkNamespace(), Ark::internal::Language::ConcatInPlace, Ark::internal::Node::constList(), Ark::internal::ScopeResolver::createNewNamespace(), Ark::internal::ScopeResolver::currentScope(), Ark::internal::Field, Ark::internal::Node::filename(), Ark::internal::StaticScope::get(), Ark::internal::ScopeResolver::getFullyQualifiedNameInNearestScope(), Ark::internal::ScopeResolver::isImmutable(), Ark::internal::Keyword, Ark::internal::List, Ark::internal::Node::list(), m_scope_resolver, Ark::internal::Namespace, Ark::internal::Node::nodeType(), Ark::internal::ScopeResolver::saveNamespaceAndRemove(), Ark::internal::Node::string(), Ark::internal::Symbol, Ark::internal::Language::UpdateRef, updateSymbolWithFullyQualifiedName(), visit(), and visitKeyword().
Referenced by process(), visit(), and visitKeyword().
|
private |
node | a list node whose first child is a keyword |
keyword | |
register_declarations | whether or not the visit should register declarations |
Definition at line 160 of file NameResolutionPass.cpp.
References addDefinedSymbol(), Ark::internal::Capture, Ark::internal::Node::constList(), Ark::internal::ScopeResolver::createNew(), Ark::internal::Node::filename(), Ark::internal::Fun, Ark::internal::Import, Ark::internal::ScopeResolver::isImmutable(), Ark::internal::ScopeResolver::isInScope(), Ark::internal::ScopeResolver::isRegistered(), Ark::internal::Let, Ark::internal::List, Ark::internal::Node::list(), m_language_symbols, m_plugin_names, m_scope_resolver, Ark::internal::Mut, Ark::internal::ScopeResolver::removeLastScope(), Ark::internal::Set, Ark::internal::Symbol, updateSymbolWithFullyQualifiedName(), visit(), and Ark::internal::While.
Referenced by visit().
|
private |
Definition at line 54 of file NameResolutionPass.hpp.
|
private |
Definition at line 57 of file NameResolutionPass.hpp.
Referenced by addDefinedSymbol(), checkForUndefinedSymbol(), and offerSuggestion().
|
private |
Precomputed set of language symbols that can't be used to define variables.
Definition at line 55 of file NameResolutionPass.hpp.
Referenced by addSymbolNode(), NameResolutionPass(), offerSuggestion(), updateSymbolWithFullyQualifiedName(), and visitKeyword().
|
private |
Definition at line 58 of file NameResolutionPass.hpp.
Referenced by visitKeyword().
|
private |
Definition at line 59 of file NameResolutionPass.hpp.
Referenced by addDefinedSymbol(), updateSymbolWithFullyQualifiedName(), visit(), and visitKeyword().
|
private |
Definition at line 56 of file NameResolutionPass.hpp.
Referenced by addSymbolNode(), and checkForUndefinedSymbol().