mark a new function FindVariable()

This commit is contained in:
Tomasz Sowa 2021-10-25 21:33:21 +02:00
parent 03a76d35ad
commit a61fd2dcd0
1 changed files with 166 additions and 51 deletions

View File

@ -309,7 +309,7 @@ private:
void PrintLastSpaceField(pt::Space * space, Var<StreamType> & result, std::vector<Var<StreamType>> & parameters);
void CallSpaceObjectForLastField(Var<StreamType> & result, std::vector<Var<StreamType>> & parameters, pt::Space * space);
pt::Space * CallSpaceObjectForMiddleField(const std::wstring & root_space_name, std::vector<std::wstring> & fields, size_t field_index, pt::Space * space);
//pt::Space * CallSpaceObjectForMiddleField(const std::wstring & root_space_name, std::vector<std::wstring> & fields, size_t field_index, pt::Space * space);
void CallSpaceTableForLastField(morm::SpaceWrapper & space_wrapper, Var<StreamType> & result, std::vector<Var<StreamType>> & 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<std::wstring> & fields,
size_t field_index, pt::Space * space, size_t model_wrapper_space_table_index);
bool CallSpace(FindHelper & find_helper, std::vector<std::wstring> & fields, Var<StreamType> & result, std::vector<Var<StreamType>> & parameters);
bool CallSpace(morm::SpaceWrapper * space_wrapper, const std::wstring & name, size_t & field_index, std::vector<std::wstring> & fields, Var<StreamType> & result, std::vector<Var<StreamType>> & parameters);
#ifdef EZC_HAS_MORM_LIBRARY
bool CallModelField(morm::Model & model, const std::wstring & field, Var<StreamType> & result, std::vector<Var<StreamType>> & parameters, const StreamType & in_stream);
@ -329,6 +329,14 @@ private:
#endif
Var<StreamType> * FindInScope(const std::wstring & name);
Var<StreamType> * FindVariable(const std::wstring & name, std::vector<std::wstring> & fields, size_t & field_index, std::vector<Var<StreamType>> & parameters);
bool EvaluateVariable(const std::wstring & name, Var<StreamType> & var, std::vector<std::wstring> & fields, size_t & field_index, std::vector<Var<StreamType>> & parameters, Var<StreamType> & result);
bool CallVariable(std::wstring & name,
std::vector<std::wstring> & fields,
size_t & field_index,
@ -1267,19 +1275,19 @@ void Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::CallSpace
}
template<class StreamType, bool is_pikotools_stream, bool is_autoescape_stream>
pt::Space * Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::CallSpaceObjectForMiddleField(const std::wstring & root_space_name, std::vector<std::wstring> & 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<class StreamType, bool is_pikotools_stream, bool is_autoescape_stream>
//pt::Space * Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::CallSpaceObjectForMiddleField(const std::wstring & root_space_name, std::vector<std::wstring> & 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<StreamType, is_pikotools_stream, is_autoescape_stream>::PrintLast
template<class StreamType, bool is_pikotools_stream, bool is_autoescape_stream>
bool Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::CallSpace(
FindHelper & find_helper, std::vector<std::wstring> & fields, Var<StreamType> & result, std::vector<Var<StreamType>> & parameters)
morm::SpaceWrapper * space_wrapper, const std::wstring & name, size_t & field_index, std::vector<std::wstring> & fields, Var<StreamType> & result, std::vector<Var<StreamType>> & 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<StreamType, is_pikotools_stream, is_autoescape_stream>::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<StreamType, is_pikotools_stream, is_autoescape_stream>::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<StreamType, is_pikotools_stream, is_autoescape_stream>::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<StreamType, is_pikotools_stream, is_autoescape_stream>::CallVaria
}
template<class StreamType, bool is_pikotools_stream, bool is_autoescape_stream>
Var<StreamType> * Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::FindInScope(const std::wstring & name)
{
// here we should look in scopes (not implemented yet)
if( pvars )
{
return pvars->find(name);
}
return nullptr;
}
template<class StreamType, bool is_pikotools_stream, bool is_autoescape_stream>
Var<StreamType> * Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::FindVariable(
const std::wstring & name, std::vector<std::wstring> & fields, size_t & field_index, std::vector<Var<StreamType>> & parameters)
{
Var<StreamType> * var = nullptr;
std::vector<Var<StreamType>> res;
res.resize(1);
bool was_evaluated = false;
do
{
const std::wstring * pname = (field_index == 0)? &name : &fields[field_index - 1];
Var<StreamType> * var = FindInScope(*pname);
if( var )
{
if( was_evaluated )
{
Var<StreamType> 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<class StreamType, bool is_pikotools_stream, bool is_autoescape_stream>
bool Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::EvaluateVariable(
const std::wstring & name, Var<StreamType> & var, std::vector<std::wstring> & fields, size_t & field_index, std::vector<Var<StreamType>> & parameters, Var<StreamType> & result)
{
StreamType fake_stream;
bool status = false;
if( var.type == Var<StreamType>::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<StreamType>::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<StreamType>::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<class StreamType, bool is_pikotools_stream, bool is_autoescape_stream>
bool Generator<StreamType, is_pikotools_stream, is_autoescape_stream>::CallVariable(