summaryrefslogtreecommitdiff
path: root/unoidl/source/sourceprovider-scanner.hxx
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2013-09-12 17:39:48 +0200
committerStephan Bergmann <sbergman@redhat.com>2013-09-12 17:45:12 +0200
commit5c2ba4aad61ce2c7c661202ae7ed26e1859c5216 (patch)
tree64ebbb4af3ab754e50da045a9f17b1207c9003c6 /unoidl/source/sourceprovider-scanner.hxx
parent3ea6e49f581ef9d28cc2c3374426b5fac8627802 (diff)
WIP: additional unoidl::Provider that directly reads from .idl files
Change-Id: I30fa6400724f4ca6f0e1986c741500f05710b840
Diffstat (limited to 'unoidl/source/sourceprovider-scanner.hxx')
-rw-r--r--unoidl/source/sourceprovider-scanner.hxx247
1 files changed, 247 insertions, 0 deletions
diff --git a/unoidl/source/sourceprovider-scanner.hxx b/unoidl/source/sourceprovider-scanner.hxx
new file mode 100644
index 000000000000..450936152b98
--- /dev/null
+++ b/unoidl/source/sourceprovider-scanner.hxx
@@ -0,0 +1,247 @@
+/* -*- 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_SOURCE_SOURCEPROVIDER_SCANNER_HXX
+#define INCLUDED_UNOIDL_SOURCE_SOURCEPROVIDER_SCANNER_HXX
+
+#include "sal/config.h"
+
+#include <cassert>
+#include <map>
+#include <vector>
+
+#include "rtl/ref.hxx"
+#include "rtl/ustring.hxx"
+#include "sal/types.h"
+#include "salhelper/simplereferenceobject.hxx"
+#include "unoidl/unoidl.hxx"
+
+#include "sourceprovider-parser-requires.hxx"
+#include "sourceprovider-parser.hxx"
+
+namespace unoidl { namespace detail {
+
+class SourceProviderEntityPad: public salhelper::SimpleReferenceObject {
+public:
+ bool isPublished() const { return published_; }
+
+protected:
+ explicit SourceProviderEntityPad(bool published): published_(published) {}
+
+ virtual ~SourceProviderEntityPad() {}
+
+private:
+ bool const published_;
+};
+
+class SourceProviderEnumTypeEntityPad: public SourceProviderEntityPad {
+public:
+ explicit SourceProviderEnumTypeEntityPad(bool published):
+ SourceProviderEntityPad(published)
+ {}
+
+ std::vector<unoidl::EnumTypeEntity::Member> members;
+
+private:
+ virtual ~SourceProviderEnumTypeEntityPad() throw () {}
+};
+
+class SourceProviderPlainStructTypeEntityPad: public SourceProviderEntityPad {
+public:
+ SourceProviderPlainStructTypeEntityPad(
+ bool published, OUString theBaseName,
+ rtl::Reference<unoidl::PlainStructTypeEntity> const & theBaseEntity):
+ SourceProviderEntityPad(published), baseName(theBaseName),
+ baseEntity(theBaseEntity)
+ { assert(theBaseName.isEmpty() != theBaseEntity.is()); }
+
+ OUString const baseName;
+ rtl::Reference<unoidl::PlainStructTypeEntity> const baseEntity;
+ std::vector<unoidl::PlainStructTypeEntity::Member> members;
+
+private:
+ virtual ~SourceProviderPlainStructTypeEntityPad() throw () {}
+};
+
+class SourceProviderPolymorphicStructTypeTemplateEntityPad:
+ public SourceProviderEntityPad
+{
+public:
+ SourceProviderPolymorphicStructTypeTemplateEntityPad(bool published):
+ SourceProviderEntityPad(published)
+ {}
+
+ std::vector<OUString> typeParameters;
+ std::vector<unoidl::PolymorphicStructTypeTemplateEntity::Member> members;
+
+private:
+ virtual ~SourceProviderPolymorphicStructTypeTemplateEntityPad() throw () {}
+};
+
+class SourceProviderExceptionTypeEntityPad: public SourceProviderEntityPad {
+public:
+ SourceProviderExceptionTypeEntityPad(
+ bool published, OUString theBaseName,
+ rtl::Reference<unoidl::ExceptionTypeEntity> const & theBaseEntity):
+ SourceProviderEntityPad(published), baseName(theBaseName),
+ baseEntity(theBaseEntity)
+ { assert(theBaseName.isEmpty() != theBaseEntity.is()); }
+
+ OUString const baseName;
+ rtl::Reference<unoidl::ExceptionTypeEntity> const baseEntity;
+ std::vector<unoidl::ExceptionTypeEntity::Member> members;
+
+private:
+ virtual ~SourceProviderExceptionTypeEntityPad() throw () {}
+};
+
+class SourceProviderInterfaceTypeEntityPad: public SourceProviderEntityPad {
+public:
+ struct Base {
+ Base(
+ OUString const & theName,
+ rtl::Reference<unoidl::InterfaceTypeEntity> const & theEntity,
+ std::vector<OUString> const & theAnnotations):
+ name(theName), entity(theEntity), annotations(theAnnotations)
+ {}
+
+ OUString name;
+ rtl::Reference<unoidl::InterfaceTypeEntity> entity;
+ std::vector<OUString> annotations;
+ };
+
+ SourceProviderInterfaceTypeEntityPad(
+ bool published, OUString singleBaseName,
+ rtl::Reference<unoidl::InterfaceTypeEntity> const & singleBaseEntity):
+ SourceProviderEntityPad(published),
+ singleBase(!singleBaseName.isEmpty())
+ {
+ assert(singleBaseName.isEmpty() != singleBaseEntity.is());
+ if (singleBase) {
+ mandatoryBases.push_back(
+ Base(
+ singleBaseName, singleBaseEntity, std::vector<OUString>()));
+ }
+ }
+
+ bool singleBase;
+ std::vector<Base> mandatoryBases;
+ std::vector<Base> optionalBases;
+ std::vector<unoidl::InterfaceTypeEntity::Attribute> attributes;
+ std::vector<unoidl::InterfaceTypeEntity::Method> methods;
+
+private:
+ virtual ~SourceProviderInterfaceTypeEntityPad() throw () {}
+};
+
+class SourceProviderConstantGroupEntityPad: public SourceProviderEntityPad {
+public:
+ explicit SourceProviderConstantGroupEntityPad(bool published):
+ SourceProviderEntityPad(published)
+ {}
+
+ std::vector<unoidl::ConstantGroupEntity::Member> members;
+
+private:
+ virtual ~SourceProviderConstantGroupEntityPad() throw () {}
+};
+
+class SourceProviderSingleInterfaceBasedServiceEntityPad:
+ public SourceProviderEntityPad
+{
+public:
+ explicit SourceProviderSingleInterfaceBasedServiceEntityPad(
+ bool published, OUString const & theBase):
+ SourceProviderEntityPad(published), base(theBase)
+ {}
+
+ OUString const base;
+ std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor>
+ constructors;
+
+private:
+ virtual ~SourceProviderSingleInterfaceBasedServiceEntityPad() throw () {}
+};
+
+class SourceProviderAccumulationBasedServiceEntityPad:
+ public SourceProviderEntityPad
+{
+public:
+ explicit SourceProviderAccumulationBasedServiceEntityPad(bool published):
+ SourceProviderEntityPad(published)
+ {}
+
+ std::vector<unoidl::AnnotatedReference> directMandatoryBaseServices;
+ std::vector<unoidl::AnnotatedReference> directOptionalBaseServices;
+ std::vector<unoidl::AnnotatedReference> directMandatoryBaseInterfaces;
+ std::vector<unoidl::AnnotatedReference> directOptionalBaseInterfaces;
+ std::vector<unoidl::AccumulationBasedServiceEntity::Property>
+ directProperties;
+
+private:
+ virtual ~SourceProviderAccumulationBasedServiceEntityPad() throw () {}
+};
+
+struct SourceProviderEntity {
+ enum Kind { KIND_EXTERNAL, KIND_LOCAL, KIND_INTERFACE_DECL };
+
+ explicit SourceProviderEntity(
+ Kind theKind, rtl::Reference<unoidl::Entity> const & externalEntity):
+ kind(theKind), entity(externalEntity)
+ { assert(theKind != KIND_INTERFACE_DECL); assert(externalEntity.is()); }
+
+ explicit SourceProviderEntity(
+ rtl::Reference<SourceProviderEntityPad> const & localPad):
+ kind(KIND_LOCAL), pad(localPad)
+ { assert(localPad.is()); }
+
+ SourceProviderEntity(): kind(KIND_INTERFACE_DECL) {}
+
+ Kind kind;
+ rtl::Reference<unoidl::Entity> entity;
+ rtl::Reference<SourceProviderEntityPad> pad;
+};
+
+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)
+ { assert(manager.is()); }
+
+ rtl::Reference<unoidl::Manager> manager;
+
+ char const * sourcePosition;
+ char const * const sourceEnd;
+ YYLTYPE errorLine;
+ OString parserError;
+ OUString errorMessage;
+
+ std::map<OUString, SourceProviderEntity> entities;
+ std::vector<OUString> modules;
+ OUString currentName;
+};
+
+} }
+
+int yylex_init_extra(
+ unoidl::detail::SourceProviderScannerData * user_defined,
+ yyscan_t * yyscanner);
+
+int yylex_destroy(yyscan_t yyscanner);
+
+int yylex(YYSTYPE * yylval_param, YYLTYPE * yylloc_param, yyscan_t yyscanner);
+
+unoidl::detail::SourceProviderScannerData * yyget_extra(yyscan_t yyscanner);
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */