Skip to content

Commit b45dfce

Browse files
authored
Add support for uninitialized functions (#113)
* Update polserver to 82bd2b6 * Add hover support for uninit function declarations and parameters
1 parent 0d4196d commit b45dfce

File tree

5 files changed

+112
-1
lines changed

5 files changed

+112
-1
lines changed

native/cpp/compiler/HoverBuilder.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,18 @@ std::optional<HoverResult> HoverBuilder::get_module_function(
114114
return append_comment( function_def, result );
115115
}
116116

117+
std::optional<HoverResult> HoverBuilder::get_uninit_function(
118+
UninitializedFunctionDeclaration* function_def )
119+
{
120+
std::string hover = "```escriptdoc\n(uninitialized function) ";
121+
hover += function_def->name;
122+
hover += "(";
123+
hover += parameters_to_string( function_def->parameters(), false );
124+
hover += ")\n```";
125+
HoverResult result{ HoverResult::SymbolType::USER_FUNCTION, function_def->name, hover };
126+
return append_comment( function_def, result );
127+
}
128+
117129
std::optional<HoverResult> HoverBuilder::get_user_function(
118130
Pol::Bscript::Compiler::UserFunction* function_def )
119131
{
@@ -205,6 +217,16 @@ std::optional<HoverResult> HoverBuilder::get_module_function_parameter(
205217
return append_comment( param, result );
206218
}
207219

220+
std::optional<HoverResult> HoverBuilder::get_uninit_function_parameter(
221+
Pol::Bscript::Compiler::UninitializedFunctionDeclaration* function_def,
222+
Pol::Bscript::Compiler::FunctionParameterDeclaration* param )
223+
{
224+
std::string hover = "```escriptdoc\n(parameter) ";
225+
hover += param->name.name;
226+
hover += "\n```";
227+
HoverResult result{ HoverResult::SymbolType::USER_FUNCTION_PARAMETER, param->name.name, hover };
228+
return append_comment( param, result );
229+
}
208230

209231
std::optional<HoverResult> HoverBuilder::get_user_function_parameter(
210232
Pol::Bscript::Compiler::UserFunction* function_def,

native/cpp/compiler/HoverBuilder.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,16 @@ class HoverBuilder : public SemanticContextBuilder<HoverResult>
5959
virtual std::optional<HoverResult> get_module_function_parameter(
6060
Pol::Bscript::Compiler::ModuleFunctionDeclaration* function_def,
6161
Pol::Bscript::Compiler::FunctionParameterDeclaration* param ) override;
62+
virtual std::optional<HoverResult> get_uninit_function(
63+
Pol::Bscript::Compiler::UninitializedFunctionDeclaration* ) override;
6264
virtual std::optional<HoverResult> get_user_function(
6365
Pol::Bscript::Compiler::UserFunction* ) override;
6466
virtual std::optional<HoverResult> get_user_function_parameter(
6567
Pol::Bscript::Compiler::UserFunction* function_def,
6668
Pol::Bscript::Compiler::FunctionParameterDeclaration* param ) override;
69+
virtual std::optional<HoverResult> get_uninit_function_parameter(
70+
Pol::Bscript::Compiler::UninitializedFunctionDeclaration* function_def,
71+
Pol::Bscript::Compiler::FunctionParameterDeclaration* param ) override;
6772
virtual std::optional<HoverResult> get_program(
6873
const std::string& name, Pol::Bscript::Compiler::Program* program ) override;
6974
virtual std::optional<HoverResult> get_program_parameter( const std::string& param ) override;

native/cpp/compiler/SemanticContextBuilder.h

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
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"
@@ -9,6 +10,7 @@
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+
122136
template <typename T>
123137
std::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+
137159
template <typename T>
138160
std::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, &param );
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
}

native/polserver

Submodule polserver updated 160 files

native/test/native.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,16 @@ describe('Hover - SRC', () => {
381381
const hover = getHover('function StaticFunction(a0) endfunction class Foo() function Foo(this) ::StaticFunction(0); endfunction endclass StaticFunction("");', 76);
382382
expect(hover).toEqual(escriptdoc('(user function) StaticFunction( a0 )'));
383383
});
384+
385+
it('Can hover uninitialized function declaration', () => {
386+
const hover = getHover('class Base() uninit function method( this, default param ); endclass class Child( Base ) function Child( this ) endfunction function method( this, param ) endfunction endclass Child();', 32);
387+
expect(hover).toEqual(escriptdoc('(uninitialized function) method( this, param )'));
388+
});
389+
390+
it('Can hover parameter in uninitialized function', () => {
391+
const hover = getHover('class Base() uninit function method( this, default param ); endclass class Child( Base ) function Child( this ) endfunction function method( this, param ) endfunction endclass Child();', 54);
392+
expect(hover).toEqual(escriptdoc('(parameter) param'));
393+
});
384394
});
385395

386396
describe('Hover - Classes', () => {

0 commit comments

Comments
 (0)