1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 #include <precomp.h> 23 #include "cmd_run.hxx" 24 25 26 // NOT FULLY DEFINED SERVICES 27 #include <cosv/file.hxx> 28 #include <cosv/x.hxx> 29 #include <ary/ary.hxx> 30 #include <ary/cpp/c_gate.hxx> 31 #include <ary/idl/i_ce.hxx> 32 #include <ary/idl/i_gate.hxx> 33 #include <ary/idl/i_module.hxx> 34 #include <ary/idl/ip_ce.hxx> 35 #include <autodoc/filecoli.hxx> 36 #include <autodoc/parsing.hxx> 37 #include <autodoc/prs_code.hxx> 38 #include <autodoc/prs_docu.hxx> 39 #include <parser/unoidl.hxx> 40 #include <adc_cl.hxx> 41 #include "adc_cmd_parse.hxx" 42 #include "adc_cmds.hxx" 43 44 namespace autodoc 45 { 46 namespace command 47 { 48 namespace run 49 { 50 51 Parser::Parser( const Parse & i_command ) 52 : rCommand(i_command), 53 pCppParser(), 54 pCppDocuInterpreter(), 55 pIdlParser() 56 { 57 } 58 59 Parser::~Parser() 60 { 61 } 62 63 bool 64 Parser::Perform() 65 { 66 Cout() << "Parsing the repository " 67 << rCommand.ReposyName() 68 << " ..." 69 << Endl(); 70 try 71 { 72 ::ary::Repository & 73 rAry = CommandLine::Get_().TheRepository(); 74 rAry.Set_Title(rCommand.ReposyName()); 75 76 Dyn< FileCollector_Ifc > 77 pFiles( ParseToolsFactory().Create_FileCollector(6000) ); 78 79 bool bIDL = false; 80 bool bCpp = false; 81 82 command::Parse::ProjectIterator 83 itEnd = rCommand.ProjectsEnd(); 84 for ( command::Parse::ProjectIterator it = rCommand.ProjectsBegin(); 85 it != itEnd; 86 ++it ) 87 { 88 uintt nCount = GatherFiles( *pFiles, *(*it) ); 89 Cout() << nCount 90 << " files found to parse in project " 91 << (*it)->Name() 92 << "." 93 << Endl(); 94 95 switch ( (*it)->Language().eLanguage ) 96 { 97 case command::S_LanguageInfo::idl: 98 { 99 Get_IdlParser().Run(*pFiles); 100 bIDL = true; 101 } break; 102 case command::S_LanguageInfo::cpp: 103 { 104 Get_CppParser().Run( *pFiles ); 105 bCpp = true; 106 } break; 107 default: 108 Cerr() << "Project in yet unimplemented language skipped." 109 << Endl(); 110 } 111 } // end for 112 113 if (bCpp) 114 { 115 rAry.Gate_Cpp().Calculate_AllSecondaryInformation(); 116 } 117 if (bIDL) 118 { 119 rAry.Gate_Idl().Calculate_AllSecondaryInformation( 120 rCommand.DevelopersManual_RefFilePath() ); 121 122 // ::ary::idl::SecondariesPilot & 123 // rIdl2sPilot = rAry.Gate_Idl().Secondaries(); 124 // 125 // rIdl2sPilot.CheckAllInterfaceBases( rAry.Gate_Idl() ); 126 // rIdl2sPilot.Connect_Types2Ces(); 127 // rIdl2sPilot.Gather_CrossReferences(); 128 // 129 // if (NOT rCommand.DevelopersManual_RefFilePath().empty()) 130 // { 131 // csv::File 132 // aFile(rCommand.DevelopersManual_RefFilePath(), csv::CFM_READ); 133 // if ( aFile.open() ) 134 // { 135 // rIdl2sPilot.Read_Links2DevManual(aFile); 136 // aFile.close(); 137 // } 138 // } 139 } // endif (bIDL) 140 141 return true; 142 143 } // end try 144 catch (csv::Exception & xx) 145 { 146 xx.GetInfo(Cerr()); 147 Cerr() << " program will exit." << Endl(); 148 149 return false; 150 } 151 } 152 153 CodeParser_Ifc & 154 Parser::Get_CppParser() 155 { 156 if ( NOT pCppParser ) 157 Create_CppParser(); 158 return *pCppParser; 159 } 160 161 IdlParser & 162 Parser::Get_IdlParser() 163 { 164 if ( NOT pIdlParser ) 165 Create_IdlParser(); 166 return *pIdlParser; 167 } 168 169 void 170 Parser::Create_CppParser() 171 { 172 pCppParser = ParseToolsFactory().Create_Parser_Cplusplus(); 173 pCppDocuInterpreter = ParseToolsFactory().Create_DocuParser_AutodocStyle(); 174 175 pCppParser->Setup( CommandLine::Get_().TheRepository(), 176 *pCppDocuInterpreter, 177 CommandLine::Get_().IgnoreDefines() ); 178 } 179 180 void 181 Parser::Create_IdlParser() 182 { 183 pIdlParser = new IdlParser(CommandLine::Get_().TheRepository()); 184 } 185 186 const ParseToolsFactory_Ifc & 187 Parser::ParseToolsFactory() 188 { 189 return ParseToolsFactory_Ifc::GetIt_(); 190 } 191 192 uintt 193 Parser::GatherFiles( FileCollector_Ifc & o_rFiles, 194 const S_ProjectData & i_rProject ) 195 { 196 uintt ret = 0; 197 o_rFiles.EraseAll(); 198 199 typedef StringVector StrVector; 200 typedef StrVector::const_iterator StrIterator; 201 const S_Sources & 202 rSources = i_rProject.Sources(); 203 const StrVector & 204 rExtensions = i_rProject.Language().aExtensions; 205 206 StrIterator it; 207 StrIterator itTreesEnd = rSources.aTrees.end(); 208 StrIterator itDirsEnd = rSources.aDirectories.end(); 209 StrIterator itFilesEnd = rSources.aFiles.end(); 210 StrIterator itExt; 211 StrIterator itExtEnd = rExtensions.end(); 212 213 csv::StreamStr aDir(500); 214 i_rProject.RootDirectory().Get( aDir ); 215 216 uintt nProjectDir_AddPosition = 217 ( strcmp(aDir.c_str(),".\\") == 0 OR strcmp(aDir.c_str(),"./") == 0 ) 218 ? 0 219 : uintt( aDir.tellp() ); 220 221 for ( it = rSources.aDirectories.begin(); 222 it != itDirsEnd; 223 ++it ) 224 { 225 aDir.seekp( nProjectDir_AddPosition ); 226 aDir << *it; 227 228 for ( itExt = rExtensions.begin(); 229 itExt != itExtEnd; 230 ++itExt ) 231 { 232 ret += o_rFiles.AddFilesFrom( aDir.c_str(), 233 *itExt, 234 FileCollector_Ifc::flat ); 235 } // end for itExt 236 } // end for it 237 for ( it = rSources.aTrees.begin(); 238 it != itTreesEnd; 239 ++it ) 240 { 241 aDir.seekp( nProjectDir_AddPosition ); 242 aDir << *it; 243 244 for ( itExt = rExtensions.begin(); 245 itExt != itExtEnd; 246 ++itExt ) 247 { 248 ret += o_rFiles.AddFilesFrom( aDir.c_str(), 249 *itExt, 250 FileCollector_Ifc::recursive ); 251 } // end for itExt 252 } // end for it 253 for ( it = rSources.aFiles.begin(); 254 it != itFilesEnd; 255 ++it ) 256 { 257 aDir.seekp( nProjectDir_AddPosition ); 258 aDir << *it; 259 260 o_rFiles.AddFile( aDir.c_str() ); 261 } // end for it 262 ret += rSources.aFiles.size(); 263 264 return ret; 265 } 266 267 268 } // namespace run 269 } // namespace command 270 271 272 #if 0 273 inline const ParseToolsFactory_Ifc & 274 CommandRunner::ParseToolsFactory() 275 { return ParseToolsFactory_Ifc::GetIt_(); } 276 277 278 inline const command::S_LanguageInfo & 279 CommandRunner::Get_ProjectLanguage( const command::Parse & i_rCommand, 280 const command::S_ProjectData & i_rProject ) 281 { 282 if ( i_rProject.pLanguage ) 283 return *i_rProject.pLanguage; 284 return *i_rCommand.GlobalLanguageInfo(); 285 } 286 287 inline bool 288 CommandRunner::HasParsedCpp() const 289 { return pCppParser; } 290 inline bool 291 CommandRunner::HasParsedIdl() const 292 { return pIdlParser; } 293 294 295 296 297 298 CommandRunner::CommandRunner() 299 : pCommandLine(0), 300 pReposy(0), 301 pNewReposy(0), 302 nResultCode(0) 303 { 304 Cout() << "\nAutodoc version 2.2.1" 305 << "\n-------------------" 306 << "\n" << Endl(); 307 } 308 309 CommandRunner::~CommandRunner() 310 { 311 ary::Repository::Destroy_(); 312 Cout() << "\n" << Endl(); 313 } 314 315 void 316 CommandRunner::Run( const CommandLine & i_rCL ) 317 { 318 ary::Repository::Destroy_(); 319 // ary::Repository::Destroy_(); 320 pReposy = 0; 321 pNewReposy = 0; 322 nResultCode = 0; 323 pCommandLine = &i_rCL; 324 325 pCommandLine->Run(); 326 } 327 328 void 329 CommandRunner::Parse() 330 { 331 try 332 { 333 334 csv_assert( pCommandLine->Cmd_Parse() != 0 ); 335 const command::Parse & 336 rCmd = *pCommandLine->Cmd_Parse(); 337 338 Cout() << "Parsing the repository " 339 << rCmd.ReposyName() 340 << " ..." 341 << Endl(); 342 343 if ( pReposy == 0 ) 344 pReposy = & ary::Repository::Create_( rCmd.ReposyName(), 0 ); 345 if ( pNewReposy == 0 ) 346 pNewReposy = & ary::Repository::Create_( rCmd.ReposyName() ); 347 348 Dyn< FileCollector_Ifc > pFiles; 349 pFiles = ParseToolsFactory().Create_FileCollector(6000); 350 351 bool bCpp = false; 352 bool bIDL = false; 353 354 command::Parse::ProjectIterator itEnd = rCmd.ProjectsEnd(); 355 for ( command::Parse::ProjectIterator it = rCmd.ProjectsBegin(); 356 it != itEnd; 357 ++it ) 358 { 359 360 uintt nCount = GatherFiles( *pFiles, rCmd, *(*it) ); 361 Cout() << nCount 362 << " files found to parse in project " 363 << (*it)->Name() 364 << "." 365 << Endl(); 366 367 368 switch ( Get_ProjectLanguage(rCmd, *(*it)).eLanguage ) 369 { 370 case command::S_LanguageInfo::cpp: 371 { 372 Get_CppParser().Run( (*it)->Name(), 373 (*it)->RootDirectory(), 374 *pFiles ); 375 bCpp = true; 376 } break; 377 case command::S_LanguageInfo::idl: 378 { 379 Get_IdlParser().Run(*pFiles); 380 bIDL = true; 381 } break; 382 default: 383 Cerr() << "Project in yet unimplemented language skipped." 384 << Endl(); 385 } 386 } // end for 387 388 if (bCpp) 389 pReposy->RwGate_Cpp().Connect_AllTypes_2_TheirRelated_CodeEntites(); 390 if (bIDL) 391 { 392 pNewReposy->Gate_Idl().Secondaries().Connect_Types2Ces(); 393 pNewReposy->Gate_Idl().Secondaries().Gather_CrossReferences(); 394 } 395 396 } // end try 397 catch (csv::Exception & xx) 398 { 399 xx.GetInfo(Cerr()); 400 Cerr() << " program will exit." << Endl(); 401 nResultCode = 1; 402 } 403 catch (...) 404 { 405 Cerr() << "Unknown exception - program will exit." << Endl(); 406 nResultCode = 1; 407 } 408 } 409 410 void 411 CommandRunner::Load() 412 { 413 Cout() << "This would load the repository from the directory " 414 << pCommandLine->Cmd_Load()->ReposyDir() 415 << "." 416 << Endl(); 417 } 418 419 420 void 421 CommandRunner::Save() 422 { 423 Cout() << "This would save the repository into the directory " 424 << pCommandLine->Cmd_Save()->ReposyDir() 425 << "." 426 << Endl(); 427 } 428 429 430 void 431 CommandRunner::CreateHtml() 432 { 433 Cout() << "Creating HTML-output into the directory " 434 << pCommandLine->Cmd_CreateHtml()->OutputDir() 435 << "." 436 << Endl(); 437 438 if ( HasParsedCpp() ) 439 CreateHtml_NewStyle(); 440 if ( HasParsedIdl() ) 441 CreateHtml_OldIdlStyle(); 442 } 443 444 445 446 void 447 CommandRunner::CreateXml() 448 { 449 Cout() << "This would create the XML-output into the directory " 450 << pCommandLine->Cmd_CreateXml()->OutputDir() 451 << "." 452 << Endl(); 453 } 454 455 CodeParser_Ifc & 456 CommandRunner::Get_CppParser() 457 { 458 if ( NOT pCppParser ) 459 Create_CppParser(); 460 return *pCppParser; 461 } 462 463 IdlParser & 464 CommandRunner::Get_IdlParser() 465 { 466 if ( NOT pIdlParser ) 467 Create_IdlParser(); 468 return *pIdlParser; 469 } 470 471 void 472 CommandRunner::Create_CppParser() 473 { 474 pCppParser = ParseToolsFactory().Create_Parser_Cplusplus(); 475 pCppDocuInterpreter = ParseToolsFactory().Create_DocuParser_AutodocStyle(); 476 477 pCppParser->Setup( *pReposy, 478 *pCppDocuInterpreter ); 479 } 480 481 void 482 CommandRunner::Create_IdlParser() 483 { 484 pIdlParser = new IdlParser(*pNewReposy); 485 } 486 487 uintt 488 CommandRunner::GatherFiles( FileCollector_Ifc & o_rFiles, 489 const command::Parse & i_rCommand, 490 const command::S_ProjectData & i_rProject ) 491 { 492 uintt ret = 0; 493 o_rFiles.EraseAll(); 494 495 typedef StringVector StrVector; 496 typedef StrVector::const_iterator StrIterator; 497 const command::S_Sources & 498 rSources = i_rProject.aFiles; 499 const StrVector & 500 rExtensions = Get_ProjectLanguage(i_rCommand,i_rProject).aExtensions; 501 502 StrIterator it; 503 StrIterator itDirsEnd = rSources.aDirectories.end(); 504 StrIterator itTreesEnd = i_rProject.aFiles.aTrees.end(); 505 StrIterator itFilesEnd = i_rProject.aFiles.aFiles.end(); 506 StrIterator itExt; 507 StrIterator itExtEnd = rExtensions.end(); 508 509 csv::StreamStr aDir(500); 510 i_rProject.aRootDirectory.Get( aDir ); 511 512 uintt nProjectDir_AddPosition = 513 ( strcmp(aDir.c_str(),".\\") == 0 OR strcmp(aDir.c_str(),"./") == 0 ) 514 ? 0 515 : uintt( aDir.tellp() ); 516 517 for ( it = rSources.aDirectories.begin(); 518 it != itDirsEnd; 519 ++it ) 520 { 521 aDir.seekp( nProjectDir_AddPosition ); 522 aDir << *it; 523 524 for ( itExt = rExtensions.begin(); 525 itExt != itExtEnd; 526 ++itExt ) 527 { 528 ret += o_rFiles.AddFilesFrom( aDir.c_str(), 529 *itExt, 530 FileCollector_Ifc::flat ); 531 } // end for itExt 532 } // end for it 533 for ( it = rSources.aTrees.begin(); 534 it != itTreesEnd; 535 ++it ) 536 { 537 aDir.seekp( nProjectDir_AddPosition ); 538 aDir << *it; 539 540 for ( itExt = rExtensions.begin(); 541 itExt != itExtEnd; 542 ++itExt ) 543 { 544 ret += o_rFiles.AddFilesFrom( aDir.c_str(), 545 *itExt, 546 FileCollector_Ifc::recursive ); 547 } // end for itExt 548 } // end for it 549 for ( it = rSources.aFiles.begin(); 550 it != itFilesEnd; 551 ++it ) 552 { 553 aDir.seekp( nProjectDir_AddPosition ); 554 aDir << *it; 555 556 o_rFiles.AddFile( aDir.c_str() ); 557 } // end for it 558 ret += rSources.aFiles.size(); 559 560 return ret; 561 } 562 563 void 564 CommandRunner::CreateHtml_NewStyle() 565 { 566 const ary::cpp::DisplayGate & 567 rGate = pReposy->DisplayGate_Cpp(); 568 569 Dyn< autodoc::HtmlDisplay_UdkStd > pHtmlDisplay; 570 pHtmlDisplay = DisplayToolsFactory_Ifc::GetIt_() 571 .Create_HtmlDisplay_UdkStd(); 572 573 pHtmlDisplay->Run( pCommandLine->Cmd_CreateHtml()->OutputDir(), 574 rGate, 575 DisplayToolsFactory_Ifc::GetIt_().Create_StdFrame() ); 576 } 577 578 void 579 CommandRunner::CreateHtml_OldIdlStyle() 580 { 581 ary::idl::Gate & 582 rAryGate = pNewReposy->Gate_Idl(); 583 584 // Read DevManualLinkFile: 585 // KORR_FUTURE 586 csv::File 587 aFile("devmanref.txt", csv::CFM_READ); 588 if ( aFile.open() ) 589 { 590 rAryGate.Secondaries().Read_Links2DevManual(aFile); 591 aFile.close(); 592 } 593 594 // New Style Output 595 Dyn<autodoc::HtmlDisplay_Idl_Ifc> pNewDisplay; 596 pNewDisplay = DisplayToolsFactory_Ifc::GetIt_() 597 .Create_HtmlDisplay_Idl(); 598 pNewDisplay->Run( pCommandLine->Cmd_CreateHtml()->OutputDir(), 599 rAryGate, 600 DisplayToolsFactory_Ifc::GetIt_().Create_StdFrame() ); 601 } 602 #endif // 0 603 604 } // namespace autodoc 605