codemaker/source/codemaker/typemanager.cxx | 3 unoidl/Library_unoidl.mk | 3 unoidl/source/sourcefileprovider.cxx | 142 +++++++++++++ unoidl/source/sourcefileprovider.hxx | 44 ++++ unoidl/source/sourceprovider-parser-requires.hxx | 2 unoidl/source/sourceprovider-parser.y | 122 +++++++++++ unoidl/source/sourceprovider-scanner.hxx | 25 +- unoidl/source/sourceprovider.cxx | 235 ----------------------- unoidl/source/sourceprovider.hxx | 46 ---- unoidl/source/sourcetreeprovider.cxx | 152 ++++++++++++++ unoidl/source/sourcetreeprovider.hxx | 46 ++++ unoidl/source/unoidl.cxx | 8 12 files changed, 531 insertions(+), 297 deletions(-)
New commits: commit 14bc5fc0ec652650deb9a41505e97c3b4d3854b2 Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Sep 16 23:25:43 2013 +0200 WIP: additional unoidl::Provider that directly reads a single .idl file Change-Id: Iab795a34a657cb36ced24a1a05f6c21a6c1637aa diff --git a/unoidl/Library_unoidl.mk b/unoidl/Library_unoidl.mk index 411e0a9..c98fc69 100644 --- a/unoidl/Library_unoidl.mk +++ b/unoidl/Library_unoidl.mk @@ -13,6 +13,7 @@ $(eval $(call gb_Library_add_defs,unoidl,-DLO_DLLIMPLEMENTATION_UNOIDL)) $(eval $(call gb_Library_add_exception_objects,unoidl, \ unoidl/source/legacyprovider \ + unoidl/source/sourcefileprovider \ unoidl/source/sourcetreeprovider \ unoidl/source/unoidl \ unoidl/source/unoidlprovider \ diff --git a/unoidl/source/sourcefileprovider.cxx b/unoidl/source/sourcefileprovider.cxx new file mode 100644 index 0000000..4c522e8 --- /dev/null +++ b/unoidl/source/sourcefileprovider.cxx @@ -0,0 +1,142 @@ +/* -*- 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 "sal/config.h" + +#include <map> +#include <utility> +#include <vector> + +#include "sourcefileprovider.hxx" +#include "sourceprovider-scanner.hxx" + +namespace unoidl { namespace detail { + +namespace { + +class Cursor: public MapCursor { +public: + explicit Cursor(std::map< OUString, rtl::Reference<Entity> > const & map): + map_(map), iterator_(map_.begin()) + {} + +private: + virtual ~Cursor() throw () {} + + virtual rtl::Reference< Entity > getNext(OUString * name); + + std::map< OUString, rtl::Reference<Entity> > const & map_; //TODO: extent + std::map< OUString, rtl::Reference<Entity> >::const_iterator iterator_; +}; + +rtl::Reference< Entity > Cursor::getNext(OUString * name) { + assert(name != 0); + 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<Entity> > map; + +private: + virtual ~Module() throw () {} + + virtual std::vector<rtl::OUString> getMemberNames() const; + + virtual rtl::Reference<MapCursor> createCursor() const + { return new Cursor(map); } +}; + +std::vector<rtl::OUString> Module::getMemberNames() const { + std::vector<rtl::OUString> names; + for (std::map< OUString, rtl::Reference<Entity> >::const_iterator i( + map.begin()); + i != map.end(); ++i) + { + names.push_back(i->first); + } + return names; +} + +} + +SourceFileProvider::SourceFileProvider( + rtl::Reference<Manager> const & manager, OUString const & uri) +{ + SourceProviderScannerData data(manager); + if (!parse(uri, &data)) { + throw NoSuchFileException(uri); + } + for (std::map<OUString, SourceProviderEntity>::iterator i( + data.entities.begin()); + i != data.entities.end(); ++i) + { + 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<Entity> > * 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<Entity> >::const_iterator k( + map->find(id)); + if (k == map->end()) { + k = map->insert(std::make_pair(id, new Module)).first; + } + Module * mod = dynamic_cast< Module * >(k->second.get()); + assert(mod != 0); + map = &mod->map; + } + } + } +} + +rtl::Reference<MapCursor> SourceFileProvider::createRootCursor() const { + return new Cursor(rootMap_); +} + +rtl::Reference<Entity> SourceFileProvider::findEntity(OUString const & name) + const +{ + std::map< OUString, rtl::Reference<Entity> > const * map = &rootMap_; + for (sal_Int32 i = 0;;) { + OUString id(name.getToken(0, '.', i)); + std::map< OUString, rtl::Reference<Entity> >::const_iterator j( + map->find(id)); + if (j == map->end()) { + return rtl::Reference<Entity>(); + } + if (i == -1) { + return j->second; + } + if (j->second->getSort() != Entity::SORT_MODULE) { + return rtl::Reference<Entity>(); + } + Module * mod = dynamic_cast< Module * >(j->second.get()); + assert(mod != 0); + map = &mod->map; + } +} + +SourceFileProvider::~SourceFileProvider() throw () {} + +} } + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unoidl/source/sourcefileprovider.hxx b/unoidl/source/sourcefileprovider.hxx new file mode 100644 index 0000000..672f0d6 --- /dev/null +++ b/unoidl/source/sourcefileprovider.hxx @@ -0,0 +1,44 @@ +/* -*- 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/. + */ + +#ifndef INCLUDED_UNOIDL_SOURCEFILEPROVIDER_HXX +#define INCLUDED_UNOIDL_SOURCEFILEPROVIDER_HXX + +#include "sal/config.h" + +#include <map> + +#include "rtl/ref.hxx" +#include "unoidl/unoidl.hxx" + +namespace unoidl { namespace detail { + +class SourceFileProvider: public Provider { +public: + // throws FileFormatException, NoSuchFileException: + SourceFileProvider( + rtl::Reference<Manager> const & manager, OUString const & uri); + + // throws FileFormatException: + virtual rtl::Reference<MapCursor> createRootCursor() const; + + // throws FileFormatException: + virtual rtl::Reference<Entity> findEntity(OUString const & name) const; + +private: + virtual ~SourceFileProvider() throw (); + + std::map< OUString, rtl::Reference<Entity> > rootMap_; +}; + +} } + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unoidl/source/unoidl.cxx b/unoidl/source/unoidl.cxx index 19b8a9c..7c3e2e5 100644 --- a/unoidl/source/unoidl.cxx +++ b/unoidl/source/unoidl.cxx @@ -20,6 +20,7 @@ #include "unoidl/unoidl.hxx" #include "legacyprovider.hxx" +#include "sourcefileprovider.hxx" #include "sourcetreeprovider.hxx" #include "unoidlprovider.hxx" @@ -117,6 +118,9 @@ rtl::Reference< Provider > loadProvider( return new detail::SourceTreeProvider(manager, uri); } } + if (uri.endsWith(".idl")) { + return new detail::SourceFileProvider(manager, uri); + } try { return new detail::UnoidlProvider(uri); } catch (FileFormatException & e) { commit 6292bba6debaeb5c1bbbabfb77606296c894ec28 Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Sep 16 22:30:31 2013 +0200 Rename SourceProvider -> SourceTreeProvider Change-Id: Ic864f9c6f3dbbe9f75bdae76818c00f62825182d diff --git a/unoidl/Library_unoidl.mk b/unoidl/Library_unoidl.mk index 5cffa49..411e0a9 100644 --- a/unoidl/Library_unoidl.mk +++ b/unoidl/Library_unoidl.mk @@ -13,7 +13,7 @@ $(eval $(call gb_Library_add_defs,unoidl,-DLO_DLLIMPLEMENTATION_UNOIDL)) $(eval $(call gb_Library_add_exception_objects,unoidl, \ unoidl/source/legacyprovider \ - unoidl/source/sourceprovider \ + unoidl/source/sourcetreeprovider \ unoidl/source/unoidl \ unoidl/source/unoidlprovider \ )) diff --git a/unoidl/source/sourceprovider.cxx b/unoidl/source/sourcetreeprovider.cxx similarity index 93% rename from unoidl/source/sourceprovider.cxx rename to unoidl/source/sourcetreeprovider.cxx index 64428eb..d389f0c 100755 --- a/unoidl/source/sourceprovider.cxx +++ b/unoidl/source/sourcetreeprovider.cxx @@ -23,7 +23,7 @@ #include "sourceprovider-parser-requires.hxx" #include "sourceprovider-parser.hxx" #include "sourceprovider-scanner.hxx" -#include "sourceprovider.hxx" +#include "sourcetreeprovider.hxx" namespace unoidl { namespace detail { @@ -56,16 +56,18 @@ private: } -SourceProvider::SourceProvider( +SourceTreeProvider::SourceTreeProvider( rtl::Reference<Manager> const & manager, OUString const & uri): manager_(manager), uri_(uri.endsWith("/") ? uri : uri + "/") {} -rtl::Reference<MapCursor> SourceProvider::createRootCursor() const { +rtl::Reference<MapCursor> SourceTreeProvider::createRootCursor() const { return new Cursor; } -rtl::Reference<Entity> SourceProvider::findEntity(OUString const & name) const { +rtl::Reference<Entity> SourceTreeProvider::findEntity(OUString const & name) + const +{ std::map< OUString, rtl::Reference<Entity> >::iterator ci( cache_.find(name)); if (ci != cache_.end()) { @@ -143,7 +145,7 @@ rtl::Reference<Entity> SourceProvider::findEntity(OUString const & name) const { return ent; } -SourceProvider::~SourceProvider() throw () {} +SourceTreeProvider::~SourceTreeProvider() throw () {} } } diff --git a/unoidl/source/sourceprovider.hxx b/unoidl/source/sourcetreeprovider.hxx similarity index 83% rename from unoidl/source/sourceprovider.hxx rename to unoidl/source/sourcetreeprovider.hxx index e7ee92f..1bacad8 100644 --- a/unoidl/source/sourceprovider.hxx +++ b/unoidl/source/sourcetreeprovider.hxx @@ -7,8 +7,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef INCLUDED_UNOIDL_SOURCEPROVIDER_HXX -#define INCLUDED_UNOIDL_SOURCEPROVIDER_HXX +#ifndef INCLUDED_UNOIDL_SOURCETREEPROVIDER_HXX +#define INCLUDED_UNOIDL_SOURCETREEPROVIDER_HXX #include "sal/config.h" @@ -19,10 +19,10 @@ namespace unoidl { namespace detail { -class SourceProvider: public Provider { +class SourceTreeProvider: public Provider { public: // throws FileFormatException, NoSuchFileException: - SourceProvider( + SourceTreeProvider( rtl::Reference<Manager> const & manager, OUString const & uri); // throws FileFormatException: @@ -32,7 +32,7 @@ public: virtual rtl::Reference<Entity> findEntity(OUString const & name) const; private: - virtual ~SourceProvider() throw (); + virtual ~SourceTreeProvider() throw (); rtl::Reference<Manager> manager_; OUString uri_; diff --git a/unoidl/source/unoidl.cxx b/unoidl/source/unoidl.cxx index e5c3c43..19b8a9c 100644 --- a/unoidl/source/unoidl.cxx +++ b/unoidl/source/unoidl.cxx @@ -20,7 +20,7 @@ #include "unoidl/unoidl.hxx" #include "legacyprovider.hxx" -#include "sourceprovider.hxx" +#include "sourcetreeprovider.hxx" #include "unoidlprovider.hxx" namespace unoidl { @@ -114,7 +114,7 @@ rtl::Reference< Provider > loadProvider( if (item.getFileStatus(status) == osl::FileBase::E_None && status.getFileType() == osl::FileStatus::Directory) { - return new detail::SourceProvider(manager, uri); + return new detail::SourceTreeProvider(manager, uri); } } try { commit d11592ad8e21970e80f6a87a9ae43d380f1c3eef Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Sep 16 22:25:30 2013 +0200 Move full file parsing logic to sourceprovider-parser.y ...in preparation of SourceFile- vs. -TreeProvider. Change-Id: I4c8f37ade1ba26cb7b38f63211711613d1b98a73 diff --git a/unoidl/source/sourceprovider-parser-requires.hxx b/unoidl/source/sourceprovider-parser-requires.hxx index 0c52b3d..fc84c5d 100644 --- a/unoidl/source/sourceprovider-parser-requires.hxx +++ b/unoidl/source/sourceprovider-parser-requires.hxx @@ -23,8 +23,6 @@ typedef void * yyscan_t; -int yyparse(yyscan_t yyscanner); - namespace unoidl { namespace detail { struct SourceProviderEntity; diff --git a/unoidl/source/sourceprovider-parser.y b/unoidl/source/sourceprovider-parser.y index cc18854..92deb23 100644 --- a/unoidl/source/sourceprovider-parser.y +++ b/unoidl/source/sourceprovider-parser.y @@ -19,10 +19,13 @@ #include <algorithm> #include <cassert> +#include <cerrno> #include <cstddef> #include <cstdlib> #include <limits> +#include <new> #include <utility> +#include <vector> #include <sourceprovider-parser-requires.hxx> @@ -50,6 +53,9 @@ %{ +#include "osl/file.h" +#include "osl/thread.h" + #include "sourceprovider-scanner.hxx" #define YYLLOC_DEFAULT(Current, Rhs, N) \ @@ -3657,6 +3663,87 @@ OUString SourceProviderType::getName() const { } } +bool parse(OUString const & uri, SourceProviderScannerData * data) { + assert(data != 0); + oslFileHandle handle; + oslFileError e = osl_openFile(uri.pData, &handle, osl_File_OpenFlag_Read); + switch (e) { + case osl_File_E_None: + break; + case osl_File_E_NOENT: + return false; + default: + throw FileFormatException(uri, "cannot open: " + OUString::number(e)); + } + sal_uInt64 size; + e = osl_getFileSize(handle, &size); + if (e != osl_File_E_None) { + oslFileError e2 = osl_closeFile(handle); + SAL_WARN_IF( + e2 != osl_File_E_None, "unoidl", + "cannot close " << uri << ": " << +e2); + throw FileFormatException( + uri, "cannot get size: " + OUString::number(e)); + } + void * address; + e = osl_mapFile(handle, &address, size, 0, osl_File_MapFlag_RandomAccess); + if (e != osl_File_E_None) { + oslFileError e2 = osl_closeFile(handle); + SAL_WARN_IF( + e2 != osl_File_E_None, "unoidl", + "cannot close " << uri << ": " << +e2); + throw FileFormatException(uri, "cannot mmap: " + OUString::number(e)); + } + try { + data->setSource(address, size); + yyscan_t yyscanner; + if (yylex_init_extra(data, &yyscanner) != 0) { + // Checking errno for the specific EINVAL, ENOMEM documented for + // yylex_init_extra would not work as those values are not defined + // by the C++ Standard: + int e = errno; + throw FileFormatException( + uri, + "yylex_init_extra failed with errno " + OUString::number(e)); + } + int e2 = yyparse(yyscanner); + yylex_destroy(yyscanner); + switch (e2) { + case 0: + break; + default: + assert(false); + // fall through + case 1: + throw FileFormatException( + uri, + ("cannot parse" + + (data->errorLine == 0 + ? OUString() : " line " + OUString::number(data->errorLine)) + + (data->parserError.isEmpty() + ? OUString() + : (", " + + OStringToOUString( + data->parserError, osl_getThreadTextEncoding()))) + + (data->errorMessage.isEmpty() + ? OUString() : ": \"" + data->errorMessage + "\""))); + case 2: + throw std::bad_alloc(); + } + } catch (...) { + e = osl_unmapMappedFile(handle, address, size); + SAL_WARN_IF(e != osl_File_E_None, "unoidl", "cannot unmap: " << +e); + e = osl_closeFile(handle); + SAL_WARN_IF(e != osl_File_E_None, "unoidl", "cannot close: " << +e); + throw; + } + e = osl_unmapMappedFile(handle, address, size); + SAL_WARN_IF(e != osl_File_E_None, "unoidl", "cannot unmap: " << +e); + e = osl_closeFile(handle); + SAL_WARN_IF(e != osl_File_E_None, "unoidl", "cannot close: " << +e); + return true; +} + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unoidl/source/sourceprovider-scanner.hxx b/unoidl/source/sourceprovider-scanner.hxx index 5190058..8a79d31 100644 --- a/unoidl/source/sourceprovider-scanner.hxx +++ b/unoidl/source/sourceprovider-scanner.hxx @@ -213,17 +213,19 @@ struct SourceProviderEntity { struct SourceProviderScannerData { SourceProviderScannerData( - rtl::Reference<unoidl::Manager> const & theManager, - void const * sourceAddress, sal_uInt64 sourceSize): - manager(theManager), - sourcePosition(static_cast<char const *>(sourceAddress)), - sourceEnd(sourcePosition + sourceSize), errorLine(0) + rtl::Reference<unoidl::Manager> const & theManager): + manager(theManager), errorLine(0) { assert(manager.is()); } + void setSource(void const * address, sal_uInt64 size) { + sourcePosition = static_cast<char const *>(address); + sourceEnd = sourcePosition + size; + } + rtl::Reference<unoidl::Manager> manager; char const * sourcePosition; - char const * const sourceEnd; + char const * sourceEnd; YYLTYPE errorLine; OString parserError; OUString errorMessage; @@ -233,6 +235,8 @@ struct SourceProviderScannerData { OUString currentName; }; +bool parse(OUString const & uri, SourceProviderScannerData * data); + } } int yylex_init_extra( diff --git a/unoidl/source/sourceprovider.cxx b/unoidl/source/sourceprovider.cxx index 429f68f..64428eb 100755 --- a/unoidl/source/sourceprovider.cxx +++ b/unoidl/source/sourceprovider.cxx @@ -9,13 +9,11 @@ #include "sal/config.h" -#include <cerrno> #include <map> -#include <new> +#include <vector> #include "osl/file.h" #include "osl/file.hxx" -#include "osl/thread.h" #include "rtl/character.hxx" #include "rtl/ref.hxx" #include "rtl/ustrbuf.hxx" @@ -31,51 +29,6 @@ namespace unoidl { namespace detail { namespace { -rtl::Reference<Entity> parse( - rtl::Reference<Manager> const & manager, OUString const & name, - OUString const & uri, void const * address, sal_uInt64 size) -{ - SourceProviderScannerData data(manager, address, size); - yyscan_t yyscanner; - if (yylex_init_extra(&data, &yyscanner) != 0) { - // Checking errno for the specific EINVAL, ENOMEM documented for - // yylex_init_extra would not work as those values are not defined by - // the C++ Standard: - int e = errno; - throw FileFormatException( - uri, "yylex_init_extra failed with errno " + OUString::number(e)); - } - int e = yyparse(yyscanner); - yylex_destroy(yyscanner); - switch (e) { - case 0: - { - std::map<OUString, SourceProviderEntity>::const_iterator i( - data.entities.find(name)); - return i == data.entities.end() - ? rtl::Reference<Entity>() : i->second.entity; - } - default: - assert(false); - // fall through - case 1: - throw FileFormatException( - uri, - ("cannot parse" - + (data.errorLine == 0 - ? OUString() : " line " + OUString::number(data.errorLine)) - + (data.parserError.isEmpty() - ? OUString() - : (", " - + OStringToOUString( - data.parserError, osl_getThreadTextEncoding()))) - + (data.errorMessage.isEmpty() - ? OUString() : ": \"" + data.errorMessage + "\""))); - case 2: - throw std::bad_alloc(); - } -} - class Cursor: public MapCursor { public: Cursor() {} @@ -173,55 +126,17 @@ rtl::Reference<Entity> SourceProvider::findEntity(OUString const & name) const { ent = new SourceModuleEntity; } else { uri += ".idl"; - oslFileHandle handle; - oslFileError e = osl_openFile( - uri.pData, &handle, osl_File_OpenFlag_Read); - switch (e) { - case osl_File_E_None: - break; - case osl_File_E_NOENT: - cache_.insert( - std::map< OUString, rtl::Reference<Entity> >::value_type( - name, rtl::Reference<Entity>())); - return rtl::Reference<Entity>(); - default: - throw FileFormatException( - uri, "cannot open: " + OUString::number(e)); - } - sal_uInt64 size; - e = osl_getFileSize(handle, &size); - if (e != osl_File_E_None) { - oslFileError e2 = osl_closeFile(handle); - SAL_WARN_IF( - e2 != osl_File_E_None, "unoidl", - "cannot close " << uri << ": " << +e2); - throw FileFormatException( - uri, "cannot get size: " + OUString::number(e)); - } - void * address; - e = osl_mapFile( - handle, &address, size, 0, osl_File_MapFlag_RandomAccess); - if (e != osl_File_E_None) { - oslFileError e2 = osl_closeFile(handle); + SourceProviderScannerData data(manager_); + if (parse(uri, &data)) { + std::map<OUString, SourceProviderEntity>::const_iterator i( + data.entities.find(name)); + if (i != data.entities.end()) { + ent = i->second.entity; + } SAL_WARN_IF( - e2 != osl_File_E_None, "unoidl", - "cannot close " << uri << ": " << +e2); - throw FileFormatException( - uri, "cannot mmap: " + OUString::number(e)); - } - try { - ent = parse(manager_, name, uri, address, size); - } catch (...) { - e = osl_unmapMappedFile(handle, address, size); - SAL_WARN_IF(e != osl_File_E_None, "unoidl", "cannot unmap: " << +e); - e = osl_closeFile(handle); - SAL_WARN_IF(e != osl_File_E_None, "unoidl", "cannot close: " << +e); - throw; + !ent.is(), "unoidl", + "<" << uri << "> does not define entity " << name); } - e = osl_unmapMappedFile(handle, address, size); - SAL_WARN_IF(e != osl_File_E_None, "unoidl", "cannot unmap: " << +e); - e = osl_closeFile(handle); - SAL_WARN_IF(e != osl_File_E_None, "unoidl", "cannot close: " << +e); } cache_.insert( std::map< OUString, rtl::Reference<Entity> >::value_type(name, ent)); commit 65a1f81a70e4268801a09106df54fcb2497c6d7d Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Sep 16 21:53:14 2013 +0200 Detect reuse of module names for other entities Change-Id: Ifc8d95b4b15a7dd91195e6f727fdb7fa2a267be9 diff --git a/unoidl/source/sourceprovider-parser.y b/unoidl/source/sourceprovider-parser.y index 7d5f108..cc18854 100644 --- a/unoidl/source/sourceprovider-parser.y +++ b/unoidl/source/sourceprovider-parser.y @@ -460,6 +460,8 @@ Found findEntity( case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: argT = unoidl::detail::SourceProviderType::TYPE_INTERFACE; break; + case unoidl::detail::SourceProviderEntity::KIND_MODULE: + assert(false); // this cannot happen } argType = unoidl::detail::SourceProviderType( @@ -546,6 +548,11 @@ Found findEntity( e->entity = ent; } break; + case unoidl::detail::SourceProviderEntity::KIND_MODULE: + error( + location, yyscanner, + *name + " is based on module entity " + n); + return FOUND_ERROR; } } if (!typeNucleus.isEmpty() || rank != 0 || !args.empty()) { @@ -696,6 +703,8 @@ Found findEntity( unoidl::detail::SourceProviderType::TYPE_INTERFACE, n, e); break; + case unoidl::detail::SourceProviderEntity::KIND_MODULE: + assert(false); // this cannot happen } } } else { @@ -757,6 +766,8 @@ Found findEntity( + n + " that is not a polymorphic struct type template")); return FOUND_ERROR; + case unoidl::detail::SourceProviderEntity::KIND_MODULE: + assert(false); // this cannot happen } } if (typedefedType != 0) { @@ -904,7 +915,21 @@ moduleDecl: TOK_MODULE identifier { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); - data->modules.push_back(convertToFullName(data, $2)); + OUString name(convertToFullName(data, $2)); + data->modules.push_back(name); + std::pair<std::map<OUString, unoidl::detail::SourceProviderEntity>::iterator, bool> p( + data->entities.insert( + std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( + name, + unoidl::detail::SourceProviderEntity( + unoidl::detail::SourceProviderEntity::KIND_MODULE)))); + if (!p.second + && (p.first->second.kind + != unoidl::detail::SourceProviderEntity::KIND_MODULE)) + { + error(@2, yyscanner, "multiple entities named " + name); + YYERROR; + } } '{' definitions '}' ';' { yyget_extra(yyscanner)->modules.pop_back(); } ; @@ -2671,7 +2696,9 @@ interfaceDecl: std::pair<std::map<OUString, unoidl::detail::SourceProviderEntity>::iterator, bool> p( data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( - name, unoidl::detail::SourceProviderEntity()))); + name, + unoidl::detail::SourceProviderEntity( + unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL)))); if (!p.second && (p.first->second.kind != unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL)) @@ -3468,6 +3495,8 @@ type: ent); ok = true; break; + case unoidl::detail::SourceProviderEntity::KIND_MODULE: + assert(false); // this cannot happen } if (!ok) { error(@1, yyscanner, "non-type entity " + name); @@ -3533,6 +3562,8 @@ type: break; case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: break; + case unoidl::detail::SourceProviderEntity::KIND_MODULE: + assert(false); // this cannot happen } if (!ok) { error(@1, yyscanner, "non-type entity " + name); diff --git a/unoidl/source/sourceprovider-scanner.hxx b/unoidl/source/sourceprovider-scanner.hxx index 152b9cf..5190058 100644 --- a/unoidl/source/sourceprovider-scanner.hxx +++ b/unoidl/source/sourceprovider-scanner.hxx @@ -189,19 +189,22 @@ private: }; struct SourceProviderEntity { - enum Kind { KIND_EXTERNAL, KIND_LOCAL, KIND_INTERFACE_DECL }; + enum Kind { KIND_EXTERNAL, KIND_LOCAL, KIND_INTERFACE_DECL, KIND_MODULE }; explicit SourceProviderEntity( Kind theKind, rtl::Reference<unoidl::Entity> const & externalEntity): kind(theKind), entity(externalEntity) - { assert(theKind != KIND_INTERFACE_DECL); assert(externalEntity.is()); } + { assert(theKind <= KIND_LOCAL); assert(externalEntity.is()); } explicit SourceProviderEntity( rtl::Reference<SourceProviderEntityPad> const & localPad): kind(KIND_LOCAL), pad(localPad) { assert(localPad.is()); } - SourceProviderEntity(): kind(KIND_INTERFACE_DECL) {} + explicit SourceProviderEntity(Kind theKind): kind(theKind) + { assert(theKind >= KIND_INTERFACE_DECL); } + + SourceProviderEntity() {} // needed for std::map::operator [] Kind kind; rtl::Reference<unoidl::Entity> entity; commit 04a002491b149bee6ba972e8288f867c791db19e Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Sep 16 21:51:59 2013 +0200 Fail for unkonwn entities Change-Id: I13d668e92ea762e9888f8c1c4615eccad6a1ff1b diff --git a/codemaker/source/codemaker/typemanager.cxx b/codemaker/source/codemaker/typemanager.cxx index ff0e6f9..7779704 100644 --- a/codemaker/source/codemaker/typemanager.cxx +++ b/codemaker/source/codemaker/typemanager.cxx @@ -54,6 +54,9 @@ bool TypeManager::foundAtPrimaryProvider(OUString const & name) const { return true; } } + if (!manager_->findEntity(name).is()) { + throw CannotDumpException("Unknown entity '" + name + "'"); + } return false; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits