summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/code.l36
-rw-r--r--src/doxygen.cpp151
-rw-r--r--src/latexgen.cpp3
-rw-r--r--src/scanner.l52
-rw-r--r--src/util.cpp37
5 files changed, 179 insertions, 100 deletions
diff --git a/src/code.l b/src/code.l
index 7de86ae..b24cd29 100644
--- a/src/code.l
+++ b/src/code.l
@@ -53,7 +53,7 @@
static BaseCodeDocInterface * g_code;
static ClassSDict g_codeClassSDict(17);
-static ClassDef *g_curClassDef;
+//static ClassDef *g_curClassDef;
static QCString g_curClassName;
static QStrList g_curClassBases;
@@ -99,6 +99,7 @@ static int g_sharpCount = 0;
static int g_lastSpecialCContext;
static int g_lastStringContext;
+static int g_lastVerbStringContext;
static int g_memCallContext;
static int g_lastCContext;
@@ -733,7 +734,8 @@ static void generateClassOrGlobalLink(BaseCodeDocInterface &ol,char *clName,
if (md==0) // not found as a typedef
{
md = setCallContextForVar(clName);
- if (md && g_currentDefinition!=0 && !isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1)
+ if (md && g_currentDefinition!=0 &&
+ isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1)
{
md=0; // variable not accessible
}
@@ -1084,6 +1086,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
%option noyywrap
%x SkipString
+%x SkipVerbString
%x SkipCPP
%x SkipComment
%x SkipCxxComment
@@ -1300,9 +1303,9 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
//printf("***** g_curClassName=%s\n",g_curClassName.data());
if (getResolvedClass(g_currentDefinition,g_sourceFileDef,g_curClassName)==0)
{
- g_curClassDef=new ClassDef("<code>",1,
+ ClassDef *ncd=new ClassDef("<code>",1,
g_curClassName,ClassDef::Class);
- g_codeClassSDict.append(g_curClassName,g_curClassDef);
+ g_codeClassSDict.append(g_curClassName,ncd);
// insert base classes.
char *s=g_curClassBases.first();
while (s)
@@ -1312,7 +1315,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
if (bcd==0) bcd=getResolvedClass(g_currentDefinition,g_sourceFileDef,s);
if (bcd)
{
- g_curClassDef->insertBaseClass(bcd,s,Public,Normal);
+ ncd->insertBaseClass(bcd,s,Public,Normal);
}
s=g_curClassBases.next();
}
@@ -1497,6 +1500,23 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
<SkipString>\\. {
g_code->codify(yytext);
}
+<SkipVerbString>[^"\n]+ {
+ g_code->codify(yytext);
+ }
+<SkipVerbString>\"\" { // escaped quote
+ g_code->codify(yytext);
+ }
+<SkipVerbString>\" { // end of string
+ g_code->codify(yytext);
+ endFontClass();
+ BEGIN( g_lastVerbStringContext );
+ }
+<SkipVerbString>. {
+ g_code->codify(yytext);
+ }
+<SkipVerbString>\n {
+ g_code->codify(yytext);
+ }
<Body>":" {
g_code->codify(yytext);
g_name.resize(0);g_type.resize(0);
@@ -2069,6 +2089,12 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
}
BEGIN( SkipComment ) ;
}
+<*>@\" { // C# verbatim string
+ startFontClass("stringliteral");
+ g_code->codify(yytext);
+ g_lastVerbStringContext=YY_START;
+ BEGIN(SkipVerbString);
+ }
<*>"//" {
startFontClass("comment");
g_code->codify(yytext);
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 03db72d..6e0a6a4 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -2289,88 +2289,91 @@ static void buildFunctionList(Entry *root)
//printf("combining function with prototype found=%d in namespace %s\n",
// found,nsName.data());
- // merge argument lists
- //mergeArguments(root->argList,md->argumentList());
- // merge documentation
- if (md->documentation().isEmpty() && !root->doc.isEmpty())
+ if (found)
{
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setDocsForDefinition(!root->proto);
- ArgumentList *argList = new ArgumentList;
- stringToArgumentList(root->args,argList);
- //printf("root->argList=%p\n",root->argList);
- //if (root->argList)
- //{
- // ArgumentListIterator ali1(*root->argList);
- // ArgumentListIterator ali2(*argList);
- // Argument *sa,*da;
- // for (;(sa=ali1.current()) && (da=ali2.current());++ali1,++ali2)
- // {
- // printf("sa->name=%s (doc=%s) da->name=%s (doc=%s)\n",
- // sa->name.data(),sa->docs.data(),
- // da->name.data(),da->docs.data()
- // );
- // if (!sa->docs.isEmpty() && da->docs.isEmpty())
- // {
- // da->docs=sa->docs.copy();
- // }
- // }
- //}
- if (root->proto)
+ // merge argument lists
+ //mergeArguments(root->argList,md->argumentList());
+ // merge documentation
+ if (md->documentation().isEmpty() && !root->doc.isEmpty())
{
- //printf("setDeclArgumentList to %p\n",argList);
- md->setDeclArgumentList(argList);
+ md->setDocumentation(root->doc,root->docFile,root->docLine);
+ md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
+ md->setDocsForDefinition(!root->proto);
+ ArgumentList *argList = new ArgumentList;
+ stringToArgumentList(root->args,argList);
+ //printf("root->argList=%p\n",root->argList);
+ //if (root->argList)
+ //{
+ // ArgumentListIterator ali1(*root->argList);
+ // ArgumentListIterator ali2(*argList);
+ // Argument *sa,*da;
+ // for (;(sa=ali1.current()) && (da=ali2.current());++ali1,++ali2)
+ // {
+ // printf("sa->name=%s (doc=%s) da->name=%s (doc=%s)\n",
+ // sa->name.data(),sa->docs.data(),
+ // da->name.data(),da->docs.data()
+ // );
+ // if (!sa->docs.isEmpty() && da->docs.isEmpty())
+ // {
+ // da->docs=sa->docs.copy();
+ // }
+ // }
+ //}
+ if (root->proto)
+ {
+ //printf("setDeclArgumentList to %p\n",argList);
+ md->setDeclArgumentList(argList);
+ }
+ else
+ {
+ md->setArgumentList(argList);
+ }
}
- else
+ else if (!md->documentation().isEmpty() && !root->doc.isEmpty() && nd==rnd)
{
- md->setArgumentList(argList);
+ warn(root->docFile,root->docLine,"Warning: member %s: ignoring the detailed description found here, since another one was found at line %d of file %s!",md->name().data(),md->docLine(),md->docFile().data());
}
- }
- else if (!md->documentation().isEmpty() && !root->doc.isEmpty())
- {
- warn(root->docFile,root->docLine,"Warning: member %s: ignoring the detailed description found here, since another one was found at line %d of file %s!",md->name().data(),md->docLine(),md->docFile().data());
- }
- if (md->briefDescription().isEmpty() && !root->brief.isEmpty())
- {
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- }
- else if (!md->briefDescription().isEmpty() && !root->brief.isEmpty())
- {
- warn(root->briefFile,root->briefLine,"Warning: member %s: ignoring the brief description found here, since another one was found at line %d of file %s!",md->name().data(),md->briefLine(),md->briefFile().data());
- }
-
- md->addSectionsToDefinition(root->anchors);
+ if (md->briefDescription().isEmpty() && !root->brief.isEmpty())
+ {
+ md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ }
+ else if (!md->briefDescription().isEmpty() && !root->brief.isEmpty() && nd==rnd)
+ {
+ warn(root->briefFile,root->briefLine,"Warning: member %s: ignoring the brief description found here, since another one was found at line %d of file %s!",md->name().data(),md->briefLine(),md->briefFile().data());
+ }
- md->enableCallGraph(md->hasCallGraph() || root->callGraph);
+ md->addSectionsToDefinition(root->anchors);
- // merge ingroup specifiers
- if (md->getGroupDef()==0 && root->groups->first()!=0)
- {
- //printf("new member is grouped, existing member not\n");
- // if we do addMemberToGroups here an undocumented declaration may prevent
- // the documented implementation below it from being added
- //addMemberToGroups(root,md);
- //GroupDef *gd=Doxygen::groupSDict[root->groups->first()->groupname.data()];
- //if (gd)
- //{
- // bool success = gd->insertMember(md);
- // if (success)
- // {
- // md->setGroupDef(gd, root->groups->first()->pri, root->fileName, root->startLine, !root->doc.isEmpty());
- // }
- //}
- addMemberToGroups(root,md);
- }
- else if (md->getGroupDef()!=0 && root->groups->count()==0)
- {
- //printf("existing member is grouped, new member not\n");
- root->groups->append(new Grouping(md->getGroupDef()->name(), md->getGroupPri()));
- }
- else if (md->getGroupDef()!=0 && root->groups->first()!=0)
- {
- //printf("both members are grouped\n");
+ md->enableCallGraph(md->hasCallGraph() || root->callGraph);
+
+ // merge ingroup specifiers
+ if (md->getGroupDef()==0 && root->groups->first()!=0)
+ {
+ //printf("new member is grouped, existing member not\n");
+ // if we do addMemberToGroups here an undocumented declaration may prevent
+ // the documented implementation below it from being added
+ //addMemberToGroups(root,md);
+ //GroupDef *gd=Doxygen::groupSDict[root->groups->first()->groupname.data()];
+ //if (gd)
+ //{
+ // bool success = gd->insertMember(md);
+ // if (success)
+ // {
+ // md->setGroupDef(gd, root->groups->first()->pri, root->fileName, root->startLine, !root->doc.isEmpty());
+ // }
+ //}
+ addMemberToGroups(root,md);
+ }
+ else if (md->getGroupDef()!=0 && root->groups->count()==0)
+ {
+ //printf("existing member is grouped, new member not\n");
+ root->groups->append(new Grouping(md->getGroupDef()->name(), md->getGroupPri()));
+ }
+ else if (md->getGroupDef()!=0 && root->groups->first()!=0)
+ {
+ //printf("both members are grouped\n");
+ }
}
}
}
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 273dd74..b80fea0 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -248,7 +248,8 @@ static void writeDefaultHeaderPart1(QTextStream &t)
"\\usepackage{float}\n"
"\\usepackage{textcomp}\n"
"\\usepackage{alltt}\n"
- "\\usepackage{ae,aecompl,aeguill}\n";
+ //"\\usepackage{ae,aecompl,aeguill}\n"
+ ;
if (Config_getBool("PDF_HYPERLINKS"))
{
t << "\\usepackage{times}" << endl;
diff --git a/src/scanner.l b/src/scanner.l
index 98a568a..e4f12a4 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -79,6 +79,7 @@ static int lastSkipHtmlCommentContext;
static int lastIfContext;
static int lastInternalDocContext;
static int lastPreLineCtrlContext;
+static int lastSkipVerbStringContext;;
static int nextDefContext;
static int overloadContext;
static Protection protection;
@@ -143,6 +144,7 @@ static QCString *pCopyRoundString;
static QCString *pCopyCurlyString;
static QCString *pCopyQuotedString;
static QCString *pSkipDoc;
+static QCString *pSkipVerbString;
static QStack<Grouping> autoGroupStack;
static Grouping lastDefGroup( "", Grouping::GROUPING_LOWEST );
@@ -719,6 +721,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
%x DefinePHP
%x DefinePHPEnd
%x OldStyleArgs
+%x SkipVerbString
%%
@@ -1769,6 +1772,31 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
current->initializer+=*yytext;
yyLineNr++;
}
+<ReadInitializer>"@\"" {
+ current->initializer+=yytext;
+ if (!insideCS) REJECT;
+ // C# verbatim string
+ lastSkipVerbStringContext=YY_START;
+ pSkipVerbString=&current->initializer;
+ BEGIN(SkipVerbString);
+ }
+<SkipVerbString>[^\n"]+ {
+ *pSkipVerbString+=yytext;
+ }
+<SkipVerbString>"\"\"" { // quote escape
+ *pSkipVerbString+=yytext;
+ }
+<SkipVerbString>"\"" {
+ *pSkipVerbString+=*yytext;
+ BEGIN(lastSkipVerbStringContext);
+ }
+<SkipVerbString>\n {
+ *pSkipVerbString+=*yytext;
+ yyLineNr++;
+ }
+<SkipVerbString>. {
+ *pSkipVerbString+=*yytext;
+ }
<ReadInitializer>. {
current->initializer+=*yytext;
}
@@ -1991,13 +2019,18 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
/*
<FindFieldArg>"," { unput(*yytext); BEGIN(FindFields); }
*/
-<ReadBody,ReadNSBody>[^\r\n\#{}"'/]* { current->program += yytext ; }
+<ReadBody,ReadNSBody>[^\r\n\#{}"@'/]* { current->program += yytext ; }
<ReadBody,ReadNSBody>"//".* { current->program += yytext ; }
<ReadBody,ReadNSBody>"#".* { if (! insidePHP)
REJECT;
current->program += yytext ;
}
-<ReadBody,ReadNSBody>\" { current->program += yytext ;
+<ReadBody,ReadNSBody>@\" { current->program += yytext ;
+ pSkipVerbString = &current->program;
+ lastSkipVerbStringContext=YY_START;
+ BEGIN( SkipVerbString );
+ }
+<ReadBody,ReadNSBody>\" { current->program += yytext ;
pCopyQuotedString = &current->program;
lastStringContext=YY_START;
BEGIN( CopyString );
@@ -2011,8 +2044,8 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
lastContext = ReadBody ;
BEGIN( Comment ) ;
}
-<ReadBody,ReadNSBody>{CHARLIT} { current->program += yytext; }
-<ReadBody,ReadNSBody>"{" { current->program += yytext ;
+<ReadBody,ReadNSBody>{CHARLIT} { current->program += yytext; }
+<ReadBody,ReadNSBody>"{" { current->program += yytext ;
++curlyCount ;
}
<ReadBody,ReadNSBody>"}" { //err("ReadBody count=%d\n",curlyCount);
@@ -2992,7 +3025,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
yyLineNr++;
//addToBody(yytext);
}
-<SkipCurly,SkipCurlyCpp>[^\n"'\\/{}]+ {
+<SkipCurly,SkipCurlyCpp>[^\n"'@\\/{}]+ {
//addToBody(yytext);
}
<SkipCurlyCpp>\n {
@@ -3033,6 +3066,13 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
lastCContext = YY_START;
BEGIN(SkipCxxComment);
}
+<SkipInits,SkipCurly,SkipCurlyCpp>@\" {
+ if (! insideCS) REJECT;
+ // C# verbatim string
+ lastSkipVerbStringContext=YY_START;
+ pSkipVerbString=&current->initializer;
+ BEGIN(SkipVerbString);
+ }
<SkipInits,SkipCurly,SkipCurlyCpp>{CHARLIT} {
}
<SkipInits,SkipCurly,SkipCurlyCpp>. {
@@ -3657,7 +3697,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
current->name = "mainpage";
BEGIN( PageDocArg2 );
}
-<Doc,JavaDoc>{B}*{CMD}"file"{B}* {
+<Doc,LineDoc,JavaDoc>{B}*{CMD}"file"{B}* {
current->section = Entry::FILEDOC_SEC;
current->fileName = yyFileName;
current->startLine = yyLineNr;
diff --git a/src/util.cpp b/src/util.cpp
index 4a0e1ab..d268f8e 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -565,6 +565,7 @@ int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item,
*/
ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,QCString *pTemplSpec)
{
+ //printf("newResolveTypedef(md=%p,cachedVal=%p)\n",md,md->getCachedTypedefVal());
bool isCached = md->isTypedefValCached(); // value already cached
if (isCached)
{
@@ -606,7 +607,14 @@ ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,QCString *pTemplSpe
}
// remember computed value for next time
- md->cacheTypedefVal(result);
+ if (result && result->getDefFileName()!="<code>")
+ // this check is needed to prevent that temporary classes that are
+ // introduced while parsing code fragments are being cached here.
+ {
+ //printf("setting cached typedef %p in result %p\n",md,result);
+ //printf("==> %s (%s,%d)\n",result->name().data(),result->getDefFileName().data(),result->getDefLine());
+ md->cacheTypedefVal(result);
+ }
g_resolvedTypedefs.remove(qname); // remove from the trace list
@@ -3542,10 +3550,10 @@ QCString stripScope(const char *name)
}
/*! Convert nibble (range 0..15) to hex char */
-static char nibbleToHex(int n)
-{
- return (n < 10) ? ('0'+n) : ('a'+n-10);
-}
+//static char nibbleToHex(int n)
+//{
+// return (n < 10) ? ('0'+n) : ('a'+n-10);
+//}
/*! Converts a string to an XML-encoded string */
QCString convertToXML(const char *s)
@@ -3564,16 +3572,17 @@ QCString convertToXML(const char *s)
case '\'': result+="&apos;"; break;
case '"': result+="&quot;"; break;
default:
- if (c<0)
- {
- result+=(QCString)"&#x" +
- nibbleToHex((((uchar)c)>>4)&0xf)+
- nibbleToHex(c&0xf)+";";
- }
- else
- {
+ //if (c<0)
+ //{ <- this doesn't work for languages that use
+ // characters with codes beyond 255
+ // result+=(QCString)"&#x" +
+ // nibbleToHex((((uchar)c)>>4)&0xf)+
+ // nibbleToHex(c&0xf)+";";
+ //}
+ //else
+ //{
result+=c;
- }
+ //}
break;
}
}