// // This file is part of Kepka, // an unofficial desktop version of Telegram messaging app, // see https://github.com/procxx/kepka // // Kepka is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // It is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // In addition, as a special exception, the copyright holders give permission // to link the code of portions of this program with the OpenSSL library. // // Full license: https://github.com/procxx/kepka/blob/master/LICENSE // Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org // Copyright (c) 2017- Kepka Contributors, https://github.com/procxx // #include "codegen/style/module.h" namespace codegen { namespace style { namespace structure { namespace { QString fullNameKey(const FullName &name) { return name.join('.'); } } // namespace Module::Module(const QString &fullpath) : fullpath_(fullpath) {} void Module::addIncluded(std::unique_ptr &&value) { included_.push_back(std::move(value)); } bool Module::addStruct(const Struct &value) { if (findStruct(value.name)) { return false; } structsByName_.insert(fullNameKey(value.name), structs_.size()); structs_.push_back(value); return true; } const Struct *Module::findStruct(const FullName &name) const { if (auto result = findStructInModule(name, *this)) { return result; } for (const auto &module : included_) { if (auto result = module->findStruct(name)) { return result; } } return nullptr; } bool Module::addVariable(const Variable &value) { if (findVariable(value.name)) { return false; } variablesByName_.insert(fullNameKey(value.name), variables_.size()); variables_.push_back(value); return true; } const Variable *Module::findVariable(const FullName &name, bool *outFromThisModule) const { if (auto result = findVariableInModule(name, *this)) { if (outFromThisModule) *outFromThisModule = true; return result; } for (const auto &module : included_) { if (auto result = module->findVariable(name)) { if (outFromThisModule) *outFromThisModule = false; return result; } } return nullptr; } const Struct *Module::findStructInModule(const FullName &name, const Module &module) const { auto index = module.structsByName_.value(fullNameKey(name), -1); if (index < 0) { return nullptr; } return &module.structs_.at(index); } const Variable *Module::findVariableInModule(const FullName &name, const Module &module) const { auto index = module.variablesByName_.value(fullNameKey(name), -1); if (index < 0) { return nullptr; } return &module.variables_.at(index); } } // namespace structure } // namespace style } // namespace codegen