Skip to content

Commit

Permalink
Convert FORTRAN modules to namespaces
Browse files Browse the repository at this point in the history
This helps fix linking issues and ambiguity related to the difference between classes and modules in FORTRAN 2003+.
  • Loading branch information
hansec committed Nov 21, 2014
1 parent c6e4122 commit be933bf
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 4 deletions.
39 changes: 36 additions & 3 deletions src/fortrancode.l
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ class Scope

static QCString docBlock; //!< contents of all lines of a documentation block
static QCString currentModule=0; //!< name of the current enclosing module
static QCString currentClass=0; //!< name of the current enclosing class
static UseSDict *useMembers= new UseSDict; //!< info about used modules
static UseEntry *useEntry = 0; //!< current use statement info
static QList<Scope> scopeStack;
Expand Down Expand Up @@ -386,8 +387,23 @@ static void writeMultiLineCodeLink(CodeOutputInterface &ol,
}
}
}
//-------------------------------------------------------------------------------
/**
searches for definition of a module (Namespace)
@param mname the name of the module
@param cd the entry, if found or null
@returns true, if module is found
*/
static bool getFortranNamespaceDefs(const QCString &mname,
NamespaceDef *&cd)
{
if (mname.isEmpty()) return FALSE; /* empty name => nothing to link */

// search for module
if ((cd=Doxygen::namespaceSDict->find(mname))) return TRUE;

return FALSE;
}
//-------------------------------------------------------------------------------
/**
searches for definition of a type
Expand Down Expand Up @@ -467,6 +483,7 @@ static bool getFortranDefs(const QCString &memberName, const QCString &moduleNam
{
FileDef *fd=md->getFileDef();
GroupDef *gd=md->getGroupDef();
ClassDef *cd=md->getClassDef();

//cout << "found link with same name: " << fd->fileName() << " " << memberName;
//if (md->getNamespaceDef() != 0) cout << " in namespace " << md->getNamespaceDef()->name();cout << endl;
Expand All @@ -477,7 +494,9 @@ static bool getFortranDefs(const QCString &memberName, const QCString &moduleNam

if (nspace == 0)
{ // found function in global scope
return TRUE;
if(cd == 0) { // Skip if bound to type
return TRUE;
}
}
else if (moduleName == nspace->name())
{ // found in local scope
Expand Down Expand Up @@ -534,7 +553,7 @@ static bool getLink(UseSDict *usedict, // dictonary with used modules
CodeOutputInterface &ol,
const char *text)
{
MemberDef *md;
MemberDef *md=0;
QCString memberName= removeRedundantWhiteSpace(memberText);

if (getFortranDefs(memberName, currentModule, md, usedict) && md->isLinkable())
Expand Down Expand Up @@ -563,6 +582,7 @@ static bool getLink(UseSDict *usedict, // dictonary with used modules
static void generateLink(CodeOutputInterface &ol, char *lname)
{
ClassDef *cd=0;
NamespaceDef *nsd=0;
QCString tmp = lname;
tmp = removeRedundantWhiteSpace(tmp.lower());

Expand All @@ -580,6 +600,12 @@ static void generateLink(CodeOutputInterface &ol, char *lname)
addToSearchIndex(tmp.data());
}
}
// check for module
else if ( (getFortranNamespaceDefs(tmp, nsd)) && nsd->isLinkable() && currentClass!="class" )
{ // write module link
writeMultiLineCodeLink(ol,nsd,tmp);
addToSearchIndex(tmp.data());
}
// check for function/variable
else if (getLink(useMembers, tmp, ol, tmp))
{
Expand Down Expand Up @@ -807,10 +833,12 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
<UseOnly,Import>{BS},{BS} { codifyLines(yytext); }
<UseOnly,Import>{BS}&{BS}"\n" { codifyLines(yytext); YY_FTN_RESET}
<UseOnly>{ID} {
QCString tmp = yytext;
tmp = tmp.lower();
useEntry->onlyNames.append(tmp);
g_insideBody=TRUE;
generateLink(*g_code, yytext);
g_insideBody=FALSE;
useEntry->onlyNames.append(yytext);
}
<Use,UseOnly,Import>"\n" {
unput(*yytext);
Expand Down Expand Up @@ -845,6 +873,7 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
endFontClass();
yy_push_state(YY_START);
BEGIN(ClassName);
currentClass="class";
}
<ClassName>{ID} {
if (currentModule == "module")
Expand All @@ -864,6 +893,10 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I
yy_pop_state();
YY_FTN_REJECT;
}
<Start>"end"({BS_}"type").* { // just reset currentClass, rest is done in following rule
currentClass=0;
YY_FTN_REJECT;
}
<Start>"end"({BS_}"module").* { // just reset currentModule, rest is done in following rule
currentModule=0;
YY_FTN_REJECT;
Expand Down
2 changes: 1 addition & 1 deletion src/fortranscanner.l
Original file line number Diff line number Diff line change
Expand Up @@ -2029,7 +2029,7 @@ static void addModule(const char *name, bool isModule)
DBG_CTX((stderr, "0=========> got module %s\n", name));

if (isModule)
current->section = Entry::CLASS_SEC;
current->section = Entry::NAMESPACE_SEC;
else
current->section = Entry::FUNCTION_SEC;

Expand Down

0 comments on commit be933bf

Please sign in to comment.