blob: eb5b2d11d2a3c91ae092229abf172db225619a91 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <precomp.h>
#include "cmd_run.hxx"
// NOT FULLY DEFINED SERVICES
#include <cosv/file.hxx>
#include <cosv/x.hxx>
#include <ary/ary.hxx>
#include <ary/cpp/c_gate.hxx>
#include <ary/idl/i_ce.hxx>
#include <ary/idl/i_gate.hxx>
#include <ary/idl/i_module.hxx>
#include <ary/idl/ip_ce.hxx>
#include <autodoc/filecoli.hxx>
#include <autodoc/parsing.hxx>
#include <autodoc/prs_code.hxx>
#include <autodoc/prs_docu.hxx>
#include <parser/unoidl.hxx>
#include <adc_cl.hxx>
#include "adc_cmd_parse.hxx"
#include "adc_cmds.hxx"
namespace autodoc
{
namespace command
{
namespace run
{
Parser::Parser( const Parse & i_command )
: rCommand(i_command),
pCppParser(),
pCppDocuInterpreter(),
pIdlParser()
{
}
Parser::~Parser()
{
}
bool
Parser::Perform()
{
Cout() << "Parsing the repository "
<< rCommand.ReposyName()
<< " ..."
<< Endl();
try
{
::ary::Repository &
rAry = CommandLine::Get_().TheRepository();
rAry.Set_Title(rCommand.ReposyName());
Dyn< FileCollector_Ifc >
pFiles( ParseToolsFactory().Create_FileCollector(6000) );
bool bIDL = false;
bool bCpp = false;
command::Parse::ProjectIterator
itEnd = rCommand.ProjectsEnd();
for ( command::Parse::ProjectIterator it = rCommand.ProjectsBegin();
it != itEnd;
++it )
{
uintt nCount = GatherFiles( *pFiles, *(*it) );
Cout() << nCount
<< " files found to parse in project "
<< (*it)->Name()
<< "."
<< Endl();
switch ( (*it)->Language().eLanguage )
{
case command::S_LanguageInfo::idl:
{
Get_IdlParser().Run(*pFiles);
bIDL = true;
} break;
case command::S_LanguageInfo::cpp:
{
Get_CppParser().Run( *pFiles );
bCpp = true;
} break;
default:
Cerr() << "Project in yet unimplemented language skipped."
<< Endl();
}
} // end for
if (bCpp)
{
rAry.Gate_Cpp().Calculate_AllSecondaryInformation();
}
if (bIDL)
{
rAry.Gate_Idl().Calculate_AllSecondaryInformation(
rCommand.DevelopersManual_RefFilePath() );
// ::ary::idl::SecondariesPilot &
// rIdl2sPilot = rAry.Gate_Idl().Secondaries();
//
// rIdl2sPilot.CheckAllInterfaceBases( rAry.Gate_Idl() );
// rIdl2sPilot.Connect_Types2Ces();
// rIdl2sPilot.Gather_CrossReferences();
//
// if (NOT rCommand.DevelopersManual_RefFilePath().empty())
// {
// csv::File
// aFile(rCommand.DevelopersManual_RefFilePath(), csv::CFM_READ);
// if ( aFile.open() )
// {
// rIdl2sPilot.Read_Links2DevManual(aFile);
// aFile.close();
// }
// }
} // endif (bIDL)
return true;
} // end try
catch (csv::Exception & xx)
{
xx.GetInfo(Cerr());
Cerr() << " program will exit." << Endl();
return false;
}
}
CodeParser_Ifc &
Parser::Get_CppParser()
{
if ( NOT pCppParser )
Create_CppParser();
return *pCppParser;
}
IdlParser &
Parser::Get_IdlParser()
{
if ( NOT pIdlParser )
Create_IdlParser();
return *pIdlParser;
}
void
Parser::Create_CppParser()
{
pCppParser = ParseToolsFactory().Create_Parser_Cplusplus();
pCppDocuInterpreter = ParseToolsFactory().Create_DocuParser_AutodocStyle();
pCppParser->Setup( CommandLine::Get_().TheRepository(),
*pCppDocuInterpreter );
}
void
Parser::Create_IdlParser()
{
pIdlParser = new IdlParser(CommandLine::Get_().TheRepository());
}
const ParseToolsFactory_Ifc &
Parser::ParseToolsFactory()
{
return ParseToolsFactory_Ifc::GetIt_();
}
uintt
Parser::GatherFiles( FileCollector_Ifc & o_rFiles,
const S_ProjectData & i_rProject )
{
uintt ret = 0;
o_rFiles.EraseAll();
typedef StringVector StrVector;
typedef StrVector::const_iterator StrIterator;
const S_Sources &
rSources = i_rProject.Sources();
const StrVector &
rExtensions = i_rProject.Language().aExtensions;
StrIterator it;
StrIterator itTreesEnd = rSources.aTrees.end();
StrIterator itDirsEnd = rSources.aDirectories.end();
StrIterator itFilesEnd = rSources.aFiles.end();
StrIterator itExt;
StrIterator itExtEnd = rExtensions.end();
csv::StreamStr aDir(500);
i_rProject.RootDirectory().Get( aDir );
uintt nProjectDir_AddPosition =
( strcmp(aDir.c_str(),".\\") == 0 OR strcmp(aDir.c_str(),"./") == 0 )
? 0
: uintt( aDir.tellp() );
for ( it = rSources.aDirectories.begin();
it != itDirsEnd;
++it )
{
aDir.seekp( nProjectDir_AddPosition );
aDir << *it;
for ( itExt = rExtensions.begin();
itExt != itExtEnd;
++itExt )
{
ret += o_rFiles.AddFilesFrom( aDir.c_str(),
*itExt,
FileCollector_Ifc::flat );
} // end for itExt
} // end for it
for ( it = rSources.aTrees.begin();
it != itTreesEnd;
++it )
{
aDir.seekp( nProjectDir_AddPosition );
aDir << *it;
for ( itExt = rExtensions.begin();
itExt != itExtEnd;
++itExt )
{
ret += o_rFiles.AddFilesFrom( aDir.c_str(),
*itExt,
FileCollector_Ifc::recursive );
} // end for itExt
} // end for it
for ( it = rSources.aFiles.begin();
it != itFilesEnd;
++it )
{
aDir.seekp( nProjectDir_AddPosition );
aDir << *it;
o_rFiles.AddFile( aDir.c_str() );
} // end for it
ret += rSources.aFiles.size();
return ret;
}
} // namespace run
} // namespace command
#if 0
inline const ParseToolsFactory_Ifc &
CommandRunner::ParseToolsFactory()
{ return ParseToolsFactory_Ifc::GetIt_(); }
inline const command::S_LanguageInfo &
CommandRunner::Get_ProjectLanguage( const command::Parse & i_rCommand,
const command::S_ProjectData & i_rProject )
{
if ( i_rProject.pLanguage )
return *i_rProject.pLanguage;
return *i_rCommand.GlobalLanguageInfo();
}
inline bool
CommandRunner::HasParsedCpp() const
{ return pCppParser; }
inline bool
CommandRunner::HasParsedIdl() const
{ return pIdlParser; }
CommandRunner::CommandRunner()
: pCommandLine(0),
pReposy(0),
pNewReposy(0),
nResultCode(0)
{
Cout() << "\nAutodoc version 2.2.1"
<< "\n-------------------"
<< "\n" << Endl();
}
CommandRunner::~CommandRunner()
{
ary::Repository::Destroy_();
Cout() << "\n" << Endl();
}
void
CommandRunner::Run( const CommandLine & i_rCL )
{
ary::Repository::Destroy_();
// ary::Repository::Destroy_();
pReposy = 0;
pNewReposy = 0;
nResultCode = 0;
pCommandLine = &i_rCL;
pCommandLine->Run();
}
void
CommandRunner::Parse()
{
try
{
csv_assert( pCommandLine->Cmd_Parse() != 0 );
const command::Parse &
rCmd = *pCommandLine->Cmd_Parse();
Cout() << "Parsing the repository "
<< rCmd.ReposyName()
<< " ..."
<< Endl();
if ( pReposy == 0 )
pReposy = & ary::Repository::Create_( rCmd.ReposyName(), 0 );
if ( pNewReposy == 0 )
pNewReposy = & ary::Repository::Create_( rCmd.ReposyName() );
Dyn< FileCollector_Ifc > pFiles;
pFiles = ParseToolsFactory().Create_FileCollector(6000);
bool bCpp = false;
bool bIDL = false;
command::Parse::ProjectIterator itEnd = rCmd.ProjectsEnd();
for ( command::Parse::ProjectIterator it = rCmd.ProjectsBegin();
it != itEnd;
++it )
{
uintt nCount = GatherFiles( *pFiles, rCmd, *(*it) );
Cout() << nCount
<< " files found to parse in project "
<< (*it)->Name()
<< "."
<< Endl();
switch ( Get_ProjectLanguage(rCmd, *(*it)).eLanguage )
{
case command::S_LanguageInfo::cpp:
{
Get_CppParser().Run( (*it)->Name(),
(*it)->RootDirectory(),
*pFiles );
bCpp = true;
} break;
case command::S_LanguageInfo::idl:
{
Get_IdlParser().Run(*pFiles);
bIDL = true;
} break;
default:
Cerr() << "Project in yet unimplemented language skipped."
<< Endl();
}
} // end for
if (bCpp)
pReposy->RwGate_Cpp().Connect_AllTypes_2_TheirRelated_CodeEntites();
if (bIDL)
{
pNewReposy->Gate_Idl().Secondaries().Connect_Types2Ces();
pNewReposy->Gate_Idl().Secondaries().Gather_CrossReferences();
}
} // end try
catch (csv::Exception & xx)
{
xx.GetInfo(Cerr());
Cerr() << " program will exit." << Endl();
nResultCode = 1;
}
catch (...)
{
Cerr() << "Unknown exception - program will exit." << Endl();
nResultCode = 1;
}
}
void
CommandRunner::Load()
{
Cout() << "This would load the repository from the directory "
<< pCommandLine->Cmd_Load()->ReposyDir()
<< "."
<< Endl();
}
void
CommandRunner::Save()
{
Cout() << "This would save the repository into the directory "
<< pCommandLine->Cmd_Save()->ReposyDir()
<< "."
<< Endl();
}
void
CommandRunner::CreateHtml()
{
Cout() << "Creating HTML-output into the directory "
<< pCommandLine->Cmd_CreateHtml()->OutputDir()
<< "."
<< Endl();
if ( HasParsedCpp() )
CreateHtml_NewStyle();
if ( HasParsedIdl() )
CreateHtml_OldIdlStyle();
}
void
CommandRunner::CreateXml()
{
Cout() << "This would create the XML-output into the directory "
<< pCommandLine->Cmd_CreateXml()->OutputDir()
<< "."
<< Endl();
}
CodeParser_Ifc &
CommandRunner::Get_CppParser()
{
if ( NOT pCppParser )
Create_CppParser();
return *pCppParser;
}
IdlParser &
CommandRunner::Get_IdlParser()
{
if ( NOT pIdlParser )
Create_IdlParser();
return *pIdlParser;
}
void
CommandRunner::Create_CppParser()
{
pCppParser = ParseToolsFactory().Create_Parser_Cplusplus();
pCppDocuInterpreter = ParseToolsFactory().Create_DocuParser_AutodocStyle();
pCppParser->Setup( *pReposy,
*pCppDocuInterpreter );
}
void
CommandRunner::Create_IdlParser()
{
pIdlParser = new IdlParser(*pNewReposy);
}
uintt
CommandRunner::GatherFiles( FileCollector_Ifc & o_rFiles,
const command::Parse & i_rCommand,
const command::S_ProjectData & i_rProject )
{
uintt ret = 0;
o_rFiles.EraseAll();
typedef StringVector StrVector;
typedef StrVector::const_iterator StrIterator;
const command::S_Sources &
rSources = i_rProject.aFiles;
const StrVector &
rExtensions = Get_ProjectLanguage(i_rCommand,i_rProject).aExtensions;
StrIterator it;
StrIterator itDirsEnd = rSources.aDirectories.end();
StrIterator itTreesEnd = i_rProject.aFiles.aTrees.end();
StrIterator itFilesEnd = i_rProject.aFiles.aFiles.end();
StrIterator itExt;
StrIterator itExtEnd = rExtensions.end();
csv::StreamStr aDir(500);
i_rProject.aRootDirectory.Get( aDir );
uintt nProjectDir_AddPosition =
( strcmp(aDir.c_str(),".\\") == 0 OR strcmp(aDir.c_str(),"./") == 0 )
? 0
: uintt( aDir.tellp() );
for ( it = rSources.aDirectories.begin();
it != itDirsEnd;
++it )
{
aDir.seekp( nProjectDir_AddPosition );
aDir << *it;
for ( itExt = rExtensions.begin();
itExt != itExtEnd;
++itExt )
{
ret += o_rFiles.AddFilesFrom( aDir.c_str(),
*itExt,
FileCollector_Ifc::flat );
} // end for itExt
} // end for it
for ( it = rSources.aTrees.begin();
it != itTreesEnd;
++it )
{
aDir.seekp( nProjectDir_AddPosition );
aDir << *it;
for ( itExt = rExtensions.begin();
itExt != itExtEnd;
++itExt )
{
ret += o_rFiles.AddFilesFrom( aDir.c_str(),
*itExt,
FileCollector_Ifc::recursive );
} // end for itExt
} // end for it
for ( it = rSources.aFiles.begin();
it != itFilesEnd;
++it )
{
aDir.seekp( nProjectDir_AddPosition );
aDir << *it;
o_rFiles.AddFile( aDir.c_str() );
} // end for it
ret += rSources.aFiles.size();
return ret;
}
void
CommandRunner::CreateHtml_NewStyle()
{
const ary::cpp::DisplayGate &
rGate = pReposy->DisplayGate_Cpp();
Dyn< autodoc::HtmlDisplay_UdkStd > pHtmlDisplay;
pHtmlDisplay = DisplayToolsFactory_Ifc::GetIt_()
.Create_HtmlDisplay_UdkStd();
pHtmlDisplay->Run( pCommandLine->Cmd_CreateHtml()->OutputDir(),
rGate,
DisplayToolsFactory_Ifc::GetIt_().Create_StdFrame() );
}
void
CommandRunner::CreateHtml_OldIdlStyle()
{
ary::idl::Gate &
rAryGate = pNewReposy->Gate_Idl();
// Read DevManualLinkFile:
// KORR_FUTURE
csv::File
aFile("devmanref.txt", csv::CFM_READ);
if ( aFile.open() )
{
rAryGate.Secondaries().Read_Links2DevManual(aFile);
aFile.close();
}
// New Style Output
Dyn<autodoc::HtmlDisplay_Idl_Ifc> pNewDisplay;
pNewDisplay = DisplayToolsFactory_Ifc::GetIt_()
.Create_HtmlDisplay_Idl();
pNewDisplay->Run( pCommandLine->Cmd_CreateHtml()->OutputDir(),
rAryGate,
DisplayToolsFactory_Ifc::GetIt_().Create_StdFrame() );
}
#endif // 0
} // namespace autodoc