/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include "sourcefileprovider.hxx" #include "sourceprovider-scanner.hxx" namespace unoidl::detail { namespace { class Cursor: public MapCursor { public: explicit Cursor(std::map< OUString, rtl::Reference > const & map): map_(map), iterator_(map_.begin()) {} private: virtual ~Cursor() noexcept override {} virtual rtl::Reference< Entity > getNext(OUString * name) override; std::map< OUString, rtl::Reference > const & map_; //TODO: extent std::map< OUString, rtl::Reference >::const_iterator iterator_; }; rtl::Reference< Entity > Cursor::getNext(OUString * name) { assert(name != nullptr); rtl::Reference< Entity > ent; if (iterator_ != map_.end()) { *name = iterator_->first; ent = iterator_->second; ++iterator_; } return ent; } class Module: public ModuleEntity { public: Module() {} std::map< OUString, rtl::Reference > map; private: virtual ~Module() noexcept override {} virtual std::vector getMemberNames() const override; virtual rtl::Reference createCursor() const override { return new Cursor(map); } }; std::vector Module::getMemberNames() const { std::vector names; for (auto & i: map) { names.push_back(i.first); } return names; } } SourceFileProvider::SourceFileProvider( rtl::Reference const & manager, OUString const & uri) { SourceProviderScannerData data(manager); if (!parse(uri, &data)) { throw NoSuchFileException(uri); } for (auto & i: data.entities) { if (i.second.kind == SourceProviderEntity::KIND_LOCAL) { assert(i.second.entity.is()); assert(i.second.entity->getSort() != Entity::SORT_MODULE); std::map< OUString, rtl::Reference > * map = &rootMap_; for (sal_Int32 j = 0;;) { OUString id(i.first.getToken(0, '.', j)); if (j == -1) { map->insert(std::make_pair(id, i.second.entity)); break; } std::map< OUString, rtl::Reference >::const_iterator k( map->find(id)); if (k == map->end()) { k = map->insert(std::make_pair(id, new Module)).first; } Module& mod = dynamic_cast(*k->second); map = &mod.map; } } } } rtl::Reference SourceFileProvider::createRootCursor() const { return new Cursor(rootMap_); } rtl::Reference SourceFileProvider::findEntity(OUString const & name) const { std::map< OUString, rtl::Reference > const * map = &rootMap_; for (sal_Int32 i = 0;;) { OUString id(name.getToken(0, '.', i)); std::map< OUString, rtl::Reference >::const_iterator j( map->find(id)); if (j == map->end()) { return rtl::Reference(); } if (i == -1) { return j->second; } if (j->second->getSort() != Entity::SORT_MODULE) { return rtl::Reference(); } Module * mod = dynamic_cast< Module * >(j->second.get()); assert(mod != nullptr); map = &mod->map; } } SourceFileProvider::~SourceFileProvider() noexcept {} } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */