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