LibreOffice Module unoidl (master) 1
sourceprovider-scanner.hxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
9
10#pragma once
11
12#include <sal/config.h>
13
14#include <cassert>
15#include <map>
16#include <set>
17#include <utility>
18#include <vector>
19
20#include <rtl/ref.hxx>
21#include <rtl/ustring.hxx>
22#include <sal/types.h>
24#include <unoidl/unoidl.hxx>
25
27#include <sourceprovider-parser.hxx>
28
29namespace unoidl::detail {
30
31struct SourceProviderScannerData;
32
34public:
35 bool isPublished() const { return published_; }
36
37protected:
38 explicit SourceProviderEntityPad(bool published): published_(published) {}
39
40 virtual ~SourceProviderEntityPad() override {}
41
42private:
43 bool const published_;
44};
45
47public:
48 explicit SourceProviderEnumTypeEntityPad(bool published):
50 {}
51
52 std::vector<unoidl::EnumTypeEntity::Member> members;
53
54private:
55 virtual ~SourceProviderEnumTypeEntityPad() noexcept override {}
56};
57
59public:
61 bool published, const OUString & theBaseName,
63 SourceProviderEntityPad(published), baseName(theBaseName),
64 baseEntity(theBaseEntity)
65 { assert(theBaseName.isEmpty() != theBaseEntity.is()); }
66
67 OUString const baseName;
69 std::vector<unoidl::PlainStructTypeEntity::Member> members;
70
71private:
72 virtual ~SourceProviderPlainStructTypeEntityPad() noexcept override {}
73};
74
77{
78public:
80 : SourceProviderEntityPad(published)
81 {}
82
83 std::vector<OUString> typeParameters;
84 std::vector<unoidl::PolymorphicStructTypeTemplateEntity::Member> members;
85
86private:
88};
89
91public:
93 bool published, const OUString & theBaseName,
95 SourceProviderEntityPad(published), baseName(theBaseName),
96 baseEntity(theBaseEntity)
97 { assert(theBaseName.isEmpty() != theBaseEntity.is()); }
98
99 OUString const baseName;
101 std::vector<unoidl::ExceptionTypeEntity::Member> members;
102
103private:
104 virtual ~SourceProviderExceptionTypeEntityPad() noexcept override {}
105};
106
108public:
109 struct DirectBase {
111 OUString theName,
113 std::vector<OUString>&& theAnnotations):
114 name(std::move(theName)), entity(theEntity), annotations(std::move(theAnnotations))
115 { assert(theEntity.is()); }
116
117 OUString name;
119 std::vector<OUString> annotations;
120 };
121
122 enum BaseKind {
125 };
126
127 struct Member {
128 OUString mandatory;
129 std::set<OUString> optional;
130
131 explicit Member(OUString theMandatory): mandatory(std::move(theMandatory)) {}
132 };
133
134 SourceProviderInterfaceTypeEntityPad(bool published, bool theSingleBase):
135 SourceProviderEntityPad(published), singleBase(theSingleBase)
136 {}
137
139 YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData * data,
140 DirectBase const & base, bool optional);
141
143 YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData * data,
144 OUString const & name);
145
147 std::vector<DirectBase> directMandatoryBases;
148 std::vector<DirectBase> directOptionalBases;
149 std::vector<unoidl::InterfaceTypeEntity::Attribute> directAttributes;
150 std::vector<unoidl::InterfaceTypeEntity::Method> directMethods;
151 std::map<OUString, BaseKind> allBases;
152 std::map<OUString, Member> allMembers;
153
154private:
155 virtual ~SourceProviderInterfaceTypeEntityPad() noexcept override {}
156
158 YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData * data,
159 OUString const & name,
161 bool direct, bool optional, bool outerOptional,
162 std::set<OUString> * seen) const;
163
165 YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData * data,
166 std::u16string_view interfaceName, OUString const & memberName,
167 bool checkOptional) const;
168
170 YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData * data,
171 OUString const & directBaseName, OUString const & name,
172 rtl::Reference<unoidl::InterfaceTypeEntity> const & entity, bool direct,
173 bool optional);
174
176 YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData * data,
177 OUString const & name,
179};
180
182public:
183 explicit SourceProviderConstantGroupEntityPad(bool published):
184 SourceProviderEntityPad(published)
185 {}
186
187 std::vector<unoidl::ConstantGroupEntity::Member> members;
188
189private:
190 virtual ~SourceProviderConstantGroupEntityPad() noexcept override {}
191};
192
195{
196public:
197 struct Constructor {
198 struct Parameter {
200 OUString theName,
201 SourceProviderType theType, bool theRest):
202 name(std::move(theName)), type(std::move(theType)), rest(theRest)
203 {}
204
205 OUString name;
206
208
209 bool rest;
210 };
211
213 OUString theName,
214 std::vector< OUString >&& theAnnotations):
215 name(std::move(theName)), annotations(std::move(theAnnotations))
216 {}
217
218 OUString name;
219
220 std::vector< Parameter > parameters;
221
222 std::vector< OUString > exceptions;
223
224 std::vector< OUString > annotations;
225 };
226
228 bool published, OUString theBase):
229 SourceProviderEntityPad(published), base(std::move(theBase))
230 {}
231
232 OUString const base;
233 std::vector<Constructor> constructors;
234
235private:
237};
238
241{
242public:
244 SourceProviderEntityPad(published)
245 {}
246
247 std::vector<unoidl::AnnotatedReference> directMandatoryBaseServices;
248 std::vector<unoidl::AnnotatedReference> directOptionalBaseServices;
249 std::vector<unoidl::AnnotatedReference> directMandatoryBaseInterfaces;
250 std::vector<unoidl::AnnotatedReference> directOptionalBaseInterfaces;
251 std::vector<unoidl::AccumulationBasedServiceEntity::Property>
253
254private:
256};
257
259 enum Kind {
262 };
263
265 Kind theKind, rtl::Reference<unoidl::Entity> const & externalEntity):
266 kind(theKind), entity(externalEntity)
267 { assert(theKind <= KIND_LOCAL); assert(externalEntity.is()); }
268
271 kind(KIND_LOCAL), pad(localPad)
272 { assert(localPad.is()); }
273
274 explicit SourceProviderEntity(Kind theKind): kind(theKind)
275 { assert(theKind >= KIND_INTERFACE_DECL); }
276
277 SourceProviderEntity(): // needed for std::map::operator []
278 kind() // avoid false warnings about uninitialized members
279 {}
280
284};
285
289 manager(std::move(theManager)),
291 // avoid false warnings about uninitialized members
292 errorLine(0), publishedContext(false)
293 { assert(manager.is()); }
294
295 void setSource(void const * address, sal_uInt64 size) {
296 sourcePosition = static_cast<char const *>(address);
298 }
299
301
302 char const * sourcePosition;
303 char const * sourceEnd;
305 OString parserError;
306 OUString errorMessage;
307
308 std::map<OUString, SourceProviderEntity> entities;
309 std::vector<OUString> modules;
310 OUString currentName;
312};
313
314bool parse(OUString const & uri, SourceProviderScannerData * data);
315
316}
317
320 yyscan_t * yyscanner);
321
322int yylex_destroy(yyscan_t yyscanner);
323
324int yylex(YYSTYPE * yylval_param, YYLTYPE * yylloc_param, yyscan_t yyscanner);
325
327
328/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
std::vector< unoidl::AccumulationBasedServiceEntity::Property > directProperties
std::vector< unoidl::AnnotatedReference > directMandatoryBaseInterfaces
std::vector< unoidl::AnnotatedReference > directOptionalBaseInterfaces
std::vector< unoidl::ConstantGroupEntity::Member > members
std::vector< unoidl::EnumTypeEntity::Member > members
std::vector< unoidl::ExceptionTypeEntity::Member > members
rtl::Reference< unoidl::ExceptionTypeEntity > const baseEntity
SourceProviderExceptionTypeEntityPad(bool published, const OUString &theBaseName, rtl::Reference< unoidl::ExceptionTypeEntity > const &theBaseEntity)
std::vector< unoidl::InterfaceTypeEntity::Attribute > directAttributes
std::vector< unoidl::InterfaceTypeEntity::Method > directMethods
bool addOptionalBaseMembers(YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData *data, OUString const &name, rtl::Reference< unoidl::InterfaceTypeEntity > const &entity)
bool addBase(YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData *data, OUString const &directBaseName, OUString const &name, rtl::Reference< unoidl::InterfaceTypeEntity > const &entity, bool direct, bool optional)
bool addDirectMember(YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData *data, OUString const &name)
bool checkMemberClashes(YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData *data, std::u16string_view interfaceName, OUString const &memberName, bool checkOptional) const
SourceProviderInterfaceTypeEntityPad(bool published, bool theSingleBase)
bool addDirectBase(YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData *data, DirectBase const &base, bool optional)
bool checkBaseClashes(YYLTYPE location, yyscan_t yyscanner, SourceProviderScannerData *data, OUString const &name, rtl::Reference< unoidl::InterfaceTypeEntity > const &entity, bool direct, bool optional, bool outerOptional, std::set< OUString > *seen) const
rtl::Reference< unoidl::PlainStructTypeEntity > const baseEntity
SourceProviderPlainStructTypeEntityPad(bool published, const OUString &theBaseName, rtl::Reference< unoidl::PlainStructTypeEntity > const &theBaseEntity)
std::vector< unoidl::PlainStructTypeEntity::Member > members
std::vector< unoidl::PolymorphicStructTypeTemplateEntity::Member > members
size
bool parse(OUString const &uri, SourceProviderScannerData *data)
int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, yyscan_t yyscanner)
unoidl::detail::SourceProviderScannerData * yyget_extra(yyscan_t yyscanner)
int yylex_init_extra(unoidl::detail::SourceProviderScannerData *user_defined, yyscan_t *yyscanner)
int yylex_destroy(yyscan_t yyscanner)
rtl::Reference< unoidl::Entity > entity
SourceProviderEntity(rtl::Reference< SourceProviderEntityPad > const &localPad)
rtl::Reference< SourceProviderEntityPad > pad
SourceProviderEntity(Kind theKind, rtl::Reference< unoidl::Entity > const &externalEntity)
DirectBase(OUString theName, rtl::Reference< unoidl::InterfaceTypeEntity > const &theEntity, std::vector< OUString > &&theAnnotations)
std::map< OUString, SourceProviderEntity > entities
void setSource(void const *address, sal_uInt64 size)
SourceProviderScannerData(rtl::Reference< unoidl::Manager > theManager)
Constructor(OUString theName, std::vector< OUString > &&theAnnotations)