summaryrefslogtreecommitdiffstats
path: root/src/fortranscanner.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/fortranscanner.l')
-rw-r--r--src/fortranscanner.l73
1 files changed, 58 insertions, 15 deletions
diff --git a/src/fortranscanner.l b/src/fortranscanner.l
index 0ea16dc..d83fe85 100644
--- a/src/fortranscanner.l
+++ b/src/fortranscanner.l
@@ -111,6 +111,10 @@ static const char *directionStrs[] =
{
"", "intent(in)", "intent(out)", "intent(inout)"
};
+static const char *directionParam[] =
+{
+ "", "[in]", "[out]", "[in,out]"
+};
// }}}
@@ -127,6 +131,8 @@ static QCString inputStringSemi; ///< Input string after command separet
static unsigned int inputPositionPrepass;
static int lineCountPrepass = 0;
+static QList<Entry> subrCurrent;
+
struct CommentInPrepass {
int column;
QCString str;
@@ -185,6 +191,7 @@ static QMap<Entry*,QMap<QCString,SymbolModifiers> > modifiers;
static int yyread(char *buf,int max_size);
static void startCommentBlock(bool);
static void handleCommentBlock(const QCString &doc,bool brief);
+static void subrHandleCommentBlock(const QCString &doc,bool brief);
static void addCurrentEntry();
static void addModule(const char *name, bool isModule=FALSE);
static void addSubprogram(const char *text);
@@ -405,7 +412,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
current->section=Entry::USINGDIR_SEC;
current_root->addSubEntry(current);
current = new Entry;
- current->lang = SrcLangExt_F90;
+ current->lang = SrcLangExt_Fortran;
yy_pop_state();
}
<Use>{ID}/, {
@@ -420,7 +427,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
current->section=Entry::USINGDECL_SEC;
current_root->addSubEntry(current);
current = new Entry ;
- current->lang = SrcLangExt_F90;
+ current->lang = SrcLangExt_Fortran;
}
<Use,UseOnly>"\n" {
yyColNr -= 1;
@@ -430,6 +437,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
/* INTERFACE definitions */
<Start,ModuleBody,SubprogBody>{
+^{BS}interface{IDSYM}+ { /* variable with interface prefix */ }
^{BS}interface { ifType = IF_SPECIFIC;
yy_push_state(InterfaceBody);
// do not start a scope here, every
@@ -647,6 +655,7 @@ private {
if (!endScope(current_root))
yyterminate();
+ subrCurrent.remove(0u);
yy_pop_state() ;
}
<Start,ModuleBody,TypedefBody,SubprogBody>{
@@ -757,8 +766,7 @@ private {
if (!argType.isNull()) parameter->type=argType.stripWhiteSpace();
if (!docBlock.isNull())
{
- parameter->docs += "\n";
- parameter->docs += docBlock;
+ subrHandleCommentBlock(docBlock,TRUE);
}
}
// save, it may be function return type
@@ -769,7 +777,7 @@ private {
else
{
if ((current_root->name.lower() == argName.lower()) ||
- (modifiers[current_root->parent()][current_root->name.lower()].returnName == argName.lower()))
+ (modifiers[current_root->parent()][current_root->name.lower()].returnName.lower() == argName.lower()))
{
int strt = current_root->type.find("function");
QString lft;
@@ -981,7 +989,7 @@ private {
/*---- documentation comments --------------------------------------------------------------------*/
-<Variable,SubprogBody,ModuleBody,TypedefBody>"!<" { /* backward docu comment (only one line) */
+<Variable,SubprogBody,ModuleBody,TypedefBody>"!<" { /* backward docu comment */
if (v_type != V_IGNORE) {
current->docLine = yyLineNr;
docBlockJavaStyle = FALSE;
@@ -992,7 +1000,16 @@ private {
}
}
<DocBackLine>.* { // contents of current comment line
- docBlock=yytext;
+ docBlock+=yytext;
+ }
+<DocBackLine>"\n"{BS}"!"("<"|"!"+) { // comment block (next line is also comment line)
+ docBlock+="\n"; // \n is necessary for lists
+ newLine();
+ }
+<DocBackLine>"\n" { // comment block ends at the end of this line
+ //cout <<"3=========> comment block : "<< docBlock << endl;
+ yyColNr -= 1;
+ unput(*yytext);
if (v_type == V_VARIABLE)
{
Entry *tmp_entry = current;
@@ -1002,11 +1019,12 @@ private {
}
else if (v_type == V_PARAMETER)
{
- parameter->docs+=docBlock;
+ subrHandleCommentBlock(docBlock,TRUE);
}
- yy_pop_state();
- }
-
+ yy_pop_state();
+ docBlock.resize(0);
+ }
+
<Start,SubprogBody,ModuleBody,TypedefBody,InterfaceBody,ModuleBodyContains,SubprogBodyContains,TypedefBodyContains>"!>" {
yy_push_state(YY_START);
current->docLine = yyLineNr;
@@ -1831,7 +1849,7 @@ static void initEntry()
current->mtype = mtype;
current->virt = virt;
current->stat = gstat;
- current->lang = SrcLangExt_F90;
+ current->lang = SrcLangExt_Fortran;
initGroupInfo(current);
}
@@ -1882,6 +1900,7 @@ static void addModule(const char *name, bool isModule)
static void addSubprogram(const char *text)
{
//fprintf(stderr,"1=========> got subprog, type: %s\n",text);
+ subrCurrent.prepend(current);
current->section = Entry::FUNCTION_SEC ;
QCString subtype = text; subtype=subtype.lower().stripWhiteSpace();
current->type += " " + subtype;
@@ -1978,7 +1997,8 @@ static void startCommentBlock(bool brief)
}
}
- //----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
static void handleCommentBlock(const QCString &doc,bool brief)
{
docBlockInBody = FALSE;
@@ -2011,6 +2031,29 @@ static void handleCommentBlock(const QCString &doc,bool brief)
}
//----------------------------------------------------------------------------
+
+static void subrHandleCommentBlock(const QCString &doc,bool brief)
+{
+ Entry *tmp_entry = current;
+ current = subrCurrent.first(); // temporarily switch to the entry of the subroutine / function
+ if (docBlock.stripWhiteSpace().find("\\param") == 0)
+ {
+ handleCommentBlock(doc,brief);
+ }
+ else if (docBlock.stripWhiteSpace().find("@param") == 0)
+ {
+ handleCommentBlock(doc,brief);
+ }
+ else
+ {
+ int dir1 = modifiers[current_root][argName.lower()].direction;
+ handleCommentBlock(QCString("@param ") + directionParam[dir1] + " " +
+ argName + " " + doc,brief);
+ }
+ current=tmp_entry;
+}
+
+//----------------------------------------------------------------------------
static int level=0;
static void debugCompounds(Entry *rt) // print Entry structure (for debugging)
{
@@ -2067,13 +2110,13 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
groupEnterFile(yyFileName,yyLineNr);
current = new Entry;
- current->lang = SrcLangExt_F90;
+ current->lang = SrcLangExt_Fortran;
current->name = yyFileName;
current->section = Entry::SOURCE_SEC;
current_root->addSubEntry(current);
file_root = current;
current = new Entry;
- current->lang = SrcLangExt_F90;
+ current->lang = SrcLangExt_Fortran;
fscanYYrestart( fscanYYin );
{