From a61fd2dcd032db8ac4d1dbb010464476e7804321 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Mon, 25 Oct 2021 21:33:21 +0200 Subject: [PATCH] mark a new function FindVariable() --- src/generator.h | 217 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 166 insertions(+), 51 deletions(-) diff --git a/src/generator.h b/src/generator.h index 93275f9..ad734ad 100644 --- a/src/generator.h +++ b/src/generator.h @@ -309,7 +309,7 @@ private: void PrintLastSpaceField(pt::Space * space, Var & result, std::vector> & parameters); void CallSpaceObjectForLastField(Var & result, std::vector> & parameters, pt::Space * space); - pt::Space * CallSpaceObjectForMiddleField(const std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space); + //pt::Space * CallSpaceObjectForMiddleField(const std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space); void CallSpaceTableForLastField(morm::SpaceWrapper & space_wrapper, Var & result, std::vector> & parameters, pt::Space * space, size_t model_wrapper_space_table_index); @@ -317,7 +317,7 @@ private: pt::Space * CallSpaceTableForMiddleField(morm::SpaceWrapper & space_wrapper, const std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space, size_t model_wrapper_space_table_index); - bool CallSpace(FindHelper & find_helper, std::vector & fields, Var & result, std::vector> & parameters); + bool CallSpace(morm::SpaceWrapper * space_wrapper, const std::wstring & name, size_t & field_index, std::vector & fields, Var & result, std::vector> & parameters); #ifdef EZC_HAS_MORM_LIBRARY bool CallModelField(morm::Model & model, const std::wstring & field, Var & result, std::vector> & parameters, const StreamType & in_stream); @@ -329,6 +329,14 @@ private: #endif + Var * FindInScope(const std::wstring & name); + + Var * FindVariable(const std::wstring & name, std::vector & fields, size_t & field_index, std::vector> & parameters); + + bool EvaluateVariable(const std::wstring & name, Var & var, std::vector & fields, size_t & field_index, std::vector> & parameters, Var & result); + + + bool CallVariable(std::wstring & name, std::vector & fields, size_t & field_index, @@ -1267,19 +1275,19 @@ void Generator::CallSpace } -template -pt::Space * Generator::CallSpaceObjectForMiddleField(const std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space) -{ - std::wstring & next_field = fields[field_index]; - space = space->get_space(next_field); - - if( !space && !IsTestingFunctionExistence() ) - { - CreateMsg(L"cannot find space field: ", root_space_name, fields, field_index + 1); - } - - return space; -} +//template +//pt::Space * Generator::CallSpaceObjectForMiddleField(const std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space) +//{ +// std::wstring & next_field = fields[field_index]; +// space = space->get_space(next_field); +// +// if( !space && !IsTestingFunctionExistence() ) +// { +// CreateMsg(L"cannot find space field: ", root_space_name, fields, field_index + 1); +// } +// +// return space; +//} @@ -1375,13 +1383,11 @@ void Generator::PrintLast template bool Generator::CallSpace( - FindHelper & find_helper, std::vector & fields, Var & result, std::vector> & parameters) + morm::SpaceWrapper * space_wrapper, const std::wstring & name, size_t & field_index, std::vector & fields, Var & result, std::vector> & parameters) { - morm::SpaceWrapper * space_wrapper = find_helper.wrapper->space_wrapper; pt::Space * space = space_wrapper->get_space(); - //last_res = false; - size_t field_index = find_helper.field_index; size_t model_wrapper_space_table_index = 0; + bool status = false; /* * @@ -1392,34 +1398,38 @@ bool Generator::CallSpace */ while( (field_index < fields.size() + 1) && space ) { - bool is_last_field = (field_index == fields.size()); - if( space->is_object() ) { - if( is_last_field ) + std::wstring & next_field = fields[field_index]; + pt::Space * next_space = space->get_space(next_field); + + if( !next_space ) { CallSpaceObjectForLastField(result, parameters, space); - } - else - { - space = CallSpaceObjectForMiddleField(*find_helper.fun_name, fields, field_index, space); + status = true; } - field_index += 1; + space = next_space; + + if( space ) + field_index += 1; } else if( space->is_table() ) { + bool is_last_field = (field_index == fields.size()); + if( model_wrapper_space_table_index < space_wrapper->space_indices_table_size() ) { if( is_last_field ) { CallSpaceTableForLastField(*space_wrapper, result, parameters, space, model_wrapper_space_table_index); field_index += 1; + status = true; } else { - space = CallSpaceTableForMiddleField(*space_wrapper, *find_helper.fun_name, fields, field_index, space, model_wrapper_space_table_index); + space = CallSpaceTableForMiddleField(*space_wrapper, name, fields, field_index, space, model_wrapper_space_table_index); // increment field_index only if next_field is 'this' and space is not an object if( space && !space->is_object() ) @@ -1435,36 +1445,41 @@ bool Generator::CallSpace } else { - CreateMsg(L"", *find_helper.fun_name, fields, field_index, L" exceeded the maximum number of fields for a space object"); + CreateMsg(L"", name, fields, field_index, L" exceeded the maximum number of fields for a space object"); space = nullptr; } } else { - if( is_last_field ) - { - if( !IsTestingFunctionExistence() ) - { - PrintLastSpaceField(space, result, parameters); - } + PrintLastSpaceField(space, result, parameters); + status = true; + // increment field_index here? + break; - field_index += 1; - } - else - { - if( !IsTestingFunctionExistence() ) - { - CreateMsg(L"", *find_helper.fun_name, fields, field_index, L" of a space is not an object nor a table"); - } - - space = nullptr; - } +// if( is_last_field ) +// { +// if( !IsTestingFunctionExistence() ) +// { +// PrintLastSpaceField(space, result, parameters); +// } +// +// field_index += 1; +// } +// else +// { +// if( !IsTestingFunctionExistence() ) +// { +// CreateMsg(L"", name, fields, field_index, L" of a space is not an object nor a table"); +// } +// +// space = nullptr; +// } } model_wrapper_space_table_index += 1; } - return space != nullptr; + return status; } @@ -1603,10 +1618,10 @@ bool Generator::CallWrapp bool all_fields_known = (find_helper.field_index == fields.size()); bool last_field_not_known = (find_helper.field_index + 1 == fields.size()); - if( find_helper.wrapper->space_wrapper ) - { - found = CallSpace(find_helper, fields, result, parameters); - } +// if( find_helper.wrapper->space_wrapper ) +// { +// found = CallSpace(find_helper, fields, result, parameters); +// } if( find_helper.wrapper->date ) { @@ -1825,6 +1840,106 @@ bool Generator::CallVaria } + +template +Var * Generator::FindInScope(const std::wstring & name) +{ + // here we should look in scopes (not implemented yet) + + if( pvars ) + { + return pvars->find(name); + } + + return nullptr; +} + + +template +Var * Generator::FindVariable( + const std::wstring & name, std::vector & fields, size_t & field_index, std::vector> & parameters) +{ + Var * var = nullptr; + std::vector> res; + res.resize(1); + bool was_evaluated = false; + + do + { + const std::wstring * pname = (field_index == 0)? &name : &fields[field_index - 1]; + Var * var = FindInScope(*pname); + + if( var ) + { + if( was_evaluated ) + { + Var improve_me; + EvaluateVariable(*var, res, improve_me); + res[0] = improve_me; + } + else + { + if( EvaluateVariable(*var, parameters, res[0]) ) + was_evaluated = true; + } + } + + field_index += 1; + } + while( field_index < fields.size() + 1 && var ) + + return var; +} + + +template +bool Generator::EvaluateVariable( + const std::wstring & name, Var & var, std::vector & fields, size_t & field_index, std::vector> & parameters, Var & result) +{ + StreamType fake_stream; + bool status = false; + + if( var.type == Var::TYPE_FUNCTION ) + { + if( var.user_function ) + { + CallFunction(var.user_function, result, parameters, fake_stream); + status = true; + } + else + { + // put some log that variable.user_function is null? + } + } + + if( var.type == Var::TYPE_MODEL ) + { + if( var.model ) + { + //status = CallModel(*var.model, name, fields, field_index, parameters, result); + } + else + { + // put some log that variable.user_function is null? + } + } + + if( var.type == Var::TYPE_SPACE_WRAPPER ) + { + if( var.space_wrapper ) + { + status = CallSpace(*var.space_wrapper, name, field_index, fields, result, parameters); + } + else + { + // put some log that variable.user_function is null? + } + } + + return status; +} + + /* template bool Generator::CallVariable(