11#ifndef VSCODEESCRIPT_SEMANTICCONTEXTBUILDER_H
22#define VSCODEESCRIPT_SEMANTICCONTEXTBUILDER_H
33
4+ #include " bscript/compiler/ast/ClassDeclaration.h"
45#include " bscript/compiler/ast/ConstDeclaration.h"
56#include " bscript/compiler/ast/Expression.h"
67#include " bscript/compiler/ast/FunctionParameterDeclaration.h"
910#include " bscript/compiler/ast/Program.h"
1011#include " bscript/compiler/ast/ProgramParameterDeclaration.h"
1112#include " bscript/compiler/ast/ProgramParameterList.h"
13+ #include " bscript/compiler/ast/UninitializedFunctionDeclaration.h"
1214#include " bscript/compiler/ast/UserFunction.h"
1315#include " bscript/compiler/file/SourceFile.h"
1416#include " bscript/compiler/file/SourceFileIdentifier.h"
@@ -40,10 +42,15 @@ class SemanticContextBuilder : public EscriptGrammar::EscriptParserBaseVisitor
4042 virtual std::optional<T> get_module_function_parameter (
4143 Pol::Bscript::Compiler::ModuleFunctionDeclaration* function_def,
4244 Pol::Bscript::Compiler::FunctionParameterDeclaration* param );
45+ virtual std::optional<T> get_uninit_function (
46+ Pol::Bscript::Compiler::UninitializedFunctionDeclaration* );
4347 virtual std::optional<T> get_user_function ( Pol::Bscript::Compiler::UserFunction* );
4448 virtual std::optional<T> get_user_function_parameter (
4549 Pol::Bscript::Compiler::UserFunction* function_def,
4650 Pol::Bscript::Compiler::FunctionParameterDeclaration* param );
51+ virtual std::optional<T> get_uninit_function_parameter (
52+ Pol::Bscript::Compiler::UninitializedFunctionDeclaration* function_def,
53+ Pol::Bscript::Compiler::FunctionParameterDeclaration* param );
4754 virtual std::optional<T> get_program ( const std::string& name,
4855 Pol::Bscript::Compiler::Program* program );
4956 virtual std::optional<T> get_program_parameter ( const std::string& name );
@@ -119,6 +126,13 @@ std::optional<T> SemanticContextBuilder<T>::get_module_function_parameter(
119126 return std::nullopt ;
120127}
121128
129+ template <typename T>
130+ std::optional<T> SemanticContextBuilder<T>::get_uninit_function(
131+ Pol::Bscript::Compiler::UninitializedFunctionDeclaration* )
132+ {
133+ return std::nullopt ;
134+ }
135+
122136template <typename T>
123137std::optional<T> SemanticContextBuilder<T>::get_user_function(
124138 Pol::Bscript::Compiler::UserFunction* )
@@ -134,6 +148,14 @@ std::optional<T> SemanticContextBuilder<T>::get_user_function_parameter(
134148 return std::nullopt ;
135149}
136150
151+ template <typename T>
152+ std::optional<T> SemanticContextBuilder<T>::get_uninit_function_parameter(
153+ Pol::Bscript::Compiler::UninitializedFunctionDeclaration* function_def,
154+ Pol::Bscript::Compiler::FunctionParameterDeclaration* param )
155+ {
156+ return std::nullopt ;
157+ }
158+
137159template <typename T>
138160std::optional<T> SemanticContextBuilder<T>::get_program( const std::string& name,
139161 Pol::Bscript::Compiler::Program* program )
@@ -541,6 +563,58 @@ std::optional<T> SemanticContextBuilder<T>::context()
541563 param_name );
542564 }
543565 }
566+ else if ( auto * parent_ctx = dynamic_cast <
567+ EscriptGrammar::EscriptParser::UninitFunctionDeclarationContext*>(
568+ get_ancestor ( ctx, 3 ) ) )
569+ {
570+ if ( auto * parent_id = parent_ctx->IDENTIFIER () )
571+ {
572+ auto function_name = parent_id->getText ();
573+
574+ if ( auto class_decl = workspace.scope_tree .find_class ( calling_scope ) )
575+ {
576+ for ( const auto & uninit_func_ref : class_decl->uninit_functions () )
577+ {
578+ auto & uninit_func = uninit_func_ref.get ();
579+ if ( uninit_func.name == function_name )
580+ {
581+ for ( const auto & param_ref : uninit_func.parameters () )
582+ {
583+ auto & param = param_ref.get ();
584+ if ( param.name .name == param_name )
585+ {
586+ return get_uninit_function_parameter ( &uninit_func, ¶m );
587+ }
588+ }
589+ }
590+ }
591+ }
592+ }
593+ }
594+ }
595+ }
596+ }
597+ else if ( auto * ctx =
598+ dynamic_cast <EscriptGrammar::EscriptParser::UninitFunctionDeclarationContext*>(
599+ node ) )
600+ {
601+ if ( auto * id = ctx->IDENTIFIER () )
602+ {
603+ if ( contains ( id ) )
604+ {
605+ auto function_name = id->getText ();
606+
607+ if ( auto class_decl = workspace.scope_tree .find_class ( calling_scope ) )
608+ {
609+ for ( const auto & uninit_func_ref : class_decl->uninit_functions () )
610+ {
611+ auto & uninit_func = uninit_func_ref.get ();
612+ if ( uninit_func.name == function_name )
613+ {
614+ return get_uninit_function ( &uninit_func );
615+ }
616+ }
617+ }
544618 }
545619 }
546620 }
0 commit comments