Line data Source code
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 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include "includes.hxx"
22 :
23 : #include "dependencies.hxx"
24 : #include "dumputils.hxx"
25 :
26 : #include "codemaker/global.hxx"
27 : #include "codemaker/typemanager.hxx"
28 : #include "codemaker/unotype.hxx"
29 :
30 : #include "osl/diagnose.h"
31 : #include "rtl/ref.hxx"
32 : #include "rtl/string.hxx"
33 : #include "rtl/ustring.hxx"
34 : #include "sal/types.h"
35 :
36 : #include <vector>
37 :
38 : using codemaker::cppumaker::Includes;
39 :
40 0 : Includes::Includes(
41 : rtl::Reference< TypeManager > const & manager,
42 : codemaker::cppumaker::Dependencies const & dependencies, bool hpp):
43 0 : m_manager(manager), m_map(dependencies.getMap()), m_hpp(hpp),
44 : m_includeCassert(false), m_includeException(false),
45 0 : m_includeAny(dependencies.hasAnyDependency()), m_includeReference(false),
46 0 : m_includeSequence(dependencies.hasSequenceDependency()),
47 0 : m_includeType(dependencies.hasTypeDependency()),
48 : m_includeCppuMacrosHxx(false), m_includeCppuUnotypeHxx(false),
49 : m_includeOslDoublecheckedlockingH(false), m_includeOslMutexHxx(false),
50 : m_includeRtlStrbufHxx(false), m_includeRtlStringH(false),
51 : m_includeRtlTextencH(false), m_includeRtlUstrbufHxx(false),
52 : m_includeRtlUstringH(false),
53 0 : m_includeRtlUstringHxx(dependencies.hasStringDependency()),
54 : m_includeRtlInstanceHxx(false),
55 : m_includeSalTypesH(
56 0 : dependencies.hasBooleanDependency() || dependencies.hasByteDependency()
57 0 : || dependencies.hasShortDependency()
58 0 : || dependencies.hasUnsignedShortDependency()
59 0 : || dependencies.hasLongDependency()
60 0 : || dependencies.hasUnsignedShortDependency()
61 0 : || dependencies.hasHyperDependency()
62 0 : || dependencies.hasUnsignedHyperDependency()
63 0 : || dependencies.hasCharDependency()),
64 : m_includeTypelibTypeclassH(false),
65 0 : m_includeTypelibTypedescriptionH(false)
66 0 : {}
67 :
68 0 : Includes::~Includes()
69 0 : {}
70 :
71 0 : void Includes::add(OString const & entityName) {
72 : sal_Int32 k;
73 0 : std::vector< OString > args;
74 0 : OUString n(b2u(codemaker::UnoType::decompose(entityName, &k, &args)));
75 0 : if (k != 0) {
76 0 : m_includeSequence = true;
77 : }
78 0 : switch (m_manager->getSort(n)) {
79 : case codemaker::UnoType::SORT_BOOLEAN:
80 : case codemaker::UnoType::SORT_BYTE:
81 : case codemaker::UnoType::SORT_SHORT:
82 : case codemaker::UnoType::SORT_UNSIGNED_SHORT:
83 : case codemaker::UnoType::SORT_LONG:
84 : case codemaker::UnoType::SORT_UNSIGNED_LONG:
85 : case codemaker::UnoType::SORT_HYPER:
86 : case codemaker::UnoType::SORT_UNSIGNED_HYPER:
87 : case codemaker::UnoType::SORT_CHAR:
88 0 : m_includeSalTypesH = true;
89 0 : break;
90 : case codemaker::UnoType::SORT_FLOAT:
91 : case codemaker::UnoType::SORT_DOUBLE:
92 0 : break;
93 : case codemaker::UnoType::SORT_STRING:
94 0 : m_includeRtlUstringHxx = true;
95 0 : break;
96 : case codemaker::UnoType::SORT_TYPE:
97 0 : m_includeType = true;
98 0 : break;
99 : case codemaker::UnoType::SORT_ANY:
100 0 : m_includeAny = true;
101 0 : break;
102 : case codemaker::UnoType::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE:
103 0 : for (std::vector< OString >::iterator i(args.begin()); i != args.end();
104 : ++i)
105 : {
106 0 : add(*i);
107 : }
108 : // fall through
109 : case codemaker::UnoType::SORT_SEQUENCE_TYPE:
110 : case codemaker::UnoType::SORT_ENUM_TYPE:
111 : case codemaker::UnoType::SORT_PLAIN_STRUCT_TYPE:
112 : case codemaker::UnoType::SORT_EXCEPTION_TYPE:
113 : case codemaker::UnoType::SORT_INTERFACE_TYPE:
114 : case codemaker::UnoType::SORT_TYPEDEF:
115 : m_map.insert(
116 0 : Dependencies::Map::value_type(n, Dependencies::KIND_NO_BASE));
117 0 : break;
118 : default:
119 : throw CannotDumpException(
120 0 : "unexpected type \"" + b2u(entityName)
121 0 : + "\" in call to codemaker::cppumaker::Includes::add");
122 0 : }
123 0 : }
124 :
125 : namespace {
126 :
127 0 : void dumpEmptyLineBeforeFirst(FileStream & out, bool * first) {
128 : OSL_ASSERT(first != 0);
129 0 : if (*first) {
130 0 : out << "\n";
131 0 : *first = false;
132 : }
133 0 : }
134 :
135 : }
136 :
137 0 : void Includes::dump(FileStream & out, OUString const * companionHdl) {
138 : OSL_ASSERT(companionHdl == 0 || m_hpp);
139 0 : if (!m_includeReference) {
140 0 : for (Dependencies::Map::iterator i(m_map.begin()); i != m_map.end();
141 : ++i)
142 : {
143 0 : if (isInterfaceType(u2b(i->first))) {
144 0 : m_includeReference = true;
145 0 : break;
146 : }
147 : }
148 : }
149 0 : out << "#include \"sal/config.h\"\n";
150 0 : if (m_includeCassert || m_includeException) {
151 0 : out << "\n";
152 0 : if (m_includeCassert) {
153 0 : out << "#include <cassert>\n";
154 : }
155 0 : if (m_includeException) {
156 0 : out << "#include <exception>\n";
157 : }
158 : }
159 0 : if (companionHdl) {
160 0 : out << "\n";
161 0 : dumpInclude(out, u2b(*companionHdl), false);
162 : }
163 0 : bool first = true;
164 0 : for (Dependencies::Map::iterator i(m_map.begin()); i != m_map.end(); ++i)
165 : {
166 0 : dumpEmptyLineBeforeFirst(out, &first);
167 0 : if (m_hpp || i->second == Dependencies::KIND_BASE
168 0 : || !isInterfaceType(u2b(i->first)))
169 : {
170 0 : dumpInclude(out, u2b(i->first), m_hpp);
171 : } else {
172 0 : bool ns = dumpNamespaceOpen(out, i->first, false);
173 0 : if (ns) {
174 0 : out << " ";
175 : }
176 0 : out << "class ";
177 0 : dumpTypeIdentifier(out, i->first);
178 0 : out << ";";
179 0 : if (ns) {
180 0 : out << " ";
181 : }
182 0 : dumpNamespaceClose(out, i->first, false);
183 0 : out << "\n";
184 : }
185 : }
186 : static char const * hxxExtension[2] = { "h", "hxx" };
187 0 : if (m_includeAny) {
188 0 : dumpEmptyLineBeforeFirst(out, &first);
189 0 : out << "#include \"com/sun/star/uno/Any." << hxxExtension[m_hpp]
190 0 : << "\"\n";
191 : }
192 0 : if (m_includeReference) {
193 0 : dumpEmptyLineBeforeFirst(out, &first);
194 0 : out << "#include \"com/sun/star/uno/Reference." << hxxExtension[m_hpp]
195 0 : << "\"\n";
196 : }
197 0 : if (m_includeSequence) {
198 0 : dumpEmptyLineBeforeFirst(out, &first);
199 0 : out << "#include \"com/sun/star/uno/Sequence." << hxxExtension[m_hpp]
200 0 : << "\"\n";
201 : }
202 0 : if (m_includeType) {
203 0 : dumpEmptyLineBeforeFirst(out, &first);
204 0 : out << "#include \"com/sun/star/uno/Type." << hxxExtension[m_hpp]
205 0 : << "\"\n";
206 : }
207 0 : if (m_includeCppuMacrosHxx) {
208 0 : dumpEmptyLineBeforeFirst(out, &first);
209 0 : out << ("#include \"cppu/macros.hxx\"\n");
210 : }
211 0 : if (m_includeCppuUnotypeHxx) {
212 0 : dumpEmptyLineBeforeFirst(out, &first);
213 0 : out << ("#include \"cppu/unotype.hxx\"\n");
214 : }
215 0 : if (m_includeOslDoublecheckedlockingH) {
216 0 : dumpEmptyLineBeforeFirst(out, &first);
217 0 : out << ("#include \"osl/doublecheckedlocking.h\"\n");
218 : }
219 0 : if (m_includeOslMutexHxx) {
220 0 : dumpEmptyLineBeforeFirst(out, &first);
221 0 : out << "#include \"osl/mutex.hxx\"\n";
222 : }
223 0 : if (m_includeRtlStrbufHxx) {
224 0 : dumpEmptyLineBeforeFirst(out, &first);
225 0 : out << ("#include \"rtl/strbuf.hxx\"\n");
226 : }
227 0 : if (m_includeRtlStringH) {
228 0 : dumpEmptyLineBeforeFirst(out, &first);
229 0 : out << "#include \"rtl/string.h\"\n";
230 : }
231 0 : if (m_includeRtlTextencH) {
232 0 : dumpEmptyLineBeforeFirst(out, &first);
233 0 : out << "#include \"rtl/textenc.h\"\n";
234 : }
235 0 : if (m_includeRtlUstrbufHxx) {
236 0 : dumpEmptyLineBeforeFirst(out, &first);
237 0 : out << ("#include \"rtl/ustrbuf.hxx\"\n");
238 : }
239 0 : if (m_includeRtlUstringH) {
240 0 : dumpEmptyLineBeforeFirst(out, &first);
241 0 : out << "#include \"rtl/ustring.h\"\n";
242 : }
243 0 : if (m_includeRtlUstringHxx) {
244 0 : dumpEmptyLineBeforeFirst(out, &first);
245 0 : out << ("#include \"rtl/ustring.hxx\"\n");
246 : }
247 0 : if (m_includeRtlInstanceHxx) {
248 0 : dumpEmptyLineBeforeFirst(out, &first);
249 0 : out << "#include \"rtl/instance.hxx\"\n";
250 : }
251 0 : if (m_includeSalTypesH) {
252 0 : dumpEmptyLineBeforeFirst(out, &first);
253 0 : out << "#include \"sal/types.h\"\n";
254 : }
255 0 : if (m_includeTypelibTypeclassH) {
256 0 : dumpEmptyLineBeforeFirst(out, &first);
257 0 : out << ("#include \"typelib/typeclass.h\"\n");
258 : }
259 0 : if (m_includeTypelibTypedescriptionH) {
260 0 : dumpEmptyLineBeforeFirst(out, &first);
261 0 : out << ("#include \"typelib/typedescription.h\"\n");
262 : }
263 0 : }
264 :
265 0 : void Includes::dumpInclude(
266 : FileStream & out, OString const & entityName, bool hpp)
267 : {
268 0 : out << "#include \"" << entityName.replace('.', '/') << "."
269 0 : << (hpp ? "hpp" : "hdl") << "\"\n";
270 0 : }
271 :
272 0 : bool Includes::isInterfaceType(OString const & entityName) const {
273 0 : return m_manager->getSort(b2u(entityName)) == UnoType::SORT_INTERFACE_TYPE;
274 : }
275 :
276 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|