summaryrefslogtreecommitdiffstats
path: root/src/code.l
diff options
context:
space:
mode:
authorDimitri van Heesch <dimitri@stack.nl>2016-05-10 19:29:45 (GMT)
committerDimitri van Heesch <dimitri@stack.nl>2016-05-10 19:29:45 (GMT)
commitc2e0ce14c65584f42e875f0abdbe5466d1414636 (patch)
tree4d59efef344bf300fd6f2a8461fd97038e0d5c8d /src/code.l
parent5a7a5477cd60ea7cc10b8132862a4928af788028 (diff)
downloadDoxygen-c2e0ce14c65584f42e875f0abdbe5466d1414636.zip
Doxygen-c2e0ce14c65584f42e875f0abdbe5466d1414636.tar.gz
Doxygen-c2e0ce14c65584f42e875f0abdbe5466d1414636.tar.bz2
Bug 749924 - Doxygen handles comments in Objective-C code blocks incorrectly.
Diffstat (limited to 'src/code.l')
-rw-r--r--src/code.l64
1 files changed, 56 insertions, 8 deletions
diff --git a/src/code.l b/src/code.l
index 6bdab83..60d4b03 100644
--- a/src/code.l
+++ b/src/code.l
@@ -109,6 +109,7 @@ static int g_lastSpecialCContext;
static int g_lastStringContext;
static int g_lastSkipCppContext;
static int g_lastVerbStringContext;
+static int g_lastObjCCallContext;
static int g_memCallContext;
static int g_lastCContext;
static int g_skipInlineInitContext;
@@ -132,6 +133,7 @@ struct ObjCCallCtx
int id;
QCString methodName;
QCString objectTypeOrName;
+ QGString comment;
ClassDef *objectType;
MemberDef *objectVar;
MemberDef *method;
@@ -146,11 +148,13 @@ static int g_currentCtxId=0;
static int g_currentNameId=0;
static int g_currentObjId=0;
static int g_currentWordId=0;
+static int g_currentCommentId=0;
static QStack<ObjCCallCtx> g_contextStack;
static QIntDict<ObjCCallCtx> g_contextDict;
static QIntDict<QCString> g_nameDict;
static QIntDict<QCString> g_objectDict;
static QIntDict<QCString> g_wordDict;
+static QIntDict<QCString> g_commentDict;
static int g_braceCount=0;
static void saveObjCContext();
@@ -1714,6 +1718,21 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
codifyLines(pWord->data());
}
}
+ else if (nc=='d') // comment block
+ {
+ nc=*p++;
+ QCString refIdStr;
+ while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
+ p--;
+ int refId=refIdStr.toInt();
+ QCString *pComment = g_commentDict.find(refId);
+ if (pComment)
+ {
+ startFontClass("comment");
+ codifyLines(pComment->data());
+ endFontClass();
+ }
+ }
else // illegal marker
{
ASSERT(!"invalid escape sequence");
@@ -1726,7 +1745,7 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
s[0]=c;s[1]=0;
codifyLines(s);
}
- }
+ }
//printf("%s %s]\n",ctx->objectTypeOrName.data(),ctx->methodName.data());
//printf("}=(type='%s',name='%s')",
// ctx->objectTypeOrName.data(),
@@ -1763,6 +1782,15 @@ static QCString escapeWord(const char *s)
return result;
}
+static QCString escapeComment(const char *s)
+{
+ QCString result;
+ result.sprintf("$d%d",g_currentCommentId);
+ g_commentDict.insert(g_currentCommentId,new QCString(s));
+ g_currentCommentId++;
+ return result;
+}
+
/* -----------------------------------------------------------------
*/
#undef YY_INPUT
@@ -1836,6 +1864,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
%x ObjCCall
%x ObjCMName
%x ObjCSkipStr
+%x ObjCCallComment
%x OldStyleArgs
%x UsingName
%x RawString
@@ -2732,10 +2761,12 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
g_nameDict.setAutoDelete(TRUE);
g_objectDict.setAutoDelete(TRUE);
g_wordDict.setAutoDelete(TRUE);
+ g_commentDict.setAutoDelete(TRUE);
g_contextDict.clear();
g_nameDict.clear();
g_objectDict.clear();
g_wordDict.clear();
+ g_commentDict.clear();
g_currentCtxId = 0;
g_currentNameId = 0;
g_currentObjId = 0;
@@ -2820,13 +2851,13 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
BEGIN(Body);
}
*/
-<ObjCCall,ObjCMName>"[" {
- saveObjCContext();
- g_currentCtx->format+=*yytext;
- BEGIN(ObjCCall);
- //printf("open\n");
- }
-<ObjCCall,ObjCMName>"]" {
+<ObjCCall,ObjCMName>"["|"{" {
+ saveObjCContext();
+ g_currentCtx->format+=*yytext;
+ BEGIN(ObjCCall);
+ //printf("open\n");
+ }
+<ObjCCall,ObjCMName>"]"|"}" {
g_currentCtx->format+=*yytext;
restoreObjCContext();
BEGIN(ObjCMName);
@@ -2838,6 +2869,23 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
}
//printf("close\n");
}
+<ObjCCall,ObjCMName>"//".* {
+ g_currentCtx->format+=escapeComment(yytext);
+ }
+<ObjCCall,ObjCMName>"/*" {
+ g_lastObjCCallContext = YY_START;
+ g_currentCtx->comment=yytext;
+ BEGIN(ObjCCallComment);
+ }
+<ObjCCallComment>"*/" {
+ g_currentCtx->comment+=yytext;
+ g_currentCtx->format+=escapeComment(g_currentCtx->comment);
+ BEGIN(g_lastObjCCallContext);
+ }
+<ObjCCallComment>[^*\n]+ { g_currentCtx->comment+=yytext; }
+<ObjCCallComment>"//"|"/*" { g_currentCtx->comment+=yytext; }
+<ObjCCallComment>\n { g_currentCtx->comment+=*yytext; }
+<ObjCCallComment>. { g_currentCtx->comment+=*yytext; }
<ObjCCall>{ID} {
g_currentCtx->format+=escapeObject(yytext);
if (g_braceCount==0)