polserver/pol-core/bscript/compiler/astbuilder/FunctionResolver.cpp
Eric Swanson cf42b03e3c
New compiler: Add AST nodes for function calls. Can compile hello world. (#240)
Adds:
- ast/Argument: AST node for an argument passed to a function.
- ast/FunctionCall: AST node for a function call.
- codegen/ModuleDeclarationRegistrar: The code generator registers module function declarations with this in order to determine module indexes and function indexes for instructions.
- model/FunctionLink: this is a reference either:
  - from: a FunctionCall or a FunctionReference
  - to: a ModuleFunctionDeclaration or a UserFunction
- optimizer/ReferencedFunctionGatherer: a visitor that determines which module functions and user functions are referenced, by looking at function calls and function references.

Also:
- CodeGenerator registers module functions
- InstructionGenerator generates code for function calls
- InstructionEmitter generates TOK_FUNC instructions
- StoredTokenDecoder decodes TOK_FUNC instructions

After all of this, the compiler can compile print("hello, world");
2020-08-24 01:47:38 -07:00

43 lines
1.3 KiB
C++

#include "FunctionResolver.h"
#include "compiler/Report.h"
#include "compiler/ast/Function.h"
#include "compiler/ast/ModuleFunctionDeclaration.h"
#include "compiler/file/SourceLocation.h"
#include "compiler/model/FunctionLink.h"
namespace Pol::Bscript::Compiler
{
FunctionResolver::FunctionResolver( Report& report ) : report( report ) {}
const Function* FunctionResolver::find( const std::string& scoped_name )
{
auto itr = resolved_functions_by_name.find( scoped_name );
if ( itr != resolved_functions_by_name.end() )
return ( *itr ).second;
else
return nullptr;
}
void FunctionResolver::register_function_link( const std::string& name,
std::shared_ptr<FunctionLink> function_link )
{
auto already_resolved_itr = resolved_functions_by_name.find( name );
if ( already_resolved_itr != resolved_functions_by_name.end() )
{
function_link->link_to( ( *already_resolved_itr ).second );
}
else
{
unresolved_function_links_by_name[name].push_back( std::move( function_link ) );
}
}
void FunctionResolver::register_module_function( ModuleFunctionDeclaration* mf )
{
resolved_functions_by_name[mf->name] = mf;
auto scoped_name = mf->module_name + "::" + mf->name;
resolved_functions_by_name[scoped_name] = mf;
}
} // namespace Pol::Bscript::Compiler