loom

Форк
0
74 строки · 2.9 Кб
1
#include "ScriptDocumentOperation.h"
2
#include "simodo/engine/Analyzer.h"
3

4
using namespace simodo;
5

6
bool ScriptDocumentOperation::analyze(const std::u16string & text, inout::Reporter_abstract & reporter)
7
{
8
    _doc.server().log().debug("ScriptDocumentOperation::analyze '" + _doc.file_name() + "'");
9

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);
13

14
    std::shared_ptr<simodo::engine::Engine_interface> 
15
            engine = std::make_shared<simodo::engine::Analyzer>(
16
                reporter,
17
                file_supplier,
18
                _factory.loom_dir(),
19
                _doc.file_name() == initial_contract_file ? "" : initial_contract_file,
20
                _doc.file_name(),
21
                semantic_data
22
            );
23

24
    // _doc.server().log().debug("ScriptDocumentOperation::analyze gathered");
25

26
    bool ok = engine->prepare();
27

28
    // _doc.server().log().debug("ScriptDocumentOperation::analyze prepare: ", ok ? "true" : "false");
29

30
    if (ok) {
31
        loom::FiberStatus status = engine->run();
32

33
        ok = (status == loom::FiberStatus::Complete);
34

35
        // _doc.server().log().debug("ScriptDocumentOperation::analyze run: ", ok ? "true" : "false");
36
    }
37
    // else
38
    //     reporter.reportFatal("Couldn't start the engine");
39

40
    if (not ok) { 
41
        // Фетисов: Могут быть обнаружены ошибки в семантике, но при этом какие-то данные 
42
        // могут всё равно обновиться
43
        if (semantic_data.declared().size() < _semantic_data.declared().size()
44
         && semantic_data.used().size() < _semantic_data.used().size())
45
            return true;
46
    }
47

48
    semantic_data.swap(_semantic_data);
49

50
    _files = engine->files();
51

52
    /// \note Фетисов: Код внутренних (internal) функций хранится в module::ModuleManagement,
53
    /// поэтому его необходимо сохранять до следующего вызова analyze. 
54
    _engine = engine;
55

56
    findCurrentFileIndex();
57

58
    return true;
59
}
60

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])
64
            break;
65

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() + "' среди этих:",
71
                                  files_string);
72
        _current_file_index = 0;
73
    }
74
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.