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 : #include <precomp.h>
21 : #include "i2s_calculator.hxx"
22 :
23 : // NOT FULLY DEFINED SERVICES
24 : #include <algorithm>
25 : #include <string.h>
26 : #include <cosv/file.hxx>
27 : #include <ary/qualiname.hxx>
28 : #include <ary/idl/i_enum.hxx>
29 : #include <ary/idl/i_exception.hxx>
30 : #include <ary/idl/i_function.hxx>
31 : #include <ary/idl/i_gate.hxx>
32 : #include <ary/idl/i_interface.hxx>
33 : #include <ary/idl/ik_interface.hxx>
34 : #include <ary/idl/i_module.hxx>
35 : #include <ary/idl/i_property.hxx>
36 : #include <ary/idl/i_service.hxx>
37 : #include <ary/idl/i_singleton.hxx>
38 : #include <ary/idl/i_siservice.hxx>
39 : #include <ary/idl/i_sisingleton.hxx>
40 : #include <ary/idl/i_struct.hxx>
41 : #include <ary/idl/i_structelem.hxx>
42 : #include <ary/idl/i_typedef.hxx>
43 : #include <ary/idl/ip_ce.hxx>
44 : #include <ary/idl/ip_type.hxx>
45 : #include <ary/namesort.hxx>
46 : #include <nametreenode.hxx>
47 : #include "i_nnfinder.hxx"
48 : #include "ia_ce.hxx"
49 : #include "ia_type.hxx"
50 : #include "is_ce.hxx"
51 : #include "is_type.hxx"
52 : #include "it_ce.hxx"
53 : #include "it_explicit.hxx"
54 : #include "it_sequence.hxx"
55 : #include "it_xnameroom.hxx"
56 :
57 :
58 : namespace ary
59 : {
60 : namespace idl
61 : {
62 :
63 : template <class DEST>
64 : DEST *
65 21906 : SecondariesCalculator::SearchCe4Type(Type_id i_type)
66 : {
67 : Ce_id
68 21906 : ce = lhf_Search_CeFromTypeId(i_type);
69 21906 : if (ce.IsValid())
70 21906 : return ary_cast<DEST>(& my_CeStorage()[ce]);
71 0 : return 0;
72 : }
73 :
74 :
75 : typedef stg::const_iterator<CodeEntity> stg_citerator;
76 : typedef stg::iterator<CodeEntity> stg_iterator;
77 :
78 : typedef stg::filter_iterator<CodeEntity,Interface>
79 : interface_iterator;
80 :
81 : typedef stg::filter_iterator<Type,ExplicitType>
82 : explicittype_iterator;
83 :
84 : typedef ary::stg::const_filter_iterator<CodeEntity,Typedef>
85 : typedef_citerator;
86 :
87 :
88 : inline Service *
89 2023 : SecondariesCalculator::lhf_SearchService( Type_id i_nType )
90 : {
91 2023 : return SearchCe4Type<Service>(i_nType);
92 : }
93 :
94 : inline Interface *
95 16872 : SecondariesCalculator::lhf_SearchInterface( Type_id i_nType )
96 : {
97 16872 : return SearchCe4Type<Interface>(i_nType);
98 : }
99 :
100 : inline Struct *
101 96 : SecondariesCalculator::lhf_SearchStruct( Type_id i_nType )
102 : {
103 96 : return SearchCe4Type<Struct>(i_nType);
104 : }
105 :
106 : inline Exception *
107 2915 : SecondariesCalculator::lhf_SearchException( Type_id i_nType )
108 : {
109 2915 : return SearchCe4Type<Exception>(i_nType);
110 : }
111 :
112 : inline const Ce_Storage &
113 7400 : SecondariesCalculator::my_CeStorage() const
114 : {
115 : csv_assert(pCes != 0);
116 7400 : return pCes->Storage();
117 : }
118 :
119 : inline const Type_Storage &
120 43631 : SecondariesCalculator::my_TypeStorage() const
121 : {
122 : csv_assert(pTypes != 0);
123 43631 : return pTypes->Storage();
124 : }
125 :
126 : inline Ce_Storage &
127 92616 : SecondariesCalculator::my_CeStorage()
128 : {
129 : csv_assert(pCes != 0);
130 92616 : return pCes->Storage();
131 : }
132 :
133 : inline Type_Storage &
134 3698 : SecondariesCalculator::my_TypeStorage()
135 : {
136 : csv_assert(pTypes != 0);
137 3698 : return pTypes->Storage();
138 : }
139 :
140 : inline void
141 6232 : SecondariesCalculator::insert_into2sList( CodeEntity & o_out,
142 : int i_listIndex,
143 : Ce_id i_nCe )
144 6232 : { o_out.Secondaries().Access_List(i_listIndex).push_back(i_nCe); }
145 :
146 :
147 1 : SecondariesCalculator::SecondariesCalculator( CeAdmin & i_ces,
148 : TypeAdmin & i_types )
149 : : pCes(&i_ces),
150 1 : pTypes(&i_types)
151 : {
152 1 : }
153 :
154 1 : SecondariesCalculator::~SecondariesCalculator()
155 : {
156 1 : }
157 :
158 :
159 : void
160 1 : SecondariesCalculator::CheckAllInterfaceBases()
161 : {
162 : Module &
163 1 : rGlobalNamespace = pCes->GlobalNamespace();
164 : QualifiedName
165 1 : aXInterface("::com::sun::star::uno::XInterface","::");
166 :
167 : const Type &
168 : rType = pTypes->CheckIn_Type( aXInterface,
169 : 0,
170 : rGlobalNamespace.CeId(),
171 1 : 0 );
172 : Type_id
173 1 : nTypeXInterface = rType.TypeId();
174 : const ExplicitType &
175 1 : rExplType = ary_cast<ExplicitType>(rType);
176 : Ce_id
177 1 : nCeXInterface = lhf_Search_CeForType(rExplType);
178 :
179 1 : interface_iterator itEnd( my_CeStorage().End() );
180 58581 : for ( interface_iterator it( my_CeStorage().BeginUnreserved() );
181 39054 : it != itEnd;
182 : ++it )
183 : {
184 19526 : if (NOT it.IsValid())
185 17882 : continue;
186 :
187 : Interface &
188 1644 : rInterface = *it;
189 3542 : if ( NOT rInterface.HasBase() // According to UNO IDL syntax, an interface without base has com::sun::star::uno::XInterface as base.
190 1898 : AND rInterface.CeId() != nCeXInterface ) // XInterface must not be base of itself.
191 : {
192 126 : rInterface.Add_Base(nTypeXInterface, 0);
193 : }
194 1 : } // end for
195 1 : }
196 :
197 : void
198 1 : SecondariesCalculator::Connect_Types2Ces()
199 : {
200 1 : explicittype_iterator itEnd( my_TypeStorage().End() );
201 15237 : for ( explicittype_iterator it( my_TypeStorage().BeginUnreserved() );
202 10158 : it != itEnd;
203 : ++it )
204 : {
205 5078 : if (NOT it.IsValid())
206 1379 : continue;
207 :
208 : ExplicitType &
209 3699 : rType = ary_cast<ExplicitType>(*it);
210 : Ce_id
211 3699 : nRelatedCe = lhf_Search_CeForType(rType);
212 3699 : if (nRelatedCe.IsValid())
213 : {
214 : Ce_Type *
215 3696 : pNew = new Ce_Type(nRelatedCe, rType.TemplateParameters());
216 3696 : my_TypeStorage().Replace_Entity( rType.TypeId(),
217 7392 : *pNew );
218 : }
219 1 : } // end for
220 1 : }
221 :
222 : void
223 1 : SecondariesCalculator::Gather_CrossReferences()
224 : {
225 1 : gather_Synonyms();
226 :
227 58584 : for ( stg_iterator it = my_CeStorage().Begin();
228 39056 : it != my_CeStorage().End();
229 : ++it )
230 : {
231 19527 : (*it).Accept( static_cast< SPInst_asHost& >(*this) );
232 :
233 1 : } // end for
234 :
235 1 : sort_All2s();
236 1 : }
237 :
238 : void
239 1 : SecondariesCalculator::Make_Links2DeveloperManual(
240 : const String & i_devman_reffilepath )
241 : {
242 : csv::File
243 1 : aFile(i_devman_reffilepath, csv::CFM_READ);
244 : csv::OpenCloseGuard
245 1 : aFileOpener(aFile);
246 1 : if (aFileOpener)
247 : {
248 1 : Read_Links2DevManual(aFile);
249 1 : }
250 1 : }
251 :
252 : namespace
253 : {
254 :
255 : enum E_LinkMode
256 : {
257 : link2descr,
258 : link2ref
259 : };
260 :
261 : struct OrderCeIdsByName
262 : {
263 1 : OrderCeIdsByName(
264 : const Ce_Storage & i_storage )
265 : : rStorage(i_storage),
266 1 : aNameComparison() {}
267 114010 : bool operator()(
268 : Ce_id i_ce1,
269 : Ce_id i_ce2 ) const
270 : {
271 114010 : return aNameComparison( rStorage[i_ce1].LocalName(),
272 228020 : rStorage[i_ce2].LocalName() );
273 : }
274 :
275 : private:
276 : const Ce_Storage & rStorage;
277 : LesserName aNameComparison;
278 : };
279 :
280 :
281 : }
282 :
283 :
284 :
285 : void
286 1075 : SecondariesCalculator::do_Process( const Service & i_rData )
287 : {
288 : const Service &
289 1075 : rService = ary_cast<Service>(i_rData);
290 :
291 : // Interfaces:
292 : assignImplementation_toAServicesInterfaces( rService.CeId(),
293 : rService.CeId(),
294 1075 : interface_2s_ExportingServices );
295 : // Services and their interfaces:
296 1075 : recursive_AssignIncludingService(rService.CeId(), rService);
297 1075 : }
298 :
299 : void
300 1644 : SecondariesCalculator::do_Process( const Interface & i_rData )
301 : {
302 1644 : assign_AsDerivedInterface( ary_cast<Interface>(i_rData) );
303 1644 : }
304 :
305 : void
306 381 : SecondariesCalculator::do_Process( const Struct & i_rData )
307 : {
308 381 : assign_AsDerivedStruct( ary_cast<Struct>(i_rData) );
309 381 : }
310 :
311 : void
312 243 : SecondariesCalculator::do_Process( const Exception & i_rData )
313 : {
314 243 : assign_AsDerivedException( ary_cast<Exception>(i_rData) );
315 243 : }
316 :
317 : void
318 18 : SecondariesCalculator::do_Process( const Typedef & )
319 : {
320 : // KORR_FUTURE
321 : // Find out what was meant here ???
322 :
323 : // const Typedef &
324 : // rTypedef = ary_cast<Typedef>(i_rData);
325 18 : }
326 :
327 : void
328 4 : SecondariesCalculator::do_Process( const Singleton & i_rData )
329 : {
330 : const Singleton &
331 4 : rSingleton = ary_cast<Singleton>(i_rData);
332 :
333 : Service *
334 4 : pServ = lhf_SearchService(rSingleton.AssociatedService());
335 4 : if (pServ != 0)
336 : {
337 : insert_into2sUnique( *pServ,
338 : service_2s_InstantiatingSingletons,
339 4 : rSingleton.CeId() );
340 : }
341 :
342 : // Interfaces:
343 : assignImplementation_toAServicesInterfaces( rSingleton.CeId(),
344 : lhf_Search_CeFromTypeId(rSingleton.AssociatedService()),
345 4 : interface_2s_ExportingSingletons );
346 4 : }
347 :
348 : void
349 221 : SecondariesCalculator::do_Process( const SglIfcService & i_rData )
350 : {
351 : const SglIfcService &
352 221 : rSglIfcService = ary_cast<SglIfcService>(i_rData);
353 :
354 : assignImplementation_toAServicesInterfaces( rSglIfcService.CeId(),
355 : rSglIfcService.CeId(),
356 221 : interface_2s_ExportingServices );
357 221 : }
358 :
359 : void
360 11 : SecondariesCalculator::do_Process( const SglIfcSingleton & i_rData )
361 : {
362 : const SglIfcSingleton &
363 11 : rSglIfcSingleton = ary_cast<SglIfcSingleton>(i_rData);
364 :
365 11 : Type_id nBase = rSglIfcSingleton.BaseInterface();
366 : recursive_AssignImplementation_toExportedInterface( rSglIfcSingleton.CeId(),
367 : nBase,
368 11 : interface_2s_ExportingSingletons );
369 11 : }
370 :
371 : void
372 5595 : SecondariesCalculator::do_Process( const Function & i_rData )
373 : {
374 : const Function &
375 5595 : rFunction = ary_cast<Function>(i_rData);
376 :
377 5595 : recursive_AssignFunction_toCeAsReturn(rFunction.CeId(), rFunction.ReturnType());
378 :
379 33759 : for ( Function::ParamList::const_iterator itp = rFunction.Parameters().begin();
380 22506 : itp != rFunction.Parameters().end();
381 : ++itp )
382 : {
383 5658 : recursive_AssignFunction_toCeAsParameter(rFunction.CeId(), (*itp).Type());
384 : } // end for (itp)
385 :
386 24804 : for ( Function::ExceptionList::const_iterator itx = rFunction.Exceptions().begin();
387 16536 : itx != rFunction.Exceptions().end();
388 : ++itx )
389 : {
390 : Exception *
391 2673 : pX = lhf_SearchException(*itx);
392 2673 : if (pX != 0)
393 : {
394 2673 : insert_into2sUnique(*pX, exception_2s_RaisingFunctions, rFunction.CeId());
395 : }
396 : } // end for (itx)
397 5595 : }
398 :
399 : void
400 1483 : SecondariesCalculator::do_Process( const StructElement & i_rData )
401 : {
402 : const StructElement &
403 1483 : rStructElement = ary_cast<StructElement>(i_rData);
404 :
405 1483 : recursive_AssignStructElement_toCeAsDataType(rStructElement.CeId(), rStructElement.Type());
406 1483 : }
407 :
408 : void
409 3166 : SecondariesCalculator::do_Process( const Property & i_rData )
410 : {
411 : const Property &
412 3166 : rProperty = ary_cast<Property>(i_rData);
413 :
414 3166 : recursive_AssignStructElement_toCeAsDataType(rProperty.CeId(), rProperty.Type());
415 3166 : }
416 :
417 : Ce_id
418 3700 : SecondariesCalculator::lhf_Search_CeForType( const ExplicitType & i_rType ) const
419 : {
420 : const ExplicitNameRoom &
421 : rExplicitNameRoom = ary_cast<ExplicitNameRoom>(
422 3700 : my_TypeStorage()[i_rType.NameRoom()] );
423 : Find_ModuleNode
424 3700 : rNodeFinder( my_CeStorage(),
425 : rExplicitNameRoom.NameChain_Begin(),
426 : rExplicitNameRoom.NameChain_End(),
427 7400 : i_rType.Name() );
428 :
429 3700 : if ( rExplicitNameRoom.IsAbsolute() )
430 : {
431 : const Module &
432 : rGlobalNamespace = ary_cast<Module>(
433 314 : my_CeStorage()[predefined::ce_GlobalNamespace]);
434 : return Search_SubTree( rGlobalNamespace,
435 314 : rNodeFinder );
436 : }
437 : else
438 : {
439 : const Module &
440 : rStartModule = ary_cast<Module>(
441 3386 : my_CeStorage()[i_rType.ModuleOfOccurrence()]);
442 : Ce_id ret = Search_SubTree_UpTillRoot( rStartModule,
443 3386 : rNodeFinder );
444 3386 : return ret;
445 3700 : } // endif (rExplicitNameRoom.IsAbsolute()) else
446 : }
447 :
448 : Ce_id
449 40024 : SecondariesCalculator::lhf_Search_CeFromTypeId( Type_id i_nType ) const
450 : {
451 40024 : if (NOT i_nType.IsValid())
452 93 : return Ce_id(0);
453 : const Ce_Type *
454 39931 : pType = ary_cast<Ce_Type>( & my_TypeStorage()[i_nType] );
455 : return pType != 0
456 : ? pType->RelatedCe()
457 39931 : : Ce_id_Null();
458 : }
459 :
460 : void
461 3471 : SecondariesCalculator::assign_CurLink( char * i_text,
462 : const String & i_link,
463 : const String & i_linkUI,
464 : bool i_isDescr,
465 : int i_lineCount )
466 : {
467 : csv_assert(i_text != 0);
468 :
469 : const ary::idl::Module *
470 : pModule = & ary_cast<Module>(
471 3471 : my_CeStorage()[predefined::ce_GlobalNamespace]);
472 :
473 3471 : char * pPastNext = 0;
474 3471 : char * pNext = i_text;
475 17475 : for ( ;
476 : (pPastNext = strstr(pNext,".")) != 0;
477 : pNext = pPastNext + 1 )
478 : {
479 14011 : String sNext(pNext, pPastNext-pNext);
480 14011 : Ce_id nModule = pModule->Search_Name(sNext);
481 14011 : if (nModule.IsValid())
482 : {
483 14004 : pModule = ary_cast<Module>( & my_CeStorage()[nModule] );
484 : }
485 : else
486 : {
487 7 : pModule = 0;
488 : }
489 :
490 14011 : if (pModule == 0)
491 : {
492 7 : Cerr() << "Warning: Invalid line nr. "
493 7 : << i_lineCount
494 7 : << " in DevelopersGuide reference file:\n"
495 7 : << reinterpret_cast< const char* >(i_text)
496 7 : << "\n"
497 14 : << Endl();
498 : return;
499 : }
500 14011 : } // end for
501 :
502 3464 : pPastNext = strchr(pNext,':');
503 3464 : bool bMember = pPastNext != 0;
504 3464 : String sCe( pNext, (bMember ? csv::str::size(pPastNext-pNext) : csv::str::maxsize) );
505 :
506 : // KORR_FUTURE
507 : // String sMember(bMember ? pPastNext+1, "");
508 :
509 3464 : Ce_id nCe = pModule->Search_Name(sCe);
510 3464 : if (NOT nCe.IsValid())
511 : {
512 3 : Cerr() << "Warning: Invalid line nr. "
513 3 : << i_lineCount
514 3 : << " in DevelopersGuide reference file:\n"
515 3 : << reinterpret_cast< const char* >(i_text)
516 3 : << "\n"
517 6 : << Endl();
518 : return;
519 : }
520 :
521 : CodeEntity &
522 3461 : rCe = my_CeStorage()[nCe];
523 3461 : if (NOT bMember)
524 : {
525 3461 : if (i_isDescr)
526 581 : rCe.Secondaries().Add_Link2DescriptionInManual(i_link, i_linkUI);
527 : else
528 2880 : rCe.Secondaries().Add_Link2RefInManual(i_link, i_linkUI);
529 : return;
530 : }
531 : else
532 : {
533 : // KORR_FUTURE
534 : // Provisorial just doing nothing (or may be
535 : // adding a link at main Ces lists).
536 : // if (i_isDescr)
537 : // rCe.Secondaries().Add_Link2DescriptionInManual(i_link);
538 : // else
539 : // rCe.Secondaries().Add_Link2RefInManual(i_link);
540 3464 : }
541 : }
542 :
543 : void
544 1 : SecondariesCalculator::gather_Synonyms()
545 : {
546 : const Ce_Storage &
547 1 : cstrg = my_CeStorage();
548 1 : typedef_citerator itEnd(cstrg.End());
549 58584 : for ( typedef_citerator it(cstrg.Begin());
550 39056 : it != itEnd;
551 : ++it )
552 : {
553 19527 : if (NOT it.IsValid())
554 19509 : continue;
555 :
556 : const Typedef &
557 18 : rTypedef = *it;
558 18 : recursive_AssignAsSynonym(rTypedef.CeId(), rTypedef);
559 1 : } // end for (itTd)
560 1 : }
561 :
562 : void
563 18 : SecondariesCalculator::recursive_AssignAsSynonym( Ce_id i_synonymousTypedefsId,
564 : const Typedef & i_TypedefToCheck )
565 : {
566 : Ce_id
567 18 : nCe = lhf_Search_CeFromTypeId(i_TypedefToCheck.DefiningType());
568 18 : if (NOT nCe.IsValid())
569 18 : return;
570 : CodeEntity &
571 0 : rCe = my_CeStorage()[nCe];
572 :
573 0 : switch (rCe.AryClass()) // KORR_FUTURE: make this faster, remove switch.
574 : {
575 : case Interface::class_id:
576 : insert_into2sList( rCe,
577 : interface_2s_SynonymTypedefs,
578 0 : i_synonymousTypedefsId );
579 0 : break;
580 : case Struct::class_id:
581 : insert_into2sList( rCe,
582 : struct_2s_SynonymTypedefs,
583 0 : i_synonymousTypedefsId );
584 0 : break;
585 : case Enum::class_id:
586 : insert_into2sList( rCe,
587 : enum_2s_SynonymTypedefs,
588 0 : i_synonymousTypedefsId );
589 0 : break;
590 : case Typedef::class_id:
591 : insert_into2sList( rCe,
592 : typedef_2s_SynonymTypedefs,
593 0 : i_synonymousTypedefsId );
594 : recursive_AssignAsSynonym( i_synonymousTypedefsId,
595 0 : static_cast< Typedef& >(rCe) );
596 0 : break;
597 : // default: do nothing.
598 : }
599 : }
600 :
601 : void
602 3091 : SecondariesCalculator::recursive_AssignIncludingService( Ce_id i_includingServicesId,
603 : const Service & i_ServiceToCheckItsIncludes )
604 : {
605 : Dyn_StdConstIterator<CommentedRelation>
606 3091 : pIncludedServices;
607 3091 : i_ServiceToCheckItsIncludes.Get_IncludedServices(pIncludedServices);
608 :
609 8201 : for ( StdConstIterator<CommentedRelation> &
610 3091 : itServ = *pIncludedServices;
611 : itServ;
612 2019 : ++itServ )
613 : {
614 : Service *
615 2019 : pServ = lhf_SearchService((*itServ).Type());
616 2019 : if (pServ != 0)
617 : {
618 : insert_into2sUnique( *pServ,
619 : service_2s_IncludingServices,
620 : i_includingServicesId
621 2016 : );
622 2016 : recursive_AssignIncludingService(i_includingServicesId, *pServ);
623 :
624 : } // end if
625 :
626 : assignImplementation_toAServicesInterfaces( i_includingServicesId,
627 2019 : lhf_Search_CeFromTypeId( (*itServ).Type() ),
628 2019 : interface_2s_ExportingServices );
629 3091 : } // end for
630 3091 : }
631 :
632 : void
633 1644 : SecondariesCalculator::assign_AsDerivedInterface( const Interface & i_rDerived )
634 : {
635 : ary::Dyn_StdConstIterator<ary::idl::CommentedRelation>
636 1644 : pHelp;
637 1644 : ary::idl::ifc_interface::attr::Get_Bases(pHelp, i_rDerived);
638 :
639 5108 : for ( ary::StdConstIterator<ary::idl::CommentedRelation> & it = *pHelp;
640 : it.operator bool();
641 1820 : ++it )
642 : {
643 : Interface *
644 1820 : pIfc = lhf_SearchInterface( (*it).Type() );
645 1820 : if (pIfc == 0)
646 0 : continue;
647 :
648 : insert_into2sList( *pIfc,
649 : interface_2s_Derivations,
650 1820 : i_rDerived.CeId() );
651 1644 : } // end for
652 1644 : }
653 :
654 : void
655 381 : SecondariesCalculator::assign_AsDerivedStruct( const Struct & i_rDerived )
656 : {
657 : Type_id
658 381 : nBase = i_rDerived.Base();
659 381 : if (nBase.IsValid())
660 : {
661 : Struct *
662 96 : pParent = lhf_SearchStruct(nBase);
663 96 : if (pParent != 0)
664 : {
665 : insert_into2sList( *pParent,
666 : struct_2s_Derivations,
667 96 : i_rDerived.CeId() );
668 : }
669 : }
670 381 : }
671 :
672 : void
673 243 : SecondariesCalculator::assign_AsDerivedException( const Exception & i_rDerived )
674 : {
675 : Type_id
676 243 : nBase = i_rDerived.Base();
677 243 : if (nBase.IsValid())
678 : {
679 : Exception *
680 242 : pParent = lhf_SearchException(nBase);
681 242 : if (pParent != 0)
682 : {
683 : insert_into2sList( *pParent,
684 : exception_2s_Derivations,
685 242 : i_rDerived.CeId() );
686 : } // end if
687 : } // end if
688 243 : }
689 :
690 : void
691 3319 : SecondariesCalculator::assignImplementation_toAServicesInterfaces(
692 : Ce_id i_nImpl,
693 : Ce_id i_nService,
694 : E_2s_of_Interface i_eList )
695 : {
696 3319 : if (NOT i_nService.IsValid())
697 3319 : return;
698 : Service *
699 3319 : pService = ary_cast<Service>( & my_CeStorage()[i_nService] );
700 : SglIfcService *
701 3319 : pSglIfcService = ary_cast<SglIfcService>( & my_CeStorage()[i_nService] );
702 :
703 3319 : if (pService != 0)
704 : {
705 : Dyn_StdConstIterator<CommentedRelation>
706 3095 : pSupportedInterfaces;
707 3095 : pService->Get_SupportedInterfaces(pSupportedInterfaces);
708 :
709 12528 : for ( StdConstIterator<CommentedRelation> &
710 3095 : itInfc = *pSupportedInterfaces;
711 : itInfc.operator bool();
712 6338 : ++itInfc )
713 : {
714 : recursive_AssignImplementation_toExportedInterface( i_nImpl,
715 6338 : (*itInfc).Type(),
716 6338 : i_eList );
717 3095 : } // end for
718 : }
719 224 : else if (pSglIfcService != 0)
720 : {
721 224 : Type_id nBase = pSglIfcService->BaseInterface();
722 : recursive_AssignImplementation_toExportedInterface( i_nImpl,
723 : nBase,
724 224 : i_eList );
725 : } // end if
726 : }
727 :
728 : void
729 15052 : SecondariesCalculator::recursive_AssignImplementation_toExportedInterface(
730 : Ce_id i_nService,
731 : Type_id i_nExportedInterface,
732 : E_2s_of_Interface i_eList )
733 : {
734 : Interface *
735 15052 : pIfc = lhf_SearchInterface(i_nExportedInterface);
736 15052 : if (pIfc == 0)
737 15052 : return;
738 :
739 : insert_into2sUnique( *pIfc,
740 : i_eList,
741 15052 : i_nService );
742 : Dyn_StdConstIterator<CommentedRelation>
743 15052 : pBases;
744 15052 : ary::idl::ifc_interface::attr::Get_Bases(pBases, *pIfc);
745 38583 : for ( StdConstIterator<CommentedRelation> & it = *pBases;
746 : it.operator bool();
747 8479 : ++it )
748 : {
749 8479 : recursive_AssignImplementation_toExportedInterface(i_nService, (*it).Type(), i_eList);
750 15052 : }
751 : }
752 :
753 : void
754 5606 : SecondariesCalculator::recursive_AssignFunction_toCeAsReturn( Ce_id i_nFunction,
755 : Type_id i_nReturnType )
756 : {
757 : Ce_id
758 5606 : nCe = lhf_Search_CeFromTypeId(i_nReturnType);
759 5606 : if (NOT nCe.IsValid())
760 5606 : return;
761 :
762 : CodeEntity &
763 1161 : rCe = my_CeStorage()[nCe];
764 1161 : switch (rCe.AryClass()) // KORR_FUTURE: make this faster, remove switch.
765 : {
766 : case Interface::class_id:
767 : insert_into2sList( rCe,
768 : interface_2s_AsReturns,
769 929 : i_nFunction );
770 929 : break;
771 : case Struct::class_id:
772 : insert_into2sList( rCe,
773 : struct_2s_AsReturns,
774 188 : i_nFunction );
775 188 : break;
776 : case Enum::class_id:
777 : insert_into2sList( rCe,
778 : enum_2s_AsReturns,
779 33 : i_nFunction );
780 33 : break;
781 : case Typedef::class_id:
782 : insert_into2sList( rCe,
783 : typedef_2s_AsReturns,
784 11 : i_nFunction );
785 : recursive_AssignFunction_toCeAsReturn( i_nFunction,
786 11 : static_cast< Typedef& >(rCe).DefiningType() );
787 11 : break;
788 : // default: do nothing.
789 : }
790 : }
791 :
792 : void
793 5822 : SecondariesCalculator::recursive_AssignFunction_toCeAsParameter( Ce_id i_nFunction,
794 : Type_id i_nParameterType )
795 : {
796 : Ce_id
797 5822 : nCe = lhf_Search_CeFromTypeId(i_nParameterType);
798 5822 : if (NOT nCe.IsValid())
799 5822 : return;
800 :
801 : CodeEntity &
802 2068 : rCe = my_CeStorage()[nCe];
803 2068 : switch (rCe.AryClass()) // KORR_FUTURE: make this faster, remove switch.
804 : {
805 : case Interface::class_id:
806 : insert_into2sList( rCe,
807 : interface_2s_AsParameters,
808 1252 : i_nFunction );
809 1252 : break;
810 : case Struct::class_id:
811 : insert_into2sList( rCe,
812 : struct_2s_AsParameters,
813 709 : i_nFunction );
814 709 : break;
815 : case Enum::class_id:
816 : insert_into2sList( rCe,
817 : enum_2s_AsParameters,
818 70 : i_nFunction );
819 70 : break;
820 : case Typedef::class_id:
821 : insert_into2sList( rCe,
822 : typedef_2s_AsParameters,
823 37 : i_nFunction );
824 : recursive_AssignFunction_toCeAsParameter( i_nFunction,
825 37 : static_cast< Typedef& >(rCe).DefiningType() );
826 37 : break;
827 : // default: do nothing.
828 : }
829 : }
830 :
831 : void
832 4649 : SecondariesCalculator::recursive_AssignStructElement_toCeAsDataType( Ce_id i_nDataElement,
833 : Type_id i_nDataType )
834 : {
835 : Ce_id
836 4649 : nCe = lhf_Search_CeFromTypeId(i_nDataType);
837 4649 : if (NOT nCe.IsValid())
838 4649 : return;
839 :
840 : CodeEntity &
841 845 : rCe = my_CeStorage()[nCe];
842 845 : switch (rCe.AryClass()) // KORR_FUTURE: make this faster, remove switch.
843 : {
844 : case Interface::class_id:
845 : insert_into2sList( rCe,
846 : interface_2s_AsDataTypes,
847 249 : i_nDataElement );
848 249 : break;
849 : case Struct::class_id:
850 : insert_into2sList( rCe,
851 : struct_2s_AsDataTypes,
852 287 : i_nDataElement );
853 287 : break;
854 : case Enum::class_id:
855 : insert_into2sList( rCe,
856 : enum_2s_AsDataTypes,
857 182 : i_nDataElement );
858 182 : break;
859 : case Typedef::class_id:
860 : insert_into2sList( rCe,
861 : typedef_2s_AsDataTypes,
862 127 : i_nDataElement );
863 : recursive_AssignFunction_toCeAsParameter( i_nDataElement,
864 127 : static_cast< Typedef& >(rCe).DefiningType() );
865 127 : break;
866 : // default: do nothing.
867 : } // end switch
868 : }
869 :
870 : void
871 19745 : SecondariesCalculator::insert_into2sUnique( CodeEntity & o_out,
872 : int i_listIndex,
873 : Ce_id i_nCe )
874 : {
875 : std::vector<Ce_id> &
876 19745 : rOut = o_out.Secondaries().Access_List(i_listIndex);
877 19745 : if (std::find(rOut.begin(),rOut.end(),i_nCe) != rOut.end())
878 27742 : return;
879 11748 : rOut.push_back(i_nCe);
880 : }
881 :
882 : void
883 1 : SecondariesCalculator::sort_All2s()
884 : {
885 : OrderCeIdsByName
886 1 : aIdOrdering(my_CeStorage());
887 :
888 58584 : for ( stg_iterator it = my_CeStorage().Begin();
889 39056 : it != my_CeStorage().End();
890 : ++it )
891 : {
892 : Ce_2s &
893 19527 : r2s = (*it).Secondaries();
894 19527 : int iCount = r2s.CountXrefLists();
895 26287 : for (int i = 0; i < iCount; ++i)
896 : {
897 6760 : std::sort( r2s.Access_List(i).begin(),
898 6760 : r2s.Access_List(i).end(),
899 13520 : aIdOrdering );
900 : } // end for (i)
901 1 : } // end for (it)
902 1 : }
903 :
904 : void
905 1 : SecondariesCalculator::Read_Links2DevManual( csv::bstream & i_file )
906 : {
907 1 : StreamLock aLine(300);
908 1 : StreamStr & rLine = aLine();
909 :
910 :
911 1 : String sCurLink;
912 1 : String sCurLinkUI;
913 1 : E_LinkMode eCurMode = link2ref;
914 :
915 1 : int lineCount = 0;
916 1 : const char * sLink = "LINK:";
917 1 : const char * sDescr = "DESCR:";
918 1 : const char * sTopic = "TOPIC:";
919 1 : const char * sRef = "REF:";
920 1 : const UINT8 cMaxASCIINumWhiteSpace = 32;
921 :
922 7338 : while (NOT i_file.eod())
923 : {
924 7336 : ++lineCount;
925 :
926 7336 : rLine.reset();
927 7336 : rLine.operator_read_line(i_file);
928 :
929 7336 : if ( *rLine.c_str() >= 'a' )
930 : {
931 3471 : assign_CurLink(rLine.begin(), sCurLink, sCurLinkUI, eCurMode == link2descr, lineCount);
932 : }
933 3865 : else if ( strncmp(rLine.c_str(), sLink, strlen(sLink)) == 0 )
934 : {
935 773 : sCurLink = rLine.c_str()+5;
936 773 : sCurLinkUI.clear();
937 : }
938 3092 : else if ( strncmp(rLine.c_str(), sDescr, strlen(sDescr)) == 0 )
939 : {
940 773 : sCurLinkUI = rLine.c_str()+6;
941 : }
942 2319 : else if ( strncmp(rLine.c_str(), sTopic, strlen(sTopic)) == 0 )
943 : {
944 773 : eCurMode = link2descr;
945 : }
946 1546 : else if ( strncmp(rLine.c_str(), sRef, strlen(sRef)) == 0 )
947 : {
948 773 : eCurMode = link2ref;
949 : }
950 773 : else if (static_cast<UINT8>(*rLine.c_str()) > cMaxASCIINumWhiteSpace)
951 : {
952 0 : assign_CurLink(rLine.begin(), sCurLink, sCurLinkUI, eCurMode == link2descr, lineCount);
953 : }
954 : // else
955 : // Ignore empty line.
956 :
957 1 : } // end while
958 1 : }
959 :
960 :
961 :
962 : } // namespace idl
963 3 : } // namespace ary
964 :
965 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|