Skip to content

Commit f60c42c

Browse files
committed
issue #10586 Backslash + quote mark causes doxygen not to generate documentation
The handling of (interpolated) verbatim C# strings didn't correctly handle the `\`. Fixed the problem in different places.
1 parent 51326cf commit f60c42c

File tree

4 files changed

+31
-3
lines changed

4 files changed

+31
-3
lines changed

src/code.l

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2229,7 +2229,7 @@ ENDQopt ("const"|"volatile"|"sealed"|"override")({BN}+("const"|"volatile"|"seale
22292229
}
22302230
BEGIN( SkipComment ) ;
22312231
}
2232-
<*>@\" { // C# verbatim string
2232+
<*>[$]?@\" { // C# (interpolated) verbatim string
22332233
startFontClass(yyscanner,"stringliteral");
22342234
yyextra->code->codify(yytext);
22352235
yyextra->lastVerbStringContext=YY_START;

src/commentcnv.l

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ MAILADDR ("mailto:")?[a-z_A-Z0-9\x80-\xff.+-]+"@"[a-z_A-Z0-9\x80-\xff-]+("."[a
157157

158158
%x Scan
159159
%x SkipString
160+
%x SkipVerbString
160161
%x SkipChar
161162
%x SComment
162163
%x CComment
@@ -232,7 +233,7 @@ SLASHopt [/]*
232233
if (yyextra->lang!=SrcLangExt::Cpp) REJECT;
233234
copyToOutput(yyscanner,yytext,yyleng);
234235
}
235-
<Scan>[^"'!\/\n\\#,\-=; \t]* { /* eat anything that is not " / , or \n */
236+
<Scan>[^"'!\/\n\\#,\-=; \t@$]* { /* eat anything that is not " / , or \n */
236237
copyToOutput(yyscanner,yytext,yyleng);
237238
}
238239
<Scan>[,= ;\t] { /* eat , so we have a nice separator in long initialization lines */
@@ -343,6 +344,12 @@ SLASHopt [/]*
343344
}
344345
}
345346
}
347+
<Scan>[$]?"@\"" { /* start of an interpolated verbatim C# string */
348+
if (yyextra->lang!=SrcLangExt::CSharp) REJECT
349+
copyToOutput(yyscanner,yytext,yyleng);
350+
yyextra->stringContext = YY_START;
351+
BEGIN(SkipVerbString);
352+
}
346353
<Scan>"\"" { /* start of a string */
347354
copyToOutput(yyscanner,yytext,yyleng);
348355
yyextra->stringContext = YY_START;
@@ -695,6 +702,22 @@ SLASHopt [/]*
695702
<SkipString>\n { /* new line inside string (illegal for some compilers) */
696703
copyToOutput(yyscanner,yytext,yyleng);
697704
}
705+
<SkipVerbString>[^"\n]+ {
706+
copyToOutput(yyscanner,yytext,yyleng);
707+
}
708+
<SkipVerbString>\"\" { // escaped quote
709+
copyToOutput(yyscanner,yytext,yyleng);
710+
}
711+
<SkipVerbString>"\"" { /* end of string */
712+
copyToOutput(yyscanner,yytext,yyleng);
713+
BEGIN(yyextra->stringContext);
714+
}
715+
<SkipVerbString>. {
716+
copyToOutput(yyscanner,yytext,yyleng);
717+
}
718+
<SkipVerbString>\n {
719+
copyToOutput(yyscanner,yytext,yyleng);
720+
}
698721
<SkipChar>\\. { /* escaped character */
699722
if (yyextra->lang==SrcLangExt::Fortran || yyextra->lang==SrcLangExt::VHDL)
700723
{

src/pre.l

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ WSopt [ \t\r]*
583583
<CopyLine,LexCopyLine>"'"."'" {
584584
outputArray(yyscanner,yytext,yyleng);
585585
}
586-
<CopyLine,LexCopyLine>@\" {
586+
<CopyLine,LexCopyLine>[$]?@\" {
587587
if (getLanguageFromFileName(yyextra->fileName)!=SrcLangExt::CSharp) REJECT;
588588
outputArray(yyscanner,yytext,yyleng);
589589
BEGIN( CopyStringCs );
@@ -610,6 +610,9 @@ WSopt [ \t\r]*
610610
<CopyStringCs>[^\"\r\n]+ {
611611
outputArray(yyscanner,yytext,yyleng);
612612
}
613+
<CopyStringCs>\"\" {
614+
outputArray(yyscanner,yytext,yyleng);
615+
}
613616
<CopyString>\\. {
614617
outputArray(yyscanner,yytext,yyleng);
615618
}

src/scanner.l

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3160,9 +3160,11 @@ NONLopt [^\n]*
31603160
*yyextra->pSkipVerbString << yytext;
31613161
}
31623162
<SkipVerbString>"\\\\" { // escaped backslash
3163+
if (yyextra->insideCS) REJECT
31633164
*yyextra->pSkipVerbString << yytext;
31643165
}
31653166
<SkipVerbString>"\\\"" { // backslash escaped quote
3167+
if (yyextra->insideCS) REJECT
31663168
*yyextra->pSkipVerbString << yytext;
31673169
}
31683170
<SkipVerbString>"\"\"" { // quote escape

0 commit comments

Comments
 (0)