1
#include "ScriptDocumentOperation.h"
2
#include "simodo/engine/Analyzer.h"
6
bool ScriptDocumentOperation::analyze(const std::u16string & text, inout::Reporter_abstract & reporter)
8
_doc.server().log().debug("ScriptDocumentOperation::analyze '" + _doc.file_name() + "'");
10
SemanticDataCollector semantic_data;
11
const std::string initial_contract_file = engine::makeInitialContractFile(_factory.loom_dir());
12
InputSupplier file_supplier(_doc.server(), _doc.file_name(), text);
14
std::shared_ptr<simodo::engine::Engine_interface>
15
engine = std::make_shared<simodo::engine::Analyzer>(
19
_doc.file_name() == initial_contract_file ? "" : initial_contract_file,
24
// _doc.server().log().debug("ScriptDocumentOperation::analyze gathered");
26
bool ok = engine->prepare();
28
// _doc.server().log().debug("ScriptDocumentOperation::analyze prepare: ", ok ? "true" : "false");
31
loom::FiberStatus status = engine->run();
33
ok = (status == loom::FiberStatus::Complete);
35
// _doc.server().log().debug("ScriptDocumentOperation::analyze run: ", ok ? "true" : "false");
38
// reporter.reportFatal("Couldn't start the engine");
41
// Фетисов: Могут быть обнаружены ошибки в семантике, но при этом какие-то данные
42
// могут всё равно обновиться
43
if (semantic_data.declared().size() < _semantic_data.declared().size()
44
&& semantic_data.used().size() < _semantic_data.used().size())
48
semantic_data.swap(_semantic_data);
50
_files = engine->files();
52
/// \note Фетисов: Код внутренних (internal) функций хранится в module::ModuleManagement,
53
/// поэтому его необходимо сохранять до следующего вызова analyze.
56
findCurrentFileIndex();
61
void ScriptDocumentOperation::findCurrentFileIndex() {
62
for (_current_file_index = 0; _current_file_index < _files.size(); ++_current_file_index) // NOLINT(*-too-small-loop-variable)
63
if (_doc.file_name() == _files[_current_file_index])
66
if (_current_file_index == _files.size()) {
67
std::string files_string;
68
for (const auto & _file : _files)
69
files_string += "\t'" + _file + "'\n";
70
_doc.server().log().error("Не удалось определить индекс файла '" + _doc.file_name() + "' среди этих:",
72
_current_file_index = 0;