diff --git a/apps/code/script_template.cpp b/apps/code/script_template.cpp index 2ec6cf4aa..488cd362a 100644 --- a/apps/code/script_template.cpp +++ b/apps/code/script_template.cpp @@ -6,7 +6,9 @@ constexpr ScriptTemplate emptyScriptTemplate(".py", "\x01" R"(from math import * )"); constexpr ScriptTemplate squaresScriptTemplate("squares.py", "\x01" R"( -from math import sin as stew, cos as cabbage)"); +#from math import sin as stew, cos as cabbage +from math import * +)"); /*constexpr ScriptTemplate squaresScriptTemplate("squares.py", "\x01" R"( import math diff --git a/apps/code/variable_box_controller.cpp b/apps/code/variable_box_controller.cpp index 4db55f6f8..54fe1cb0a 100644 --- a/apps/code/variable_box_controller.cpp +++ b/apps/code/variable_box_controller.cpp @@ -92,10 +92,12 @@ typedef struct _mp_reader_mem_t { /* TODO end*/ -void VariableBoxController::addNodesFromImportMaybe(mp_parse_node_struct_t * parseNode) { +void VariableBoxController::addNodesFromImportMaybe(mp_parse_node_struct_t * parseNode, const char * textToAutocomplete, int textToAutocompleteLength) { uint structKind = (uint) MP_PARSE_NODE_STRUCT_KIND(parseNode); - if (structKind != PN_import_name + bool structKindIsImportWithoutFrom = structKind == PN_import_name; + + if (!structKindIsImportWithoutFrom && structKind != PN_import_from && structKind != PN_import_as_names && structKind != PN_import_as_name) @@ -103,6 +105,8 @@ void VariableBoxController::addNodesFromImportMaybe(mp_parse_node_struct_t * par return; } + bool loadModuleContent = structKindIsImportWithoutFrom; + // TODO from ScriptStore size_t childNodesCount = MP_PARSE_NODE_STRUCT_NUM_NODES(parseNode); for (int i = 0; i < childNodesCount; i++) { @@ -110,12 +114,28 @@ void VariableBoxController::addNodesFromImportMaybe(mp_parse_node_struct_t * par if (MP_PARSE_NODE_IS_LEAF(child) && MP_PARSE_NODE_LEAF_KIND(child) == MP_PARSE_NODE_ID) { uintptr_t arg = MP_PARSE_NODE_LEAF_ARG(child); const char * id = qstr_str(arg); - // TODO LEA check if not already present - addNode(ScriptNode::Type::Variable, NodeOrigin::Importation, id, -1, 1/*TODO LEA*/); + if ((strncmp(textToAutocomplete, id, textToAutocompleteLength) == 0) + && (*(id + textToAutocompleteLength) != 0)) + { + // TODO LEA check if not already present + addNode(ScriptNode::Type::Variable, NodeOrigin::Importation, id, -1, 1/*TODO LEA*/); + } } else if (MP_PARSE_NODE_IS_STRUCT(child)) { - addNodesFromImportMaybe((mp_parse_node_struct_t *)child); + addNodesFromImportMaybe((mp_parse_node_struct_t *)child, textToAutocomplete, textToAutocompleteLength); + } else if (MP_PARSE_NODE_IS_TOKEN(child) && MP_PARSE_NODE_IS_TOKEN_KIND(child, MP_TOKEN_OP_STAR)) { + /* Parsing something like from math import * + * -> Load all the module content */ + loadModuleContent = true; } } + + if (loadModuleContent) { + assert(childNodesCount > 0); + mp_parse_node_t moduleName = parseNode->nodes[0]; + assert(MP_PARSE_NODE_IS_LEAF(moduleName) && MP_PARSE_NODE_LEAF_KIND(moduleName) == MP_PARSE_NODE_ID); + + + } } void VariableBoxController::loadFunctionsAndVariables(int scriptIndex, const char * textToAutocomplete, int textToAutocompleteLength) { @@ -277,7 +297,7 @@ void VariableBoxController::loadFunctionsAndVariables(int scriptIndex, const cha mp_parse_node_t pn = parseTree.root; if (MP_PARSE_NODE_IS_STRUCT(pn)) { - addNodesFromImportMaybe((mp_parse_node_struct_t *) pn); + addNodesFromImportMaybe((mp_parse_node_struct_t *) pn, textToAutocomplete, textToAutocompleteLength); } mp_parse_tree_clear(&parseTree); diff --git a/apps/code/variable_box_controller.h b/apps/code/variable_box_controller.h index e352d722a..68d575463 100644 --- a/apps/code/variable_box_controller.h +++ b/apps/code/variable_box_controller.h @@ -65,7 +65,7 @@ private: bool selectLeaf(int rowIndex) override; void insertTextInCaller(const char * text, int textLength = -1); - void addNodesFromImportMaybe(mp_parse_node_struct_t * parseNode); + void addNodesFromImportMaybe(mp_parse_node_struct_t * parseNode, const char * textToAutocomplete, int textToAutocompleteLength); void addNode(ScriptNode::Type type, NodeOrigin origin, const char * name, int nameLength, int scriptIndex = 0); ScriptNode m_currentScriptNodes[k_maxScriptNodesCount];