Doxygen
Loading...
Searching...
No Matches
scanner.l
Go to the documentation of this file.
1/*****************************************************************************
2 *
3 * Copyright (C) 1997-2021 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15%option never-interactive
16%option prefix="scannerYY"
17%option reentrant
18%option extra-type="struct scannerYY_state *"
19%top{
20#include <stdint.h>
21// forward declare yyscan_t to improve typesafety
22#define YY_TYPEDEF_YY_SCANNER_T
23struct yyguts_t;
24typedef yyguts_t *yyscan_t;
yyguts_t * yyscan_t
Definition code.l:24
25}
26
27%{
28
29// own header
30#include "scanner.h"
31
32// standard includes
33#include <algorithm>
34#include <cstdint>
35#include <memory>
36#include <utility>
37#include <vector>
38
39// other includes
40#include "arguments.h"
41#include "clangparser.h"
42#include "commentscan.h"
43#include "config.h"
44#include "debug.h"
45#include "defargs.h"
46#include "doxygen.h"
47#include "entry.h"
48#include "filedef.h"
49#include "filename.h"
50#include "markdown.h"
51#include "md5hash.h"
52#include "message.h"
53#include "moduledef.h"
54#include "regex.h"
55#include "stringutil.h"
56#include "trace.h"
57#include "util.h"
58
59#define YY_NO_INPUT 1
60#define YY_NO_UNISTD_H 1
61
63{
66 const char * inputString = nullptr;
68 int lastContext = 0;
69 int lastCContext = 0;
94 Protection protection = Protection::Public;
95 Protection baseProt = Protection::Public;
96 bool exported = false;
97 int sharpCount = 0 ;
98 int roundCount = 0 ;
99 int curlyCount = 0 ;
101 int squareCount = 0 ;
102 int padCount = 0 ;
103 std::shared_ptr<Entry> current;
104 std::shared_ptr<Entry> current_root;
105 std::shared_ptr<Entry> previous;
106 std::shared_ptr<Entry> tempEntry;
107 std::shared_ptr<Entry> firstTypedefEntry;
108 std::shared_ptr<Entry> memspecEntry;
109 int yyLineNr = 1 ;
110 int yyBegLineNr = 1 ;
111 size_t yyColNr = 1 ;
112 size_t yyBegColNr = 1 ;
114 MethodTypes mtype = MethodTypes::Method;
115 bool isStatic = false;
116 Specifier virt = Specifier::Normal;
117 Specifier baseVirt = Specifier::Normal;
121 bool isTypedef = false;
126 DString* specName = nullptr;
127
128 SrcLangExt language = SrcLangExt::Unknown;
129 bool insideIDL = false; //!< processing IDL code?
130 bool insideJava = false; //!< processing Java code?
131 bool insideCS = false; //!< processing C# code?
132 bool insideD = false; //!< processing D code?
133 bool insidePHP = false; //!< processing PHP code?
134 bool insideObjC = false; //!< processing Objective C code?
135 bool insideCli = false; //!< processing C++/CLI code?
136 bool insideJS = false; //!< processing JavaScript code?
137 bool insideSlice = false; //!< processing Slice code?
138 bool insideCpp = true; //!< processing C/C++ code
140
141 bool insideCppQuote = false;
142 bool insideProtocolList = false;
143 bool doxygenComment = false;
144
155
157 char lastCopyArgChar = '\0';
158
174
175 bool insideFormula = false;
176 bool insideTryBlock = false;
177 bool insideCode = false;
178 bool needsSemi = false;
179
181
185
189 bool isCodeBlock = false;
190 bool docBlockInBody = false;
191 bool docBlockAutoBrief = false;
192 char docBlockTerm = '\0';
193
196 bool odlProp = false;
197
198 bool externLinkage = false;
199
201
202 int column = 0;
203
204 size_t fencedSize = 0;
206 using EntryRelation = std::pair< Entry*, std::shared_ptr<Entry> >;
207 using EntryRelations = std::vector<EntryRelation>;
210
212
213 bool usingNewVarNeeded = false;
214
215 int fakeNS = 0; //<! number of file scoped namespaces in CSharp file
217
218 int anonCount = 0;
219 int anonNSCount = 0;
220
221 bool keepComment = false;
222};
223
224[[maybe_unused]] static const char *stateToString(int state);
225//-----------------------------------------------------------------------------
226
227// forward declarations for stateless functions
228static inline size_t computeIndent(const char *s,size_t startIndent);
229static inline void initMethodProtection(yyscan_t yyscanner,Protection prot);
230static DString stripQuotes(const char *s);
231static DString stripFuncPtr(const DString &type);
232static bool nameIsOperator(DString &name);
234static bool startOfRequiresExpression(const DString &req);
235
236// forward declarations for stateful functions
237static void initParser(yyscan_t yyscanner);
238static void initEntry(yyscan_t yyscanner);
239static void lineCount(yyscan_t yyscanner);
240static void addType(yyscan_t yyscanner);
241static void setContext(yyscan_t yyscanner);
242static void prependScope(yyscan_t yyscanner);
243static void startCommentBlock(yyscan_t yyscanner,bool);
244static void handleCommentBlock(yyscan_t yyscanner,const DString &doc,bool brief);
245static void handleParametersCommentBlocks(yyscan_t yyscanner,ArgumentList &al);
246static bool checkForKnRstyleC(yyscan_t yyscanner);
247static void splitKnRArg(yyscan_t yyscanner,DString &oldStyleArgPtr,DString &oldStyleArgName);
248static void addKnRArgInfo(yyscan_t yyscanner,const DString &type,const DString &name,
249 const DString &brief,const DString &docs);
250static int yyread(yyscan_t yyscanner,char *buf,int max_size);
251static void setJavaProtection(yyscan_t yyscanner);
252static void storeClangId(yyscan_t yyscanner,const char *id);
253static void startVerbatimBlock(yyscan_t yyscanner,const DString &blockName,size_t fencedSize=0,bool codeBlock=false);
254static bool endVerbatimBlock(yyscan_t yyscanner,const DString &blockName,size_t fencedSize=0);
255static DString generateAnonymousAnchor(const DString &fileName,int count);
256
257
258/* ----------------------------------------------------------------- */
259#undef YY_INPUT
260#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
261
262// otherwise the filename would be the name of the converted file (*.cpp instead of *.l)
263static inline const char *getLexerFILE() {return __FILE__;}
264#include "doxygen_lex.h"
265
This class represents an function or template argument list.
Definition arguments.h:66
Clang parser object for a single translation unit, which consists of a source file and the directly o...
Definition clangparser.h:25
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:84
Abstract interface for outline parsers.
Definition parserintf.h:41
Text streaming class that buffers data.
Definition textstream.h:36
Interface for the comment block scanner.
#define lineCount(s, len)
static DString generateAnonymousAnchor(const DString &fileName, int count)
Definition scanner.l:8125
static void startVerbatimBlock(yyscan_t yyscanner, const DString &blockName, size_t fencedSize=0, bool codeBlock=false)
Definition scanner.l:8253
static void storeClangId(yyscan_t yyscanner, const char *id)
Definition scanner.l:8144
static bool endVerbatimBlock(yyscan_t yyscanner, const DString &blockName, size_t fencedSize=0)
Definition scanner.l:8267
static void startCommentBlock(yyscan_t yyscanner, bool)
Definition scanner.l:8508
static void setContext(yyscan_t yyscanner)
Definition scanner.l:8305
static bool startOfRequiresExpression(const DString &req)
Definition scanner.l:8286
static void initParser(yyscan_t yyscanner)
Definition scanner.l:8080
static DString stripFuncPtr(const DString &type)
Definition scanner.l:8240
static bool checkForKnRstyleC(yyscan_t yyscanner)
Definition scanner.l:8345
static void addKnRArgInfo(yyscan_t yyscanner, const DString &type, const DString &name, const DString &brief, const DString &docs)
Definition scanner.l:8465
static int yyread(yyscan_t yyscanner, char *buf, int max_size)
Definition scanner.l:8066
static void initMethodProtection(yyscan_t yyscanner, Protection prot)
Definition scanner.l:8195
static const char * stateToString(int state)
void fixArgumentListForJavaScript(ArgumentList &al)
Definition scanner.l:8494
static void splitKnRArg(yyscan_t yyscanner, DString &oldStyleArgPtr, DString &oldStyleArgName)
Definition scanner.l:8376
static bool nameIsOperator(DString &name)
Definition scanner.l:8294
static void handleParametersCommentBlocks(yyscan_t yyscanner, ArgumentList &al)
Definition scanner.l:8605
static void prependScope(yyscan_t yyscanner)
Definition scanner.l:8327
static const char * getLexerFILE()
Definition scanner.l:263
static void setJavaProtection(yyscan_t yyscanner)
Definition scanner.l:8359
static void addType(yyscan_t yyscanner)
Definition scanner.l:8207
static DString stripQuotes(const char *s)
Definition scanner.l:8228
static size_t computeIndent(const char *s, size_t startIndent)
Definition scanner.l:8180
static void handleCommentBlock(yyscan_t yyscanner, const DString &doc, bool brief)
Definition scanner.l:8545
static void initEntry(yyscan_t yyscanner)
Definition scanner.l:8104
Some helper functions for std::string.
DString templateStr
Definition scanner.l:123
DString idlProp
Definition scanner.l:195
TextStream * pSkipInterpString
Definition scanner.l:172
EntryRelations outerScopeEntries
Definition scanner.l:208
bool docBlockAutoBrief
Definition scanner.l:191
int lastCopyArgStringContext
Definition scanner.l:149
Specifier baseVirt
Definition scanner.l:117
std::shared_ptr< Entry > firstTypedefEntry
Definition scanner.l:107
int lastDeprecatedContext
Definition scanner.l:75
DString aliasName
Definition scanner.l:124
TextStream docBlock
Definition scanner.l:187
bool insideJS
processing JavaScript code?
Definition scanner.l:136
bool insideProtocolList
Definition scanner.l:142
DString * copyArgString
Definition scanner.l:152
OutlineParserInterface * thisParser
Definition scanner.l:64
int lastDocContext
Definition scanner.l:70
DString fileName
Definition scanner.l:113
std::shared_ptr< Entry > tempEntry
Definition scanner.l:106
int lastStringContext
Definition scanner.l:74
std::shared_ptr< Entry > memspecEntry
Definition scanner.l:108
TextStream * pCopySquareGString
Definition scanner.l:167
int lastInitializerContext
Definition scanner.l:80
bool doxygenComment
Definition scanner.l:143
std::shared_ptr< Entry > previous
Definition scanner.l:105
int lastPreLineCtrlContext
Definition scanner.l:82
DString baseName
Definition scanner.l:125
int lastDefineContext
Definition scanner.l:90
MethodTypes mtype
Definition scanner.l:114
ClangTUParser * clangParser
Definition scanner.l:211
int lastSquareContext
Definition scanner.l:79
int lastAlignAsContext
Definition scanner.l:91
bool insideCS
processing C# code?
Definition scanner.l:131
ArgumentList * currentArgumentList
Definition scanner.l:156
DString * pCopyC11AttributeString
Definition scanner.l:164
TextStream * pCopyCurlyGString
Definition scanner.l:165
size_t yyBegColNr
Definition scanner.l:112
int lastCommentInArgContext
Definition scanner.l:86
int lastHereDocContext
Definition scanner.l:89
int lastSharpContext
Definition scanner.l:78
DString * pCopyRoundString
Definition scanner.l:160
int lastRoundContext
Definition scanner.l:77
DString msType
Definition scanner.l:118
Specifier virt
Definition scanner.l:116
DString briefBackup
Definition scanner.l:184
int lastSkipInterpVerbStringContext
Definition scanner.l:85
bool stopAtInvalidString
Definition scanner.l:139
DString * pCopyRawString
Definition scanner.l:163
bool insideCppQuote
Definition scanner.l:141
DString delimiter
Definition scanner.l:200
bool externLinkage
Definition scanner.l:198
const char * inputString
Definition scanner.l:66
DString docBackup
Definition scanner.l:183
DString programStr
Definition scanner.l:209
TextStream * pSkipVerbString
Definition scanner.l:171
std::pair< Entry *, std::shared_ptr< Entry > > EntryRelation
Definition scanner.l:206
SrcLangExt language
Definition scanner.l:128
int lastC11AttributeContext
Definition scanner.l:92
Protection baseProt
Definition scanner.l:95
DString * pCopyCurlyString
Definition scanner.l:161
bool insidePHP
processing PHP code?
Definition scanner.l:133
std::shared_ptr< Entry > current_root
Definition scanner.l:104
int lastCSConstraint
Definition scanner.l:88
int lastCurlyContext
Definition scanner.l:76
CommentScanner commentScanner
Definition scanner.l:65
DString funcPtrType
Definition scanner.l:122
int lastModifierContext
Definition scanner.l:93
DString idlAttr
Definition scanner.l:194
bool insideIDL
processing IDL code?
Definition scanner.l:129
bool insideTryBlock
Definition scanner.l:176
Protection protection
Definition scanner.l:94
bool insideSlice
processing Slice code?
Definition scanner.l:137
int lastCPPContext
Definition scanner.l:71
DString oldStyleArgType
Definition scanner.l:182
DString msName
Definition scanner.l:119
TextStream * pCopyHereDocGString
Definition scanner.l:169
bool insideObjC
processing Objective C code?
Definition scanner.l:134
int lastSkipSharpContext
Definition scanner.l:72
bool insideCli
processing C++/CLI code?
Definition scanner.l:135
int currentArgumentContext
Definition scanner.l:148
DString * pCopySharpString
Definition scanner.l:162
int initBracketCount
Definition scanner.l:180
size_t yyColNr
Definition scanner.l:111
DString * pCopyQuotedString
Definition scanner.l:159
int requiresContext
Definition scanner.l:151
int lastSkipVerbStringContext
Definition scanner.l:83
TextStream * pCopyRawGString
Definition scanner.l:170
DString docBlockName
Definition scanner.l:188
bool docBlockInBody
Definition scanner.l:190
int lastCopyArgContext
Definition scanner.l:150
int inputPosition
Definition scanner.l:67
TextStream * pCopyQuotedGString
Definition scanner.l:168
DString msArgs
Definition scanner.l:120
TextStream * pSkipInterpVerbString
Definition scanner.l:173
std::shared_ptr< Entry > current
Definition scanner.l:103
char lastCopyArgChar
Definition scanner.l:157
DString dummyRawString
Definition scanner.l:154
int lastSkipInterpStringContext
Definition scanner.l:84
bool insideD
processing D code?
Definition scanner.l:132
char docBlockTerm
Definition scanner.l:192
size_t fencedSize
Definition scanner.l:204
std::vector< EntryRelation > EntryRelations
Definition scanner.l:207
TextStream * pCopyRoundGString
Definition scanner.l:166
bool insideCpp
processing C/C++ code
Definition scanner.l:138
int docBlockContext
Definition scanner.l:186
TextStream dummyTextStream
Definition scanner.l:216
int lastClassTemplSpecContext
Definition scanner.l:81
bool insideFormula
Definition scanner.l:175
bool usingNewVarNeeded
Definition scanner.l:213
DString * specName
Definition scanner.l:126
DString fullArgString
Definition scanner.l:153
int lastSkipRoundContext
Definition scanner.l:73
bool insideJava
processing Java code?
Definition scanner.l:130
int lastRawStringContext
Definition scanner.l:87
MethodTypes
Definition types.h:119
Protection
Definition types.h:32
SrcLangExt
Definition types.h:207
Specifier
Definition types.h:80
A bunch of utility functions.
266%}
267
268 /* start command character */
269CMD ("\\"|"@")
270BN [ \t\n\r]
271BNopt {BN}*
272BL [ \t\r]*"\n"
273B [ \t]
274Bopt {B}*
275NOTopt (("!"{BNopt})|("not"{BN}+))?
276DIGIT [0-9]
277HEXDIGIT ({DIGIT}|[a-f]|[A-F])
278ID [$a-z_A-Z\x80-\xFF][$a-z_A-Z0-9\x80-\xFF]*
279SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)(((~|!){BN}*)?{ID})
280TSCOPE {ID}("<"[a-z_A-Z0-9 \t\*\&,:]*">")?
281CSSCOPENAME (({ID}?{BN}*"."{BN}*)*)((~{BN}*)?{ID})
282PRE [pP][rR][eE]
283CODE [cC][oO][dD][eE]
284CHARLIT (("'"\\x[0-9a-fA-F]{1,2}"'")|("'"\\‍[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
285PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
286PHPUSEKW ("public"|"private"|"protected")
287IDLATTR ("["[^\‍]]*"]"){BN}*
288TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
289RAWBEGIN (u|U|L|u8)?R\"[^ \t\‍(\‍)\\‍]{0,16}"("
290RAWEND ")"[^ \t\‍(\‍)\\‍]{0,16}\"
291ARITHOP "+"|"-"|"/"|"*"|"%"|"--"|"++"
292ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="
293LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"|"<=>"
294BITOP "&"|"|"|"^"|"<<"|">>"|"~"
295OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP})
296FUNCOP "operator"("()"|"[]"|{B}+[^;\n]+)
297MODULE_ID ({ID}".")*{ID}
298LINENR {B}*[1-9][0-9]*
299FILEICHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+=&#@~]
300FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+=&#@~]
301FILECHARS {FILEICHAR}*{FILEECHAR}+
302HFILEMASK {FILEICHAR}*("."{FILEICHAR}+)+{FILECHARS}*
303VFILEMASK {FILECHARS}("."{FILECHARS})*
304FILEMASK {VFILEMASK}|{HFILEMASK}
305
306 /* no comment start / end signs inside square brackets */
307NCOMM [^/\*]
308 // C start comment
309CCS "/\*"
310 // C end comment
311CCE "*\/"
312 // Cpp comment
313CPPC "/\/"
314 // doxygen C start comment
315DCOMMC ("/\*!"|"/\**")
316 // doxygen Cpp start comment
317DCOMMCPP ("/\/!"|"/\/\/")
318 // doxygen start comment
319DCOMM {DCOMMC}|{DCOMMCPP}
320
321 // Optional any character
322ANYopt .*
323 // Optional all but newline
324NONLopt [^\n]*
325
326%option noyywrap
327
328 /* language parsing states */
329
330%x AlignAs
331%x AlignAsEnd
332%x SDefine
333%x DefineEnd
334%x CompoundName
335%x ClassVar
336%x CSConstraintName
337%x CSConstraintType
338%x CSIndexer
339%x ClassCategory
340%x ClassTemplSpec
341%x CliPropertyType
342%x CliPropertyIndex
343%x CliOverride
344%x Bases
345%x BasesProt
346%x NextSemi
347%x BitFields
348%x EnumBaseType
349%x FindMembers
350%x FindMembersPHP
351%x FindMemberName
352%x FindFields
353%x FindConceptParts
354%x FindConceptDocs
355%x FindConceptCxxDocs
356%x SFunction
357%x FuncRound
358%x ExcpRound
359%x ExcpList
360%x FuncQual
361%x TrailingReturn
362%x Operator
363%x Array
364%x ReadBody
365%x ReadNSBody
366%x ReadBodyIntf
367%x ReadExpressionBody
368%x Using
369%x UsingAlias
370%x UsingDirective
371%x SkipCurly
372%x SkipCurlyCpp
373%x SkipCurlyEndDoc
374%x SkipString
375%x SkipPHPString
376%x SkipInits
377%x SkipC11Inits
378%x SkipCPP
379%x SkipComment
380%x SkipCxxComment
381%x SkipCurlyBlock
382%x SkipRoundBlock
383%x Sharp
384%x SkipRound
385%x SkipSquare
386%x StaticAssert
387%x DeclType
388%x TypedefName
389%x TryFunctionBlock
390%x TryFunctionBlockEnd
391%x Comment
392%x PackageName
393%x JavaImport
394%x IDLImport
395%x PHPUse
396%x PHPUseAs
397%x CSAccessorDecl
398%x CSGeneric
399%x PreLineCtrl
400%x DefinePHP
401%x DefinePHPEnd
402%x OldStyleArgs
403%x SkipVerbString
404%x SkipInterpString
405%x SkipInterpVerbString
406%x ObjCMethod
407%x ObjCReturnType
408%x ObjCParams
409%x ObjCParamType
410%x ObjCProtocolList
411%x ObjCPropAttr
412%x ObjCSkipStatement
413%x QtPropType
414%x QtPropAttr
415%x QtPropRead
416%x QtPropWrite
417%x ReadInitializer
418%x ReadInitializerPtr
419%x InitCopyComment
420%x UNOIDLAttributeBlock
421%x GetCallType
422%x CppQuote
423%x EndCppQuote
424%x MemberSpec
425%x MemberSpecSkip
426%x EndTemplate
427%x FuncPtr
428%x FuncPtrOperator
429%x EndFuncPtr
430%x ReadFuncArgType
431%x ReadTempArgs
432%x IDLUnionCase
433%x NSAliasName
434%x NSAliasArg
435%x CopyString
436%x CopyPHPString
437%x CopyGString
438%x CopyPHPGString
439%x CopyRound
440%x CopySharp
441%x CopyCurly
442%x CopyC11Attribute
443%x CopyComment
444%x GCopyRound
445%x GCopySquare
446%x GCopyCurly
447%x GCopyComment
448%x SkipUnionSwitch
449%x Specialization
450%x SpecializationSingleQuote
451%x SpecializationDoubleQuote
452%x FuncFunc
453%x FuncFuncEnd
454%x FuncFuncType
455%x FuncFuncArray
456%x CopyArgString
457%x CopyArgPHPString
458%x CopyArgRound
459%x CopyArgSquare
460%x CopyArgSharp
461%x CopyArgComment
462%x CopyArgCommentLine
463%x CopyArgVerbatim
464%x HereDoc
465%x HereDocEnd
466%x CopyHereDoc
467%x CopyHereDocEnd
468%x RawString
469%x RawGString
470%x CSString
471%x CppProt
472
473%x IDLAttribute
474%x IDLProp
475%x IDLPropName
476
477 /** Slice states */
478
479%x SliceOptional
480%x SliceMetadata
481%x SliceSequence
482%x SliceSequenceName
483%x SliceDictionary
484%x SliceDictionaryName
485
486 /** Prototype scanner states */
487
488%x Prototype
489%x PrototypePtr
490%x PrototypeQual
491%x PrototypeExc
492%x PrototypeSkipLine
493
494 /** comment parsing states */
495
496%x DocLine
497%x DocBlock
498%x DocCopyBlock
499
500 /** C++20 concepts */
501
502%x RequiresClause
503%x RequiresExpression
504%x ConceptName
505
506 /** Object-C Deprecated */
507%x Deprecated_round
508
509
510 /** C++20 modules */
511%x ModuleName
512%x ModuleImport
514
515<*>"DEPRECATED_ATTRIBUTE" { // Object-C attribute
516 if (!yyextra->insideObjC) REJECT;
517 }
518<*>"DEPRECATED_MSG_ATTRIBUTE(\"" { // Object-C attribute
519 if (!yyextra->insideObjC) REJECT;
520 yyextra->lastDeprecatedContext=YY_START;
521 yyextra->lastStringContext=Deprecated_round;
522 BEGIN(SkipString);
523 }
524<Deprecated_round>")" {
525 BEGIN(yyextra->lastDeprecatedContext);
526 }
527<Deprecated_round>{BNopt} {
528 lineCount(yyscanner);
529 }
530<Deprecated_round>. { }
531<NextSemi>"{" {
532 yyextra->curlyCount=0;
533 yyextra->needsSemi = true;
534 BEGIN(SkipCurlyBlock);
535 }
536<NextSemi>"(" {
537 yyextra->roundCount=0;
538 BEGIN(SkipRoundBlock);
539 }
540<SkipRoundBlock>"(" {
541 ++yyextra->roundCount;
542 }
543<SkipRoundBlock>")" {
544 if (yyextra->roundCount )
545 --yyextra->roundCount ;
546 else
547 BEGIN( NextSemi ) ;
548 }
549<SkipCurlyBlock>"{" {
550 ++yyextra->curlyCount ;
551 }
552<SkipCurlyBlock>"}" {
553 if( yyextra->curlyCount )
554 {
555 --yyextra->curlyCount ;
556 }
557 else if (yyextra->needsSemi)
558 {
559 BEGIN( NextSemi );
560 }
561 else
562 {
563 BEGIN( FindMembers );
564 }
565 }
566<NextSemi>\' {
567 if (yyextra->insidePHP)
568 {
569 yyextra->lastStringContext=NextSemi;
570 BEGIN(SkipPHPString);
571 }
572 }
573<NextSemi>{CHARLIT} { if (yyextra->insidePHP) REJECT; }
574<NextSemi>\" {
575 yyextra->lastStringContext=NextSemi;
576 BEGIN(SkipString);
577 }
578<NextSemi>[;,] {
579 unput(*yytext);
580 BEGIN( FindMembers );
581 }
582<BitFields>[;,] {
583 unput(*yytext);
584 BEGIN( FindMembers );
585 }
586<EnumBaseType>[{;,] {
587 yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
588 unput(*yytext);
589 BEGIN( ClassVar );
590 }
591<FindMembers>"<?php" { // PHP code with unsupported extension?
592 yyextra->insidePHP = true;
593 }
594<FindMembersPHP>"<?"("php"?) { // PHP code start
595 BEGIN( FindMembers );
596 }
597<FindMembersPHP>"<script"{BN}+"language"{BN}*"="{BN}*['"]?"php"['"]?{BN}*">" { // PHP code start
598 lineCount(yyscanner) ;
599 BEGIN( FindMembers );
600 }
601<FindMembers>"?>"|"</script>" { // PHP code end
602 if (yyextra->insidePHP)
603 BEGIN( FindMembersPHP );
604 else
605 REJECT;
606 }
607<FindMembersPHP>[^\n<]+ { // Non-PHP code text, ignore
608 }
609<FindMembersPHP>\n { // Non-PHP code text, ignore
610 lineCount(yyscanner);
611 }
612<FindMembersPHP>. { // Non-PHP code text, ignore
613 }
614<FindMembers>{PHPKW} { if (yyextra->insidePHP)
615 BEGIN( NextSemi );
616 else
617 REJECT;
618 }
619<FindMembers>"%{"[^\n]* { // Mozilla XPIDL lang-specific block
620 if (!yyextra->insideIDL)
621 REJECT;
622 }
623<FindMembers>"%}" { // Mozilla XPIDL lang-specific block end
624 if (!yyextra->insideIDL)
625 REJECT;
626 }
627<FindMembers>{B}*("properties"){BN}*":"{BN}* { // IDL or Borland C++ builder property
628 initMethodProtection(yyscanner,Protection::Public);
629 yyextra->current->mtype = yyextra->mtype = MethodTypes::Property;
630 }
631
632<FindMembers>{B}*"k_dcop"{BN}*":"{BN}* {
633 initMethodProtection(yyscanner,Protection::Public);
634 yyextra->current->mtype = yyextra->mtype = MethodTypes::DCOP;
635 }
636
637<FindMembers>{B}*("signals"|"Q_SIGNALS"){BN}*":"{BN}* {
638 initMethodProtection(yyscanner,Protection::Public);
639 yyextra->current->mtype = yyextra->mtype = MethodTypes::Signal;
640 }
641
642<FindMembers>{B}*"public"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* {
643 initMethodProtection(yyscanner,Protection::Public);
644 yyextra->current->mtype = yyextra->mtype = MethodTypes::Slot;
645 }
646
647<FindMembers>{B}*"protected"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* {
648 initMethodProtection(yyscanner,Protection::Protected);
649 yyextra->current->mtype = yyextra->mtype = MethodTypes::Slot;
650 }
651
652<FindMembers>{B}*"private"{BN}*("slots"|"Q_SLOTS"){BN}*":"{BN}* {
653 initMethodProtection(yyscanner,Protection::Private);
654 yyextra->current->mtype = yyextra->mtype = MethodTypes::Slot;
655 }
656<FindMembers>{B}*("public"|"methods"|"__published"){BN}*":"{BN}* {
657 initMethodProtection(yyscanner,Protection::Public);
658 }
659<FindMembers>{B}*"internal"{BN}*":"{BN}* { // for now treat C++/CLI's internal as package...
660 if (yyextra->insideCli)
661 {
662 initMethodProtection(yyscanner,Protection::Package);
663 }
664 else
665 {
666 REJECT;
667 }
668 }
669<FindMembers>{B}*"protected"{BN}*":"{BN}* {
670 initMethodProtection(yyscanner,Protection::Protected);
671 }
672<FindMembers>{B}*"private"{BN}*":"{BN}* {
673 initMethodProtection(yyscanner,Protection::Private);
674 }
675<FindMembers>{B}*("private"{BN}+"protected"|"protected"{BN}+"private")/{BN} { // C# "private protected" is only visible to derived classes in the same assembly
676 if (!yyextra->insideCS) REJECT;
677 lineCount(yyscanner);
678 addType(yyscanner);
679 yyextra->current->protection = Protection::Package;
680 }
681<FindMembers>{B}*"public"/({BN}|{CCS}|{CPPC}) {
682 if (!yyextra->insideCpp) REJECT;
683 initMethodProtection(yyscanner,Protection::Public);
684 BEGIN(CppProt);
685 }
686<FindMembers>{B}*"protected"/({BN}|{CCS}|{CPPC}) {
687 if (!yyextra->insideCpp) REJECT;
688 initMethodProtection(yyscanner,Protection::Protected);
689 BEGIN(CppProt);
690 }
691<FindMembers>{B}*"private"/({BN}|{CCS}|{CPPC}) {
692 if (!yyextra->insideCpp) REJECT;
693 initMethodProtection(yyscanner,Protection::Private);
694 BEGIN(CppProt);
695 }
696<CppProt>":" {
697 BEGIN(FindMembers);
698 }
699<CppProt>. {
700 unput(*yytext);
701 BEGIN(FindMembers);
702 }
703<CppProt>{BN}+ { lineCount(yyscanner); }
704<CppProt>{CPPC}.*\n { lineCount(yyscanner); }
705<CppProt>{CCS} { yyextra->lastCContext = YY_START ;
706 BEGIN( SkipComment ) ;
707 }
708<CppProt>("slots"|"Q_SLOTS") {
709 yyextra->current->mtype = yyextra->mtype = MethodTypes::Slot;
710 }
711<FindMembers>{B}*"event"{BN}+ {
712 if (yyextra->insideCli)
713 {
714 // C++/CLI event
715 lineCount(yyscanner) ;
716 yyextra->current->mtype = yyextra->mtype = MethodTypes::Event;
717 yyextra->current->bodyLine = yyextra->yyLineNr;
718 yyextra->current->bodyColumn = yyextra->yyColNr;
719 yyextra->curlyCount=0;
720 BEGIN( CliPropertyType );
721 }
722 else if (yyextra->insideCS)
723 {
724 lineCount(yyscanner) ;
725 yyextra->current->mtype = MethodTypes::Event;
726 yyextra->current->bodyLine = yyextra->yyLineNr;
727 yyextra->current->bodyColumn = yyextra->yyColNr;
728 }
729 else
730 {
731 REJECT;
732 }
733 }
734<FindMembers>{B}*"property"{BN}+ {
735 if (yyextra->insideCli)
736 {
737 // C++/CLI property
738 lineCount(yyscanner) ;
739 yyextra->current->mtype = yyextra->mtype = MethodTypes::Property;
740 yyextra->current->bodyLine = yyextra->yyLineNr;
741 yyextra->current->bodyColumn = yyextra->yyColNr;
742 yyextra->curlyCount=0;
743 BEGIN( CliPropertyType );
744 }
745 else
746 {
747 REJECT;
748 }
749 }
750<CliPropertyType>{ID} {
751 addType(yyscanner);
752 yyextra->current->name = yytext;
753 }
754<CliPropertyType>"[" { // C++/CLI indexed property
755 yyextra->current->args = "[";
756 BEGIN( CliPropertyIndex );
757 }
758<CliPropertyType>"{" {
759 yyextra->curlyCount=0;
760 //printf("event: '%s' '%s'\n",qPrint(yyextra->current->type),qPrint(yyextra->current->name));
761 BEGIN( CSAccessorDecl );
762 }
763<CliPropertyType>";" {
764 unput(*yytext);
765 BEGIN( FindMembers );
766 }
767<CliPropertyType>\n {
768 lineCount(yyscanner);
769 }
770<CliPropertyType>{B}* {
771 }
772<CliPropertyType>. {
773 addType(yyscanner);
774 yyextra->current->type += yytext;
775 }
776<CliPropertyIndex>"]" {
777 BEGIN( CliPropertyType );
778 yyextra->current->args+=yytext;
779 }
780<CliPropertyIndex>. {
781 yyextra->current->args+=yytext;
782 }
783 /*
784<FindMembers>{B}*"property"{BN}+ {
785 if (!yyextra->current->type.empty())
786 {
787 REJECT;
788 }
789 else
790 {
791 yyextra->current->mtype = yyextra->mtype = MethodTypes::Property;
792 lineCount(yyscanner);
793 }
794 }
795 */
796<FindMembers>{B}*"@private"{BN}+ {
797 initMethodProtection(yyscanner,Protection::Private);
798 }
799<FindMembers>{B}*"@protected"{BN}+ {
800 initMethodProtection(yyscanner,Protection::Protected);
801 }
802<FindMembers>{B}*"@public"{BN}+ {
803 initMethodProtection(yyscanner,Protection::Public);
804 }
805<FindMembers>[\-+]{BN}* {
806 if (!yyextra->insideObjC)
807 {
808 REJECT;
809 }
810 else
811 {
812 yyextra->current->fileName = yyextra->fileName;
813 yyextra->current->startLine = yyextra->yyLineNr;
814 yyextra->current->startColumn = yyextra->yyColNr;
815 yyextra->current->bodyLine = yyextra->yyLineNr;
816 yyextra->current->bodyColumn = yyextra->yyColNr;
817 yyextra->current->section = EntryType::makeFunction();
818 yyextra->language = yyextra->current->lang = SrcLangExt::ObjC;
819 yyextra->insideObjC = true;
820 yyextra->yyBegColNr = yyextra->yyColNr;
821 yyextra->yyBegLineNr = yyextra->yyLineNr;
822 yyextra->current->virt = Specifier::Virtual;
823
824 yyextra->current->isStatic=yytext[0]=='+';
825 initMethodProtection(yyscanner,Protection::Public);
826 BEGIN( ObjCMethod );
827 }
828 }
829<ObjCMethod>"(" { // start of method's return type
830 BEGIN( ObjCReturnType );
831 yyextra->current->type.clear();
832 yyextra->roundCount=0;
833 }
834<ObjCMethod>{ID} { // found method name
835 if (yyextra->current->type.empty())
836 {
837 yyextra->current->type += "id";
838 }
839 yyextra->current->name = yytext;
840 storeClangId(yyscanner,yytext);
841 }
842<ObjCMethod>":"{B}* { // start of parameter list
843 yyextra->current->name += ':';
844 Argument a;
845 yyextra->current->argList.push_back(a);
846 BEGIN( ObjCParams );
847 }
This class contains the information about the argument of a function or template.
Definition arguments.h:27
848<ObjCReturnType>[^()]* {
849 yyextra->current->type += yytext;
850 }
851<ObjCReturnType>"(^)(" { // Block return type
852 yyextra->current->type += yytext;
853 yyextra->roundCount++;
854 }
855<ObjCReturnType>"(" {
856 yyextra->current->type += yytext;
857 yyextra->roundCount++;
858 }
859<ObjCReturnType>")" {
860 if (yyextra->roundCount<=0)
861 {
862 BEGIN( ObjCMethod );
863 }
864 else
865 {
866 yyextra->current->type += yytext;
867 yyextra->roundCount--;
868 }
869 }
870<ObjCParams>({ID})?{BN}*":" { // Keyword of parameter
871 DString keyw = yytext;
872 keyw=keyw.left(keyw.length()-1).stripWhiteSpace(); // strip :
873 if (keyw.empty())
874 {
875 yyextra->current->name += " :";
876 }
877 else
878 {
879 yyextra->current->name += keyw+":";
880 }
881 if (yyextra->current->argList.back().type.empty())
882 {
883 yyextra->current->argList.back().type="id";
884 }
885 Argument a;
886 a.attrib=(DString)"["+keyw+"]";
887 yyextra->current->argList.push_back(a);
888 }
DString attrib
Definition arguments.h:42
void push_back(char c)
Definition dstring.h:202
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:148
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:337
DString left(size_t len) const
Definition dstring.h:306
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:151
889<ObjCParams>{ID}{BN}* { // name of parameter
890 lineCount(yyscanner);
891 yyextra->current->argList.back().name=DString(yytext).stripWhiteSpace();
892 }
893<ObjCParams>","{BN}*"..." { // name of parameter
894 lineCount(yyscanner);
895 // do we want the comma as part of the name?
896 //yyextra->current->name += ",";
897 Argument a;
898 a.attrib="[,]";
899 a.type="...";
900 yyextra->current->argList.push_back(a);
901 }
DString type
Definition arguments.h:43
902 /*
903<ObjCParams>":" {
904 yyextra->current->name += ':';
905 }
906 */
907<ObjCParams>"(" {
908 yyextra->roundCount=0;
909 yyextra->current->argList.back().type.clear();
910 BEGIN( ObjCParamType );
911 }
912<ObjCParamType>"(" {
913 yyextra->roundCount++;
914 yyextra->current->argList.back().type+=yytext;
915 }
916<ObjCParamType>")"/{B}* {
917 if (yyextra->roundCount<=0)
918 {
919 BEGIN( ObjCParams );
920 }
921 else
922 {
923 yyextra->current->argList.back().type+=yytext;
924 yyextra->roundCount--;
925 }
926 }
927<ObjCParamType>[^()]* {
928 yyextra->current->argList.back().type+=DString(yytext).stripWhiteSpace();
929 }
930<ObjCMethod,ObjCParams>";" { // end of method declaration
931 if (!yyextra->current->argList.empty() && yyextra->current->argList.back().type.empty())
932 {
933 yyextra->current->argList.back().type="id";
934 }
935 if (yyextra->current->argList.empty()) // method without parameters
936 {
937 yyextra->current->argList.setNoParameters(true);
938 }
939 yyextra->current->args = argListToString(yyextra->current->argList);
940 //printf("argList=%s\n",qPrint(yyextra->current->args));
941 unput(';');
942 BEGIN( SFunction );
943 }
DString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
Definition util.cpp:859
944<ObjCMethod,ObjCParams>(";"{BN}+)?"{" { // start of a method body
945 lineCount(yyscanner);
946 //printf("Type=%s Name=%s args=%s\n",
947 // qPrint(yyextra->current->type),qPrint(yyextra->current->name),qPrint(argListToString(yyextra->current->argList))
948 // );
949 if (!yyextra->current->argList.empty() && yyextra->current->argList.back().type.empty())
950 {
951 yyextra->current->argList.back().type="id";
952 }
953 if (yyextra->current->argList.empty()) // method without parameters
954 {
955 yyextra->current->argList.setNoParameters(true);
956 }
957 yyextra->current->args = argListToString(yyextra->current->argList);
958 unput('{');
959 BEGIN( SFunction );
960 }
961<FindMembers>{B}*"sequence"{BN}*"<"{BN}* {
962 if (yyextra->insideSlice)
963 {
964 lineCount(yyscanner);
965 yyextra->current->bodyLine = yyextra->yyLineNr;
966 yyextra->current->bodyColumn = yyextra->yyColNr;
967 yyextra->current->fileName = yyextra->fileName ;
968 yyextra->current->startLine = yyextra->yyLineNr ;
969 yyextra->current->startColumn = yyextra->yyColNr;
970 yyextra->current->args.clear();
971 yyextra->current->section = EntryType::makeTypedef();
972 yyextra->isTypedef = true;
973 BEGIN( SliceSequence );
974 }
975 else
976 REJECT;
977 }
978<FindMembers>{B}*"dictionary"{BN}*"<"{BN}* {
979 if (yyextra->insideSlice)
980 {
981 lineCount(yyscanner);
982 yyextra->current->bodyLine = yyextra->yyLineNr;
983 yyextra->current->bodyColumn = yyextra->yyColNr;
984 yyextra->current->fileName = yyextra->fileName ;
985 yyextra->current->startLine = yyextra->yyLineNr ;
986 yyextra->current->startColumn = yyextra->yyColNr;
987 yyextra->current->args.clear();
988 yyextra->current->section = EntryType::makeTypedef() ;
989 yyextra->isTypedef = true;
990 BEGIN( SliceDictionary );
991 }
992 else
993 REJECT;
994 }
995<FindMembers>{BN}{1,80} {
996 lineCount(yyscanner);
997 }
998<FindMembers>"@"({ID}".")*{ID}{BN}*"(" {
999 if (yyextra->insideJava) // Java annotation
1000 {
1001 lineCount(yyscanner);
1002 yyextra->lastSkipRoundContext = YY_START;
1003 yyextra->roundCount=0;
1004 BEGIN( SkipRound );
1005 }
1006 else if (literal_at(yytext,"@property")) // ObjC 2.0 property
1007 {
1008 yyextra->current->mtype = yyextra->mtype = MethodTypes::Property;
1009 yyextra->current->spec.setReadable(true).setWritable(true).setAssign(true);
1010 yyextra->current->protection = Protection::Public ;
1011 unput('(');
1012 BEGIN( ObjCPropAttr );
1013 }
1014 else
1015 {
1016 REJECT;
1017 }
1018 }
bool literal_at(const char *data, const char(&str)[N])
returns true iff data points to a substring that matches string literal str
Definition stringutil.h:101
1019<ObjCPropAttr>"getter="{ID} {
1020 yyextra->current->read = yytext+7;
1021 }
1022<ObjCPropAttr>"setter="{ID} {
1023 yyextra->current->write = yytext+7;
1024 }
1025<ObjCPropAttr>"readonly" {
1026 yyextra->current->spec.setWritable(false);
1027 }
1028<ObjCPropAttr>"readwrite" { // default
1029 }
1030<ObjCPropAttr>"assign" { // default
1031 }
1032<ObjCPropAttr>"unsafe_unretained" {
1033 yyextra->current->spec.setAssign(false);
1034 yyextra->current->spec.setUnretained(true);
1035 }
1036<ObjCPropAttr>"retain" {
1037 yyextra->current->spec.setAssign(false);
1038 yyextra->current->spec.setRetain(true);
1039 }
1040<ObjCPropAttr>"copy" {
1041 yyextra->current->spec.setAssign(false);
1042 yyextra->current->spec.setCopy(true);
1043 }
1044<ObjCPropAttr>"weak" {
1045 yyextra->current->spec.setAssign(false);
1046 yyextra->current->spec.setWeak(true);
1047 }
1048<ObjCPropAttr>"strong" {
1049 yyextra->current->spec.setAssign(false);
1050 yyextra->current->spec.setStrong(true);
1051 }
1052<ObjCPropAttr>"nonatomic" {
1053 yyextra->current->spec.setNonAtomic(true);
1054 }
1055<ObjCPropAttr>")" {
1056 BEGIN(FindMembers);
1057 }
1058<FindMembers>"@"{ID}("."{ID})+ {
1059 if (yyextra->insideJava) // Java annotation
1060 {
1061 // skip annotation
1062 }
1063 else
1064 {
1065 REJECT;
1066 }
1067 }
1068<FindMembers>"@"{ID} {
1069 if (yyextra->insideJava) // Java annotation
1070 {
1071 // skip annotation
1072 }
1073 else if (dstrcmp(yytext,"@property")==0) // ObjC 2.0 property
1074 {
1075 yyextra->current->mtype = yyextra->mtype = MethodTypes::Property;
1076 yyextra->current->spec.setWritable(true).setReadable(true);
1077 yyextra->current->protection = Protection::Public ;
1078 }
1079 else if (dstrcmp(yytext,"@synthesize")==0)
1080 {
1081 BEGIN( ObjCSkipStatement );
1082 }
1083 else if (dstrcmp(yytext,"@dynamic")==0)
1084 {
1085 BEGIN( ObjCSkipStatement );
1086 }
1087 else
1088 {
1089 REJECT;
1090 }
1091 }
int dstrcmp(const char *str1, const char *str2)
Definition dstring.h:50
1092<ObjCSkipStatement>";" {
1093 BEGIN(FindMembers);
1094 }
1095<PackageName>{ID}(("."|"\\"){ID})* {
1096 yyextra->isTypedef=false;
1097 //printf("Found namespace %s lang=%d\n",yytext,yyextra->current->lang);
1098 yyextra->current->name = yytext;
1099 yyextra->current->name = substitute(yyextra->current->name,".","::");
1100 yyextra->current->name = substitute(yyextra->current->name,"\\","::");
1101 yyextra->current->section = EntryType::makeNamespace();
1102 yyextra->current->type = "namespace" ;
1103 yyextra->current->fileName = yyextra->fileName;
1104 yyextra->current->startLine = yyextra->yyLineNr;
1105 yyextra->current->startColumn = yyextra->yyColNr;
1106 yyextra->current->bodyLine = yyextra->yyLineNr;
1107 yyextra->current->bodyColumn = yyextra->yyColNr;
1108 lineCount(yyscanner);
1109 }
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
Definition dstring.cpp:485
1110<PackageName>";" {
1111 std::shared_ptr<Entry> tmp = yyextra->current;
1112 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
1113 yyextra->current_root = std::move(tmp);
1114 initEntry(yyscanner);
1115 BEGIN(FindMembers);
1116 }
1117<PackageName>"{" {
1118 yyextra->curlyCount=0;
1119 BEGIN( ReadNSBody );
1120 }
1121<FindMembers>{B}*"export"{BN}+"module"{BN}+ { // primary module interface unit
1122 if (!yyextra->insideCpp) REJECT;
1123 //printf("Interface module unit\n");
1124 yyextra->current->exported = true;
1125 lineCount(yyscanner);
1126 BEGIN( ModuleName );
1127 }
1128<FindMembers>{B}*"module"{BN}*";" { // global module section
1129 if (!yyextra->insideCpp) REJECT;
1130 if (!yyextra->current->type.empty() || !yyextra->current->name.empty()) REJECT;
1131 //printf("Implementation module unit\n");
1132 lineCount(yyscanner);
1133 BEGIN( FindMembers );
1134 }
1135<FindMembers>{B}*"module"{BN}+ { // module implementation unit
1136 if (!yyextra->insideCpp) REJECT;
1137 //printf("Implementation module unit\n");
1138 yyextra->current->exported = false;
1139 lineCount(yyscanner);
1140 BEGIN( ModuleName );
1141 }
1142<FindMembers>{B}*"export"{BN}+"import"{BN}+ { // export an imported module
1143 if (!yyextra->insideCpp) REJECT;
1144 yyextra->current->exported = true;
1145 lineCount(yyscanner);
1146 BEGIN( ModuleImport );
1147 }
1148<FindMembers>{B}*"import"{BN}+ { // start of a module import
1149 if (!yyextra->insideCpp) REJECT;
1150 lineCount(yyscanner);
1151 BEGIN( ModuleImport );
1152 }
1153<ModuleName>{MODULE_ID}{BN}*":"{BN}*{MODULE_ID} { // module partition name, e.g. A.B:C.D'
1154 DString name = yytext;
1155 size_t i = name.find(':');
1156 DString partition = name.mid(i+1).stripWhiteSpace();
1157 name = name.left(i).stripWhiteSpace();
1158 ModuleManager::instance().createModuleDef(yyextra->fileName,
1159 yyextra->yyLineNr,
1160 yyextra->yyColNr,
1161 yyextra->current->exported,
1162 name,
1163 partition);
1164 yyextra->current->section = EntryType::makeModuleDoc();
1165 yyextra->isTypedef=false;
1166 addType(yyscanner);
1167 yyextra->current->type += " module";
1168 yyextra->current->fileName = yyextra->fileName;
1169 yyextra->current->startLine = yyextra->yyLineNr;
1170 yyextra->current->startColumn = yyextra->yyColNr;
1171 yyextra->current->bodyLine = yyextra->yyLineNr;
1172 yyextra->current->bodyColumn = yyextra->yyColNr;
1173 yyextra->current->name = name+":"+partition;
1174 lineCount(yyscanner);
1175 }
void createModuleDef(const DString &fileName, int line, size_t column, bool exported, const DString &moduleName, const DString &partitionName=DString())
static ModuleManager & instance()
const char * name(int level)
Definition latexgen.h:368
1176<ModuleName>{MODULE_ID} { // primary module name, e.g. A.B
1177 ModuleManager::instance().createModuleDef(yyextra->fileName,
1178 yyextra->yyLineNr,
1179 yyextra->yyColNr,
1180 yyextra->current->exported,
1181 yytext);
1182 yyextra->current->section = EntryType::makeModuleDoc();
1183 yyextra->isTypedef=false;
1184 addType(yyscanner);
1185 yyextra->current->type += " module";
1186 yyextra->current->fileName = yyextra->fileName;
1187 yyextra->current->startLine = yyextra->yyLineNr;
1188 yyextra->current->startColumn = yyextra->yyColNr;
1189 yyextra->current->bodyLine = yyextra->yyLineNr;
1190 yyextra->current->bodyColumn = yyextra->yyColNr;
1191 yyextra->current->name = yytext;
1192 lineCount(yyscanner);
1193 }
1194<ModuleName>":"{BN}+"private" { // start of private section of the module interface
1195 yyextra->current->exported = yyextra->exported = false;
1196 lineCount(yyscanner);
1197 }
1198<ModuleName>";" { unput(';');
1199 BEGIN(FindMembers);
1200 }
1201<ModuleName>\n { lineCount(yyscanner); }
1202<ModuleName>. {}
1203<ModuleImport>"\""[^"\n]*"\"" { // local header import
1204 ModuleManager::instance().addHeader(yyextra->fileName,
1205 yyextra->yyLineNr,
1206 DString(yytext).mid(1,yyleng-2),
1207 false);
1208 }
void addHeader(const DString &moduleFile, int line, const DString &headerName, bool isSystem)
1209<ModuleImport>"<"[^>\n]*">" { // system header import
1210 ModuleManager::instance().addHeader(yyextra->fileName,
1211 yyextra->yyLineNr,
1212 DString(yytext).mid(1,yyleng-2),
1213 true);
1214 }
1215<ModuleImport>{MODULE_ID}?{BN}*":"{BN}*{MODULE_ID} { // module partition import
1216 DString name = yytext; // can be 'M:P' or ':P'
1217 size_t i = name.find(':');
1218 DString partition = name.mid(i+1).stripWhiteSpace();
1219 name = name.left(i).stripWhiteSpace();
1220 ModuleManager::instance().addImport(yyextra->fileName,
1221 yyextra->yyLineNr,
1222 name,
1223 yyextra->current->exported,
1224 partition);
1225 lineCount(yyscanner);
1226 }
void addImport(const DString &moduleFile, int line, const DString &importName, bool isExported, const DString &partitionName=DString())
1227<ModuleImport>{MODULE_ID} { // module import
1228 ModuleManager::instance().addImport(yyextra->fileName,
1229 yyextra->yyLineNr,
1230 yytext,
1231 yyextra->current->exported);
1232 lineCount(yyscanner);
1233 }
1234<ModuleImport>";" { BEGIN(FindMembers); }
1235<ModuleImport>\n { lineCount(yyscanner); }
1236<ModuleImport>. {}
1237<FindMembers>{B}*"export"{BN}+"{" {
1238 yyextra->current->exported = yyextra->exported = true; // export block
1239 }
1240<FindMembers>{B}*"export"{BN}+ {
1241 if (!yyextra->insideCpp) REJECT;
1242 yyextra->current->exported=true;
1243 }
1244<FindMembers>{B}*"initonly"{BN}+ { if (yyextra->insideJava || yyextra->insideCpp) REJECT;
1245 yyextra->current->type += " initonly ";
1246 if (yyextra->insideCli) yyextra->current->spec.setInitonly(true);
1247 lineCount(yyscanner);
1248 }
1249<FindMembers>{B}*"static"{BN}*/"{" { yyextra->current->type += " static ";
1250 yyextra->current->isStatic = true;
1251 lineCount(yyscanner);
1252 }
1253<FindMembers>{B}*"static"{BN}+ { yyextra->current->type += " static ";
1254 yyextra->current->isStatic = true;
1255 lineCount(yyscanner);
1256 }
1257<FindMembers>{B}*"extern"{BN}+ { if (yyextra->insideJava) REJECT;
1258 yyextra->current->isStatic = false;
1259 yyextra->current->explicitExternal = true;
1260 lineCount(yyscanner);
1261 }
1262<FindMembers>{B}*"const"{BN}+ { if (yyextra->insideCS)
1263 {
1264 yyextra->current->type += " const ";
1265 if (yyextra->insideCS) yyextra->current->isStatic = true;
1266 lineCount(yyscanner);
1267 }
1268 else
1269 {
1270 REJECT;
1271 }
1272 }
1273<FindMembers>{B}*"virtual"{BN}+ { if (yyextra->insideJava) REJECT;
1274 yyextra->current->type += " virtual ";
1275 yyextra->current->virt = Specifier::Virtual;
1276 lineCount(yyscanner);
1277 }
1278<FindMembers>{B}*"constexpr"{BN}+ {
1279 if (yyextra->insideCpp)
1280 {
1281 yyextra->current->spec.setConstExpr(true);
1282 }
1283 REJECT;
1284 }
1285<FindMembers>{B}*"consteval"{BN}+ {
1286 if (yyextra->insideCpp)
1287 {
1288 yyextra->current->spec.setConstEval(true);
1289 }
1290 REJECT;
1291 }
1292<FindMembers>{B}*"constinit"{BN}+ {
1293 if (yyextra->insideCpp)
1294 {
1295 yyextra->current->spec.setConstInit(true);
1296 }
1297 REJECT;
1298 }
1299<FindMembers>{B}*"published"{BN}+ { // UNO IDL published keyword
1300 if (yyextra->insideIDL)
1301 {
1302 lineCount(yyscanner);
1303 yyextra->current->spec.setPublished(true);
1304 }
1305 else
1306 {
1307 REJECT;
1308 }
1309 }
1310<FindMembers>{B}*"sealed"{BN}+ {
1311 if (yyextra->insideCS)
1312 {
1313 yyextra->current->spec.setSealed(true);
1314 }
1315 else
1316 {
1317 REJECT;
1318 }
1319 }
1320<FindMembers>{B}*"abstract"{BN}+ {
1321 if (yyextra->insidePHP || yyextra->insideCS)
1322 {
1323 yyextra->current->spec.setAbstract(true);
1324 }
1325 else
1326 {
1327 if (yyextra->insideCpp) REJECT;
1328 yyextra->current->type += " abstract ";
1329 if (!yyextra->insideJava)
1330 {
1331 yyextra->current->virt = Specifier::Pure;
1332 }
1333 else
1334 {
1335 yyextra->current->spec.setAbstract(true);
1336 }
1337 }
1338 lineCount(yyscanner);
1339 }
1340<FindMembers>{B}*"inline"{BN}+ { if (yyextra->insideJava) REJECT;
1341 yyextra->current->spec.setInline(true);
1342 lineCount(yyscanner);
1343 }
1344<FindMembers>{B}*"mutable"{BN}+ { if (yyextra->insideJava) REJECT;
1345 yyextra->current->spec.setMutable(true);
1346 lineCount(yyscanner);
1347 }
1348<FindMembers>{B}*"thread_local"{BN}+ { if (yyextra->insideJava) REJECT;
1349 yyextra->current->spec.setThreadLocal(true);
1350 lineCount(yyscanner);
1351 }
1352<FindMembers>{B}*"explicit"{BN}+ { if (yyextra->insideJava) REJECT;
1353 yyextra->current->spec.setExplicit(true);
1354 lineCount(yyscanner);
1355 }
1356<FindMembers>{B}*"local"{BN}+ { if (yyextra->insideJava || yyextra->insideCpp) REJECT;
1357 yyextra->current->spec.setLocal(true);
1358 lineCount(yyscanner);
1359 }
1360<FindMembers>{B}*"@required"{BN}+ { // Objective C 2.0 protocol required section
1361 yyextra->current->spec.setOptional(false).setRequired(true);
1362 lineCount(yyscanner);
1363 }
1364<FindMembers>{B}*"@optional"{BN}+ { // Objective C 2.0 protocol optional section
1365 yyextra->current->spec.setRequired(false).setOptional(true);
1366 lineCount(yyscanner);
1367 }
1368 /*
1369<FindMembers>{B}*"import"{BN}+ { // IDL import keyword
1370 BEGIN( NextSemi );
1371 }
1372 */
1373<FindMembers>{B}*"typename"{BN}+ { lineCount(yyscanner); }
1374<FindMembers>{B}*"namespace"{BNopt}/[^a-z_A-Z0-9] { if (yyextra->insideJava) REJECT;
1375 yyextra->isTypedef=false;
1376 yyextra->current->section = EntryType::makeNamespace();
1377 yyextra->current->type = "namespace" ;
1378 yyextra->current->fileName = yyextra->fileName;
1379 yyextra->current->startLine = yyextra->yyLineNr;
1380 yyextra->current->startColumn = yyextra->yyColNr;
1381 yyextra->current->bodyLine = yyextra->yyLineNr;
1382 yyextra->current->bodyColumn = yyextra->yyColNr;
1383 lineCount(yyscanner);
1384 if (yyextra->insidePHP)
1385 {
1386 BEGIN( PackageName );
1387 }
1388 else
1389 {
1390 BEGIN( CompoundName );
1391 }
1392 }
1393<FindMembers>{B}*"module"{BN}+ {
1394 lineCount(yyscanner);
1395 if (yyextra->insideIDL || yyextra->insideSlice)
1396 {
1397 yyextra->isTypedef=false;
1398 yyextra->current->section = EntryType::makeNamespace();
1399 yyextra->current->type = "module" ;
1400 yyextra->current->fileName = yyextra->fileName;
1401 yyextra->current->startLine = yyextra->yyLineNr;
1402 yyextra->current->startColumn = yyextra->yyColNr;
1403 yyextra->current->bodyLine = yyextra->yyLineNr;
1404 yyextra->current->bodyColumn = yyextra->yyColNr;
1405 BEGIN( CompoundName );
1406 }
1407 else if (yyextra->insideD)
1408 {
1409 lineCount(yyscanner);
1410 BEGIN(PackageName);
1411 }
1412 else
1413 {
1414 addType(yyscanner);
1415 yyextra->current->name = DString(yytext).stripWhiteSpace();
1416 }
1417 }
1418<FindMembers>{B}*"library"{BN}+ {
1419 lineCount(yyscanner);
1420 if (yyextra->insideIDL)
1421 {
1422 yyextra->isTypedef=false;
1423 yyextra->current->section = EntryType::makeNamespace();
1424 yyextra->current->type = "library" ;
1425 yyextra->current->fileName = yyextra->fileName;
1426 yyextra->current->startLine = yyextra->yyLineNr;
1427 yyextra->current->startColumn = yyextra->yyColNr;
1428 yyextra->current->bodyLine = yyextra->yyLineNr;
1429 yyextra->current->bodyColumn = yyextra->yyColNr;
1430 BEGIN( CompoundName );
1431 }
1432 else
1433 {
1434 addType(yyscanner);
1435 yyextra->current->name = DString(yytext).stripWhiteSpace();
1436 }
1437 }
1438<FindMembers>{B}*"constants"{BN}+ { // UNO IDL constant group
1439 lineCount(yyscanner);
1440 if (yyextra->insideIDL)
1441 {
1442 yyextra->isTypedef=false;
1443 yyextra->current->section = EntryType::makeNamespace();
1444 yyextra->current->type = "constants";
1445 yyextra->current->fileName = yyextra->fileName;
1446 yyextra->current->startLine = yyextra->yyLineNr;
1447 yyextra->current->startColumn = yyextra->yyColNr;
1448 yyextra->current->bodyLine = yyextra->yyLineNr;
1449 yyextra->current->bodyColumn = yyextra->yyColNr;
1450 BEGIN( CompoundName );
1451 }
1452 else
1453 {
1454 addType(yyscanner);
1455 yyextra->current->name = DString(yytext).stripWhiteSpace();
1456 }
1457 }
1458<FindMembers>{BN}*("service"){BN}+ { // UNO IDL service
1459 lineCount(yyscanner);
1460 if (yyextra->insideIDL)
1461 {
1462 yyextra->isTypedef=false;
1463 yyextra->current->section = EntryType::makeClass();
1464 TypeSpecifier spec = yyextra->current->spec;
1465 yyextra->current->spec = TypeSpecifier().setService(true).
1466 // preserve UNO IDL [optional] or published
1467 setOptional(spec.isOptional()).setPublished(spec.isPublished());
1468 addType(yyscanner);
1469 yyextra->current->type += " service " ;
1470 yyextra->current->fileName = yyextra->fileName;
1471 yyextra->current->startLine = yyextra->yyLineNr;
1472 yyextra->current->bodyLine = yyextra->yyLineNr;
1473 yyextra->current->bodyColumn = yyextra->yyColNr;
1474 BEGIN( CompoundName );
1475 }
1476 else // TODO is addType right? just copy/pasted
1477 {
1478 addType(yyscanner);
1479 yyextra->current->name = DString(yytext).stripWhiteSpace();
1480 }
1481 }
Wrapper class for a number of boolean properties.
Definition types.h:694
1482<FindMembers>{BN}*("singleton"){BN}+ { // UNO IDL singleton
1483 lineCount(yyscanner);
1484 if (yyextra->insideIDL)
1485 {
1486 yyextra->isTypedef=false;
1487 yyextra->current->section = EntryType::makeClass();
1488 TypeSpecifier spec = yyextra->current->spec;
1489 yyextra->current->spec = TypeSpecifier().setSingleton(true).
1490 setPublished(spec.isPublished()); // preserve
1491 addType(yyscanner);
1492 yyextra->current->type += " singleton " ;
1493 yyextra->current->fileName = yyextra->fileName;
1494 yyextra->current->startLine = yyextra->yyLineNr;
1495 yyextra->current->bodyLine = yyextra->yyLineNr;
1496 yyextra->current->bodyColumn = yyextra->yyColNr;
1497 BEGIN( CompoundName );
1498 }
1499 else // TODO is addType right? just copy/pasted
1500 {
1501 addType(yyscanner);
1502 yyextra->current->name = DString(yytext).stripWhiteSpace();
1503 }
1504 }
1505<FindMembers>{BN}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba/UNO IDL/Java/Slice interface
1506 lineCount(yyscanner);
1507 if (yyextra->insideIDL || yyextra->insideJava || yyextra->insideCS || yyextra->insideD || yyextra->insidePHP || yyextra->insideSlice)
1508 {
1509 yyextra->isTypedef=false;
1510 yyextra->current->section = EntryType::makeClass();
1511 TypeSpecifier spec = yyextra->current->spec;
1512 yyextra->current->spec = TypeSpecifier().setInterface(true).
1513 // preserve UNO IDL [optional], published, Slice local
1514 setOptional(spec.isOptional()).
1515 setPublished(spec.isPublished()).
1516 setLocal(spec.isLocal());
1517 addType(yyscanner);
1518 yyextra->current->type += " interface" ;
1519 yyextra->current->fileName = yyextra->fileName;
1520 yyextra->current->startLine = yyextra->yyLineNr;
1521 yyextra->current->startColumn = yyextra->yyColNr;
1522 yyextra->current->bodyLine = yyextra->yyLineNr;
1523 yyextra->current->bodyColumn = yyextra->yyColNr;
1524 setJavaProtection(yyscanner);
1525 BEGIN( CompoundName );
1526 }
1527 else
1528 {
1529 addType(yyscanner);
1530 yyextra->current->name = DString(yytext).stripWhiteSpace();
1531 }
1532 }
1533<FindMembers>{B}*"@implementation"{BN}+ { // Objective-C class implementation
1534 lineCount(yyscanner);
1535 yyextra->isTypedef=false;
1536 yyextra->current->section = EntryType::makeObjcImpl();
1537 yyextra->language = yyextra->current->lang = SrcLangExt::ObjC;
1538 yyextra->insideObjC = true;
1539 yyextra->current->protection = yyextra->protection = Protection::Public ;
1540 addType(yyscanner);
1541 yyextra->current->type += " implementation" ;
1542 yyextra->current->fileName = yyextra->fileName;
1543 yyextra->current->startLine = yyextra->yyLineNr;
1544 yyextra->current->bodyLine = yyextra->yyLineNr;
1545 yyextra->current->bodyColumn = yyextra->yyColNr;
1546 BEGIN( CompoundName );
1547 }
1548<FindMembers>{B}*"@interface"{BN}+ { // Objective-C class interface, or Java attribute
1549 lineCount(yyscanner);
1550 yyextra->isTypedef=false;
1551 yyextra->current->section = EntryType::makeClass();
1552 yyextra->current->spec = TypeSpecifier().setInterface(true);
1553 if (!yyextra->insideJava)
1554 {
1555 yyextra->language = yyextra->current->lang = SrcLangExt::ObjC;
1556 yyextra->insideObjC = true;
1557 }
1558 yyextra->current->protection = yyextra->protection = Protection::Public ;
1559 addType(yyscanner);
1560 yyextra->current->type += " interface" ;
1561 yyextra->current->fileName = yyextra->fileName;
1562 yyextra->current->startLine = yyextra->yyLineNr;
1563 yyextra->current->startColumn = yyextra->yyColNr;
1564 yyextra->current->bodyLine = yyextra->yyLineNr;
1565 yyextra->current->bodyColumn = yyextra->yyColNr;
1566 BEGIN( CompoundName );
1567 }
1568<FindMembers>{B}*"@protocol"{BN}+ { // Objective-C protocol definition
1569 lineCount(yyscanner);
1570 yyextra->isTypedef=false;
1571 yyextra->current->section = EntryType::makeClass();
1572 yyextra->current->spec = TypeSpecifier().setProtocol(true);
1573 yyextra->language = yyextra->current->lang = SrcLangExt::ObjC;
1574 yyextra->insideObjC = true;
1575 yyextra->current->protection = yyextra->protection = Protection::Public ;
1576 addType(yyscanner);
1577 yyextra->current->type += " protocol" ;
1578 yyextra->current->fileName = yyextra->fileName;
1579 yyextra->current->startLine = yyextra->yyLineNr;
1580 yyextra->current->startColumn = yyextra->yyColNr;
1581 yyextra->current->bodyLine = yyextra->yyLineNr;
1582 yyextra->current->bodyColumn = yyextra->yyColNr;
1583 BEGIN( CompoundName );
1584 }
1585<FindMembers>{B}*"exception"{BN}+ { // Corba IDL/Slice exception
1586 if (yyextra->insideJava || yyextra->insideCpp) REJECT;
1587 yyextra->isTypedef=false;
1588 yyextra->current->section = EntryType::makeClass();
1589 TypeSpecifier spec = yyextra->current->spec;
1590 // preserve UNO IDL, Slice local
1591 yyextra->current->spec = TypeSpecifier().setException(true).
1592 setPublished(spec.isPublished()).setLocal(spec.isLocal());
1593 addType(yyscanner);
1594 yyextra->current->type += " exception" ;
1595 yyextra->current->fileName = yyextra->fileName;
1596 yyextra->current->startLine = yyextra->yyLineNr;
1597 yyextra->current->startColumn = yyextra->yyColNr;
1598 yyextra->current->bodyLine = yyextra->yyLineNr;
1599 yyextra->current->bodyColumn = yyextra->yyColNr;
1600 lineCount(yyscanner);
1601 BEGIN( CompoundName );
1602 }
1603<FindMembers>"@class" | // for Objective C class declarations
1604<FindMembers>{B}*{TYPEDEFPREFIX}"class{" |
1605<FindMembers>{B}*{TYPEDEFPREFIX}"class"{BN}+ {
1606 DString decl = yytext;
1607 yyextra->isTypedef = decl.find("typedef") !=DString::npos;
1608 bool isConst = decl.find("const") !=DString::npos;
1609 bool isVolatile = decl.find("volatile")!=DString::npos;
1610 yyextra->current->section = EntryType::makeClass();
1611 addType(yyscanner);
1612 if (yyextra->insidePHP && yyextra->current->spec.isAbstract())
1613 {
1614 // convert Abstract to AbstractClass
1615 yyextra->current->spec.setAbstract(false).setAbstractClass(true);
1616 }
1617 if (yyextra->insideSlice && yyextra->current->spec.isLocal())
1618 {
1619 yyextra->current->spec.setLocal(true);
1620 }
1621 if (isConst)
1622 {
1623 yyextra->current->type += " const";
1624 }
1625 else if (isVolatile)
1626 {
1627 yyextra->current->type += " volatile";
1628 }
1629 yyextra->current->type += " class" ;
1630 yyextra->current->fileName = yyextra->fileName;
1631 yyextra->current->startLine = yyextra->yyLineNr;
1632 yyextra->current->startColumn = yyextra->yyColNr;
1633 yyextra->current->bodyLine = yyextra->yyLineNr;
1634 yyextra->current->bodyColumn = yyextra->yyColNr;
1635 if (yytext[0]=='@')
1636 {
1637 yyextra->language = yyextra->current->lang = SrcLangExt::ObjC;
1638 yyextra->insideObjC = true;
1639 }
1640 lineCount(yyscanner) ;
1641 if (yytext[yyleng-1]=='{') unput('{');
1642 BEGIN( CompoundName ) ;
1643 }
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
Definition dstring.h:178
size_t find(char c, size_t pos=0) const
Definition dstring.h:239
1644<FindMembers>{B}*"value class{" | // C++/CLI extension
1645<FindMembers>{B}*"value class"{BN}+ {
1646 yyextra->isTypedef=false;
1647 yyextra->current->section = EntryType::makeClass();
1648 yyextra->current->spec = TypeSpecifier().setValue(true);
1649 addType(yyscanner);
1650 yyextra->current->type += " value class" ;
1651 yyextra->current->fileName = yyextra->fileName;
1652 yyextra->current->startLine = yyextra->yyLineNr;
1653 yyextra->current->startColumn = yyextra->yyColNr;
1654 yyextra->current->bodyLine = yyextra->yyLineNr;
1655 yyextra->current->bodyColumn = yyextra->yyColNr;
1656 lineCount(yyscanner) ;
1657 if (yytext[yyleng-1]=='{') unput('{');
1658 BEGIN( CompoundName ) ;
1659 }
1660<FindMembers>{B}*"ref class{" | // C++/CLI extension
1661<FindMembers>{B}*"ref class"{BN}+ {
1662 yyextra->isTypedef=false;
1663 yyextra->current->section = EntryType::makeClass();
1664 yyextra->current->spec = TypeSpecifier().setRef(true);
1665 addType(yyscanner);
1666 yyextra->current->type += " ref class" ;
1667 yyextra->current->fileName = yyextra->fileName;
1668 yyextra->current->startLine = yyextra->yyLineNr;
1669 yyextra->current->startColumn = yyextra->yyColNr;
1670 yyextra->current->bodyLine = yyextra->yyLineNr;
1671 yyextra->current->bodyColumn = yyextra->yyColNr;
1672 lineCount(yyscanner) ;
1673 if (yytext[yyleng-1]=='{') unput('{');
1674 BEGIN( CompoundName ) ;
1675 }
1676<FindMembers>{B}*"interface class{" | // C++/CLI extension
1677<FindMembers>{B}*"interface class"{BN}+ {
1678 yyextra->isTypedef=false;
1679 yyextra->current->section = EntryType::makeClass();
1680 yyextra->current->spec = TypeSpecifier().setInterface(true);
1681 addType(yyscanner);
1682 yyextra->current->type += " interface class" ;
1683 yyextra->current->fileName = yyextra->fileName;
1684 yyextra->current->startLine = yyextra->yyLineNr;
1685 yyextra->current->startColumn = yyextra->yyColNr;
1686 yyextra->current->bodyLine = yyextra->yyLineNr;
1687 yyextra->current->bodyColumn = yyextra->yyColNr;
1688 lineCount(yyscanner) ;
1689 if (yytext[yyleng-1]=='{') unput('{');
1690 BEGIN( CompoundName ) ;
1691 }
1692<FindMembers>{B}*"coclass"{BN}+ {
1693 if (yyextra->insideIDL)
1694 {
1695 yyextra->isTypedef=false;
1696 yyextra->current->section = EntryType::makeClass();
1697 addType(yyscanner);
1698 yyextra->current->type += " coclass" ;
1699 yyextra->current->fileName = yyextra->fileName;
1700 yyextra->current->startLine = yyextra->yyLineNr;
1701 yyextra->current->startColumn = yyextra->yyColNr;
1702 yyextra->current->bodyLine = yyextra->yyLineNr;
1703 yyextra->current->bodyColumn = yyextra->yyColNr;
1704 lineCount(yyscanner) ;
1705 BEGIN( CompoundName ) ;
1706 }
1707 else
1708 {
1709 addType(yyscanner);
1710 yyextra->current->name = yytext;
1711 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
1712 lineCount(yyscanner);
1713 }
1714 }
1715<FindMembers>{B}*{TYPEDEFPREFIX}"struct{" |
1716<FindMembers>{B}*{TYPEDEFPREFIX}"struct"/{BN}+ {
1717 if (yyextra->insideJava) REJECT;
1718 DString decl = yytext;
1719 yyextra->isTypedef = decl.find("typedef") !=DString::npos;
1720 bool isConst = decl.find("const") !=DString::npos;
1721 bool isVolatile = decl.find("volatile")!=DString::npos;
1722 yyextra->current->section = EntryType::makeClass() ;
1723 TypeSpecifier spec = yyextra->current->spec;
1724 yyextra->current->spec = TypeSpecifier().setStruct(true).
1725 // preserve UNO IDL & Inline attributes, Slice local
1726 setPublished(spec.isPublished()).
1727 setInline(spec.isInline()).
1728 setLocal(spec.isLocal());
1729 // bug 582676: can be a struct nested in an interface so keep yyextra->insideObjC state
1730 //yyextra->current->objc = yyextra->insideObjC = false;
1731 addType(yyscanner);
1732 if (isConst)
1733 {
1734 yyextra->current->type += " const";
1735 }
1736 else if (isVolatile)
1737 {
1738 yyextra->current->type += " volatile";
1739 }
1740 yyextra->current->type += " struct" ;
1741 yyextra->current->fileName = yyextra->fileName;
1742 yyextra->current->startLine = yyextra->yyLineNr;
1743 yyextra->current->startColumn = yyextra->yyColNr;
1744 yyextra->current->bodyLine = yyextra->yyLineNr;
1745 yyextra->current->bodyColumn = yyextra->yyColNr;
1746 lineCount(yyscanner) ;
1747 if (yytext[yyleng-1]=='{') unput('{');
1748 BEGIN( CompoundName ) ;
1749 }
1750<FindMembers>{B}*"value struct{" | // C++/CLI extension
1751<FindMembers>{B}*"value struct"{BN}+ {
1752 yyextra->isTypedef=false;
1753 yyextra->current->section = EntryType::makeClass();
1754 yyextra->current->spec = TypeSpecifier().setStruct(true).setValue(true);
1755 addType(yyscanner);
1756 yyextra->current->type += " value struct" ;
1757 yyextra->current->fileName = yyextra->fileName;
1758 yyextra->current->startLine = yyextra->yyLineNr;
1759 yyextra->current->startColumn = yyextra->yyColNr;
1760 yyextra->current->bodyLine = yyextra->yyLineNr;
1761 yyextra->current->bodyColumn = yyextra->yyColNr;
1762 lineCount(yyscanner) ;
1763 if (yytext[yyleng-1]=='{') unput('{');
1764 BEGIN( CompoundName ) ;
1765 }
1766<FindMembers>{B}*"ref struct{" | // C++/CLI extension
1767<FindMembers>{B}*"ref struct"{BN}+ {
1768 yyextra->isTypedef=false;
1769 yyextra->current->section = EntryType::makeClass();
1770 yyextra->current->spec = TypeSpecifier().setStruct(true).setRef(true);
1771 addType(yyscanner);
1772 yyextra->current->type += " ref struct" ;
1773 yyextra->current->fileName = yyextra->fileName;
1774 yyextra->current->startLine = yyextra->yyLineNr;
1775 yyextra->current->startColumn = yyextra->yyColNr;
1776 yyextra->current->bodyLine = yyextra->yyLineNr;
1777 yyextra->current->bodyColumn = yyextra->yyColNr;
1778 lineCount(yyscanner) ;
1779 if (yytext[yyleng-1]=='{') unput('{');
1780 BEGIN( CompoundName ) ;
1781 }
1782<FindMembers>{B}*"interface struct{" | // C++/CLI extension
1783<FindMembers>{B}*"interface struct"{BN}+ {
1784 yyextra->isTypedef=false;
1785 yyextra->current->section = EntryType::makeClass();
1786 yyextra->current->spec = TypeSpecifier().setStruct(true).setInterface(true);
1787 addType(yyscanner);
1788 yyextra->current->type += " interface struct";
1789 yyextra->current->fileName = yyextra->fileName;
1790 yyextra->current->startLine = yyextra->yyLineNr;
1791 yyextra->current->startColumn = yyextra->yyColNr;
1792 yyextra->current->bodyLine = yyextra->yyLineNr;
1793 yyextra->current->bodyColumn = yyextra->yyColNr;
1794 lineCount(yyscanner) ;
1795 if (yytext[yyleng-1]=='{') unput('{');
1796 BEGIN( CompoundName ) ;
1797 }
1798<FindMembers>{B}*{TYPEDEFPREFIX}"union{" |
1799<FindMembers>{B}*{TYPEDEFPREFIX}"union"{BN}+ {
1800 if (yyextra->insideJava) REJECT;
1801 DString decl=yytext;
1802 yyextra->isTypedef = decl.find("typedef") !=DString::npos;
1803 bool isConst = decl.find("const") !=DString::npos;
1804 bool isVolatile = decl.find("volatile")!=DString::npos;
1805 yyextra->current->section = EntryType::makeClass();
1806 yyextra->current->spec = TypeSpecifier().setUnion(true);
1807 // bug 582676: can be a struct nested in an interface so keep yyextra->insideObjC state
1808 //yyextra->current->objc = yyextra->insideObjC = false;
1809 addType(yyscanner);
1810 if (isConst)
1811 {
1812 yyextra->current->type += " const";
1813 }
1814 else if (isVolatile)
1815 {
1816 yyextra->current->type += " volatile";
1817 }
1818 yyextra->current->type += " union" ;
1819 yyextra->current->fileName = yyextra->fileName;
1820 yyextra->current->startLine = yyextra->yyLineNr;
1821 yyextra->current->startColumn = yyextra->yyColNr;
1822 yyextra->current->bodyLine = yyextra->yyLineNr;
1823 yyextra->current->bodyColumn = yyextra->yyColNr;
1824 lineCount(yyscanner) ;
1825 if (yytext[yyleng-1]=='{') unput('{');
1826 BEGIN( CompoundName ) ;
1827 }
1828<FindMembers>{B}*{TYPEDEFPREFIX}{IDLATTR}?"enum"({BN}+("class"|"struct"))?"{" |
1829<FindMembers>{B}*{TYPEDEFPREFIX}{IDLATTR}?"enum"({BN}+("class"|"struct"))?{BN}+ { // for IDL: typedef [something] enum
1830 DString text=yytext;
1831 yyextra->isTypedef = text.find("typedef")!=DString::npos;
1832 bool isStrongEnum = text.find("class") !=DString::npos || yyextra->insideCS;
1833 bool isEnumSytruct = text.find("struct") !=DString::npos;
1834 if (yyextra->insideJava)
1835 {
1836 yyextra->current->section = EntryType::makeClass();
1837 setJavaProtection(yyscanner);
1838 yyextra->current->spec = TypeSpecifier().setEnum(true);
1839 }
1840 else
1841 {
1842 yyextra->current->section = EntryType::makeEnum() ;
1843 }
1844 addType(yyscanner);
1845 yyextra->current->type += " enum";
1846 if (isStrongEnum)
1847 {
1848 yyextra->current->spec.setStrong(true);
1849 }
1850 if (isEnumSytruct)
1851 {
1852 yyextra->current->spec.setStrong(true).setEnumStruct(true);
1853 }
1854 yyextra->current->fileName = yyextra->fileName;
1855 yyextra->current->startLine = yyextra->yyLineNr;
1856 yyextra->current->startColumn = yyextra->yyColNr;
1857 yyextra->current->bodyLine = yyextra->yyLineNr;
1858 yyextra->current->bodyColumn = yyextra->yyColNr;
1859 lineCount(yyscanner) ;
1860 if (yytext[yyleng-1]=='{') unput('{');
1861 BEGIN( CompoundName ) ;
1862 }
1863<FindMembers>{B}*"concept"{BN}+ { // C++20 concept
1864 if (yyextra->insideJava) REJECT;
1865 yyextra->isTypedef=false;
1866 yyextra->current->section = EntryType::makeConcept();
1867 addType(yyscanner);
1868 yyextra->current->type += " concept";
1869 yyextra->current->fileName = yyextra->fileName;
1870 yyextra->current->startLine = yyextra->yyLineNr;
1871 yyextra->current->startColumn = yyextra->yyColNr;
1872 yyextra->current->bodyLine = yyextra->yyLineNr;
1873 yyextra->current->bodyColumn = yyextra->yyColNr;
1874 yyextra->current->args = yyextra->fullArgString;
1875 yyextra->keepComment = true;
1876 lineCount(yyscanner) ;
1877 BEGIN( ConceptName ) ;
1878 }
1879<Operator>"("{BN}*")"({BN}*"<"[^>]*">"){BNopt}/"(" { // A::operator()<int>(int arg)
1880 lineCount(yyscanner);
1881 yyextra->current->name += "()";
1882 BEGIN( FindMembers );
1883 }
1884<Operator>"("{BN}*")"{BNopt}/("[["[^\‍]]*"]]"){BNopt}"(" {
1885 lineCount(yyscanner);
1886 yyextra->current->name += yytext ;
1887 yyextra->current->name = yyextra->current->name.simplifyWhiteSpace();
1888 BEGIN( FindMembers ) ;
1889 }
1890<Operator>"("{BN}*")"{BNopt}/"(" {
1891 lineCount(yyscanner);
1892 yyextra->current->name += yytext ;
1893 yyextra->current->name = yyextra->current->name.simplifyWhiteSpace();
1894 BEGIN( FindMembers ) ;
1895 }
1896<Operator>";" { // can occur when importing members
1897 unput(';');
1898 BEGIN( FindMembers ) ;
1899 }
1900<Operator>[^(] {
1901 lineCount(yyscanner);
1902 yyextra->current->name += *yytext ;
1903 }
1904<Operator>"<"({B}*{ID}{B}*(","{B}*{BN})*{B}*)?">" { /* skip guided templ specifiers */
1905 if (!yyextra->current->type.startsWith("friend "))
1906 {
1907 yyextra->current->name += yytext;
1908 }
1909 }
1910<Operator>"(" {
1911 yyextra->current->name = yyextra->current->name.simplifyWhiteSpace();
1912 unput(*yytext);
1913 BEGIN( FindMembers ) ;
1914 }
1915<FindMembers>("template"|"generic")({BN}*)"<"/[>]? { // generic is a C++/CLI extension
1916 lineCount(yyscanner);
1917 ArgumentList al;
1918 yyextra->current->tArgLists.push_back(al);
1919 yyextra->currentArgumentList = &yyextra->current->tArgLists.back();
1920 yyextra->templateStr="<";
1921 yyextra->fullArgString = yyextra->templateStr;
1922 yyextra->copyArgString = &yyextra->templateStr;
1923 yyextra->currentArgumentContext = FindMembers;
1924 BEGIN( ReadTempArgs );
1925 }
void push_back(const Argument &a)
Definition arguments.h:103
1926<FindMembers>"namespace"{BN}+/{ID}{BN}*"=" { // namespace alias
1927 if (yyextra->insideJava) REJECT;
1928 lineCount(yyscanner);
1929 BEGIN( NSAliasName );
1930 }
1931<NSAliasName>{ID} {
1932 yyextra->aliasName = yytext;
1933 BEGIN( NSAliasArg );
1934 }
1935<NSAliasArg>({ID}"::")*{ID} {
1936 //printf("Inserting namespace alias %s::%s->%s\n",qPrint(yyextra->current_root->name),qPrint(yyextra->aliasName),yytext);
1937 std::string ctx = yyextra->current_root->name.str();
1938 if (ctx.empty())
1939 {
1940 Doxygen::namespaceAliasMap.emplace(yyextra->aliasName.str(),NamespaceAliasInfo(std::string(yytext),std::string()));
1941 }
1942 else
1943 {
1944 Doxygen::namespaceAliasMap.emplace(ctx+"::"+yyextra->aliasName.str(),NamespaceAliasInfo(std::string(yytext),ctx));
1945 }
1946 }
static NamespaceAliasInfoMap namespaceAliasMap
Definition doxygen.h:106
1947<NSAliasArg>";" {
1948 BEGIN( FindMembers );
1949 }
1950<PHPUse>({ID}{BN}*"\\"{BN}*)*{ID}/{BN}+"as" {
1951 lineCount(yyscanner);
1952 yyextra->aliasName=yytext;
1953 BEGIN(PHPUseAs);
1954 }
1955<PHPUse>({ID}{BN}*"\\"{BN}*)*{ID} {
1956 lineCount(yyscanner);
1957 yyextra->current->name=removeRedundantWhiteSpace(substitute(yytext,"\\","::"));
1958 //printf("PHP: adding use relation: %s\n",qPrint(yyextra->current->name));
1959 yyextra->current->fileName = yyextra->fileName;
1960 // add a using declaration
1961 yyextra->current->section = EntryType::makeUsingDecl();
1962 yyextra->current_root->copyToSubEntry(yyextra->current);
1963 // also add it as a using directive
1964 yyextra->current->section = EntryType::makeUsingDir();
1965 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
1966 initEntry(yyscanner);
1967 yyextra->aliasName.clear();
1968 }
DString removeRedundantWhiteSpace(const DString &s)
Definition util.cpp:426
1969<PHPUseAs>{BN}+"as"{BN}+ {
1970 lineCount(yyscanner);
1971 }
1972<PHPUseAs>{PHPUSEKW} {
1973 }
1974<PHPUseAs>{ID} {
1975 //printf("PHP: adding use as relation: %s->%s\n",yytext,qPrint(yyextra->aliasName));
1976 if (!yyextra->aliasName.empty())
1977 {
1978 std::string aliasValue = removeRedundantWhiteSpace(substitute(yyextra->aliasName,"\\","::")).str();
1979 Doxygen::namespaceAliasMap.emplace(yytext,NamespaceAliasInfo(aliasValue));
1980 }
1981 yyextra->aliasName.clear();
1982 }
const std::string & str() const
Definition dstring.h:645
1983<PHPUse,PHPUseAs>[,;] {
1984 if (*yytext==',')
1985 {
1986 BEGIN(PHPUse);
1987 }
1988 else
1989 {
1990 BEGIN(FindMembers);
1991 }
1992 }
1993<JavaImport>({ID}{BN}*"."{BN}*)+"*" { // package import => add as a using directive
1994 lineCount(yyscanner);
1995 DString scope=yytext;
1996 yyextra->current->name=removeRedundantWhiteSpace(substitute(scope.left(scope.length()-1),".","::"));
1997 yyextra->current->fileName = yyextra->fileName;
1998 bool ambig = false;
1999 FileDef *incFd = Doxygen::inputNameLinkedMap->findFileDef(yyextra->fileName,ambig);
2000 if (incFd)
2001 {
2002 incFd->addIncludeDependency(nullptr,scope,IncludeKind::ImportModule);
2003 }
2004 yyextra->current->section = EntryType::makeUsingDir();
2005 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2006 initEntry(yyscanner);
2007 BEGIN(Using);
2008 }
static FileNameLinkedMap * inputNameLinkedMap
Definition doxygen.h:97
A model of a file symbol.
Definition filedef.h:97
virtual void addIncludeDependency(const FileDef *fd, const DString &incName, IncludeKind kind)=0
FileDef * findFileDef(const DString &n, bool &ambig) const
Returns the file definition in fnMap that matches the file name n.
Definition filename.cpp:38
@ ImportModule
Definition filedef.h:52
2009<JavaImport>({ID}{BN}*"."{BN}*)+{ID} { // class import => add as a using declaration
2010 lineCount(yyscanner);
2011 DString scope=yytext;
2012 yyextra->current->name=removeRedundantWhiteSpace(substitute(scope,".","::"));
2013 yyextra->current->fileName = yyextra->fileName;
2014 bool ambig = false;
2015 FileDef *fromFd = Doxygen::inputNameLinkedMap->findFileDef(yyextra->fileName,ambig);
2016 FileDef *toFd = Doxygen::inputNameLinkedMap->findFileDef(scope,ambig);
2017 if (fromFd)
2018 {
2020 }
2021 if (toFd && fromFd)
2022 {
2024 }
2025 if (yyextra->insideD)
2026 {
2027 yyextra->current->section = EntryType::makeUsingDir();
2028 }
2029 else
2030 {
2031 //printf("import name = %s -> %s\n",yytext,qPrint(yyextra->current->name));
2032 yyextra->current->section = EntryType::makeUsingDecl();
2033 }
2034 yyextra->previous = yyextra->current;
2035 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2036 initEntry(yyscanner);
2037 BEGIN(Using);
2038 }
virtual const DString & docName() const =0
virtual void addIncludedByDependency(const FileDef *fd, const DString &incName, IncludeKind kind)=0
2039<IDLImport>"\""[^"]*"\"" {
2040 DString fileName(&yytext[1],yyleng-2);
2041 bool ambig = false;
2042 FileDef *fromFd = Doxygen::inputNameLinkedMap->findFileDef(yyextra->fileName,ambig);
2043 FileDef *toFd = Doxygen::inputNameLinkedMap->findFileDef(fileName,ambig);
2044 if (fromFd)
2045 {
2046 fromFd->addIncludeDependency(toFd,fileName,IncludeKind::ImportModule);
2047 }
2048 if (toFd && fromFd)
2049 {
2051 }
2052 }
2053<IDLImport>";" {
2054 BEGIN(FindMembers);
2055 }
2056<FindMembers>"using"{BN}+/("::"{ID}("::"{ID})*)? {
2057 if (yyextra->insideJava) REJECT;
2058 yyextra->current->startLine=yyextra->yyLineNr;
2059 yyextra->current->startColumn = yyextra->yyColNr;
2060 lineCount(yyscanner);
2061 BEGIN(Using);
2062 }
2063<Using>"namespace"{BN}+ { lineCount(yyscanner); BEGIN(UsingDirective); }
2064<Using>("::")?({ID}{BN}*("::"|"."){BN}*)*({ID}|{OPERATOR}|{FUNCOP}) {
2065 lineCount(yyscanner);
2066 yyextra->current->name=yytext;
2067 yyextra->current->fileName = yyextra->fileName;
2068 yyextra->current->section = EntryType::makeUsingDecl();
2069 yyextra->current->startLine = yyextra->yyLineNr;
2070 yyextra->usingNewVarNeeded = true;
2071 if (yyextra->insideCS) /* Hack: in C# a using declaration and
2072 directive have the same syntax, so we
2073 also add it as a using directive here
2074 */
2075 {
2076 yyextra->current->name=yytext;
2077 yyextra->current->fileName = yyextra->fileName;
2078 yyextra->current->startLine = yyextra->yyLineNr;
2079 yyextra->current->startColumn = yyextra->yyColNr;
2080 yyextra->current->section = EntryType::makeUsingDir();
2081 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2082 initEntry(yyscanner);
2083 }
2084 BEGIN(Using);
2085 }
2086<Using>({ID}{BN}*("::"|"."){BN}*)*({ID}|{OPERATOR}){BN}*"=" { // C++11 style using alias
2087 yyextra->current->name=DString(yytext).left(yyleng-1).stripWhiteSpace();
2088 yyextra->current->fileName = yyextra->fileName;
2089 yyextra->current->section = EntryType::makeUsingDecl();
2090 yyextra->current->startLine = yyextra->yyLineNr;
2091 yyextra->current->bodyLine = yyextra->yyLineNr;
2092 yyextra->current->bodyColumn = yyextra->yyColNr;
2093 yyextra->lastInitializerContext = UsingAlias;
2094 yyextra->sharpCount=0;
2095 yyextra->initBracketCount=0;
2096 storeClangId(yyscanner,yyextra->current->name.data());
2097 BEGIN(ReadInitializer);
2098 }
2099<Using>";" {
2100 if (yyextra->usingNewVarNeeded)
2101 {
2102 yyextra->previous = yyextra->current;
2103 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2104 initEntry(yyscanner);
2105 yyextra->usingNewVarNeeded = false;
2106 }
2107 BEGIN(FindMembers);
2108 }
2109<Using>{BN}*"=" {
2110 yyextra->lastInitializerContext = UsingAlias;
2111 yyextra->sharpCount=0;
2112 yyextra->initBracketCount=0;
2113 storeClangId(yyscanner,yyextra->current->name.data());
2114 yyextra->usingNewVarNeeded = false;
2115 BEGIN(ReadInitializer);
2116 }
2117<Using>{B}*{CCS} {
2118 yyextra->lastCContext = YY_START ;
2119 BEGIN( SkipComment ) ;
2120 }
2121<Using>{B}*{CPPC} {
2122 yyextra->lastCContext = YY_START ;
2123 BEGIN( SkipCxxComment ) ;
2124 }
2125<Using>{B}*
2126<Using>. {
2127 if (yyextra->usingNewVarNeeded)
2128 {
2129 yyextra->previous = yyextra->current;
2130 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2131 initEntry(yyscanner);
2132 yyextra->usingNewVarNeeded = false;
2133 }
2134 }
2135<UsingAlias>";" {
2136 yyextra->current->section = EntryType::makeVariable();
2137 DString init = yyextra->current->initializer.str();
2138 init.stripPrefix("class ");
2139 init.stripPrefix("struct ");
2140 init = init.stripWhiteSpace();
2141 yyextra->current->type = "typedef "+init;
2142 yyextra->current->args.clear();
2143 yyextra->current->spec.setAlias(true);
2144 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2145 initEntry(yyscanner);
2146 BEGIN(FindMembers);
2147 }
void init()
2148<UsingAlias>. {
2149 yyextra->current->initializer << yytext;
2150 }
2151<UsingAlias>\n {
2152 yyextra->current->initializer << yytext;
2153 lineCount(yyscanner);
2154 }
2155<UsingDirective>{SCOPENAME} { yyextra->current->name=removeRedundantWhiteSpace(yytext);
2156 yyextra->current->fileName = yyextra->fileName;
2157 yyextra->current->section = EntryType::makeUsingDir();
2158 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2159 initEntry(yyscanner);
2160 yyextra->usingNewVarNeeded = false;
2161 BEGIN(Using);
2162 }
2163<FindMembers>{SCOPENAME}{BN}*"<>" { // guided template decl
2164 DString n=yytext;
2165 addType(yyscanner);
2166 yyextra->current->name=n.left(n.length()-2);
2167 }
2168<FindMembers>{SCOPENAME}{BNopt}/"<" { // Note: this could be a return type!
2169 DString name = DString(yytext).stripWhiteSpace();
2170 if (yyextra->insideCpp && name=="import") REJECT; // C++20 module header import
2171 yyextra->roundCount=0;
2172 yyextra->sharpCount=0;
2173 lineCount(yyscanner);
2174 addType(yyscanner);
2175 yyextra->current->name=name;
2176 //yyextra->current->scopeSpec.clear();
2177 // yyextra->currentTemplateSpec = &yyextra->current->scopeSpec;
2178 if (nameIsOperator(yyextra->current->name))
2179 BEGIN( Operator );
2180 else
2181 BEGIN( EndTemplate );
2182 }
2183<FindMemberName>{SCOPENAME}{BNopt}/"<" {
2184 yyextra->sharpCount=0;
2185 yyextra->roundCount=0;
2186 lineCount(yyscanner);
2187 yyextra->current->name+=((DString)yytext).stripWhiteSpace();
2188 //yyextra->current->memberSpec.clear();
2189 // yyextra->currentTemplateSpec = &yyextra->current->memberSpec;
2190 if (nameIsOperator(yyextra->current->name))
2191 BEGIN( Operator );
2192 else
2193 BEGIN( EndTemplate );
2194 }
std::string_view stripWhiteSpace(std::string_view s)
Given a string view s, returns a new, narrower view on that string, skipping over any leading or trai...
Definition stringutil.h:75
2195<EndTemplate>"<<<" {
2196 if (!yyextra->insidePHP)
2197 {
2198 REJECT;
2199 }
2200 else
2201 {
2202 yyextra->lastHereDocContext = YY_START;
2203 BEGIN(HereDoc);
2204 }
2205 }
2206<ClassTemplSpec,EndTemplate>("<<"|"<=") {
2207 yyextra->current->name+=yytext;
2208 // *yyextra->currentTemplateSpec+=yytext;
2209 }
2210<EndTemplate>"<" {
2211 if (yyextra->roundCount==0)
2212 {
2213 // *yyextra->currentTemplateSpec+='<';
2214 yyextra->sharpCount++;
2215 }
2216 yyextra->current->name+=yytext;
2217 }
2218<ClassTemplSpec,EndTemplate>">=" {
2219 yyextra->current->name+=yytext;
2220 }
2221<ClassTemplSpec,EndTemplate>(">>") {
2222 if (yyextra->insideJava || yyextra->insideCS || yyextra->insideCli || yyextra->roundCount==0)
2223 {
2224 unput('>');
2225 unput(' ');
2226 unput('>');
2227 }
2228 else
2229 {
2230 yyextra->current->name+=yytext;
2231 }
2232 // *yyextra->currentTemplateSpec+=yytext;
2233 }
2234<EndTemplate>">" {
2235 yyextra->current->name+='>';
2236 // *yyextra->currentTemplateSpec+='>';
2237 if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
2238 {
2239 yyextra->current->name = yyextra->current->name.simplifyWhiteSpace();
2240 //printf("Found %s\n",qPrint(yyextra->current->name));
2241 BEGIN(FindMembers);
2242 }
2243 }
2244<EndTemplate>">"{BN}*"(" {
2245 lineCount(yyscanner);
2246 yyextra->current->name+='>';
2247 // *yyextra->currentTemplateSpec+='>';
2248 if (yyextra->roundCount==0)
2249 {
2250 --yyextra->sharpCount;
2251 }
2252 if (yyextra->roundCount==0 && yyextra->sharpCount<=0)
2253 {
2254 yyextra->current->bodyLine = yyextra->yyLineNr;
2255 yyextra->current->bodyColumn = yyextra->yyColNr;
2256 yyextra->current->args = "(";
2257 yyextra->currentArgumentContext = FuncQual;
2258 yyextra->fullArgString = yyextra->current->args;
2259 yyextra->copyArgString = &yyextra->current->args;
2260 //printf("Found %s\n",qPrint(yyextra->current->name));
2261 BEGIN( ReadFuncArgType ) ;
2262 }
2263 else
2264 {
2265 yyextra->current->name+="(";
2266 yyextra->roundCount++;
2267 }
2268 }
2269<EndTemplate>">"{BNopt}/"("({BN}*{TSCOPE}{BN}*"::")*({BN}*"*"{BN}*)+ { // function pointer returning a template instance
2270 lineCount(yyscanner);
2271 yyextra->current->name+='>';
2272 if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
2273 {
2274 BEGIN(FindMembers);
2275 }
2276 }
2277<EndTemplate>">"{BNopt}/"::" {
2278 lineCount(yyscanner);
2279 yyextra->current->name+='>';
2280 // *yyextra->currentTemplateSpec+='>';
2281 if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
2282 {
2283 BEGIN(FindMemberName);
2284 }
2285 }
2286<ClassTemplSpec,EndTemplate>"(" { yyextra->current->name+=*yytext;
2287 yyextra->roundCount++;
2288 }
2289<ClassTemplSpec,EndTemplate>")" { yyextra->current->name+=*yytext;
2290 if (yyextra->roundCount>0) yyextra->roundCount--;
2291 }
2292<EndTemplate>. {
2293 yyextra->current->name+=*yytext;
2294 // *yyextra->currentTemplateSpec+=*yytext;
2295 }
2296<FindMembers>"define"{BN}*"("{BN}*["'] {
2297 if (yyextra->insidePHP)
2298 {
2299 yyextra->current->bodyLine = yyextra->yyLineNr;
2300 yyextra->current->bodyColumn = yyextra->yyColNr;
2301 BEGIN( DefinePHP );
2302 }
2303 else
2304 REJECT;
2305 }
2306<CopyHereDoc>{ID} { // PHP heredoc
2307 yyextra->delimiter = yytext;
2308 *yyextra->pCopyHereDocGString << yytext;
2309 BEGIN(CopyHereDocEnd);
2310 }
2311<CopyHereDoc>"\""{ID}/"\"" { // PHP quoted heredoc
2312 yyextra->delimiter = &yytext[1];
2313 *yyextra->pCopyHereDocGString << yytext;
2314 BEGIN(CopyHereDocEnd);
2315 }
2316<CopyHereDoc>"'"{ID}/"'" { // PHP nowdoc
2317 yyextra->delimiter = &yytext[1];
2318 *yyextra->pCopyHereDocGString << yytext;
2319 BEGIN(CopyHereDocEnd);
2320 }
2321<HereDoc>{ID} { // PHP heredoc
2322 yyextra->delimiter = yytext;
2323 BEGIN(HereDocEnd);
2324 }
2325<HereDoc>"\""{ID}/"\"" { // PHP quoted heredoc
2326 yyextra->delimiter = &yytext[1];
2327 BEGIN(HereDocEnd);
2328 }
2329<HereDoc>"'"{ID}/"'" { // PHP nowdoc
2330 yyextra->delimiter = &yytext[1];
2331 BEGIN(HereDocEnd);
2332 }
2333<HereDocEnd>^{Bopt}{ID} { // id at start of the line could mark the end of the block
2334 if (yyextra->delimiter==DString(yytext).stripWhiteSpace()) // it is the end marker
2335 {
2336 BEGIN(yyextra->lastHereDocContext);
2337 }
2338 }
2339<HereDocEnd>. { }
2340<CopyHereDocEnd>^{Bopt}{ID} { // id at start of the line could mark the end of the block
2341 *yyextra->pCopyHereDocGString << yytext;
2342 if (yyextra->delimiter==DString(yytext).stripWhiteSpace()) // it is the end marker
2343 {
2344 BEGIN(yyextra->lastHereDocContext);
2345 }
2346 }
2347<CopyHereDocEnd>\n {
2348 lineCount(yyscanner);
2349 *yyextra->pCopyHereDocGString << yytext;
2350 }
2351<CopyHereDocEnd>{ID} {
2352 *yyextra->pCopyHereDocGString << yytext;
2353 }
2354<CopyHereDocEnd>. {
2355 *yyextra->pCopyHereDocGString << yytext;
2356 }
2357<FindMembers>"Q_OBJECT"|"Q_GADGET" { // Qt object / gadget macro
2358 }
2359<FindMembers>"Q_PROPERTY" { // Qt property declaration
2360 yyextra->yyBegLineNr = yyextra->yyLineNr;
2361 yyextra->yyBegColNr = yyextra->yyColNr;
2362 yyextra->current->protection = Protection::Public ; // see bug734245 & bug735462
2363 yyextra->current->mtype = yyextra->mtype = MethodTypes::Property;
2364 yyextra->current->type.clear();
2365 BEGIN(QtPropType);
2366 }
2367<QtPropType>"(" { // start of property arguments
2368 }
2369<QtPropAttr>")" { // end of property arguments
2370 unput(';');
2371 BEGIN(FindMembers);
2372 }
2373<QtPropType>{BN}+ {
2374 yyextra->current->name+=yytext;
2375 }
2376<QtPropType>"*" {
2377 yyextra->current->type+= yyextra->current->name;
2378 yyextra->current->type+= yytext;
2379 yyextra->current->name="";
2380 }
2381<QtPropType>({TSCOPE}"::")*{TSCOPE} {
2382 yyextra->current->type+= yyextra->current->name;
2383 yyextra->current->name=yytext;
2384 }
2385<QtPropType,QtPropAttr>{BN}+"READ"{BN}+ {
2386 yyextra->current->spec.setReadable(true);
2387 BEGIN(QtPropRead);
2388 }
2389<QtPropType,QtPropAttr>{BN}+"WRITE"{BN}+ {
2390 yyextra->current->spec.setWritable(true);
2391 BEGIN(QtPropWrite);
2392 }
2393<QtPropType,QtPropAttr>{BN}+"MEMBER"{BN}+{ID} | // member property => not supported yet
2394<QtPropType,QtPropAttr>{BN}+"RESET"{BN}+{ID} | // reset method => not supported yet
2395<QtPropType,QtPropAttr>{BN}+"SCRIPTABLE"{BN}+{ID} | // scriptable property => not supported yet
2396<QtPropType,QtPropAttr>{BN}+"DESIGNABLE"{BN}+{ID} | // designable property => not supported yet
2397<QtPropType,QtPropAttr>{BN}+"NOTIFY"{BN}+{ID} | // notify property => not supported yet
2398<QtPropType,QtPropAttr>{BN}+"REVISION"{BN}+{ID} | // revision property => not supported yet
2399<QtPropType,QtPropAttr>{BN}+"STORED"{BN}+{ID} | // stored property => not supported yet
2400<QtPropType,QtPropAttr>{BN}+"USER"{BN}+{ID} | // user property => not supported yet
2401<QtPropType,QtPropAttr>{BN}+"CONSTANT"{BN} | // constant property => not supported yet
2402<QtPropType,QtPropAttr>{BN}+"FINAL"{BN} { // final property => not supported yet
2403 BEGIN(QtPropAttr);
2404 }
2405<QtPropRead>{ID} {
2406 yyextra->current->read = yytext;
2407 BEGIN(QtPropAttr);
2408 }
2409<QtPropWrite>{ID} {
2410 yyextra->current->write = yytext;
2411 BEGIN(QtPropAttr);
2412 }
2413<FindMembers>"friend"{BN}+("class"|"union"|"struct"){BN}+ {
2414 yyextra->current->name=yytext;
2415 lineCount(yyscanner) ;
2416 BEGIN(FindMembers);
2417 }
2418<FindMembers>"requires" { // C++20 requires clause
2419 if (yyextra->insideJava) REJECT;
2420 yyextra->current->req.clear();
2421 yyextra->requiresContext = YY_START;
2422 BEGIN(RequiresClause);
2423 }
2424<RequiresClause>"requires"{BN}*/"{" { // requires requires { ... }
2425 if (yyextra->insideJava) REJECT;
2426 lineCount(yyscanner) ;
2427 yyextra->current->req+=yytext;
2428 BEGIN( RequiresExpression ) ;
2429 }
2430<RequiresClause>"requires"{BN}*"(" { // requires requires(T x) { ... }
2431 if (yyextra->insideJava) REJECT;
2432 lineCount(yyscanner) ;
2433 yyextra->current->req+=yytext;
2434 yyextra->lastRoundContext=RequiresExpression;
2435 yyextra->pCopyRoundString=&yyextra->current->req;
2436 yyextra->roundCount=0;
2437 BEGIN( CopyRound ) ;
2438 }
2439<RequiresExpression>"{" {
2440 yyextra->current->req+=yytext;
2441 yyextra->lastCurlyContext=RequiresClause;
2442 yyextra->pCopyCurlyString=&yyextra->current->req;
2443 yyextra->curlyCount=0;
2444 BEGIN( CopyCurly ) ;
2445 }
2446<RequiresExpression>\n {
2447 yyextra->current->req+=' ';
2448 lineCount(yyscanner);
2449 }
2450<RequiresExpression>. {
2451 yyextra->current->req+=yytext;
2452 }
2453<RequiresClause>"(" { // requires "(A && B)"
2454 yyextra->current->req+=yytext;
2455 yyextra->lastRoundContext=RequiresClause;
2456 yyextra->pCopyRoundString=&yyextra->current->req;
2457 yyextra->roundCount=0;
2458 BEGIN( CopyRound ) ;
2459 }
2460<RequiresClause>{NOTopt}{SCOPENAME}{BNopt}"(" { // "requires func(x)"
2461 if (startOfRequiresExpression(yyextra->current->req))
2462 {
2463 lineCount(yyscanner);
2464 yyextra->current->req+=yytext;
2465 yyextra->lastRoundContext=RequiresClause;
2466 yyextra->pCopyRoundString=&yyextra->current->req;
2467 yyextra->roundCount=0;
2468 BEGIN( CopyRound );
2469 }
2470 else
2471 {
2472 REJECT;
2473 }
2474 }
2475<RequiresClause>{NOTopt}{SCOPENAME}{BNopt}"<" { // "requires C<S,T>"
2476 if (startOfRequiresExpression(yyextra->current->req))
2477 {
2478 lineCount(yyscanner);
2479 yyextra->current->req+=yytext;
2480 yyextra->lastSharpContext=RequiresClause;
2481 yyextra->pCopySharpString=&yyextra->current->req;
2482 yyextra->sharpCount=0;
2483 BEGIN( CopySharp );
2484 }
2485 else
2486 {
2487 REJECT
2488 }
2489 }
2490<RequiresClause>{NOTopt}{SCOPENAME} { // something like "requires true" or "requires !my::value"
2491 if (startOfRequiresExpression(yyextra->current->req))
2492 {
2493 lineCount(yyscanner);
2494 yyextra->current->req=yytext;
2495 BEGIN(yyextra->requiresContext);
2496 }
2497 else
2498 {
2499 REJECT;
2500 }
2501 }
2502<RequiresClause>{NOTopt}"::"{ID} {
2503 lineCount(yyscanner);
2504 yyextra->current->req+=yytext;
2505 }
2506<RequiresClause>"||"|"&&"|"!"|("or"{BN}+)|("and"{BN}+)|("not"{BN}+) { // "requires A || B" or "requires A && B"
2507 lineCount(yyscanner);
2508 yyextra->current->req+=yytext;
2509 }
2510<RequiresClause>{BN}+ {
2511 yyextra->current->req+=' ';
2512 lineCount(yyscanner) ;
2513 }
2514<RequiresClause>. {
2515 unput(*yytext);
2516 yyextra->current->req=yyextra->current->req.simplifyWhiteSpace();
2517 BEGIN(yyextra->requiresContext);
2518 }
2519<FindMembers,FindMemberName>{SCOPENAME} {
2520 storeClangId(yyscanner,yytext);
2521 yyextra->yyBegColNr=yyextra->yyColNr;
2522 yyextra->yyBegLineNr=yyextra->yyLineNr;
2523 lineCount(yyscanner);
2524 if (yyextra->insideIDL && yyleng==9 && dstrcmp(yytext,"cpp_quote")==0)
2525 {
2526 BEGIN(CppQuote);
2527 }
2528 else if ((yyextra->insideIDL || yyextra->insideJava || yyextra->insideD) && yyleng==6 && dstrcmp(yytext,"import")==0)
2529 {
2530 if (yyextra->insideIDL)
2531 BEGIN(IDLImport);
2532 else // yyextra->insideJava or yyextra->insideD
2533 BEGIN(JavaImport);
2534 }
2535 else if (yyextra->insidePHP && dstrcmp(yytext,"use")==0)
2536 {
2537 BEGIN(PHPUse);
2538 }
2539 else if (yyextra->insideJava && dstrcmp(yytext,"package")==0)
2540 {
2541 lineCount(yyscanner);
2542 BEGIN(PackageName);
2543 }
2544 else if (yyextra->insideIDL && dstrcmp(yytext,"case")==0)
2545 {
2546 BEGIN(IDLUnionCase);
2547 }
2548 else if (yyextra->insideTryBlock && dstrcmp(yytext,"catch")==0)
2549 {
2550 yyextra->insideTryBlock=false;
2551 BEGIN(TryFunctionBlock);
2552 }
2553 else if (yyextra->insideCpp && dstrcmp(yytext,"alignas")==0)
2554 {
2555 yyextra->lastAlignAsContext = YY_START;
2556 BEGIN(AlignAs);
2557 }
2558 else if (yyextra->insideJS && dstrcmp(yytext,"var")==0)
2559 { // javascript variable
2560 yyextra->current->type="var";
2561 }
2562 else if (yyextra->insideJS && dstrcmp(yytext,"function")==0)
2563 { // javascript function
2564 yyextra->current->type="function";
2565 }
2566 else if (yyextra->insideCS && dstrcmp(yytext,"this")==0)
2567 {
2568 // C# indexer
2569 addType(yyscanner);
2570 yyextra->current->name="this";
2571 BEGIN(CSIndexer);
2572 }
2573 else if (yyextra->insideCpp && (dstrcmp(yytext,"static_assert")==0 || dstrcmp(yytext,"_Static_assert")==0))
2574 {
2575 // C/C++11 static_assert
2576 BEGIN(StaticAssert);
2577 }
2578 else if (yyextra->insideCpp && dstrcmp(yytext,"decltype")==0)
2579 {
2580 // C++11 decltype(x)
2581 addType(yyscanner);
2582 if (!yyextra->current->type.empty()) yyextra->current->type+=' ';
2583 yyextra->current->type+=yytext;
2584 BEGIN(DeclType);
2585 }
2586 else if (yyextra->insideSlice && dstrcmp(yytext,"optional")==0)
2587 {
2588 if (yyextra->current->type.empty())
2589 {
2590 yyextra->current->type = "optional";
2591 }
2592 else
2593 {
2594 yyextra->current->type += " optional";
2595 }
2596 yyextra->lastModifierContext = YY_START;
2597 BEGIN(SliceOptional);
2598 }
2599 else
2600 {
2601 if (YY_START==FindMembers)
2602 {
2603 addType(yyscanner);
2604 }
2605 bool javaLike = yyextra->insideJava || yyextra->insideCS || yyextra->insideD || yyextra->insidePHP || yyextra->insideJS;
2606 if (javaLike && dstrcmp(yytext,"public")==0)
2607 {
2608 yyextra->current->protection = Protection::Public;
2609 }
2610 else if (javaLike && dstrcmp(yytext,"protected")==0)
2611 {
2612 yyextra->current->protection = Protection::Protected;
2613 }
2614 else if ((yyextra->insideCS || yyextra->insideD || yyextra->insidePHP || yyextra->insideJS) && dstrcmp(yytext,"internal")==0)
2615 {
2616 // C# "protected internal" is also visible to derived classes in other assemblies
2617 if (!(yyextra->insideCS && yyextra->current->protection==Protection::Protected))
2618 {
2619 yyextra->current->protection = Protection::Package;
2620 }
2621 }
2622 else if (javaLike && dstrcmp(yytext,"private")==0)
2623 {
2624 yyextra->current->protection = Protection::Private;
2625 }
2626 else if (javaLike && dstrcmp(yytext,"static")==0)
2627 {
2628 if (YY_START==FindMembers)
2629 yyextra->current->name = yytext;
2630 else
2631 yyextra->current->name += yytext;
2632 yyextra->current->isStatic = true;
2633 }
2634 else
2635 {
2636 if (YY_START==FindMembers)
2637 yyextra->current->name = yytext;
2638 else
2639 yyextra->current->name += yytext;
2640 if (yyextra->current->name.startsWith("static "))
2641 {
2642 yyextra->current->isStatic = true;
2643 yyextra->current->name= yyextra->current->name.mid(7);
2644 }
2645 else if (yyextra->current->name.startsWith("inline "))
2646 {
2647 if (yyextra->current->type.empty())
2648 {
2649 yyextra->current->type="inline";
2650 }
2651 else
2652 {
2653 yyextra->current->type+="inline ";
2654 }
2655 yyextra->current->name= yyextra->current->name.mid(7);
2656 }
2657 else if (yyextra->current->name.startsWith("constexpr "))
2658 {
2659 if (yyextra->current->type.empty())
2660 {
2661 yyextra->current->type="constexpr";
2662 }
2663 else
2664 {
2665 yyextra->current->type+="constexpr ";
2666 }
2667 yyextra->current->name=yyextra->current->name.mid(10);
2668 }
2669 else if (yyextra->current->name.startsWith("consteval "))
2670 {
2671 if (yyextra->current->type.empty())
2672 {
2673 yyextra->current->type="consteval";
2674 }
2675 else
2676 {
2677 yyextra->current->type+="consteval ";
2678 }
2679 yyextra->current->name=yyextra->current->name.mid(10);
2680 }
2681 else if (yyextra->current->name.startsWith("constinit "))
2682 {
2683 if (yyextra->current->type.empty())
2684 {
2685 yyextra->current->type="constinit";
2686 }
2687 else
2688 {
2689 yyextra->current->type+="constinit ";
2690 }
2691 yyextra->current->name=yyextra->current->name.mid(10);
2692 }
2693 else if (yyextra->current->name.startsWith("const "))
2694 {
2695 if (yyextra->current->type.empty())
2696 {
2697 yyextra->current->type="const";
2698 }
2699 else
2700 {
2701 yyextra->current->type+="const ";
2702 }
2703 yyextra->current->name=yyextra->current->name.mid(6);
2704 }
2705 else if (yyextra->current->name.startsWith("volatile "))
2706 {
2707 if (yyextra->current->type.empty())
2708 {
2709 yyextra->current->type="volatile";
2710 }
2711 else
2712 {
2713 yyextra->current->type+="volatile ";
2714 }
2715 yyextra->current->name=yyextra->current->name.mid(9);
2716 }
2717 else if (yyextra->current->name.startsWith("typedef "))
2718 {
2719 if (yyextra->current->type.empty())
2720 {
2721 yyextra->current->type="typedef";
2722 }
2723 else
2724 {
2725 yyextra->current->type+="typedef ";
2726 }
2727 yyextra->current->name=yyextra->current->name.mid(8);
2728 }
2729 }
2730 DString tmp=yytext;
2731 if (nameIsOperator(tmp))
2732 {
2733 BEGIN( Operator );
2734 }
2735 else
2736 {
2737 yyextra->externLinkage=false; // see bug759247
2738 BEGIN(FindMembers);
2739 }
2740 }
2741 yyextra->current->name = yyextra->current->name.removeWhiteSpace();
2742 }
2743<StaticAssert>"(" {
2744 yyextra->lastSkipRoundContext = FindMembers;
2745 yyextra->roundCount=0;
2746 BEGIN(SkipRound);
2747 }
2748<StaticAssert>{BN}+ { lineCount(yyscanner); }
2749<StaticAssert>. { // variable with static_assert as name?
2750 unput(*yytext);
2751 BEGIN(FindMembers);
2752 }
2753<DeclType>"(" {
2754 yyextra->current->type+=yytext;
2755 yyextra->lastRoundContext=FindMembers;
2756 yyextra->pCopyRoundString=&yyextra->current->type;
2757 yyextra->roundCount=0;
2758 BEGIN(CopyRound);
2759 }
2760<DeclType>{BN}+ { lineCount(yyscanner); }
2761<DeclType>. {
2762 unput(*yytext);
2763 BEGIN(FindMembers);
2764 }
2765<CSIndexer>"["[^\n\‍]]*"]" {
2766 yyextra->current->name+=removeRedundantWhiteSpace(yytext);
2767 BEGIN(FindMembers);
2768 }
2769<FindMembers>[0-9]{ID} { // some number where we did not expect one
2770 }
2771<FindMembers>"." {
2772 if (yyextra->insideJava || yyextra->insideCS || yyextra->insideD)
2773 {
2774 yyextra->current->name+=".";
2775 }
2776 }
2777<FindMembers>"::" {
2778 yyextra->current->name+=yytext;
2779 }
2780<CppQuote>"("{B}*"\"" {
2781 yyextra->insideCppQuote=true;
2782 BEGIN(FindMembers);
2783 }
2784<IDLUnionCase>"::"
2785<IDLUnionCase>":" { BEGIN(FindMembers); }
2786<IDLUnionCase>\n { lineCount(yyscanner); }
2787<IDLUnionCase>.
2788<TryFunctionBlock>\n { lineCount(yyscanner); }
2789<TryFunctionBlock>"{" {
2790 yyextra->curlyCount=0;
2791 yyextra->lastCurlyContext = TryFunctionBlockEnd ;
2792 BEGIN( SkipCurly );
2793 }
2794<TryFunctionBlock>.
2795<TryFunctionBlockEnd>{BN}*"catch" { lineCount(yyscanner); BEGIN(TryFunctionBlock); // {BN}* added to fix bug 611193
2796 }
2797<TryFunctionBlockEnd>\n { unput(*yytext); // rule added to fix bug id 601138
2798 BEGIN( FindMembers );
2799 }
2800<TryFunctionBlockEnd>. { unput(*yytext);
2801 BEGIN( FindMembers );
2802 }
2803<EndCppQuote>")" {
2804 yyextra->insideCppQuote=false;
2805 BEGIN(FindMembers);
2806 }
2807<FindConceptParts>[^\/\n]* {
2808 yyextra->current->initializer << yytext;
2809 }
2810<FindConceptParts>. {
2811 yyextra->current->initializer << yytext;
2812 }
2813<FindConceptParts>\n {
2814 yyextra->current->initializer << yytext;
2815 yyextra->yyLineNr++;
2816 }
2817<FindConceptParts>{CCS} {
2818 yyextra->current->initializer << yytext;
2819 }
2820<FindConceptParts>{CPPC} {
2821 yyextra->current->initializer << yytext;
2822 }
2823<FindConceptParts>^[ \t]*{CCS}[!*] { // start of a special comment inside Concept definition
2824 DString text(yytext);
2825 size_t indent = text.find('/');
2826 //printf("## startLine=%d startColumn=%d\n",yyextra->current->startLine,indent);
2827 if (!yyextra->current->initializer.empty())
2828 {
2829 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2830 initEntry(yyscanner);
2831 }
2832 yyextra->current->section = EntryType::makeConceptDocPart();
2833 yyextra->current->startLine = yyextra->yyLineNr;
2834 yyextra->current->startColumn = indent;
2835 yyextra->current->initializer.clear();
2836 BEGIN(FindConceptDocs);
2837 }
2838<FindConceptParts>^[ \t]*{CPPC}[!/].*\n {
2839 if (!yyextra->current->initializer.empty())
2840 {
2841 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2842 initEntry(yyscanner);
2843 }
2844 DString line(yytext);
2845 size_t indent = line.find('/');
2846 yyextra->current->section = EntryType::makeConceptDocPart();
2847 yyextra->current->startLine = yyextra->yyLineNr;
2848 yyextra->current->startColumn = indent;
2849 yyextra->current->initializer.clear();
2850 yyextra->current->initializer << line.mid(indent+3);
2851 yyextra->yyLineNr++;
2852 BEGIN(FindConceptCxxDocs);
2853 }
2854<FindConceptCxxDocs>^[ \t]*{CPPC}.*\n {
2855 DString line(yytext);
2856 size_t p = line.find('/');
2857 if (line.at(p+2)=='!' || line.at(p+2)=='/') p++;
2858 yyextra->current->initializer << line.mid(p+2);
2859 yyextra->yyLineNr++;
2860 }
2861<FindConceptCxxDocs>{CCS}|{CCE}|{CPPC} {
2862 yyextra->current->initializer << yytext;
2863 }
2864<FindConceptCxxDocs>. {
2865 if (!yyextra->current->initializer.empty())
2866 {
2867 //printf("*** doc=[[%s]\n",qPrint(yyextra->current->initializer.str()));
2868 handleCommentBlock(yyscanner,yyextra->current->initializer.str(),false);
2869 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2870 initEntry(yyscanner);
2871 }
2872 unput(*yytext);
2873 yyextra->current->section = EntryType::makeConceptCodePart();
2874 yyextra->current->startLine = yyextra->yyLineNr;
2875 BEGIN(FindConceptParts);
2876 }
2877<FindConceptDocs>^[ \t]*"*"+/[^/] { // skip leading indentation
2878 }
2879<FindConceptDocs>[^\*\n]+ {
2880 yyextra->current->initializer << yytext;
2881 }
2882<FindConceptDocs>\n {
2883 yyextra->current->initializer << yytext;
2884 yyextra->yyLineNr++;
2885 }
2886<FindConceptDocs>"*"*{CCE}[ t]*\n? {
2887 if (!yyextra->current->initializer.empty())
2888 {
2889 //printf("*** doc=[[%s]\n",qPrint(yyextra->current->initializer.str()));
2890 handleCommentBlock(yyscanner,yyextra->current->initializer.str(),false);
2891 yyextra->current->section = EntryType::makeConceptDocPart();
2892 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2893 initEntry(yyscanner);
2894 }
2895 lineCount(yyscanner);
2896 yyextra->current->section = EntryType::makeConceptCodePart();
2897 yyextra->current->startLine = yyextra->yyLineNr;
2898 BEGIN(FindConceptParts);
2899 }
2900<FindConceptDocs>"*"*{CCE} {
2901 if (!yyextra->current->initializer.empty())
2902 {
2903 //printf("*** doc=[[%s]\n",qPrint(yyextra->current->initializer.str()));
2904 handleCommentBlock(yyscanner,yyextra->current->initializer.str(),false);
2905 yyextra->current->section = EntryType::makeConceptDocPart();
2906 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2907 initEntry(yyscanner);
2908 }
2909 yyextra->current->section = EntryType::makeConceptCodePart();
2910 yyextra->current->startLine = yyextra->yyLineNr;
2911 BEGIN(FindConceptParts);
2912 }
2913<FindConceptParts><<EOF>> {
2914 if (!yyextra->current->initializer.empty())
2915 {
2916 if (!yyextra->current->section.isConceptCodePart())
2917 {
2918 yyextra->current->section = EntryType::makeConceptDocPart();
2919 }
2920 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
2921 initEntry(yyscanner);
2922 }
2923 yyterminate();
2924 }
#define yyterminate()
2925<FindMembers,FindFields>{B}*"#" { if (yyextra->insidePHP)
2926 REJECT;
2927 yyextra->lastCPPContext = YY_START;
2928 BEGIN( SkipCPP ) ;
2929 }
2930<FindMembers,FindFields>{B}*"#"{B}*"cmakedefine01" |
2931<FindMembers,FindFields>{B}*"#"{B}*("cmake")?"define" {
2932 if (yyextra->insidePHP)
2933 REJECT;
2934 yyextra->current->bodyLine = yyextra->yyLineNr;
2935 yyextra->current->bodyColumn = yyextra->yyColNr;
2936 yyextra->current->fileName = yyextra->fileName;
2937 yyextra->current->startLine = yyextra->yyLineNr;
2938 yyextra->current->startColumn = yyextra->yyColNr;
2939 yyextra->current->type.clear();
2940 yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
2941 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
2942 yyextra->current->section = EntryType::makeDefine();
2943 yyextra->lastDefineContext = YY_START;
2944 BEGIN( SDefine );
2945 }
2946<FindMembers,ReadBody,ReadNSBody,ReadBodyIntf,SkipCurly,SkipCurlyCpp>{B}*"#"{B}+[0-9]+{B}+/"\"" { /* line control directive */
2947 yyextra->yyLineNr = atoi(&yytext[1]);
2948 //printf("setting line number to %d\n",yyextra->yyLineNr);
2949 yyextra->lastPreLineCtrlContext = YY_START;
2950 if (YY_START==ReadBody ||
2951 YY_START==ReadNSBody ||
2952 YY_START==ReadBodyIntf)
2953 {
2954 yyextra->current->program << yytext;
2955 }
2956 BEGIN( PreLineCtrl );
2957 }
2958<PreLineCtrl>"\""[^\n\"]*"\"" {
2959 yyextra->fileName = stripQuotes(yytext);
2960 if (yyextra->lastPreLineCtrlContext==ReadBody ||
2961 yyextra->lastPreLineCtrlContext==ReadNSBody ||
2962 yyextra->lastPreLineCtrlContext==ReadBodyIntf)
2963 {
2964 yyextra->current->program << yytext;
2965 }
2966 }
2967<PreLineCtrl>. {
2968 if (yyextra->lastPreLineCtrlContext==ReadBody ||
2969 yyextra->lastPreLineCtrlContext==ReadNSBody ||
2970 yyextra->lastPreLineCtrlContext==ReadBodyIntf)
2971 {
2972 yyextra->current->program << yytext;
2973 }
2974 }
2975<PreLineCtrl>\n {
2976 if (yyextra->lastPreLineCtrlContext==ReadBody ||
2977 yyextra->lastPreLineCtrlContext==ReadNSBody ||
2978 yyextra->lastPreLineCtrlContext==ReadBodyIntf)
2979 {
2980 yyextra->current->program << yytext;
2981 }
2982 lineCount(yyscanner);
2983 BEGIN( yyextra->lastPreLineCtrlContext );
2984 }
2985<SkipCPP>.
2986<SkipCPP>\\‍[\r]*"\n"[\r]* { lineCount(yyscanner); }
2987<SkipCPP>[\r]*\n[\r]* { lineCount(yyscanner);
2988 BEGIN( yyextra->lastCPPContext) ;
2989 }
2990<SDefine>{ID}{B}*"(" {
2991 yyextra->current->name = yytext;
2992 yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
2993 yyextra->current->args = "(";
2994 yyextra->current->bodyLine = yyextra->yyLineNr;
2995 yyextra->current->bodyColumn = yyextra->yyColNr;
2996 yyextra->currentArgumentContext = DefineEnd;
2997 yyextra->fullArgString=yyextra->current->args;
2998 yyextra->copyArgString=&yyextra->current->args;
2999 BEGIN( ReadFuncArgType ) ;
3000 }
3001 /*
3002<DefineArg>")" {
3003 //printf("Define with args\n");
3004 yyextra->current->args += ')';
3005 BEGIN( DefineEnd );
3006 }
3007<DefineArg>. {
3008 yyextra->current->args += *yytext;
3009 }
3010 */
3011<SDefine>{ID} {
3012 //printf("Define '%s' without args\n",yytext);
3013 storeClangId(yyscanner,yytext);
3014 yyextra->current->bodyLine = yyextra->yyLineNr;
3015 yyextra->current->bodyColumn = yyextra->yyColNr;
3016 yyextra->current->name = yytext;
3017 BEGIN(DefineEnd);
3018 }
3019<DefineEnd><<EOF>> |
3020<DefineEnd>\n {
3021 //printf("End define: doc=%s docFile=%s docLine=%d\n",qPrint(yyextra->current->doc),qPrint(yyextra->current->docFile),yyextra->current->docLine);
3022 lineCount(yyscanner);
3023 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
3024 initEntry(yyscanner);
3025 BEGIN(yyextra->lastDefineContext);
3026 }
3027<DefinePHPEnd>";" {
3028 //printf("End define\n");
3029 yyextra->current->fileName = yyextra->fileName;
3030 yyextra->current->startLine = yyextra->yyLineNr;
3031 yyextra->current->startColumn = yyextra->yyColNr;
3032 yyextra->current->type.clear();
3033 yyextra->current->type = "const";
3034 DString init = yyextra->current->initializer.str();
3035 init = init.simplifyWhiteSpace();
3036 init = init.left(init.length()-1);
3037 yyextra->current->initializer.str(init.str());
3038 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
3039 yyextra->current->section = EntryType::makeVariable();
3040 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
3041 initEntry(yyscanner);
3042 BEGIN(FindMembers);
3043 }
3044<DefinePHPEnd>.
3045<DefineEnd>\\‍[\r]?\n {
3046 lineCount(yyscanner);
3047 yyextra->current->endBodyLine = yyextra->yyLineNr;
3048 }
3049<DefineEnd>\" {
3050 if (yyextra->insideIDL && yyextra->insideCppQuote)
3051 {
3052 BEGIN(EndCppQuote);
3053 }
3054 else
3055 {
3056 yyextra->lastStringContext=DefineEnd;
3057 BEGIN(SkipString);
3058 }
3059 }
3060<DefineEnd>.
3061<DefinePHP>{ID}["']{BN}*","{BN}* {
3062 yyextra->current->name = yytext;
3063 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
3064 yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
3065 yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1);
3066 yyextra->current->bodyLine = yyextra->yyLineNr;
3067 yyextra->current->bodyColumn = yyextra->yyColNr;
3068 yyextra->lastRoundContext = DefinePHPEnd;
3069 yyextra->pCopyRoundGString = &yyextra->current->initializer;
3070 yyextra->roundCount = 0;
3071 BEGIN( GCopyRound );
3072 }
3073
3074<FindMembers>[\^%] { // ^ and % are C++/CLI extensions
3075 if (yyextra->insideCli)
3076 {
3077 addType(yyscanner);
3078 yyextra->current->name = yytext ;
3079 }
3080 else
3081 {
3082 REJECT;
3083 }
3084 }
3085<FindMembers>[*&]+ {
3086 yyextra->current->name += yytext ;
3087 addType(yyscanner);
3088 }
3089<FindMembers,MemberSpec,SFunction,NextSemi,EnumBaseType,BitFields,ReadInitializer,ReadInitializerPtr,OldStyleArgs,DefinePHPEnd>";"{BN}*{DCOMM}"<" {
3090 if (YY_START==ReadInitializer && yyextra->keepComment)
3091 {
3092 REJECT;
3093 }
3094 else
3095 {
3096 if (yyextra->current->bodyLine==-1)
3097 {
3098 yyextra->current->bodyLine=yyextra->yyLineNr;
3099 yyextra->current->bodyColumn = yyextra->yyColNr;
3100 }
3101 yyextra->docBlockContext = YY_START;
3102 yyextra->docBlockInBody = false;
3103 yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
3104 ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
3105 if (YY_START==MemberSpec && yyextra->memspecEntry && yyextra->memspecEntry->briefFile.empty()) // see issue #10900
3106 {
3107 if (yytext[yyleng-3]=='/')
3108 {
3109 yyextra->memspecEntry->briefFile = yyextra->fileName;
3110 yyextra->memspecEntry->briefLine = yyextra->yyLineNr;
3111 }
3112 else
3113 {
3114 yyextra->memspecEntry->docFile = yyextra->fileName;
3115 yyextra->memspecEntry->docLine = yyextra->yyLineNr;
3116 }
3117 }
3118
3119 DString indent;
3120 indent.fill(' ',computeIndent(yytext,yyextra->column));
3121 yyextra->docBlock.str(indent.str());
3122 //printf("indent=%d\n",computeIndent(yytext+1,yyextra->column));
3123 lineCount(yyscanner);
3124
3125 yyextra->docBlockTerm = ';';
3126 if (YY_START==EnumBaseType && yyextra->current->section.isEnum())
3127 {
3128 yyextra->current->bitfields = ":"+yyextra->current->args;
3129 yyextra->current->args.clear();
3130 yyextra->current->section = EntryType::makeVariable();
3131 }
3132 if (yytext[yyleng-3]=='/')
3133 {
3134 startCommentBlock(yyscanner,true);
3135 BEGIN( DocLine );
3136 }
3137 else
3138 {
3139 startCommentBlock(yyscanner,false);
3140 BEGIN( DocBlock );
3141 }
3142 }
3143 }
DString fill(char c, size_t len)
Fills a string with a predefined character.
Definition dstring.h:278
#define Config_getBool(name)
Definition config.h:33
3144<MemberSpec,FindFields,FindMembers,NextSemi,EnumBaseType,BitFields,ReadInitializer,ReadInitializerPtr,OldStyleArgs>","{BN}*{DCOMM}"<" {
3145 if (YY_START==ReadInitializer && yyextra->keepComment)
3146 {
3147 REJECT;
3148 }
3149 else
3150 {
3151 yyextra->docBlockContext = YY_START;
3152 yyextra->docBlockInBody = false;
3153 yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
3154 ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
3155
3156 DString indent;
3157 indent.fill(' ',computeIndent(yytext,yyextra->column));
3158 yyextra->docBlock.str(indent.str());
3159 lineCount(yyscanner);
3160
3161 yyextra->docBlockTerm = ',';
3162 if (YY_START==EnumBaseType && yyextra->current->section.isEnum())
3163 {
3164 yyextra->current->bitfields = ":"+yyextra->current->args;
3165 yyextra->current->args.clear();
3166 yyextra->current->section = EntryType::makeVariable();
3167 }
3168 if (yytext[yyleng-3]=='/')
3169 {
3170 startCommentBlock(yyscanner,true);
3171 BEGIN( DocLine );
3172 }
3173 else
3174 {
3175 startCommentBlock(yyscanner,false);
3176 BEGIN( DocBlock );
3177 }
3178 }
3179 }
3180<DefineEnd,FindFields,ReadInitializer,ReadInitializerPtr,OldStyleArgs>{BN}*{DCOMM}"<" {
3181 if (YY_START==ReadInitializer && yyextra->keepComment)
3182 {
3183 REJECT;
3184 }
3185 else
3186 {
3187 if (yyextra->current->bodyLine==-1)
3188 {
3189 yyextra->current->bodyLine=yyextra->yyLineNr;
3190 yyextra->current->bodyColumn = yyextra->yyColNr;
3191 }
3192 yyextra->docBlockContext = YY_START;
3193 yyextra->docBlockInBody = false;
3194 yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
3195 ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
3196 DString indent;
3197 indent.fill(' ',computeIndent(yytext,yyextra->column));
3198 yyextra->docBlock.str(indent.str());
3199 lineCount(yyscanner);
3200
3201 yyextra->docBlockTerm = 0;
3202 if (yytext[yyleng-3]=='/')
3203 {
3204 startCommentBlock(yyscanner,true);
3205 BEGIN( DocLine );
3206 }
3207 else
3208 {
3209 startCommentBlock(yyscanner,false);
3210 BEGIN( DocBlock );
3211 }
3212 }
3213 }
3214
3215<FindMembers,FindFields>({CPPC}([!/]){B}*{CMD}"{")|({CCS}([!*]){B}*{CMD}"{") {
3216 //handleGroupStartCommand(yyextra->current->name);
3217 if (yyextra->previous && yyextra->previous->section.isGroupDoc())
3218 {
3219 // link open command to the group defined in the yyextra->previous entry
3220 yyextra->commentScanner.open(yyextra->previous.get(),yyextra->fileName,yyextra->yyLineNr);
3221 }
3222 else
3223 {
3224 // link open command to the yyextra->current entry
3225 yyextra->commentScanner.open(yyextra->current.get(),yyextra->fileName,yyextra->yyLineNr);
3226 }
3227 //yyextra->current = tmp;
3228 initEntry(yyscanner);
3229 if (yytext[1]=='/')
3230 {
3231 if (yytext[2]=='!' || yytext[2]=='/')
3232 {
3233 yyextra->docBlockContext = YY_START;
3234 yyextra->docBlockInBody = false;
3235 yyextra->docBlockAutoBrief = false;
3236 yyextra->docBlock.str(std::string());
3237 yyextra->docBlockTerm = 0;
3238 startCommentBlock(yyscanner,true);
3239 BEGIN(DocLine);
3240 }
3241 else
3242 {
3243 yyextra->lastCContext=YY_START;
3244 BEGIN(SkipCxxComment);
3245 }
3246 }
3247 else
3248 {
3249 if (yytext[2]=='!' || yytext[2]=='*')
3250 {
3251 yyextra->docBlockContext = YY_START;
3252 yyextra->docBlockInBody = false;
3253 yyextra->docBlock.str(std::string());
3254 yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
3255 ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
3256 yyextra->docBlockTerm = 0;
3257 startCommentBlock(yyscanner,false);
3258 BEGIN(DocBlock);
3259 }
3260 else
3261 {
3262 yyextra->lastCContext=YY_START;
3263 BEGIN(SkipComment);
3264 }
3265 }
3266 }
3267<FindMembers,FindFields,ReadInitializer,ReadInitializerPtr>{CPPC}([!/]){B}*{CMD}"}".*|{CCS}([!*]){B}*{CMD}"}"[^*]*{CCE} {
3268 bool insideEnum = YY_START==FindFields || ((YY_START==ReadInitializer || YY_START==ReadInitializerPtr) && yyextra->lastInitializerContext==FindFields); // see bug746226
3269 yyextra->commentScanner.close(yyextra->current.get(),yyextra->fileName,yyextra->yyLineNr,insideEnum);
3270 lineCount(yyscanner);
3271 }
3272<FindMembers>"=>" {
3273 if (!yyextra->insideCS) REJECT;
3274 yyextra->current->bodyLine = yyextra->yyLineNr;
3275 yyextra->current->bodyColumn = yyextra->yyColNr;
3276 yyextra->current->initializer.str(yytext);
3277 yyextra->lastInitializerContext = YY_START;
3278 yyextra->sharpCount=0;
3279 yyextra->initBracketCount=0;
3280 yyextra->current->mtype = yyextra->mtype = MethodTypes::Property;
3281 yyextra->current->spec.setGettable(true);
3282 BEGIN(ReadInitializerPtr);
3283 }
3284<FindMembers>"=" { // in PHP code this could also be due to "<?="
3285 yyextra->current->bodyLine = yyextra->yyLineNr;
3286 yyextra->current->bodyColumn = yyextra->yyColNr;
3287 yyextra->current->initializer.str(" ");
3288 for (size_t ii = 2 ; ii < yyextra->yyColNr; ii++)
3289 yyextra->current->initializer << " ";
3290 yyextra->current->initializer << "=";
3291 yyextra->lastInitializerContext = YY_START;
3292 yyextra->sharpCount=0;
3293 yyextra->initBracketCount=0;
3294 BEGIN(ReadInitializer);
3295 }
3296<UNOIDLAttributeBlock>{BN}*[gs]"et"{BN}+"raises"{BN}*"("{BN}*{SCOPENAME}{BN}*(","{BN}*{SCOPENAME}{BN}*)*")"{BN}*";" {
3297 lineCount(yyscanner);
3298 yyextra->current->exception += " ";
3299 yyextra->current->exception += removeRedundantWhiteSpace(yytext);
3300 }
3301<UNOIDLAttributeBlock>"}" {
3302 yyextra->current->exception += " }";
3303 BEGIN(FindMembers);
3304 }
3305 /* Read initializer rules */
3306<ReadInitializer,ReadInitializerPtr>"(" {
3307 yyextra->lastRoundContext=YY_START;
3308 yyextra->pCopyRoundGString=&yyextra->current->initializer;
3309 yyextra->roundCount=0;
3310 yyextra->current->initializer << *yytext;
3311 BEGIN(GCopyRound);
3312 }
3313<ReadInitializer,ReadInitializerPtr>"[" {
3314 if (!yyextra->insidePHP) REJECT;
3315 yyextra->lastSquareContext=YY_START;
3316 yyextra->pCopySquareGString=&yyextra->current->initializer;
3317 yyextra->squareCount=0;
3318 yyextra->current->initializer << *yytext;
3319 BEGIN(GCopySquare);
3320 }
3321<ReadInitializer,ReadInitializerPtr>"{" {
3322 yyextra->lastCurlyContext=YY_START;
3323 yyextra->pCopyCurlyGString=&yyextra->current->initializer;
3324 yyextra->curlyCount=0;
3325 yyextra->current->initializer << *yytext;
3326 BEGIN(GCopyCurly);
3327 }
3328<ReadInitializer,ReadInitializerPtr>[;,] {
3329 //printf(">> initializer '%s' <<\n",qPrint(yyextra->current->initializer));
3330 if (*yytext==';' && yyextra->current_root->spec.isEnum())
3331 {
3332 yyextra->current->fileName = yyextra->fileName;
3333 yyextra->current->startLine = yyextra->yyLineNr;
3334 yyextra->current->startColumn = yyextra->yyColNr;
3335 yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
3336 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
3337 yyextra->current->section = EntryType::makeVariable();
3338 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
3339 initEntry(yyscanner);
3340 BEGIN(FindMembers);
3341 }
3342 else if (*yytext==';' || (yyextra->lastInitializerContext==FindFields && yyextra->initBracketCount==0)) // yyextra->initBracketCount==0 was added for bug 665778
3343 {
3344 unput(*yytext);
3345 if (YY_START == ReadInitializerPtr) yyextra->current->initializer.str(std::string());
3346 BEGIN(yyextra->lastInitializerContext);
3347 }
3348 else if (*yytext==',' && yyextra->initBracketCount==0) // for "int a=0,b=0"
3349 {
3350 unput(*yytext);
3351 if (YY_START == ReadInitializerPtr) yyextra->current->initializer.str(std::string());
3352 BEGIN(yyextra->lastInitializerContext);
3353 }
3354 else
3355 {
3356 yyextra->current->initializer << *yytext;
3357 }
3358 }
3359<ReadInitializer,ReadInitializerPtr>{RAWBEGIN} { // C++11 raw string
3360 if (!yyextra->insideCpp)
3361 {
3362 REJECT;
3363 }
3364 else
3365 {
3366 yyextra->current->initializer << yytext;
3367 yyextra->delimiter = extractBeginRawStringDelimiter(yytext);
3368 yyextra->lastRawStringContext = YY_START;
3369 yyextra->pCopyRawGString = &yyextra->current->initializer;
3370 BEGIN(RawGString);
3371 //printf("RawGString delimiter='%s'\n",qPrint(delimiter));
3372 }
3373 }
DString extractBeginRawStringDelimiter(const char *rawStart)
Definition util.cpp:5379
3374<ReadInitializer>{CPPC}.* {
3375 if (yyextra->keepComment)
3376 {
3377 yyextra->current->initializer << yytext;
3378 }
3379 else
3380 {
3381 REJECT;
3382 }
3383 }
3384<ReadInitializer>{CCS} {
3385 if (yyextra->keepComment)
3386 {
3387 yyextra->current->initializer << yytext;
3388 BEGIN(InitCopyComment);
3389 }
3390 else
3391 {
3392 REJECT;
3393 }
3394 }
3395<InitCopyComment>{CCE} {
3396 yyextra->current->initializer << yytext;
3397 BEGIN(ReadInitializer);
3398 }
3399<InitCopyComment>\n {
3400 lineCount(yyscanner);
3401 yyextra->current->initializer << yytext;
3402 }
3403<InitCopyComment>. {
3404 yyextra->current->initializer << yytext;
3405 }
3406<InitCopyComment><<EOF>> {
3407 warn(yyextra->fileName,yyextra->yyLineNr,
3408 "reached end of file while inside a C style comment block!");
3409 yyterminate();
3410 }
#define warn(file, line, fmt,...)
Definition message.h:97
3411<RawGString>{RAWEND} {
3412 if (extractEndRawStringDelimiter(yytext)==yyextra->delimiter)
3413 {
3414 *yyextra->pCopyRawGString << yytext;
3415 BEGIN(yyextra->lastRawStringContext);
3416 }
3417 else
3418 {
3419 REJECT;
3420 }
3421 }
DString extractEndRawStringDelimiter(const char *rawEnd)
Definition util.cpp:5387
3422<RawGString>[^)\n]+ {
3423 *yyextra->pCopyRawGString << yytext;
3424 }
3425<RawGString>. {
3426 *yyextra->pCopyRawGString << yytext;
3427 }
3428<RawGString>\n {
3429 *yyextra->pCopyRawGString << yytext;
3430 lineCount(yyscanner);
3431 }
3432<RawString>{RAWEND} {
3433 *yyextra->pCopyRawString+=yytext;
3434 yyextra->fullArgString+=yytext;
3435 if (extractEndRawStringDelimiter(yytext)==yyextra->delimiter)
3436 {
3437 BEGIN(yyextra->lastRawStringContext);
3438 }
3439 }
3440<RawString>[^)]+ {
3441 *yyextra->pCopyRawString += yytext;
3442 yyextra->fullArgString+=yytext;
3443 }
3444<RawString>. {
3445 *yyextra->pCopyRawString += yytext;
3446 yyextra->fullArgString+=yytext;
3447 }
3448<RawString>\n {
3449 *yyextra->pCopyRawString += yytext;
3450 yyextra->fullArgString+=yytext;
3451 lineCount(yyscanner);
3452 }
3453<ReadInitializer,ReadInitializerPtr>\" {
3454 if (yyextra->insideIDL && yyextra->insideCppQuote)
3455 {
3456 BEGIN(EndCppQuote);
3457 }
3458 else
3459 {
3460 yyextra->lastStringContext=YY_START;
3461 yyextra->current->initializer << yytext;
3462 yyextra->pCopyQuotedGString=&yyextra->current->initializer;
3463 yyextra->stopAtInvalidString=false;
3464 BEGIN(CopyGString);
3465 }
3466 }
3467<ReadInitializer,ReadInitializerPtr>"->" {
3468 yyextra->current->initializer << yytext;
3469 }
3470<ReadInitializer,ReadInitializerPtr>("<<"|"<=") {
3471 yyextra->current->initializer << yytext;
3472 }
3473<ReadInitializer,ReadInitializerPtr>(">>") {
3474 if (yyextra->initBracketCount<=yyextra->sharpCount && yyextra->sharpCount>=2)
3475 {
3476 // heuristic to detect '>>' in A<B<C>>::D as '> >', but not e.g. 'A>>B' or A<B<(C>>2)>::D>
3477 yyextra->initBracketCount-=2;
3478 yyextra->sharpCount-=2;
3479 }
3480 yyextra->current->initializer << yytext;
3481 }
3482<ReadInitializer,ReadInitializerPtr>(">=") {
3483 yyextra->current->initializer << yytext;
3484 }
3485<ReadInitializer,ReadInitializerPtr>[<\‍[{(] {
3486 yyextra->initBracketCount++;
3487 yyextra->sharpCount++;
3488 yyextra->current->initializer << *yytext;
3489 }
3490<ReadInitializer,ReadInitializerPtr>[>\‍]})] {
3491 yyextra->initBracketCount--;
3492 yyextra->sharpCount--;
3493 if (*yytext=='}')
3494 {
3495 yyextra->current->endBodyLine=yyextra->yyLineNr;
3496 }
3497 yyextra->current->initializer << *yytext;
3498 }
3499<ReadInitializer,ReadInitializerPtr>\' {
3500 if (yyextra->insidePHP)
3501 {
3502 yyextra->current->initializer << yytext;
3503 yyextra->pCopyQuotedGString = &yyextra->current->initializer;
3504 yyextra->lastStringContext=YY_START;
3505 BEGIN(CopyPHPGString);
3506 }
3507 else
3508 {
3509 yyextra->current->initializer << yytext;
3510 }
3511 }
3512<ReadInitializer,ReadInitializerPtr>{CHARLIT} {
3513 if (yyextra->insidePHP)
3514 {
3515 REJECT;
3516 }
3517 else
3518 {
3519 yyextra->current->initializer << yytext;
3520 }
3521 }
3522<ReadInitializer,ReadInitializerPtr>\n {
3523 yyextra->current->initializer << *yytext;
3524 lineCount(yyscanner);
3525 }
3526<ReadInitializer,ReadInitializerPtr>"@\"" {
3527 //printf("yyextra->insideCS=%d\n",yyextra->insideCS);
3528 yyextra->current->initializer << yytext;
3529 if (!yyextra->insideCS && !yyextra->insideObjC)
3530 {
3531 REJECT;
3532 }
3533 else
3534 {
3535 // C#/ObjC verbatim string
3536 yyextra->lastSkipVerbStringContext=YY_START;
3537 yyextra->pSkipVerbString=&yyextra->current->initializer;
3538 BEGIN(SkipVerbString);
3539 }
3540 }
3541<SkipVerbString>[^\n"\\‍]+ {
3542 *yyextra->pSkipVerbString << yytext;
3543 }
3544<SkipVerbString>"\\\\" { // escaped backslash
3545 if (yyextra->insideCS) REJECT
3546 *yyextra->pSkipVerbString << yytext;
3547 }
3548<SkipVerbString>"\\\"" { // backslash escaped quote
3549 if (yyextra->insideCS) REJECT
3550 *yyextra->pSkipVerbString << yytext;
3551 }
3552<SkipVerbString>"\"\"" { // quote escape
3553 *yyextra->pSkipVerbString << yytext;
3554 }
3555<SkipVerbString>"\"" {
3556 *yyextra->pSkipVerbString << *yytext;
3557 BEGIN(yyextra->lastSkipVerbStringContext);
3558 }
3559<SkipVerbString>\n {
3560 *yyextra->pSkipVerbString << *yytext;
3561 lineCount(yyscanner);
3562 }
3563<SkipVerbString>. {
3564 *yyextra->pSkipVerbString << *yytext;
3565 }
3566<ReadInitializer,ReadInitializerPtr>"?>" {
3567 if (yyextra->insidePHP)
3568 BEGIN( FindMembersPHP );
3569 else
3570 yyextra->current->initializer << yytext;
3571 }
3572<ReadInitializer,ReadInitializerPtr>. {
3573 yyextra->current->initializer << *yytext;
3574 }
3575
3576 /* generic quoted string copy rules */
3577<CopyString,CopyPHPString>\\. {
3578 *yyextra->pCopyQuotedString+=yytext;
3579 }
3580<CopyString>\" {
3581 *yyextra->pCopyQuotedString+=*yytext;
3582 BEGIN( yyextra->lastStringContext );
3583 }
3584<CopyPHPString>\' {
3585 *yyextra->pCopyQuotedString+=*yytext;
3586 BEGIN( yyextra->lastStringContext );
3587 }
3588<CopyString,CopyPHPString>{CCS}|{CCE}|{CPPC} {
3589 *yyextra->pCopyQuotedString+=yytext;
3590 }
3591<CopyString,CopyPHPString>\n {
3592 *yyextra->pCopyQuotedString+=*yytext;
3593 lineCount(yyscanner);
3594 }
3595<CopyString,CopyPHPString>. {
3596 *yyextra->pCopyQuotedString+=*yytext;
3597 }
3598
3599 /* generic quoted growable string copy rules */
3600<CopyGString,CopyPHPGString>\\. {
3601 *yyextra->pCopyQuotedGString << yytext;
3602 }
3603<CopyGString>\" {
3604 *yyextra->pCopyQuotedGString << *yytext;
3605 BEGIN( yyextra->lastStringContext );
3606 }
3607<CopyPHPGString>\' {
3608 *yyextra->pCopyQuotedGString << *yytext;
3609 BEGIN( yyextra->lastStringContext );
3610 }
3611<CopyGString,CopyPHPGString>"<?php" { // we had an odd number of quotes.
3612 *yyextra->pCopyQuotedGString << yytext;
3613 BEGIN( yyextra->lastStringContext );
3614 }
3615<CopyGString,CopyPHPGString>{CCS}|{CCE}|{CPPC} {
3616 *yyextra->pCopyQuotedGString << yytext;
3617 }
3618<CopyGString,CopyPHPGString>\n {
3619 *yyextra->pCopyQuotedGString << *yytext;
3620 if (yyextra->stopAtInvalidString)
3621 {
3622 BEGIN( yyextra->lastStringContext );
3623 }
3624 else
3625 {
3626 lineCount(yyscanner);
3627 }
3628 }
3629<CopyGString,CopyPHPGString>. {
3630 *yyextra->pCopyQuotedGString << *yytext;
3631 }
3632
3633 /* generic C++ attribute copy rules */
3634<CopyC11Attribute>\" {
3635 *yyextra->pCopyC11AttributeString += *yytext;
3636 yyextra->pCopyQuotedString=yyextra->pCopyC11AttributeString;
3637 yyextra->lastStringContext=YY_START;
3638 BEGIN(CopyString);
3639 }
3640<CopyC11Attribute>\n {
3641 lineCount(yyscanner);
3642 *yyextra->pCopyC11AttributeString += *yytext;
3643 }
3644<CopyC11Attribute>{ID} {
3645 if (dstrcmp(yytext,"nodiscard")==0)
3646 {
3647 yyextra->current->spec.setNoDiscard(true);
3648 }
3649 *yyextra->pCopyC11AttributeString += yytext;
3650 }
3651<CopyC11Attribute>. {
3652 *yyextra->pCopyC11AttributeString += *yytext;
3653 }
3654<CopyC11Attribute>"]]" { /* end of the attribute list */
3655 yyextra->commentScanner.addDeprecatedDocs(yyextra->current.get(),
3656 yyextra->fileName,
3657 yyextra->yyLineNr,
3658 yyextra->thisParser);
3659 BEGIN(yyextra->lastC11AttributeContext);
3660 }
3661
3662
3663 /* generic round bracket list copy rules */
3664<CopyRound>\" {
3665 *yyextra->pCopyRoundString += *yytext;
3666 yyextra->pCopyQuotedString=yyextra->pCopyRoundString;
3667 yyextra->lastStringContext=YY_START;
3668 BEGIN(CopyString);
3669 }
3670<CopyRound>"(" {
3671 *yyextra->pCopyRoundString += *yytext;
3672 yyextra->roundCount++;
3673 }
3674<CopyRound>")" {
3675 *yyextra->pCopyRoundString += *yytext;
3676 if (--yyextra->roundCount<0)
3677 BEGIN(yyextra->lastRoundContext);
3678 }
3679<CopyRound>\n {
3680 lineCount(yyscanner);
3681 *yyextra->pCopyRoundString += *yytext;
3682 }
3683<CopyRound>\' {
3684 if (yyextra->insidePHP)
3685 {
3686 yyextra->current->initializer << yytext;
3687 yyextra->pCopyQuotedString = yyextra->pCopyRoundString;
3688 yyextra->lastStringContext=YY_START;
3689 BEGIN(CopyPHPString);
3690 }
3691 else
3692 {
3693 *yyextra->pCopyRoundString += yytext;
3694 }
3695 }
3696<CopyRound>{CHARLIT} {
3697 if (yyextra->insidePHP)
3698 {
3699 REJECT;
3700 }
3701 else
3702 {
3703 *yyextra->pCopyRoundString+=yytext;
3704 }
3705 }
3706<CopyRound>[^"'()\n,]+ {
3707 *yyextra->pCopyRoundString+=yytext;
3708 }
3709<CopyRound>. {
3710 *yyextra->pCopyRoundString+=*yytext;
3711 }
3712
3713 /* generic sharp bracket list copy rules */
3714<CopySharp>\" {
3715 *yyextra->pCopySharpString += *yytext;
3716 yyextra->pCopyQuotedString=yyextra->pCopySharpString;
3717 yyextra->lastStringContext=YY_START;
3718 BEGIN(CopyString);
3719 }
3720<CopySharp>"<" {
3721 *yyextra->pCopySharpString += *yytext;
3722 yyextra->sharpCount++;
3723 }
3724<CopySharp>">" {
3725 *yyextra->pCopySharpString += *yytext;
3726 if (--yyextra->sharpCount<0)
3727 {
3728 BEGIN(yyextra->lastSharpContext);
3729 }
3730 }
3731<CopySharp>\n {
3732 lineCount(yyscanner);
3733 *yyextra->pCopySharpString += *yytext;
3734 }
3735<CopySharp>\' {
3736 if (yyextra->insidePHP)
3737 {
3738 yyextra->current->initializer << yytext;
3739 yyextra->pCopyQuotedString = yyextra->pCopySharpString;
3740 yyextra->lastStringContext=YY_START;
3741 BEGIN(CopyPHPString);
3742 }
3743 else
3744 {
3745 *yyextra->pCopySharpString += yytext;
3746 }
3747 }
3748<CopySharp>{CHARLIT} {
3749 if (yyextra->insidePHP)
3750 {
3751 REJECT;
3752 }
3753 else
3754 {
3755 *yyextra->pCopySharpString+=yytext;
3756 }
3757 }
3758<CopySharp>[^"'<>\n,]+ {
3759 *yyextra->pCopySharpString+=yytext;
3760 }
3761<CopySharp>. {
3762 *yyextra->pCopySharpString+=*yytext;
3763 }
3764
3765
3766 /* generic round bracket list copy rules for growable strings */
3767<GCopyRound>\" {
3768 *yyextra->pCopyRoundGString << *yytext;
3769 yyextra->pCopyQuotedGString=yyextra->pCopyRoundGString;
3770 yyextra->lastStringContext=YY_START;
3771 BEGIN(CopyGString);
3772 }
3773<GCopyRound>"(" {
3774 *yyextra->pCopyRoundGString << *yytext;
3775 yyextra->roundCount++;
3776 }
3777<GCopyRound>")" {
3778 *yyextra->pCopyRoundGString << *yytext;
3779 if (--yyextra->roundCount<0)
3780 BEGIN(yyextra->lastRoundContext);
3781 }
3782<GCopyRound>\n {
3783 lineCount(yyscanner);
3784 *yyextra->pCopyRoundGString << *yytext;
3785 }
3786<GCopyRound>\' {
3787 if (yyextra->insidePHP)
3788 {
3789 yyextra->current->initializer << yytext;
3790 yyextra->pCopyQuotedGString = yyextra->pCopyRoundGString;
3791 yyextra->lastStringContext=YY_START;
3792 BEGIN(CopyPHPGString);
3793 }
3794 else
3795 {
3796 *yyextra->pCopyRoundGString << yytext;
3797 }
3798 }
3799<GCopyRound>{CHARLIT} {
3800 if (yyextra->insidePHP)
3801 {
3802 REJECT;
3803 }
3804 else
3805 {
3806 *yyextra->pCopyRoundGString << yytext;
3807 }
3808 }
3809<GCopyRound>"@\"" {
3810 if (!yyextra->insideCS) REJECT;
3811 *yyextra->pCopyRoundGString << yytext;
3812 yyextra->lastSkipVerbStringContext=YY_START;
3813 yyextra->pSkipVerbString=yyextra->pCopyRoundGString;
3814 BEGIN(SkipVerbString);
3815 }
3816<GCopyRound>[^"'()\n\/,R]+ { // R because of raw string start
3817 *yyextra->pCopyRoundGString << yytext;
3818 }
3819<GCopyRound>{RAWBEGIN} {
3820 *yyextra->pCopyRoundGString << yytext;
3821 yyextra->delimiter = extractBeginRawStringDelimiter(yytext);
3822 yyextra->lastRawStringContext = YY_START;
3823 yyextra->pCopyRawGString = yyextra->pCopyRoundGString;
3824 BEGIN(RawGString);
3825 }
3826<GCopyRound>. {
3827 *yyextra->pCopyRoundGString << *yytext;
3828 }
3829
3830 /* generic square bracket list copy rules for growable strings, we should only enter here in case of php, left the test part as in GCopyRound to keep it compatible with the round bracket version */
3831<GCopySquare>\" {
3832 *yyextra->pCopySquareGString << *yytext;
3833 yyextra->pCopyQuotedGString=yyextra->pCopySquareGString;
3834 yyextra->lastStringContext=YY_START;
3835 BEGIN(CopyGString);
3836 }
3837<GCopySquare>\' {
3838 *yyextra->pCopySquareGString << *yytext;
3839 if (yyextra->insidePHP)
3840 {
3841 yyextra->pCopyQuotedGString=yyextra->pCopySquareGString;
3842 yyextra->lastStringContext=YY_START;
3843 BEGIN(CopyPHPGString);
3844 }
3845 }
3846<GCopySquare>"[" {
3847 *yyextra->pCopySquareGString << *yytext;
3848 yyextra->squareCount++;
3849 }
3850<GCopySquare>"]" {
3851 *yyextra->pCopySquareGString << *yytext;
3852 if (--yyextra->squareCount<0)
3853 BEGIN(yyextra->lastSquareContext);
3854 }
3855<GCopySquare>\n {
3856 lineCount(yyscanner);
3857 *yyextra->pCopySquareGString << *yytext;
3858 }
3859<GCopySquare>\' {
3860 if (yyextra->insidePHP)
3861 {
3862 yyextra->current->initializer << yytext;
3863 yyextra->pCopyQuotedGString = yyextra->pCopySquareGString;
3864 yyextra->lastStringContext=YY_START;
3865 BEGIN(CopyPHPGString);
3866 }
3867 else
3868 {
3869 *yyextra->pCopySquareGString << yytext;
3870 }
3871 }
3872<GCopySquare>{CHARLIT} {
3873 if (yyextra->insidePHP)
3874 {
3875 REJECT;
3876 }
3877 else
3878 {
3879 *yyextra->pCopySquareGString << yytext;
3880 }
3881 }
3882<GCopySquare>[^"'\‍[\‍]\n\/,]+ {
3883 *yyextra->pCopySquareGString << yytext;
3884 }
3885<GCopySquare>. {
3886 *yyextra->pCopySquareGString << *yytext;
3887 }
3888
3889 /* generic curly bracket list copy rules */
3890<CopyCurly>\" {
3891 *yyextra->pCopyCurlyString += *yytext;
3892 yyextra->pCopyQuotedString=yyextra->pCopyCurlyString;
3893 yyextra->lastStringContext=YY_START;
3894 yyextra->keepComment=false;
3895 BEGIN(CopyString);
3896 }
3897<CopyCurly>\' {
3898 *yyextra->pCopyCurlyString += *yytext;
3899 if (yyextra->insidePHP)
3900 {
3901 yyextra->pCopyQuotedString=yyextra->pCopyCurlyString;
3902 yyextra->lastStringContext=YY_START;
3903 yyextra->keepComment=false;
3904 BEGIN(CopyPHPString);
3905 }
3906 }
3907<CopyCurly>"{" {
3908 *yyextra->pCopyCurlyString += *yytext;
3909 yyextra->curlyCount++;
3910 }
3911<CopyCurly>"}" {
3912 *yyextra->pCopyCurlyString += *yytext;
3913 if (--yyextra->curlyCount<0)
3914 {
3915 yyextra->keepComment=false;
3916 BEGIN(yyextra->lastCurlyContext);
3917 }
3918 }
3919<CopyCurly>{CHARLIT} { if (yyextra->insidePHP)
3920 {
3921 REJECT;
3922 }
3923 else
3924 {
3925 *yyextra->pCopyCurlyString += yytext;
3926 }
3927 }
3928<CopyCurly>[^"'{}\/\n,]+ {
3929 *yyextra->pCopyCurlyString += yytext;
3930 }
3931<CopyCurly>"/" { *yyextra->pCopyCurlyString += yytext; }
3932<CopyCurly>\n {
3933 lineCount(yyscanner);
3934 *yyextra->pCopyCurlyString += *yytext;
3935 }
3936<CopyCurly>. {
3937 *yyextra->pCopyCurlyString += *yytext;
3938 }
3939<CopyCurly>{CPPC}[^\n]* {
3940 if (yyextra->keepComment)
3941 {
3942 *yyextra->pCopyCurlyString += yytext;
3943 }
3944 else
3945 {
3946 REJECT;
3947 }
3948 }
3949<CopyCurly>{CCS} {
3950 if (yyextra->keepComment)
3951 {
3952 *yyextra->pCopyCurlyString += yytext;
3953 BEGIN(CopyComment);
3954 }
3955 else
3956 {
3957 REJECT;
3958 }
3959 }
3960<CopyComment>{CCE} {
3961 *yyextra->pCopyCurlyString += yytext;
3962 BEGIN(CopyCurly);
3963 }
3964<CopyComment>\n {
3965 lineCount(yyscanner);
3966 *yyextra->pCopyCurlyString += *yytext;
3967 }
3968<CopyComment>. {
3969 *yyextra->pCopyCurlyString += *yytext;
3970 }
3971<CopyComment><<EOF>> {
3972 warn(yyextra->fileName,yyextra->yyLineNr,
3973 "reached end of file while inside a C style comment block!");
3974 yyterminate();
3975 }
3976
3977 /* generic curly bracket list copy rules for growable strings */
3978<GCopyCurly>^"#"{B}+[0-9]+{B}+"\""[^\"\n]+"\""{B}+"1"{B}*\n? { // start of included file marker
3979 }
3980<GCopyCurly>^"#"{B}+[0-9]+{B}+"\""[^\"\n]+"\""{B}+"2"{B}*\n? { // end of included file marker
3981 DString line = yytext;
3982 size_t s = line.find(' ');
3983 if (s == DString::npos) s = line.find('\t');
3984 size_t e = line.find('"',s);
3985 yyextra->yyLineNr = line.mid(s,e-s).toInt();
3986 if (yytext[yyleng-1]=='\n')
3987 {
3988 lineCount(yyscanner);
3989 yyextra->column=0;
3990 }
3991 }
DString mid(size_t index, size_t len=npos) const
Definition dstring.h:318
int toInt(bool *ok=nullptr, int base=10) const
Definition dstring.cpp:191
3992<GCopyCurly>\" {
3993 *yyextra->pCopyCurlyGString << *yytext;
3994 yyextra->pCopyQuotedGString=yyextra->pCopyCurlyGString;
3995 yyextra->lastStringContext=YY_START;
3996 yyextra->keepComment = false;
3997 BEGIN(CopyGString);
3998 }
3999<GCopyCurly>\' {
4000 *yyextra->pCopyCurlyGString << *yytext;
4001 if (yyextra->insidePHP)
4002 {
4003 yyextra->pCopyQuotedGString=yyextra->pCopyCurlyGString;
4004 yyextra->lastStringContext=YY_START;
4005 yyextra->keepComment = false;
4006 BEGIN(CopyPHPGString);
4007 }
4008 }
4009<GCopyCurly>"{" {
4010 *yyextra->pCopyCurlyGString << *yytext;
4011 yyextra->curlyCount++;
4012 }
4013<GCopyCurly>"}" {
4014 *yyextra->pCopyCurlyGString << *yytext;
4015 if (--yyextra->curlyCount<0)
4016 {
4017 yyextra->current->endBodyLine = yyextra->yyLineNr;
4018 yyextra->keepComment = false;
4019 BEGIN(yyextra->lastCurlyContext);
4020 }
4021 }
4022<GCopyCurly>{CHARLIT} { if (yyextra->insidePHP)
4023 {
4024 REJECT;
4025 }
4026 else
4027 {
4028 *yyextra->pCopyCurlyGString << yytext;
4029 }
4030 }
4031<GCopyCurly>[^"'{}\/\n,]+ {
4032 *yyextra->pCopyCurlyGString << yytext;
4033 }
4034<GCopyCurly>[,]+ {
4035 *yyextra->pCopyCurlyGString << yytext;
4036 }
4037<GCopyCurly>"/" { *yyextra->pCopyCurlyGString << yytext; }
4038<GCopyCurly>\n {
4039 lineCount(yyscanner);
4040 *yyextra->pCopyCurlyGString << *yytext;
4041 }
4042<GCopyCurly>. {
4043 *yyextra->pCopyCurlyGString << *yytext;
4044 }
4045<GCopyCurly>{CPPC}[^\n]* {
4046 if (yyextra->keepComment)
4047 {
4048 *yyextra->pCopyCurlyGString << yytext;
4049 }
4050 else
4051 {
4052 REJECT;
4053 }
4054 }
4055<GCopyCurly>{CCS} {
4056 if (yyextra->keepComment)
4057 {
4058 *yyextra->pCopyCurlyGString << yytext;
4059 BEGIN(GCopyComment);
4060 }
4061 else
4062 {
4063 REJECT;
4064 }
4065 }
4066<GCopyComment>{CCE} {
4067 *yyextra->pCopyCurlyGString << yytext;
4068 BEGIN(GCopyCurly);
4069 }
4070<GCopyComment>\n {
4071 lineCount(yyscanner);
4072 *yyextra->pCopyCurlyGString << *yytext;
4073 }
4074<GCopyComment>. {
4075 *yyextra->pCopyCurlyGString << *yytext;
4076 }
4077<GCopyComment><<EOF>> {
4078 warn(yyextra->fileName,yyextra->yyLineNr,
4079 "reached end of file while inside a C style comment block!");
4080 yyterminate();
4081 }
4082
4083 /* ---------------------- */
4084
4085
4086<FindMembers>":" {
4087 if (yyextra->current->type.empty() &&
4088 yyextra->current->name=="enum") // see bug 69041, C++11 style anon enum: 'enum : unsigned int {...}'
4089 {
4090 yyextra->current->section = EntryType::makeEnum();
4091 yyextra->current->name.clear();
4092 yyextra->current->args.clear();
4093 BEGIN(EnumBaseType);
4094 }
4095 else
4096 {
4097 if (yyextra->current->type.empty()) // anonymous padding field, e.g. "int :7;"
4098 {
4099 addType(yyscanner);
4100 yyextra->current->name.sprintf("__pad%d__",yyextra->padCount++);
4101 }
4102 BEGIN(BitFields);
4103 yyextra->current->bitfields+=":";
4104 }
4105 }
4106<BitFields>. {
4107 yyextra->current->bitfields+=*yytext;
4108 }
4109<EnumBaseType>. {
4110 yyextra->current->args+=*yytext;
4111 }
4112<EnumBaseType>\n {
4113 lineCount(yyscanner);
4114 yyextra->current->args+=' ';
4115 }
4116<FindMembers>[;,] {
4117 DString oldType = yyextra->current->type;
4118 if (yyextra->current->bodyLine==-1)
4119 {
4120 yyextra->current->bodyLine = yyextra->yyLineNr;
4121 yyextra->current->bodyColumn = yyextra->yyColNr;
4122 }
4123 if ( yyextra->insidePHP && yyextra->current->type.startsWith("var"))
4124 {
4125 yyextra->current->type = yyextra->current->type.mid(3);
4126 }
4127 if (yyextra->isTypedef && !yyextra->current->type.startsWith("typedef "))
4128 {
4129 yyextra->current->type.prepend("typedef ");
4130 }
4131 bool isStatic = yyextra->current->isStatic;
4132 Protection prot = yyextra->current->protection;
4133 bool isConcept = yyextra->current->section.isConcept();
4134 bool isModule = yyextra->current->section.isModuleDoc();
4135 if (isConcept) // C++20 concept
4136 {
4137 yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
4138 initEntry(yyscanner);
4139 }
4140 else if (isModule) // C++20 module
4141 {
4142 yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
4143 initEntry(yyscanner);
4144 }
4145 else if (!yyextra->current->name.empty() && !yyextra->current->section.isEnum())
4146 {
4147 yyextra->current->type=yyextra->current->type.simplifyWhiteSpace();
4148 yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args);
4149 yyextra->current->name=yyextra->current->name.stripWhiteSpace();
4150 if (yyextra->current->section.isClass()) // remove spec for "struct Bla bla;"
4151 {
4152 yyextra->current->spec = TypeSpecifier();
4153 }
4154 yyextra->current->section = EntryType::makeVariable() ;
4155 yyextra->current->fileName = yyextra->fileName;
4156 yyextra->current->startLine = yyextra->yyBegLineNr;
4157 yyextra->current->startColumn = yyextra->yyBegColNr;
4158 yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
4159 initEntry(yyscanner);
4160 }
4161 if ( *yytext == ',')
4162 {
4163 yyextra->current->isStatic = isStatic; // the static attribute holds for all variables
4164 yyextra->current->protection = prot;
4165 yyextra->current->name.clear();
4166 yyextra->current->args.clear();
4167 yyextra->current->brief.clear();
4168 yyextra->current->doc.clear();
4169 yyextra->current->initializer.str(std::string());
4170 yyextra->current->bitfields.clear();
4171 yyextra->current->type = stripFuncPtr(oldType);
4172 }
4173 else
4174 {
4175 yyextra->mtype = MethodTypes::Method;
4176 yyextra->virt = Specifier::Normal;
4177 yyextra->current->bodyLine = -1;
4178 yyextra->current->bodyColumn = 1;
4179 yyextra->current->groups.clear();
4180 initEntry(yyscanner);
4181 }
4182 }
4183
4184<FindMembers>"[" {
4185 if (yyextra->insideSlice)
4186 {
4187 yyextra->squareCount=1;
4188 yyextra->lastSquareContext = YY_START;
4189 yyextra->current->metaData += "[";
4190 BEGIN( SliceMetadata );
4191 }
4192 else if (!yyextra->insideCS &&
4193 (yyextra->current->name.empty() ||
4194 yyextra->current->name=="typedef"
4195 )
4196 ) // IDL function property
4197 {
4198 yyextra->squareCount=1;
4199 yyextra->lastSquareContext = YY_START;
4200 yyextra->idlAttr.clear();
4201 yyextra->idlProp.clear();
4202 yyextra->current->mtype = yyextra->mtype;
4203
4204 if (Config_getBool(IDL_PROPERTY_SUPPORT) &&
4205 yyextra->current->mtype == MethodTypes::Property)
4206 { // we are yyextra->inside the properties section of a dispinterface
4207 yyextra->odlProp = true;
4208 yyextra->current->spec.setGettable(true).setSettable(true);
4209 }
4210
4211 BEGIN( IDLAttribute );
4212 }
4213 else if (yyextra->insideCS &&
4214 yyextra->current->name.empty())
4215 {
4216 yyextra->squareCount=1;
4217 yyextra->lastSquareContext = YY_START;
4218 // Skip the C# attribute
4219 // for this member
4220 yyextra->current->args.clear();
4221 BEGIN( SkipSquare );
4222 }
4223 else
4224 {
4225 yyextra->current->args += yytext ;
4226 yyextra->squareCount=1;
4227 yyextra->externLinkage=false; // see bug759247
4228 BEGIN( Array ) ;
4229 }
4230 }
4231<SliceMetadata>"[" { // Global metadata.
4232 yyextra->squareCount++;
4233 yyextra->current->metaData += "[";
4234 }
4235<SliceMetadata>{BN}* {
4236 lineCount(yyscanner);
4237 }
4238<SliceMetadata>\"[^\"]*\" {
4239 yyextra->current->metaData += yytext;
4240 }
4241<SliceMetadata>"," {
4242 yyextra->current->metaData += yytext;
4243 }
4244<SliceMetadata>"]" {
4245 yyextra->current->metaData += yytext;
4246 if (--yyextra->squareCount<=0)
4247 {
4248 BEGIN (yyextra->lastSquareContext);
4249 }
4250 }
4251<SliceOptional>"(" {
4252 yyextra->current->type += "(";
4253 yyextra->roundCount++;
4254 }
4255<SliceOptional>[0-9]+ {
4256 yyextra->current->type += yytext;
4257 }
4258<SliceOptional>")" {
4259 yyextra->current->type += ")";
4260 if(--yyextra->roundCount<=0)
4261 {
4262 BEGIN (yyextra->lastModifierContext);
4263 }
4264 }
4265<IDLAttribute>"]" {
4266 // end of IDL function attribute
4267 if (--yyextra->squareCount<=0)
4268 {
4269 lineCount(yyscanner);
4270 if (yyextra->current->mtype == MethodTypes::Property)
4271 BEGIN( IDLPropName );
4272 else
4273 BEGIN( yyextra->lastSquareContext );
4274 }
4275 }
4276<IDLAttribute>"propput" {
4277 if (Config_getBool(IDL_PROPERTY_SUPPORT))
4278 {
4279 yyextra->current->mtype = MethodTypes::Property;
4280 }
4281 yyextra->current->spec.setSettable(true);
4282 }
4283<IDLAttribute>"propget" {
4284 if (Config_getBool(IDL_PROPERTY_SUPPORT))
4285 {
4286 yyextra->current->mtype = MethodTypes::Property;
4287 }
4288 yyextra->current->spec.setGettable(true);
4289 }
4290<IDLAttribute>"property" { // UNO IDL property
4291 yyextra->current->spec.setProperty(true);
4292 }
4293<IDLAttribute>"attribute" { // UNO IDL attribute
4294 yyextra->current->spec.setAttribute(true);
4295 }
4296<IDLAttribute>"optional" { // on UNO IDL interface/service/attribute/property
4297 yyextra->current->spec.setOptional(true);
4298 }
4299<IDLAttribute>"readonly" { // on UNO IDL attribute or property
4300 if (Config_getBool(IDL_PROPERTY_SUPPORT) && yyextra->odlProp)
4301 {
4302 yyextra->current->spec.setSettable(false);
4303 }
4304 else
4305 {
4306 yyextra->current->spec.setReadonly(true);
4307 }
4308 }
4309<IDLAttribute>"bound" { // on UNO IDL attribute or property
4310 yyextra->current->spec.setBound(true);
4311 }
4312<IDLAttribute>"removable" { // on UNO IDL property
4313 yyextra->current->spec.setRemovable(true);
4314 }
4315<IDLAttribute>"constrained" { // on UNO IDL property
4316 yyextra->current->spec.setConstrained(true);
4317 }
4318<IDLAttribute>"transient" { // on UNO IDL property
4319 yyextra->current->spec.setTransient(true);
4320 }
4321<IDLAttribute>"maybevoid" { // on UNO IDL property
4322 yyextra->current->spec.setMaybeVoid(true);
4323 }
4324<IDLAttribute>"maybedefault" { // on UNO IDL property
4325 yyextra->current->spec.setMaybeDefault(true);
4326 }
4327<IDLAttribute>"maybeambiguous" { // on UNO IDL property
4328 yyextra->current->spec.setMaybeAmbiguous(true);
4329 }
4330<IDLAttribute>. {
4331 }
4332<IDLPropName>{BN}*{ID}({BN}*[*]*{BN}*)? {
4333 // return type (probably HRESULT) - skip it
4334
4335 if (yyextra->odlProp)
4336 { // property type
4337 yyextra->idlProp = yytext;
4338 }
4339 }
4340<IDLPropName>{ID}{BN}*"(" {
4341 yyextra->current->name = yytext;
4342 yyextra->current->name = yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
4343 yyextra->current->startLine = yyextra->yyLineNr;
4344 yyextra->current->startColumn = yyextra->yyColNr;
4345 BEGIN( IDLProp );
4346 }
4347<IDLPropName>{BN}*"("{BN}*{ID}{BN}*")"{BN}* {
4348 if (yyextra->odlProp)
4349 {
4350 yyextra->idlProp += yytext;
4351 }
4352 }
4353<IDLPropName>{ID}{BNopt}/";" {
4354 if (yyextra->odlProp)
4355 {
4356 yyextra->current->name = yytext;
4357 yyextra->idlProp = yyextra->idlProp.stripWhiteSpace();
4358 yyextra->odlProp = false;
4359
4360 BEGIN( IDLProp );
4361 }
4362 }
4363<IDLProp>{BN}*"["[^\‍]]*"]"{BN}* { // attribute of a parameter
4364 yyextra->idlAttr = yytext;
4365 yyextra->idlAttr=yyextra->idlAttr.stripWhiteSpace();
4366 }
4367<IDLProp>{ID} { // property type
4368 yyextra->idlProp = yytext;
4369 }
4370<IDLProp>{BN}*{ID}{BN}*"," { // Rare: Another parameter ([propput] HRESULT Item(int index, [in] Type theRealProperty);)
4371 if (yyextra->current->args.empty())
4372 yyextra->current->args = "(";
4373 else
4374 yyextra->current->args += ", ";
4375 yyextra->current->args += yyextra->idlAttr;
4376 yyextra->current->args += " ";
4377 yyextra->current->args += yyextra->idlProp; // prop was actually type of extra parameter
4378 yyextra->current->args += " ";
4379 yyextra->current->args += yytext;
4380 yyextra->current->args = yyextra->current->args.left(yyextra->current->args.length() - 1); // strip comma
4381 yyextra->idlProp.clear();
4382 yyextra->idlAttr.clear();
4383 BEGIN( IDLProp );
4384 }
4385<IDLProp>{BN}*{ID}{BN}*")"{BN}* {
4386 // the parameter name for the property - just skip.
4387 }
4388<IDLProp>";" {
4389 yyextra->current->fileName = yyextra->fileName;
4390 yyextra->current->type = yyextra->idlProp;
4391 yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
4392 if (!yyextra->current->args.empty())
4393 yyextra->current->args += ")";
4394 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
4395 yyextra->current->section = EntryType::makeVariable();
4396 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
4397 initEntry(yyscanner);
4398 BEGIN( FindMembers );
4399 }
4400<IDLProp>. { // spaces, *, or other stuff
4401 //yyextra->idlProp+=yytext;
4402 }
4403<Array>"]" { yyextra->current->args += *yytext ;
4404 if (--yyextra->squareCount<=0)
4405 BEGIN( FindMembers ) ;
4406 }
4407<FuncFuncArray>"]" { yyextra->current->args += *yytext ;
4408 if (--yyextra->squareCount<=0)
4409 BEGIN( SFunction ) ;
4410 }
4411<Array,FuncFuncArray>"[" { yyextra->current->args += *yytext ;
4412 yyextra->squareCount++;
4413 }
4414<Array,FuncFuncArray>. { yyextra->current->args += *yytext ; }
4415<SkipSquare>"[" { yyextra->squareCount++; }
4416<SkipSquare>"]" {
4417 if (--yyextra->squareCount<=0)
4418 BEGIN( yyextra->lastSquareContext );
4419 }
4420<SkipSquare>\" {
4421 yyextra->lastStringContext=YY_START;
4422 BEGIN( SkipString );
4423 }
4424<SkipSquare>[^\n\‍[\‍]\"]+
4425<FindMembers>"<" { addType(yyscanner);
4426 yyextra->current->type += yytext ;
4427 BEGIN( Sharp ) ;
4428 }
4429<Sharp>">" { yyextra->current->type += *yytext ;
4430 if (--yyextra->sharpCount<=0)
4431 BEGIN( FindMembers ) ;
4432 }
4433<Sharp>"<" { yyextra->current->type += *yytext ;
4434 yyextra->sharpCount++;
4435 }
4436<Sharp>{BN}+ {
4437 yyextra->current->type += ' ';
4438 lineCount(yyscanner);
4439 }
4440<Sharp>. { yyextra->current->type += *yytext ; }
4441<FindFields>{ID} {
4442 storeClangId(yyscanner,yytext);
4443 yyextra->current->bodyLine = yyextra->yyLineNr;
4444 yyextra->current->bodyColumn = yyextra->yyColNr;
4445 yyextra->current->name = yytext;
4446 }
4447<FindFields>[({] {
4448 // Java enum initializer
4449 unput(*yytext);
4450 yyextra->lastInitializerContext = YY_START;
4451 yyextra->sharpCount=0;
4452 yyextra->initBracketCount=0;
4453 yyextra->current->initializer.str("=");
4454 BEGIN(ReadInitializer);
4455 }
4456<FindFields>"=" {
4457 yyextra->lastInitializerContext = YY_START;
4458 yyextra->sharpCount=0;
4459 yyextra->initBracketCount=0;
4460 yyextra->current->initializer.str(yytext);
4461 BEGIN(ReadInitializer);
4462 }
4463<FindFields>";" {
4464 if (yyextra->insideJava) // yyextra->last enum field in Java class
4465 {
4466 if (!yyextra->current->name.empty())
4467 {
4468 yyextra->current->fileName = yyextra->fileName;
4469 yyextra->current->startLine = yyextra->yyLineNr;
4470 yyextra->current->startColumn = yyextra->yyColNr;
4471 if (!yyextra->current_root->spec.isEnum())
4472 {
4473 yyextra->current->type = "@"; // enum marker
4474 }
4475 yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
4476 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
4477 yyextra->current->section = EntryType::makeVariable();
4478 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
4479 initEntry(yyscanner);
4480 }
4481
4482 BEGIN( FindMembers );
4483 }
4484 else
4485 {
4486 REJECT;
4487 }
4488 }
4489<FindFields>"," {
4490 //printf("adding '%s' '%s' '%s' to enum '%s' (mGrpId=%d)\n",
4491 // qPrint(yyextra->current->type), qPrint(yyextra->current->name),
4492 // qPrint(yyextra->current->args), qPrint(yyextra->current_root->name),yyextra->current->mGrpId);
4493 if (!yyextra->current->name.empty())
4494 {
4495 yyextra->current->fileName = yyextra->fileName;
4496 if (yyextra->current_root->section.isEnum() || yyextra->current_root->spec.isEnum())
4497 {
4498 yyextra->current->startLine = yyextra->current->bodyLine;
4499 yyextra->current->startColumn = yyextra->current->bodyColumn;
4500 }
4501 else
4502 {
4503 yyextra->current->startLine = yyextra->yyLineNr;
4504 yyextra->current->startColumn = yyextra->yyColNr;
4505 }
4506 if (!yyextra->current_root->spec.isEnum())
4507 {
4508 yyextra->current->type = "@"; // enum marker
4509 }
4510 yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
4511 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
4512 yyextra->current->section = EntryType::makeVariable();
4513 // add to the scope of the enum
4514 if (!yyextra->insideCS && !yyextra->insideJava &&
4515 !yyextra->current_root->spec.isStrong())
4516 // for C# and Java 1.5+ enum values always have to be explicitly qualified,
4517 // same for C++11 style enums (enum class Name {})
4518 {
4519 // add to the scope surrounding the enum (copy!)
4520 // we cannot add it directly as that would invalidate the iterator in parseCompounds.
4521 //printf("*** adding outer scope entry for %s\n",qPrint(yyextra->current->name));
4522 yyextra->outerScopeEntries.emplace_back(yyextra->current_root->parent(), std::make_shared<Entry>(*yyextra->current));
4523 }
4524 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
4525 initEntry(yyscanner);
4526 }
4527 else // probably a redundant ,
4528 {
4529 yyextra->current->reset();
4530 initEntry(yyscanner);
4531 }
4532 }
4533<FindFields>"[" { // attribute list in IDL
4534 yyextra->squareCount=1;
4535 yyextra->lastSquareContext = YY_START;
4536 BEGIN(SkipSquare);
4537 }
4538<ReadBody,ReadNSBody,ReadBodyIntf>[^\r\n\#{}"@'/<\\\$R]* { yyextra->current->program << yytext ; } // R because of raw string start
4539<ReadBody,ReadNSBody,ReadBodyIntf>{CPPC}.* { yyextra->current->program << yytext ; }
4540<ReadBody,ReadNSBody,ReadBodyIntf>"#".* { if (!yyextra->insidePHP)
4541 REJECT;
4542 // append PHP comment.
4543 yyextra->current->program << yytext ;
4544 }
4545 /* Interpolated string C# */
4546<SkipCurly,ReadBody,ReadNSBody,ReadBodyIntf,ReadExpressionBody,FindMembers,FindMemberName>$\" { if (!yyextra->insideCS) REJECT
4547 yyextra->current->program << yytext ;
4548 yyextra->pSkipInterpString = &yyextra->current->program;
4549 yyextra->lastSkipInterpStringContext=YY_START;
4550 yyextra->strCurlyCount = 0;
4551 BEGIN( SkipInterpString );
4552 }
4553<SkipInterpString>([^"\\{}\x000D\x000A\x0085\x2028\x2029]|"{{"|"}}"|"\\'"|"\\\""|"\\\\"|"\\0"|"\\a"|"\\b"|"\\f"|"\\n"|"\\r"|"\\t"|"\\v"|"\\x"{HEXDIGIT}{HEXDIGIT}?{HEXDIGIT}?{HEXDIGIT}?|"\\"[uU]{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT}{HEXDIGIT})* {
4554 *yyextra->pSkipInterpString << yytext;
4555 }
4556<SkipInterpString>"{" {
4557 *yyextra->pSkipInterpString << *yytext;
4558 yyextra->strCurlyCount++;
4559 }
4560<SkipInterpString>"}" {
4561 *yyextra->pSkipInterpString << *yytext;
4562 yyextra->strCurlyCount--;
4563 }
4564<SkipInterpString>\" {
4565 *yyextra->pSkipInterpString << *yytext;
4566 if (yyextra->strCurlyCount==0)
4567 {
4568 BEGIN( yyextra->lastSkipInterpStringContext );
4569 }
4570 }
4571<SkipInterpString>. {
4572 *yyextra->pSkipInterpString << *yytext;
4573 }
4574 /* Verbatim Interpolated string C# */
4575<SkipCurly,ReadBody,ReadNSBody,ReadBodyIntf,ReadExpressionBody,FindMembers,FindMemberName>$@\" { if (!yyextra->insideCS) REJECT
4576 yyextra->current->program << yytext ;
4577 yyextra->pSkipInterpVerbString = &yyextra->current->program;
4578 yyextra->lastSkipInterpVerbStringContext=YY_START;
4579 yyextra->strCurlyCount = 0;
4580 BEGIN( SkipInterpVerbString );
4581 }
4582<SkipInterpVerbString>([^\"{}]|"{{"|"}}"|"\"\"")* {
4583 *yyextra->pSkipInterpVerbString << yytext;
4584 }
4585<SkipInterpVerbString>"{" {
4586 *yyextra->pSkipInterpVerbString << *yytext;
4587 yyextra->strCurlyCount++;
4588 }
4589<SkipInterpVerbString>"}" {
4590 *yyextra->pSkipInterpVerbString << *yytext;
4591 yyextra->strCurlyCount--;
4592 }
4593<SkipInterpVerbString>\" {
4594 *yyextra->pSkipInterpVerbString << *yytext;
4595 if (yyextra->strCurlyCount==0)
4596 {
4597 BEGIN( yyextra->lastSkipInterpVerbStringContext );
4598 }
4599 }
4600<SkipInterpVerbString>. {
4601 *yyextra->pSkipInterpVerbString << *yytext;
4602 }
4603<ReadBody,ReadNSBody,ReadBodyIntf>"\$" { yyextra->current->program << yytext ; }
4604<ReadBody,ReadNSBody,ReadBodyIntf>@\" { yyextra->current->program << yytext ;
4605 yyextra->pSkipVerbString = &yyextra->current->program;
4606 yyextra->lastSkipVerbStringContext=YY_START;
4607 BEGIN( SkipVerbString );
4608 }
4609<ReadBody,ReadNSBody,ReadBodyIntf>"<<<" { if (yyextra->insidePHP)
4610 {
4611 yyextra->current->program << yytext ;
4612 yyextra->pCopyHereDocGString = &yyextra->current->program;
4613 yyextra->lastHereDocContext=YY_START;
4614 BEGIN( CopyHereDoc );
4615 }
4616 else
4617 {
4618 REJECT;
4619 }
4620 }
4621<ReadBody,ReadNSBody,ReadBodyIntf>{RAWBEGIN} {
4622 yyextra->current->program << yytext;
4623 yyextra->delimiter = extractBeginRawStringDelimiter(yytext);
4624 yyextra->lastRawStringContext = YY_START;
4625 yyextra->pCopyRawGString = &yyextra->current->program;
4626 BEGIN(RawGString);
4627 }
4628<ReadBody,ReadNSBody,ReadBodyIntf>\" { yyextra->current->program << yytext ;
4629 yyextra->pCopyQuotedGString = &yyextra->current->program;
4630 yyextra->lastStringContext=YY_START;
4631 yyextra->stopAtInvalidString=false;
4632 BEGIN( CopyGString );
4633 }
4634<ReadBody,ReadNSBody,ReadBodyIntf>{DCOMMC} { yyextra->doxygenComment=true; REJECT;}
4635<ReadBody,ReadNSBody,ReadBodyIntf>{CCS}{B}* { yyextra->current->program << yytext ;
4636 yyextra->lastContext = YY_START ;
4637 BEGIN( Comment ) ;
4638 }
4639<ReadBody,ReadNSBody,ReadBodyIntf>{CCS}{BL} { yyextra->current->program << yytext ;
4640 ++yyextra->yyLineNr ;
4641 yyextra->lastContext = YY_START ;
4642 BEGIN( Comment ) ;
4643 }
4644<ReadBody,ReadNSBody,ReadBodyIntf>"'" {
4645 if (!yyextra->insidePHP)
4646 {
4647 yyextra->current->program << yytext;
4648 }
4649 else
4650 { // begin of single quoted string
4651 yyextra->current->program << yytext;
4652 yyextra->pCopyQuotedGString = &yyextra->current->program;
4653 yyextra->lastStringContext=YY_START;
4654 BEGIN(CopyPHPGString);
4655 }
4656 }
4657<ReadBody,ReadNSBody,ReadBodyIntf>{CHARLIT} {
4658 if (yyextra->insidePHP)
4659 {
4660 REJECT; // for PHP code single quotes
4661 // are used for strings of arbitrary length
4662 }
4663 else
4664 {
4665 yyextra->current->program << yytext;
4666 }
4667 }
4668<ReadBody,ReadNSBody,ReadBodyIntf>"{" { yyextra->current->program << yytext ;
4669 ++yyextra->curlyCount ;
4670 }
4671<ReadBodyIntf>"}" {
4672 yyextra->current->program << yytext ;
4673 --yyextra->curlyCount ;
4674 }
4675<ReadBody,ReadNSBody>"}" {
4676 if ( yyextra->curlyCount>0 )
4677 {
4678 yyextra->current->program << yytext ;
4679 --yyextra->curlyCount ;
4680 }
4681 else
4682 {
4683 yyextra->current->endBodyLine = yyextra->yyLineNr;
4684 std::shared_ptr<Entry> original_root = yyextra->current_root; // save root this namespace is in
4685 if (yyextra->current->section.isNamespace() && yyextra->current->type == "namespace")
4686 {
4687 //printf("namespace %s\n",qPrint(yyextra->current->name));
4688 // save documentation values
4689 DString doc = yyextra->current->doc;
4690 int docLine = yyextra->current->docLine;
4691 DString docFile = yyextra->current->docFile;
4692 DString brief = yyextra->current->brief;
4693 int briefLine = yyextra->current->briefLine;
4694 DString briefFile = yyextra->current->briefFile;
4695 auto groups = yyextra->current->groups;
4696 auto anchors = yyextra->current->anchors;
4697 auto sli = yyextra->current->sli;
4698 auto rqli = yyextra->current->rqli;
4699 // reset documentation values
4700 yyextra->current->doc = "";
4701 yyextra->current->docLine = 0;
4702 yyextra->current->docFile = "";
4703 yyextra->current->brief = "";
4704 yyextra->current->briefLine = 0;
4705 yyextra->current->briefFile = "";
4706 yyextra->current->groups.clear();
4707 yyextra->current->anchors.clear();
4708 yyextra->current->sli.clear();
4709 yyextra->current->rqli.clear();
4710 size_t split_point;
4711 while ((split_point = yyextra->current->name.find("::")) != DString::npos)
4712 {
4713 std::shared_ptr<Entry> new_current = std::make_shared<Entry>(*yyextra->current);
4714 yyextra->current->program.str(std::string());
4715 new_current->name = yyextra->current->name.mid(split_point + 2);
4716 yyextra->current->name = yyextra->current->name.left(split_point);
4717 if (yyextra->current->name.startsWith("inline ")) // C++20 style nested inline namespace syntax
4718 {
4719 yyextra->current->name = yyextra->current->name.mid(7);
4720 yyextra->current->spec.setInline(true);
4721 }
4722 if (!yyextra->current_root->name.empty()) yyextra->current->name.prepend(yyextra->current_root->name+"::");
4723
4724 yyextra->current_root->moveToSubEntryAndKeep(yyextra->current);
4725 yyextra->current_root = yyextra->current;
4726 yyextra->current = new_current;
4727 }
4728 // restore documentation values
4729 yyextra->current->doc = doc;
4730 yyextra->current->docLine = docLine;
4731 yyextra->current->docFile = docFile;
4732 yyextra->current->brief = brief;
4733 yyextra->current->briefLine = briefLine;
4734 yyextra->current->briefFile = briefFile;
4735 yyextra->current->groups = groups;
4736 yyextra->current->anchors = anchors;
4737 yyextra->current->sli = sli;
4738 yyextra->current->rqli = rqli;
4739 }
4740 DString &cn = yyextra->current->name;
4741 if (cn.startsWith("inline ")) // C++20 style nested inline namespace syntax
4742 {
4743 cn = cn.mid(7);
4744 yyextra->current->spec.setInline(true);
4745 }
4746 DString rn = yyextra->current_root->name;
4747 //printf("cn='%s' rn='%s' yyextra->isTypedef=%d\n",qPrint(cn),qPrint(rn),yyextra->isTypedef);
4748 if (!cn.empty() && !rn.empty())
4749 {
4750 prependScope(yyscanner);
4751 }
4752 if (yyextra->isTypedef && cn.empty())
4753 {
4754 //printf("Typedef Name\n");
4755 BEGIN( TypedefName );
4756 }
4757 else
4758 {
4759 if (yyextra->current->section.isEnum() || yyextra->current->spec.isEnum())
4760 {
4761 yyextra->current->program << ','; // add field terminator
4762 }
4763 // add compound definition to the tree
4764 yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args);
4765 // was: yyextra->current->args.simplifyWhiteSpace();
4766 yyextra->current->type = yyextra->current->type.simplifyWhiteSpace();
4767 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
4768 //printf("adding '%s' '%s' '%s' brief=%s yyextra->insideObjC=%d %x\n",qPrint(yyextra->current->type),qPrint(yyextra->current->name),qPrint(yyextra->current->args),qPrint(yyextra->current->brief),yyextra->insideObjC,yyextra->current->section);
4769 if (yyextra->insideObjC &&
4770 (yyextra->current->spec.isInterface() || yyextra->current->spec.isCategory())
4771 ) // method definition follows
4772 {
4773 BEGIN( ReadBodyIntf ) ;
4774 }
4775 else
4776 {
4777 yyextra->memspecEntry = yyextra->current;
4778 if (yyextra->isTypedef)
4779 {
4780 yyextra->current_root->moveToSubEntryAndKeep( yyextra->current ) ;
4781 yyextra->current = std::make_shared<Entry>(*yyextra->current);
4782 }
4783 else
4784 {
4785 yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
4786 yyextra->current = std::make_shared<Entry>(*yyextra->memspecEntry);
4787 }
4788 if (yyextra->current->section.isNamespace() ||
4789 yyextra->current->spec.isInterface() ||
4790 yyextra->insideJava || yyextra->insidePHP || yyextra->insideCS || yyextra->insideD || yyextra->insideJS ||
4791 yyextra->insideSlice
4792 )
4793 { // namespaces and interfaces and java classes ends with a closing bracket without semicolon
4794 yyextra->current->reset();
4795 yyextra->current_root = std::move(original_root); // restore scope from before namespace descent
4796 initEntry(yyscanner);
4797 yyextra->memspecEntry.reset();
4798 BEGIN( FindMembers ) ;
4799 }
4800 else
4801 {
4802 if (!yyextra->isTypedef) // for a typedef we do not reset the documentation
4803 {
4804 yyextra->current->doc.clear();
4805 yyextra->current->brief.clear();
4806 }
4807 BEGIN( MemberSpec ) ;
4808 }
4809 }
4810 }
4811 }
4812 }
void clear()
Definition dstring.h:214
bool startsWith(const char *s) const
Definition dstring.h:600
4813<ReadBody>"}"{BN}+"typedef"{BN}+ {
4814 lineCount(yyscanner);
4815 if ( yyextra->curlyCount>0 )
4816 {
4817 yyextra->current->program << yytext ;
4818 --yyextra->curlyCount ;
4819 }
4820 else
4821 {
4822 yyextra->isTypedef = true;
4823 yyextra->current->endBodyLine = yyextra->yyLineNr;
4824 DString &cn = yyextra->current->name;
4825 DString rn = yyextra->current_root->name;
4826 if (!cn.empty() && !rn.empty())
4827 {
4828 prependScope(yyscanner);
4829 }
4830 BEGIN( TypedefName );
4831 }
4832 }
4833<TypedefName>("const"|"volatile"){BN} { // late "const" or "volatile" keyword
4834 lineCount(yyscanner);
4835 yyextra->current->type.prepend(yytext);
4836 }
4837<TypedefName>{ID} {
4838 if (yyextra->current->section.isEnum() || yyextra->current->spec.isEnum())
4839 {
4840 yyextra->current->program << ","; // add field terminator
4841 }
4842 yyextra->current->name=yytext;
4843 prependScope(yyscanner);
4844 yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
4845 yyextra->current->type = yyextra->current->type.simplifyWhiteSpace();
4846 //printf("Adding compound %s %s %s\n",qPrint(yyextra->current->type),qPrint(yyextra->current->name),qPrint(yyextra->current->args));
4847 if (!yyextra->firstTypedefEntry)
4848 {
4849 yyextra->firstTypedefEntry = yyextra->current;
4850 }
4851 yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
4852 initEntry(yyscanner);
4853 yyextra->isTypedef=true; // to undo reset by initEntry(yyscanner)
4854 BEGIN(MemberSpecSkip);
4855 }
4856<TypedefName>";" { /* typedef of anonymous type */
4857 yyextra->current->name = generateAnonymousAnchor(yyextra->fileName,yyextra->anonCount++);
4858 if (yyextra->current->section.isEnum() || yyextra->current->spec.isEnum())
4859 {
4860 yyextra->current->program << ','; // add field terminator
4861 }
4862 // add compound definition to the tree
4863 yyextra->current->args = yyextra->current->args.simplifyWhiteSpace();
4864 yyextra->current->type = yyextra->current->type.simplifyWhiteSpace();
4865 yyextra->memspecEntry = yyextra->current;
4866 yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
4867 initEntry(yyscanner);
4868 unput(';');
4869 BEGIN( MemberSpec ) ;
4870 }
4871<MemberSpec>([*&]*{BN}*)*{ID}{BN}*("["[^\‍]\n]*"]")* { // the [] part could be improved.
4872 lineCount(yyscanner);
4873 int i=0,l=(int)yyleng;
4874 while (i<l && (!isId(yytext[i]))) i++;
4875 yyextra->msName = DString(yytext).right(l-i).stripWhiteSpace();
4876 if (size_t j=yyextra->msName.find("[") ; j!=DString::npos)
4877 {
4878 yyextra->msArgs=yyextra->msName.mid(j);
4879 yyextra->msName=yyextra->msName.left(j);
4880 }
4881 yyextra->msType=DString(yytext).left(i);
4882
4883 // handle *pName in: typedef { ... } name, *pName;
4884 if (yyextra->firstTypedefEntry)
4885 {
4886 if (yyextra->firstTypedefEntry->spec.isStruct())
4887 {
4888 yyextra->msType.prepend("struct "+yyextra->firstTypedefEntry->name);
4889 }
4890 else if (yyextra->firstTypedefEntry->spec.isUnion())
4891 {
4892 yyextra->msType.prepend("union "+yyextra->firstTypedefEntry->name);
4893 }
4894 else if (yyextra->firstTypedefEntry->section.isEnum())
4895 {
4896 yyextra->msType.prepend("enum "+yyextra->firstTypedefEntry->name);
4897 }
4898 else
4899 {
4900 yyextra->msType.prepend(yyextra->firstTypedefEntry->name);
4901 }
4902 }
4903 }
DString right(size_t len) const
Definition dstring.h:311
bool isId(char c)
Returns true if c is a valid character for an identifier.
Definition dstring.h:895
4904<MemberSpec>"(" { // function with struct return type
4905 addType(yyscanner);
4906 yyextra->current->name = yyextra->msName;
4907 yyextra->current->spec = TypeSpecifier();
4908 unput('(');
4909 BEGIN(FindMembers);
4910 }
4911<MemberSpec>[,;] {
4912 //printf("msName=%s\n",qPrint(yyextra->msName));
4913 if (yyextra->msName.empty() && !yyextra->current->name.empty())
4914 {
4915 // see if the compound does not have a name or is yyextra->inside another
4916 // anonymous compound. If so we insert a
4917 // special 'anonymous' variable.
4918 //Entry *p=yyextra->current_root;
4919 const Entry *p=yyextra->current.get();
4920 while (p)
4921 {
4922 // only look for class scopes, not namespace scopes
4923 if (p->section.isCompound() && !p->name.empty())
4924 {
4925 //printf("Trying scope '%s'\n",qPrint(p->name));
4926 size_t i=p->name.rfind("::");
4927 size_t pi = i==DString::npos ? 0 : i+2;
4928 if (p->name.at(pi)=='@')
4929 {
4930 // anonymous compound yyextra->inside -> insert dummy variable name
4931 //printf("Adding anonymous variable for scope %s\n",qPrint(p->name));
4932 yyextra->msName = generateAnonymousAnchor(yyextra->fileName,yyextra->anonCount++);
4933 break;
4934 }
4935 }
4936 //p=p->parent;
4937 if (p==yyextra->current.get()) p=yyextra->current_root.get(); else p=p->parent();
4938 }
4939 }
4940 //printf("yyextra->msName=%s yyextra->current->name=%s\n",qPrint(yyextra->msName),qPrint(yyextra->current->name));
4941 if (!yyextra->msName.empty()
4942 /*&& yyextra->msName!=yyextra->current->name*/) // skip typedef T {} T;, removed due to bug608493
4943 {
4944 bool typedefHidesStruct = Config_getBool(TYPEDEF_HIDES_STRUCT);
4945 // case 1: typedef struct _S { ... } S_t;
4946 // -> omit typedef and use S_t as the struct name
4947 if (typedefHidesStruct &&
4948 yyextra->isTypedef &&
4949 ((yyextra->current->spec.isStruct() || yyextra->current->spec.isUnion()) || yyextra->current->section.isEnum()) &&
4950 yyextra->msType.stripWhiteSpace().empty() &&
4951 yyextra->memspecEntry)
4952 {
4953 yyextra->memspecEntry->name=yyextra->msName;
4954 }
4955 else // case 2: create a typedef field
4956 {
4957 std::shared_ptr<Entry> varEntry=std::make_shared<Entry>();
4958 varEntry->lang = yyextra->language;
4959 varEntry->protection = yyextra->current->protection ;
4960 varEntry->mtype = yyextra->current->mtype;
4961 varEntry->virt = yyextra->current->virt;
4962 varEntry->isStatic = yyextra->current->isStatic;
4963 varEntry->section = EntryType::makeVariable();
4964 varEntry->name = yyextra->msName.stripWhiteSpace();
4965 varEntry->type = yyextra->current->type.simplifyWhiteSpace()+" ";
4966 varEntry->args = yyextra->msArgs;
4967 if (yyextra->isTypedef)
4968 {
4969 varEntry->type.prepend("typedef ");
4970 // //printf("yyextra->current->name = %s %s\n",qPrint(yyextra->current->name),qPrint(yyextra->msName));
4971 }
4972 if (typedefHidesStruct &&
4973 yyextra->isTypedef &&
4974 (yyextra->current->spec.isStruct() || yyextra->current->spec.isUnion()) &&
4975 yyextra->memspecEntry
4976 ) // case 1: use S_t as type for pS_t in "typedef struct _S {} S_t, *pS_t;"
4977 {
4978 varEntry->type+=yyextra->memspecEntry->name+yyextra->msType;
4979 }
4980 else // case 2: use _S as type for for pS_t
4981 {
4982 varEntry->type+=yyextra->current->name+yyextra->msType;
4983 }
4984 varEntry->fileName = yyextra->fileName;
4985 varEntry->startLine = yyextra->yyLineNr;
4986 varEntry->startColumn = yyextra->yyColNr;
4987 varEntry->doc = yyextra->current->doc;
4988 varEntry->brief = yyextra->current->brief;
4989 varEntry->mGrpId = yyextra->current->mGrpId;
4990 varEntry->initializer.str(yyextra->current->initializer.str());
4991 varEntry->groups = yyextra->current->groups;
4992 varEntry->sli = yyextra->current->sli;
4993
4994 //printf("Add: type='%s',name='%s',args='%s' brief=%s doc=%s\n",
4995 // qPrint(varEntry->type),qPrint(varEntry->name),
4996 // qPrint(varEntry->args),qPrint(varEntry->brief),qPrint(varEntry->doc));
4997 yyextra->current_root->moveToSubEntryAndKeep(varEntry);
4998 }
4999 }
5000 if (*yytext==';') // end of a struct/class ...
5001 {
5002 if (!yyextra->isTypedef && yyextra->msName.empty() &&
5003 yyextra->memspecEntry && yyextra->current->section.isCompound())
5004 { // case where a class/struct has a doc block after it
5005 if (!yyextra->current->doc.empty())
5006 {
5007 yyextra->memspecEntry->doc += yyextra->current->doc;
5008 }
5009 if (!yyextra->current->brief.empty())
5010 {
5011 yyextra->memspecEntry->brief += yyextra->current->brief;
5012 }
5013 }
5014 yyextra->msType.clear();
5015 yyextra->msName.clear();
5016 yyextra->msArgs.clear();
5017 yyextra->isTypedef=false;
5018 yyextra->firstTypedefEntry.reset();
5019 yyextra->memspecEntry.reset();
5020 yyextra->current->reset();
5021 initEntry(yyscanner);
5022 BEGIN( FindMembers );
5023 }
5024 else
5025 {
5026 yyextra->current->doc.clear();
5027 yyextra->current->brief.clear();
5028 }
5029
5030 }
size_t rfind(char c, size_t pos=npos) const
Definition dstring.h:244
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:686
Represents an unstructured piece of information, about an entity found in the sources.
Definition entry.h:115
Entry * parent() const
Definition entry.h:133
EntryType section
entry type (see Sections);
Definition entry.h:171
DString name
member name
Definition entry.h:173
ENTRY_TYPES constexpr bool isCompound() const noexcept
Definition types.h:863
5031<MemberSpec>"=" {
5032 yyextra->lastInitializerContext=YY_START;
5033 yyextra->sharpCount=0;
5034 yyextra->initBracketCount=0;
5035 yyextra->current->initializer.str(yytext);
5036 BEGIN(ReadInitializer);
5037 /* BEGIN(MemberSpecSkip); */
5038 }
5039 /*
5040<MemberSpecSkip>"{" {
5041 yyextra->curlyCount=0;
5042 yyextra->lastCurlyContext = MemberSpecSkip;
5043 yyextra->previous = yyextra->current;
5044 BEGIN(SkipCurly);
5045 }
5046 */
5047<MemberSpecSkip>"," { BEGIN(MemberSpec); }
5048<MemberSpecSkip>";" { unput(';'); BEGIN(MemberSpec); }
5049<ReadBody,ReadNSBody,ReadBodyIntf>{BN}{1,80} { yyextra->current->program << yytext ;
5050 lineCount(yyscanner) ;
5051 }
5052<ReadBodyIntf>"@end"/[^a-z_A-Z0-9] { // end of Objective C block
5053 yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
5054 initEntry(yyscanner);
5055 yyextra->language = yyextra->current->lang = SrcLangExt::Cpp; // see bug746361
5056 yyextra->insideObjC=false;
5057 BEGIN( FindMembers );
5058 }
5059<ReadBody,ReadNSBody,ReadBodyIntf>\\. { yyextra->current->program << yytext ; }
5060<ReadBody,ReadNSBody,ReadBodyIntf>. { yyextra->current->program << yytext ; }
5061
5062<FindMembers>"("/{BN}*"::"*{BN}*({TSCOPE}{BN}*"::")*{TSCOPE}{BN}*")"{BN}*"(" | /* typedef void (A<int>::func_t)(args...) */
5063<FindMembers>("("({BN}*"::"*{BN}*{TSCOPE}{BN}*"::")*({BN}*[*&\^]{BN}*)+)+ { /* typedef void (A::*ptr_t)(args...) or int (*func(int))[], the ^ is for Obj-C blocks */
5064 if (yyextra->insidePHP) // reference parameter
5065 {
5066 REJECT
5067 }
5068 else
5069 {
5070 yyextra->current->bodyLine = yyextra->yyLineNr;
5071 yyextra->current->bodyColumn = yyextra->yyColNr;
5072 lineCount(yyscanner);
5073 addType(yyscanner);
5074 yyextra->funcPtrType=yytext;
5075 yyextra->roundCount=0;
5076 //yyextra->current->type += yytext;
5077 BEGIN( FuncPtr );
5078 }
5079 }
5080<FuncPtr>{SCOPENAME} {
5081 yyextra->current->name = yytext;
5082 if (nameIsOperator(yyextra->current->name))
5083 {
5084 BEGIN( FuncPtrOperator );
5085 }
5086 else
5087 {
5088 if (yyextra->current->name=="const" || yyextra->current->name=="volatile")
5089 {
5090 yyextra->funcPtrType += yyextra->current->name;
5091 }
5092 else
5093 {
5094 BEGIN( EndFuncPtr );
5095 }
5096 }
5097 }
5098<FuncPtr>. {
5099 //printf("error: FuncPtr '%c' unexpected at line %d of %s\n",*yytext,yyextra->yyLineNr,yyextra->fileName);
5100 }
5101<FuncPtrOperator>"("{BN}*")"{BNopt}/"(" {
5102 yyextra->current->name += yytext;
5103 yyextra->current->name = yyextra->current->name.simplifyWhiteSpace();
5104 lineCount(yyscanner);
5105 }
5106<FuncPtrOperator>\n {
5107 lineCount(yyscanner);
5108 yyextra->current->name += *yytext;
5109 }
5110<FuncPtrOperator>"(" {
5111 unput(*yytext);
5112 BEGIN( EndFuncPtr );
5113 }
5114<FuncPtrOperator>. {
5115 yyextra->current->name += *yytext;
5116 }
5117<EndFuncPtr>")"{BNopt}/";" { // a variable with extra braces
5118 lineCount(yyscanner);
5119 yyextra->current->type+=yyextra->funcPtrType.mid(1);
5120 BEGIN(FindMembers);
5121 }
5122<EndFuncPtr>")"{BNopt}/"(" { // a function pointer
5123 lineCount(yyscanner);
5124 if (yyextra->funcPtrType!="(") // not just redundant braces
5125 {
5126 yyextra->current->type+=yyextra->funcPtrType+")";
5127 }
5128 BEGIN(FindMembers);
5129 }
5130<EndFuncPtr>")"{BNopt}/"[" { // an array of variables
5131 lineCount(yyscanner);
5132 yyextra->current->type+=yyextra->funcPtrType;
5133 yyextra->current->args += ")";
5134 BEGIN(FindMembers);
5135 }
5136<EndFuncPtr>"(" { // a function returning a function or
5137 // a function returning a pointer to an array
5138 yyextra->current->args += *yytext ;
5139 //yyextra->roundCount=0;
5140 //BEGIN( FuncFunc );
5141 yyextra->current->bodyLine = yyextra->yyLineNr;
5142 yyextra->current->bodyColumn = yyextra->yyColNr;
5143 yyextra->currentArgumentContext = FuncFuncEnd;
5144 yyextra->fullArgString=yyextra->current->args;
5145 yyextra->copyArgString=&yyextra->current->args;
5146 BEGIN( ReadFuncArgType ) ;
5147 }
5148<EndFuncPtr>"["[^\n\‍]]*"]" {
5149 yyextra->funcPtrType+=yytext;
5150 }
5151<EndFuncPtr>")" {
5152 BEGIN(FindMembers);
5153 }
5154<FuncFunc>"(" {
5155 yyextra->current->args += *yytext ;
5156 ++yyextra->roundCount;
5157 }
5158<FuncFunc>")" {
5159 yyextra->current->args += *yytext ;
5160 if ( yyextra->roundCount )
5161 --yyextra->roundCount;
5162 else
5163 {
5164 BEGIN(FuncFuncEnd);
5165 }
5166 }
5167<FuncFuncEnd>")"{BN}*"(" {
5168 lineCount(yyscanner);
5169 yyextra->current->type+=yyextra->funcPtrType+")(";
5170 BEGIN(FuncFuncType);
5171 }
5172<FuncFuncEnd>")"{BNopt}/[;{] {
5173 lineCount(yyscanner);
5174 yyextra->current->type+=yyextra->funcPtrType.mid(1);
5175 BEGIN(SFunction);
5176 }
5177<FuncFuncEnd>")"{BNopt}/"[" { // function returning a pointer to an array
5178 lineCount(yyscanner);
5179 yyextra->current->type+=yyextra->funcPtrType;
5180 yyextra->current->args+=")";
5181 BEGIN(FuncFuncArray);
5182 }
5183<FuncFuncEnd>. {
5184 yyextra->current->args += *yytext;
5185 }
5186<FuncFuncType>"(" {
5187 yyextra->current->type += *yytext;
5188 yyextra->roundCount++;
5189 }
5190<FuncFuncType>")" {
5191 yyextra->current->type += *yytext;
5192 if (yyextra->roundCount)
5193 --yyextra->roundCount;
5194 else
5195 BEGIN(SFunction);
5196 }
5197<FuncFuncType>{BN}*","{BN}* { lineCount(yyscanner) ; yyextra->current->type += ", " ; }
5198<FuncFuncType>{BN}+ { lineCount(yyscanner) ; yyextra->current->type += ' ' ; }
5199<FuncFuncType>. {
5200 yyextra->current->type += *yytext;
5201 }
5202<FindMembers>"("/{BN}*{ID}{BN}*"*"{BN}*{ID}*")"{BN}*"(" { // for catching typedef void (__stdcall *f)() like definitions
5203 if (yyextra->current->type.startsWith("typedef") &&
5204 yyextra->current->bodyLine==-1)
5205 // the bodyLine check is to prevent this guard to be true more than once
5206 {
5207 yyextra->current->bodyLine = yyextra->yyLineNr;
5208 yyextra->current->bodyColumn = yyextra->yyColNr;
5209 BEGIN( GetCallType );
5210 }
5211 else if (!yyextra->current->name.empty()) // normal function
5212 {
5213 yyextra->current->args = yytext;
5214 yyextra->current->bodyLine = yyextra->yyLineNr;
5215 yyextra->current->bodyColumn = yyextra->yyColNr;
5216 yyextra->currentArgumentContext = FuncQual;
5217 yyextra->fullArgString=yyextra->current->args;
5218 yyextra->copyArgString=&yyextra->current->args;
5219 BEGIN( ReadFuncArgType ) ;
5220 //printf(">>> Read function arguments!\n");
5221 }
5222 }
5223<GetCallType>{BN}*{ID}{BN}*"*" {
5224 lineCount(yyscanner);
5225 addType(yyscanner);
5226 yyextra->funcPtrType="(";
5227 yyextra->funcPtrType+=yytext;
5228 yyextra->roundCount=0;
5229 BEGIN( FuncPtr );
5230 }
5231<FindMembers>"(" {
5232 if (!yyextra->current->name.empty())
5233 {
5234 yyextra->current->args = yytext;
5235 yyextra->current->bodyLine = yyextra->yyLineNr;
5236 yyextra->current->bodyColumn = yyextra->yyColNr;
5237 yyextra->currentArgumentContext = FuncQual;
5238 yyextra->fullArgString=yyextra->current->args;
5239 yyextra->copyArgString=&yyextra->current->args;
5240 BEGIN( ReadFuncArgType ) ;
5241 //printf(">>> Read function arguments yyextra->current->argList.size()=%d\n",yyextra->current->argList.size());
5242 }
5243 }
5244
5245 /*- Function argument reading rules ---------------------------------------*/
5246
5247<ReadFuncArgType>[^ \/\r\t\n\‍[\‍]\‍)\‍(\"\'#]+ { *yyextra->copyArgString+=yytext;
5248 if (yyextra->insideCS) yyextra->fullArgString+=substitute(yytext,".","::");
5249 else yyextra->fullArgString+=yytext;
5250 }
5251<CopyArgString,CopyArgPHPString>[^\n\\\"\']+ { *yyextra->copyArgString+=yytext;
5252 yyextra->fullArgString+=yytext;
5253 }
5254<CopyArgRound>[^\/\n\‍)\‍(\"\']+ {
5255 *yyextra->copyArgString+=yytext;
5256 yyextra->fullArgString+=yytext;
5257 }
5258<CopyArgSquare>[^\/\n\‍]\‍[\"\']+ {
5259 *yyextra->copyArgString+=yytext;
5260 yyextra->fullArgString+=yytext;
5261 }
5262<ReadFuncArgType,ReadTempArgs>{BN}* {
5263 *yyextra->copyArgString+=" ";
5264 yyextra->fullArgString+=" ";
5265 lineCount(yyscanner);
5266 }
5267<ReadFuncArgType,CopyArgRound,CopyArgSquare,CopyArgSharp,ReadTempArgs>{RAWBEGIN} {
5268 yyextra->delimiter = extractBeginRawStringDelimiter(yytext);
5269 yyextra->lastRawStringContext = YY_START;
5270 yyextra->pCopyRawString = yyextra->copyArgString;
5271 *yyextra->pCopyRawString+=yytext;
5272 yyextra->fullArgString+=yytext;
5273 BEGIN(RawString);
5274 }
5275<ReadFuncArgType,CopyArgRound,CopyArgSquare,CopyArgSharp,ReadTempArgs>\" {
5276 *yyextra->copyArgString+=*yytext;
5277 yyextra->fullArgString+=*yytext;
5278 yyextra->lastCopyArgStringContext = YY_START;
5279 BEGIN( CopyArgString );
5280 }
5281<ReadFuncArgType>"[" {
5282 if (!yyextra->insidePHP) REJECT;
5283 *yyextra->copyArgString+=*yytext;
5284 yyextra->fullArgString+=*yytext;
5285 yyextra->argSquareCount=0;
5286 yyextra->lastCopyArgContext = YY_START;
5287 BEGIN( CopyArgSquare );
5288 }
5289<ReadFuncArgType,ReadTempArgs>"(" {
5290 *yyextra->copyArgString+=*yytext;
5291 yyextra->fullArgString+=*yytext;
5292 yyextra->argRoundCount=0;
5293 yyextra->lastCopyArgContext = YY_START;
5294 BEGIN( CopyArgRound );
5295 }
5296<ReadFuncArgType>")" {
5297 *yyextra->copyArgString+=*yytext;
5298 yyextra->fullArgString+=*yytext;
5299 yyextra->current->argList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
5300 if (yyextra->insideJS)
5301 {
5302 fixArgumentListForJavaScript(yyextra->current->argList);
5303 }
5304 handleParametersCommentBlocks(yyscanner,yyextra->current->argList);
5305
5306 /* remember the yyextra->current documentation block, since
5307 we could overwrite it with the documentation of
5308 a function argument, which we then have to correct later
5309 on
5310 */
5311 yyextra->docBackup = yyextra->current->doc;
5312 yyextra->briefBackup = yyextra->current->brief;
5313
5314 BEGIN( yyextra->currentArgumentContext );
5315 }
std::unique_ptr< ArgumentList > stringToArgumentList(SrcLangExt lang, const DString &argsString, DString *extraTypeChars=nullptr)
Definition defargs.l:821
5316 /* a special comment */
5317<ReadFuncArgType,ReadTempArgs>({CCS}[*!]|{CPPC}[/!])("<"?) {
5318 if (yyextra->currentArgumentContext==DefineEnd)
5319 {
5320 // for defines we interpret a comment
5321 // as documentation for the define
5322 int i;for (i=(int)yyleng-1;i>=0;i--)
5323 {
5324 unput(yytext[i]);
5325 }
5326 yyextra->current->argList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
5327 handleParametersCommentBlocks(yyscanner,yyextra->current->argList);
5328 BEGIN( yyextra->currentArgumentContext );
5329 }
5330 else // not a define
5331 {
5332 // for functions we interpret a comment
5333 // as documentation for the argument
5334 yyextra->fullArgString+=yytext;
5335 yyextra->lastCopyArgChar=0;
5336 yyextra->lastCommentInArgContext=YY_START;
5337 if (yytext[1]=='/')
5338 BEGIN( CopyArgCommentLine );
5339 else
5340 BEGIN( CopyArgComment );
5341 }
5342 }
5343 /* a non-special comment */
5344<ReadFuncArgType,ReadTempArgs>{CCS}{CCE} { /* empty comment */ }
5345<ReadFuncArgType,ReadTempArgs>{CCS} {
5346 yyextra->lastCContext = YY_START;
5347 BEGIN( SkipComment );
5348 }
5349<ReadFuncArgType,ReadTempArgs>{CPPC} {
5350 yyextra->lastCContext = YY_START;
5351 BEGIN( SkipCxxComment );
5352 }
5353 /*
5354<ReadFuncArgType,ReadTempArgs>"'#" { if (yyextra->insidePHP)
5355 REJECT;
5356 *yyextra->copyArgString+=yytext;
5357 yyextra->fullArgString+=yytext;
5358 }
5359<ReadFuncArgType,ReadTempArgs>"#" {
5360 if (!yyextra->insidePHP)
5361 REJECT;
5362 yyextra->lastCContext = YY_START;
5363 BEGIN( SkipCxxComment );
5364 }
5365 */
5366 /* ')' followed by a special comment */
5367<ReadFuncArgType>")"{BN}*({CCS}[*!]|{CPPC}[/!])"<" {
5368 lineCount(yyscanner);
5369 if (yyextra->currentArgumentContext==DefineEnd)
5370 {
5371 // for defines we interpret a comment
5372 // as documentation for the define
5373 int i;for (i=(int)yyleng-1;i>0;i--)
5374 {
5375 unput(yytext[i]);
5376 }
5377 *yyextra->copyArgString+=*yytext;
5378 yyextra->fullArgString+=*yytext;
5379 yyextra->current->argList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
5380 handleParametersCommentBlocks(yyscanner,yyextra->current->argList);
5381 BEGIN( yyextra->currentArgumentContext );
5382 }
5383 else
5384 {
5385 // for functions we interpret a comment
5386 // as documentation for the yyextra->last argument
5387 yyextra->lastCopyArgChar=*yytext;
5388 DString text=&yytext[1];
5389 text=text.stripWhiteSpace();
5390 yyextra->lastCommentInArgContext=YY_START;
5391 yyextra->fullArgString+=text;
5392 if (text.find("//")!=DString::npos)
5393 BEGIN( CopyArgCommentLine );
5394 else
5395 BEGIN( CopyArgComment );
5396 }
5397 }
5398<CopyArgComment>^{B}*"*"+/{BN}+
5399<CopyArgComment>[^\n\\\@\*]+ { yyextra->fullArgString+=yytext; }
5400<CopyArgComment>{CCE} { yyextra->fullArgString+=yytext;
5401 if (yyextra->lastCopyArgChar!=0)
5402 unput(yyextra->lastCopyArgChar);
5403 BEGIN( yyextra->lastCommentInArgContext );
5404 }
5405<CopyArgCommentLine>\n { yyextra->fullArgString+=yytext;
5406 lineCount(yyscanner);
5407 if (yyextra->lastCopyArgChar!=0)
5408 unput(yyextra->lastCopyArgChar);
5409 BEGIN( yyextra->lastCommentInArgContext );
5410 }
5411<CopyArgCommentLine>{CMD}"startuml"/[^a-z_A-Z0-9\-] { // verbatim type command (which could contain nested comments!)
5412 yyextra->docBlockName="uml";
5413 yyextra->fullArgString+=yytext;
5414 BEGIN(CopyArgVerbatim);
5415 }
5416<CopyArgCommentLine>{CMD}("verbatim"|"iliteral"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"rtfonly"|"docbookonly"|"dot"|"msc"|"mermaid"|"code")/[^a-z_A-Z0-9\-] { // verbatim command (which could contain nested comments!)
5417 yyextra->docBlockName=&yytext[1];
5418 yyextra->fullArgString+=yytext;
5419 BEGIN(CopyArgVerbatim);
5420 }
5421<CopyArgCommentLine>{CMD}("f$"|"f["|"f{"|"f(") {
5422 yyextra->docBlockName=&yytext[1];
5423 if (yyextra->docBlockName.at(1)=='[')
5424 {
5425 yyextra->docBlockName.at(1)=']';
5426 }
5427 if (yyextra->docBlockName.at(1)=='{')
5428 {
5429 yyextra->docBlockName.at(1)='}';
5430 }
5431 if (yyextra->docBlockName.at(1)=='(')
5432 {
5433 yyextra->docBlockName.at(1)=')';
5434 }
5435 yyextra->fullArgString+=yytext;
5436 BEGIN(CopyArgVerbatim);
5437 }
5438<CopyArgVerbatim>{CMD}("endverbatim"|"endiliteral"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"endrtfonly"|"enddot"|"endmsc"|"endmermaid"|"enduml"|"endcode")/[^a-z_A-Z0-9\-] { // end of verbatim block
5439 yyextra->fullArgString+=yytext;
5440 if (&yytext[4]==yyextra->docBlockName)
5441 {
5442 yyextra->docBlockName="";
5443 BEGIN(CopyArgCommentLine);
5444 }
5445 }
5446<CopyArgVerbatim>{CMD}("f$"|"f]"|"f}"|"f)") { // end of verbatim block
5447 yyextra->fullArgString+=yytext;
5448 if (yyextra->docBlockName==&yytext[1])
5449 {
5450 yyextra->docBlockName="";
5451 BEGIN(CopyArgCommentLine);
5452 }
5453 }
5454<CopyArgCommentLine>[^\\\@\n]+ { yyextra->fullArgString+=yytext; }
5455<CopyArgCommentLine>. { yyextra->fullArgString+=*yytext; }
5456<CopyArgComment,CopyArgVerbatim>\n { yyextra->fullArgString+=*yytext; lineCount(yyscanner); }
5457<CopyArgComment,CopyArgVerbatim>. { yyextra->fullArgString+=*yytext; }
5458<CopyArgComment>{CMD}("brief"|"short"){B}+ {
5459 warn(yyextra->fileName,yyextra->yyLineNr,
5460 "Ignoring {:c}brief command inside argument documentation",*yytext
5461 );
5462 yyextra->fullArgString+=' ';
5463 }
5464<ReadTempArgs>"<" {
5465 *yyextra->copyArgString+=*yytext;
5466 yyextra->fullArgString+=*yytext;
5467 yyextra->argSharpCount=1;
5468 BEGIN( CopyArgSharp );
5469 }
5470<ReadTempArgs>">" {
5471 *yyextra->copyArgString+=*yytext;
5472 yyextra->fullArgString+=*yytext;
5473 //printf("end template list '%s'\n",qPrint(*yyextra->copyArgString));
5474 *yyextra->currentArgumentList = *stringToArgumentList(yyextra->language, yyextra->fullArgString);
5475 handleParametersCommentBlocks(yyscanner,yyextra->current->tArgLists.back());
5476 BEGIN( yyextra->currentArgumentContext );
5477 }
5478<CopyArgRound>"(" {
5479 yyextra->argRoundCount++;
5480 *yyextra->copyArgString+=*yytext;
5481 yyextra->fullArgString+=*yytext;
5482 }
5483<CopyArgRound>")" {
5484 *yyextra->copyArgString+=*yytext;
5485 yyextra->fullArgString+=*yytext;
5486 if (yyextra->argRoundCount>0)
5487 yyextra->argRoundCount--;
5488 else
5489 BEGIN( yyextra->lastCopyArgContext );
5490 }
5491<CopyArgSquare>"[" {
5492 yyextra->argSquareCount++;
5493 *yyextra->copyArgString+=*yytext;
5494 yyextra->fullArgString+=*yytext;
5495 }
5496<CopyArgSquare>"]" {
5497 *yyextra->copyArgString+=*yytext;
5498 yyextra->fullArgString+=*yytext;
5499 if (yyextra->argSquareCount>0)
5500 yyextra->argSquareCount--;
5501 else
5502 BEGIN( yyextra->lastCopyArgContext );
5503 }
5504<CopyArgSharp>"(" {
5505 *yyextra->copyArgString+=*yytext;
5506 yyextra->fullArgString+=*yytext;
5507 yyextra->argRoundCount=0;
5508 yyextra->lastCopyArgContext = YY_START;
5509 BEGIN( CopyArgRound );
5510 }
5511<CopyArgSharp>"<" {
5512 yyextra->argSharpCount++;
5513 //printf("yyextra->argSharpCount++=%d copy\n",yyextra->argSharpCount);
5514 *yyextra->copyArgString+=*yytext;
5515 yyextra->fullArgString+=*yytext;
5516 }
5517<CopyArgSharp>">" {
5518 *yyextra->copyArgString+=*yytext;
5519 yyextra->fullArgString+=*yytext;
5520 yyextra->argSharpCount--;
5521 if (yyextra->argSharpCount>0)
5522 {
5523 //printf("yyextra->argSharpCount--=%d copy\n",yyextra->argSharpCount);
5524 }
5525 else
5526 {
5527 BEGIN( ReadTempArgs );
5528 //printf("end of yyextra->argSharpCount\n");
5529 }
5530 }
5531<CopyArgString,CopyArgPHPString>\\. {
5532 *yyextra->copyArgString+=yytext;
5533 yyextra->fullArgString+=yytext;
5534 }
5535<CopyArgString>\" {
5536 *yyextra->copyArgString+=*yytext;
5537 yyextra->fullArgString+=*yytext;
5538 BEGIN( yyextra->lastCopyArgStringContext );
5539 }
5540<CopyArgPHPString>\' {
5541 *yyextra->copyArgString+=*yytext;
5542 yyextra->fullArgString+=*yytext;
5543 BEGIN( yyextra->lastCopyArgStringContext );
5544 }
5545<ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSquare,CopyArgSharp>{CHARLIT} {
5546 if (yyextra->insidePHP)
5547 {
5548 REJECT;
5549 }
5550 else
5551 {
5552 *yyextra->copyArgString+=yytext;
5553 yyextra->fullArgString+=yytext;
5554 }
5555 }
5556<ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSquare,CopyArgSharp>\' {
5557 *yyextra->copyArgString+=yytext;
5558 yyextra->fullArgString+=yytext;
5559 if (yyextra->insidePHP)
5560 {
5561 yyextra->lastCopyArgStringContext=YY_START;
5562 BEGIN(CopyArgPHPString);
5563 }
5564 }
5565<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSquare,CopyArgSharp>"<="|">="|"<=>" {
5566 *yyextra->copyArgString+=yytext;
5567 yyextra->fullArgString+=yytext;
5568 }
5569<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSquare,CopyArgSharp>\n {
5570 lineCount(yyscanner);
5571 *yyextra->copyArgString+=*yytext;
5572 yyextra->fullArgString+=*yytext;
5573 }
5574<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSquare,CopyArgSharp>{ID} {
5575 *yyextra->copyArgString+=yytext;
5576 yyextra->fullArgString+=yytext;
5577 }
5578<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSquare,CopyArgSharp>. {
5579 *yyextra->copyArgString+=*yytext;
5580 yyextra->fullArgString+=*yytext;
5581 }
5582
5583
5584
5585 /*------------------------------------------------------------------------*/
5586
5587
5588<FuncRound>"(" { yyextra->current->args += *yytext ;
5589 ++yyextra->roundCount ;
5590 }
5591<FuncRound>")" { yyextra->current->args += *yytext ;
5592 if ( yyextra->roundCount )
5593 --yyextra->roundCount ;
5594 else
5595 BEGIN( FuncQual ) ;
5596 }
5597 /*
5598<FuncQual>"#" { if (yyextra->insidePHP)
5599 REJECT;
5600 yyextra->lastCPPContext = YY_START;
5601 BEGIN(SkipCPP);
5602 }
5603 */
5604<FuncQual>[{:;,] {
5605 if ( dstrcmp(yytext,";")==0 &&
5606 ((yyextra->insideJS || yyextra->insidePHP) &&
5607 !yyextra->current->type.containsWord("function")) )
5608 {
5609 yyextra->current->reset();
5610 initEntry(yyscanner);
5611 BEGIN( FindMembers );
5612 }
5613 else
5614 {
5615 unput(*yytext); BEGIN( SFunction );
5616 }
5617 }
5618<FuncQual>{BN}*"abstract"{BN}* { // pure virtual member function
5619 lineCount(yyscanner) ;
5620 yyextra->current->virt = Specifier::Pure;
5621 yyextra->current->args += " override ";
5622 }
5623<FuncQual,TrailingReturn>{BN}*"override"{BN}* { // C++11 overridden virtual member function
5624 lineCount(yyscanner) ;
5625 yyextra->current->spec.setOverride(true);
5626 yyextra->current->args += " override ";
5627 if (YY_START==TrailingReturn) yyextra->current->argList.finishTrailingReturnType();
5628 BEGIN(FuncQual);
5629 }
5630<FuncQual,TrailingReturn>{BN}*"final"{BN}* { // C++11 final method
5631 lineCount(yyscanner) ;
5632 yyextra->current->spec.setFinal(true);
5633 yyextra->current->args += " final ";
5634 if (YY_START==TrailingReturn) yyextra->current->argList.finishTrailingReturnType();
5635 BEGIN(FuncQual);
5636 }
5637<FuncQual>{BN}*"sealed"{BN}* { // sealed member function
5638 lineCount(yyscanner) ;
5639 yyextra->current->spec.setSealed(true);
5640 yyextra->current->args += " sealed ";
5641 }
5642<FuncQual>{BN}*"new"{BN}* { // new member function
5643 lineCount(yyscanner) ;
5644 yyextra->current->spec.setNew(true);
5645 yyextra->current->args += " new ";
5646 }
5647<FuncQual>{BN}*"const"{BN}* { // const member function
5648 lineCount(yyscanner) ;
5649 yyextra->current->args += " const ";
5650 yyextra->current->argList.setConstSpecifier(true);
5651 }
5652<FuncQual>{BN}*"volatile"{BN}* { // volatile member function
5653 lineCount(yyscanner) ;
5654 yyextra->current->args += " volatile ";
5655 yyextra->current->argList.setVolatileSpecifier(true);
5656 }
5657<FuncQual>{BN}*"noexcept"{BN}* { // noexcept qualifier
5658 lineCount(yyscanner) ;
5659 yyextra->current->args += " noexcept ";
5660 yyextra->current->spec.setNoExcept(true);
5661 }
5662<FuncQual>{BN}*"noexcept"{BN}*"("{B}*false{B}*")"{BN}* { // noexcept(false) expression
5663 lineCount(yyscanner) ;
5664 yyextra->current->args += " noexcept(false)";
5665 }
5666<FuncQual>{BN}*"noexcept"{BN}*"(" { // noexcept expression
5667 lineCount(yyscanner) ;
5668 yyextra->current->args += " noexcept(";
5669 yyextra->current->spec.setNoExcept(true);
5670 yyextra->lastRoundContext=FuncQual;
5671 yyextra->pCopyRoundString=&yyextra->current->args;
5672 yyextra->roundCount=0;
5673 BEGIN(CopyRound);
5674 }
5675<FuncQual>{BN}*"&" {
5676 yyextra->current->args += " &";
5677 yyextra->current->argList.setRefQualifier(RefQualifierType::LValue);
5678 }
5679<FuncQual>{BN}*"&&" {
5680 yyextra->current->args += " &&";
5681 yyextra->current->argList.setRefQualifier(RefQualifierType::RValue);
5682 }
5683
5684<FuncQual,TrailingReturn>{BN}*"="{BN}*"0"{BN}* { // pure virtual member function
5685 lineCount(yyscanner) ;
5686 yyextra->current->args += " = 0";
5687 yyextra->current->virt = Specifier::Pure;
5688 yyextra->current->argList.setPureSpecifier(true);
5689 if (YY_START==TrailingReturn) yyextra->current->argList.finishTrailingReturnType();
5690 BEGIN(FuncQual);
5691 }
5692<FuncQual,TrailingReturn>{BN}*"="{BN}*"delete"{BN}* { // C++11 explicitly delete member
5693 lineCount(yyscanner);
5694 yyextra->current->args += " = delete";
5695 yyextra->current->spec.setDelete(true);
5696 yyextra->current->argList.setIsDeleted(true);
5697 if (YY_START==TrailingReturn) yyextra->current->argList.finishTrailingReturnType();
5698 BEGIN(FuncQual);
5699 }
5700<FuncQual,TrailingReturn>{BN}*"="{BN}*"default"{BN}* { // C++11 explicitly defaulted constructor/assignment operator
5701 lineCount(yyscanner);
5702 yyextra->current->args += " = default";
5703 yyextra->current->spec.setDefault(true);
5704 if (YY_START==TrailingReturn) yyextra->current->argList.finishTrailingReturnType();
5705 BEGIN(FuncQual);
5706 }
5707<FuncQual>{BN}*"->"{BN}* {
5708 lineCount(yyscanner);
5709 yyextra->current->argList.setTrailingReturnType(" -> ");
5710 yyextra->current->args += " -> ";
5711 yyextra->roundCount=0;
5712 BEGIN(TrailingReturn);
5713 }
5714<TrailingReturn>[{;] {
5715 if (yyextra->roundCount>0) REJECT;
5716 unput(*yytext);
5717 yyextra->current->argList.finishTrailingReturnType();
5718 BEGIN(FuncQual);
5719 }
5720<TrailingReturn>"requires"{BN}+ {
5721 if (yyextra->insideJava) REJECT;
5722 yyextra->requiresContext = FuncQual;
5723 yyextra->current->req+=' ';
5724 yyextra->current->argList.finishTrailingReturnType();
5725 BEGIN(RequiresClause);
5726 }
5727<TrailingReturn>"(" {
5728 yyextra->roundCount++;
5729 yyextra->current->argList.appendTrailingReturnType(yytext);
5730 yyextra->current->args+=yytext;
5731 }
5732<TrailingReturn>")" {
5733 if (yyextra->roundCount>0)
5734 {
5735 yyextra->roundCount--;
5736 }
5737 else
5738 {
5739 warn(yyextra->fileName,yyextra->yyLineNr,
5740 "Found ')' without opening '(' for trailing return type '{})...'",
5741 yyextra->current->argList.trailingReturnType());
5742 }
5743 yyextra->current->argList.appendTrailingReturnType(yytext);
5744 yyextra->current->args+=yytext;
5745 }
5746<TrailingReturn>. {
5747 yyextra->current->argList.appendTrailingReturnType(yytext);
5748 yyextra->current->args+=yytext;
5749 }
5750<TrailingReturn>\n {
5751 lineCount(yyscanner);
5752 yyextra->current->argList.appendTrailingReturnType(yytext);
5753 yyextra->current->args+=' ';
5754 }
5755<FuncRound,FuncFunc>{BN}*","{BN}* {
5756 lineCount(yyscanner) ;
5757 yyextra->current->args += ", " ;
5758 }
5759<FuncQual,FuncRound,FuncFunc>{BN}+ {
5760 lineCount(yyscanner) ;
5761 yyextra->current->args += ' ' ;
5762 }
5763<SFunction,FuncQual,FuncRound,FuncFunc>"#" { if (yyextra->insidePHP)
5764 REJECT;
5765 yyextra->lastCPPContext = YY_START;
5766 BEGIN(SkipCPP);
5767 }
5768<FuncQual>"=>" {
5769 if (!yyextra->insideCS)
5770 REJECT;
5771 // Expression body function
5772 unput('=');
5773 BEGIN(SFunction);
5774 }
5775<FuncQual>"=" {
5776 if (yyextra->insideCli && yyextra->current_root->section.isCompound())
5777 {
5778 BEGIN(CliOverride);
5779 }
5780 else
5781 {
5782 // typically an initialized function pointer
5783 yyextra->lastInitializerContext=YY_START;
5784 yyextra->sharpCount=0;
5785 yyextra->initBracketCount=0;
5786 yyextra->current->initializer.str(yytext);
5787 BEGIN(ReadInitializer);
5788 }
5789 }
5790<ReadExpressionBody>";" {
5791 if (!yyextra->current->sli.empty() && yyextra->previous) // copy special list items
5792 {
5793 yyextra->previous->sli = yyextra->current->sli;
5794 yyextra->current->sli.clear();
5795 }
5796 if (yyextra->previous) yyextra->previous->endBodyLine=yyextra->yyLineNr;
5797 BEGIN(FindMembers);
5798 }
5799<CliOverride>{ID} {
5800 }
5801<CliOverride>"{" {
5802 unput(*yytext);
5803 BEGIN(FuncQual);
5804 }
5805<CliOverride>\n {
5806 lineCount(yyscanner);
5807 }
5808<CliOverride>. {
5809 }
5810<FuncQual>{ID} {
5811 if (yyextra->insideCpp && dstrcmp(yytext,"requires")==0)
5812 {
5813 // c++20 trailing requires clause
5814 yyextra->requiresContext = YY_START;
5815 if (!yyextra->current->req.empty())
5816 {
5817 yyextra->current->req+=" && ";
5818 }
5819 BEGIN(RequiresClause);
5820 }
5821 else if (yyextra->insideCS && dstrcmp(yytext,"where")==0)
5822 {
5823 // type constraint for a method
5824 yyextra->current->typeConstr.clear();
5825 yyextra->current->typeConstr.push_back(Argument());
5826 yyextra->lastCSConstraint = YY_START;
5827 BEGIN( CSConstraintName );
5828 }
5829 else if (checkForKnRstyleC(yyscanner)) // K&R style C function
5830 {
5831 yyextra->current->args = yytext;
5832 yyextra->oldStyleArgType.clear();
5833 BEGIN(OldStyleArgs);
5834 }
5835 else
5836 {
5837 yyextra->current->args += yytext;
5838 }
5839 }
5840<OldStyleArgs>[,;] {
5841 DString oldStyleArgPtr;
5842 DString oldStyleArgName;
5843 splitKnRArg(yyscanner,oldStyleArgPtr,oldStyleArgName);
5844 DString doc,brief;
5845 if (yyextra->current->doc!=yyextra->docBackup)
5846 {
5847 doc=yyextra->current->doc;
5848 yyextra->current->doc=yyextra->docBackup;
5849 }
5850 if (yyextra->current->brief!=yyextra->briefBackup)
5851 {
5852 brief=yyextra->current->brief;
5853 yyextra->current->brief=yyextra->briefBackup;
5854 }
5855 addKnRArgInfo(yyscanner,yyextra->oldStyleArgType+oldStyleArgPtr,
5856 oldStyleArgName,brief,doc);
5857 yyextra->current->args.clear();
5858 if (*yytext==';') yyextra->oldStyleArgType.clear();
5859 }
5860<OldStyleArgs>{ID} { yyextra->current->args += yytext; }
5861<OldStyleArgs>"{" {
5862 if (yyextra->current->argList.empty())
5863 {
5864 yyextra->current->argList.setNoParameters(true);
5865 }
5866 yyextra->current->args = argListToString(yyextra->current->argList);
5867 unput('{');
5868 BEGIN(FuncQual);
5869 }
5870<OldStyleArgs>. { yyextra->current->args += *yytext; }
5871<FuncQual,FuncRound,FuncFunc>\" {
5872 if (yyextra->insideIDL && yyextra->insideCppQuote)
5873 {
5874 BEGIN(EndCppQuote);
5875 }
5876 else
5877 {
5878 yyextra->current->args += *yytext;
5879 }
5880 }
5881<FuncQual,FuncRound,FuncFunc>. { yyextra->current->args += *yytext; }
5882<FuncQual>{BN}*"try:" |
5883<FuncQual>{BN}*"try"{BN}+ { /* try-function-block */
5884 yyextra->insideTryBlock=true;
5885 lineCount(yyscanner);
5886 if (yytext[yyleng-1]==':')
5887 {
5888 unput(':');
5889 BEGIN( SFunction );
5890 }
5891 }
5892<FuncQual>{BN}*"throw"{BN}*"(" { // C++ style throw clause
5893 yyextra->current->exception = " throw (" ;
5894 yyextra->roundCount=0;
5895 lineCount(yyscanner) ;
5896 BEGIN( ExcpRound ) ;
5897 }
5898<FuncQual>{BN}*"raises"{BN}*"(" {
5899 yyextra->current->exception = " raises (" ;
5900 lineCount(yyscanner) ;
5901 yyextra->roundCount=0;
5902 BEGIN( ExcpRound ) ;
5903 }
5904<FuncQual>{BN}*"throws"{BN}+ { // Java style throw clause
5905 yyextra->current->exception = " throws " ;
5906 lineCount(yyscanner) ;
5907 BEGIN( ExcpList );
5908 }
5909<ExcpRound>"(" { yyextra->current->exception += *yytext ;
5910 ++yyextra->roundCount ;
5911 }
5912<ExcpRound>")" { yyextra->current->exception += *yytext ;
5913 if ( yyextra->roundCount )
5914 --yyextra->roundCount ;
5915 else
5916 BEGIN( FuncQual ) ;
5917 }
5918<ExcpRound>. {
5919 yyextra->current->exception += *yytext;
5920 }
5921<ExcpList>"{" {
5922 unput('{'); BEGIN( FuncQual );
5923 }
5924<ExcpList>";" {
5925 unput(';'); BEGIN( FuncQual );
5926 }
5927<ExcpList>"\n" {
5928 yyextra->current->exception += ' ';
5929 lineCount(yyscanner);
5930 }
5931<ExcpList>. {
5932 yyextra->current->exception += *yytext;
5933 }
5934<SFunction>"(" { yyextra->current->type += yyextra->current->name ;
5935 yyextra->current->name = yyextra->current->args ;
5936 yyextra->current->args = yytext ;
5937 yyextra->roundCount=0;
5938 BEGIN( FuncRound ) ;
5939 }
5940<SFunction>":" {
5941 if (!yyextra->insidePHP) BEGIN(SkipInits);
5942 }
5943<SFunction>[=;{,] {
5944 yyextra->current->name=removeRedundantWhiteSpace(yyextra->current->name);
5945 yyextra->current->type=removeRedundantWhiteSpace(yyextra->current->type);
5946 yyextra->current->args=removeRedundantWhiteSpace(yyextra->current->args);
5947 yyextra->current->fileName = yyextra->fileName;
5948 yyextra->current->startLine = yyextra->yyBegLineNr;
5949 yyextra->current->startColumn = yyextra->yyBegColNr;
5950 static const reg::Ex re(R"(\‍([^)]*[*&][^)]*\))"); // e.g. (...*...)
5952 std::string type = yyextra->current->type.str();
5953 size_t ti=DString::npos;
5954 if (reg::search(type,match,re))
5955 {
5956 ti = match.position();
5957 }
5958 if (ti!=DString::npos)
5959 {
5960 if (size_t di = yyextra->current->type.find("decltype(");
5961 di!=DString::npos && di<ti) // decltype(...(...*...) -> normal return type
5962 {
5963 ti = DString::npos;
5964 }
5965 }
5966 size_t ts=yyextra->current->type.find('<');
5967 size_t te=yyextra->current->type.rfind('>');
5968
5969 // bug677315: A<int(void *, char *)> get(); is not a function pointer
5970 bool startsWithTypedef = yyextra->current->type.startsWith("typedef ");
5971 bool isFunction = ti==DString::npos || // not a (...*...) pattern
5972 (ts!=DString::npos && te!=DString::npos && ts<te && ts<ti && ti<te); // (...*...) is part of a template argument list
5973 bool isVariable = !yyextra->current->type.empty() &&
5974 (!isFunction || startsWithTypedef);
5975
5976 //printf("type=%s ts=%d te=%d ti=%d isFunction=%d\n",
5977 // qPrint(yyextra->current->type),ts,te,ti,isFunction);
5978
5979 if (*yytext!=';' || yyextra->current_root->section.isCompound())
5980 {
5981 if (isVariable)
5982 {
5983 //printf("Scanner.l: found in class variable: '%s' '%s' '%s'\n", qPrint(yyextra->current->type),qPrint(yyextra->current->name),qPrint(yyextra->current->args));
5984 if (yyextra->isTypedef && !startsWithTypedef)
5985 {
5986 yyextra->current->type.prepend("typedef ");
5987 }
5988 yyextra->current->section = EntryType::makeVariable() ;
5989 }
5990 else
5991 {
5992 //printf("Scanner.l: found in class function: '%s' '%s' '%s'\n", qPrint(yyextra->current->type),qPrint(yyextra->current->name),qPrint(yyextra->current->args));
5993 yyextra->current->section = EntryType::makeFunction() ;
5994 yyextra->current->proto = *yytext==';';
5995 }
5996 }
5997 else // a global function prototype or function variable
5998 {
5999 //printf("Scanner.l: prototype? type='%s' name='%s' args='%s'\n",qPrint(yyextra->current->type),qPrint(yyextra->current->name),qPrint(yyextra->current->args));
6000 if (isVariable)
6001 {
6002 if (yyextra->isTypedef && !startsWithTypedef)
6003 {
6004 yyextra->current->type.prepend("typedef ");
6005 }
6006 //printf("Scanner.l: found function variable!\n");
6007 yyextra->current->section = EntryType::makeVariable();
6008 }
6009 else
6010 {
6011 //printf("Scanner.l: found prototype\n");
6012 yyextra->current->section = EntryType::makeFunction();
6013 yyextra->current->proto = true;
6014 }
6015 }
6016 //printf("Adding entry '%s'\n",qPrint(yyextra->current->name));
6017 if ( yyextra->insidePHP)
6018 {
6019 if (yyextra->current->type.findAndRemoveWord("final"))
6020 {
6021 yyextra->current->spec.setFinal(true);
6022 }
6023 if (yyextra->current->type.findAndRemoveWord("abstract"))
6024 {
6025 yyextra->current->spec.setAbstract(true);
6026 }
6027 }
6028 if ( yyextra->insidePHP && !yyextra->current->type.containsWord("function"))
6029 {
6030 initEntry(yyscanner);
6031 if ( *yytext == '{' )
6032 {
6033 yyextra->lastCurlyContext = FindMembers;
6034 yyextra->curlyCount=0;
6035 BEGIN( SkipCurly );
6036 }
6037 else
6038 {
6039 BEGIN( FindMembers );
6040 }
6041 }
6042 else
6043 {
6044 if ( yyextra->insidePHP)
6045 {
6046 yyextra->current->type.findAndRemoveWord("function");
6047 }
6048 yyextra->previous = yyextra->current;
6049 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
6050 initEntry(yyscanner);
6051 // Objective C 2.0: Required/Optional section
6052 if (yyextra->previous->spec.isOptional() || yyextra->previous->spec.isRequired())
6053 {
6054 yyextra->current->spec.setOptional(true).setRequired(true);
6055 }
6056 yyextra->lastCurlyContext = FindMembers;
6057 if ( *yytext == ',' )
6058 {
6059 yyextra->current->type = stripFuncPtr(yyextra->previous->type);
6060 }
6061 if ( *yytext == '{' )
6062 {
6063 if ( !yyextra->insidePHP && yyextra->current_root->section.isCompound() )
6064 {
6065 yyextra->previous->spec.setInline(true);
6066 }
6067 yyextra->curlyCount=0;
6068 BEGIN( SkipCurly ) ;
6069 }
6070 else if ( *yytext == '=' ) // C# Expression Body
6071 {
6072 yyextra->previous->spec.setInline(true);
6073 yyextra->curlyCount=0;
6074 BEGIN( ReadExpressionBody );
6075 }
6076 else
6077 {
6078 if (!yyextra->previous->section.isVariable())
6079 yyextra->previous->bodyLine=-1; // a function/member declaration
6080 BEGIN( FindMembers ) ;
6081 }
6082 }
6083 }
Class representing a regular expression.
Definition regex.h:39
Object representing the matching results.
Definition regex.h:154
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
Definition regex.cpp:850
bool match(std::string_view str, Match &match, const Ex &re)
Matches a given string str for a match against regular expression re.
Definition regex.cpp:861
6084<SkipInits>">"{BN}*"{" { // C++11 style initializer (see bug 790788)
6085 lineCount(yyscanner);
6086 yyextra->curlyCount=1;
6087 BEGIN(SkipC11Inits);
6088 }
6089<SkipInits>{ID}{BN}*"{" { // C++11 style initializer (see bug 688647)
6090 lineCount(yyscanner);
6091 yyextra->curlyCount=1;
6092 BEGIN(SkipC11Inits);
6093 }
6094<SkipC11Inits>"{" {
6095 ++yyextra->curlyCount;
6096 }
6097<SkipC11Inits>"}" {
6098 if ( --yyextra->curlyCount<=0 )
6099 {
6100 BEGIN(SkipInits);
6101 }
6102 }
6103<SkipInits>"{" { // C++11 style initializer
6104 unput('{');
6105 BEGIN( SFunction );
6106 }
6107<SkipCurly>"{" {
6108 //addToBody(yytext);
6109 ++yyextra->curlyCount ;
6110 }
6111<SkipCurly>"}"/{BN}*{DCOMM}"<!--" | /* see bug710917 */)
6112<SkipCurly>"}" {
6113 //addToBody(yytext);
6114 if( yyextra->curlyCount )
6115 {
6116 --yyextra->curlyCount ;
6117 }
6118 else
6119 {
6120 if (!yyextra->current->sli.empty() && yyextra->previous) // copy special list items
6121 {
6122 yyextra->previous->sli = yyextra->current->sli;
6123 yyextra->current->sli.clear();
6124 }
6125 if (yyextra->previous) yyextra->previous->endBodyLine=yyextra->yyLineNr;
6126 BEGIN( yyextra->lastCurlyContext ) ;
6127 }
6128 }
6129<SkipCurly>"}"{BN}*{DCOMM}"<" {
6130 lineCount(yyscanner);
6131 if ( yyextra->curlyCount )
6132 {
6133 //addToBody(yytext);
6134 --yyextra->curlyCount ;
6135 }
6136 else
6137 {
6138 yyextra->current->endBodyLine=yyextra->yyLineNr;
6139 yyextra->tempEntry = yyextra->current; // temporarily switch to the previous entry
6140 yyextra->current = yyextra->previous;
6141
6142 yyextra->docBlockContext = SkipCurlyEndDoc;
6143 yyextra->docBlockInBody = false;
6144 yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
6145 ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
6146 yyextra->docBlock.str(std::string());
6147 yyextra->docBlockTerm = '}';
6148 if (yytext[yyleng-3]=='/')
6149 {
6150 startCommentBlock(yyscanner,true);
6151 BEGIN( DocLine );
6152 }
6153 else
6154 {
6155 startCommentBlock(yyscanner,false);
6156 BEGIN( DocBlock );
6157 }
6158 }
6159 }
6160<SkipCurlyEndDoc>"}"{BN}*{DCOMM}"<" { // desc is followed by another one
6161 yyextra->docBlockContext = SkipCurlyEndDoc;
6162 yyextra->docBlockInBody = false;
6163 yyextra->docBlockAutoBrief = ( yytext[yyleng-2]=='*' && Config_getBool(JAVADOC_AUTOBRIEF) ) ||
6164 ( yytext[yyleng-2]=='!' && Config_getBool(QT_AUTOBRIEF) );
6165 yyextra->docBlock.str(std::string());
6166 yyextra->docBlockTerm = '}';
6167 if (yytext[yyleng-3]=='/')
6168 {
6169 startCommentBlock(yyscanner,true);
6170 BEGIN( DocLine );
6171 }
6172 else
6173 {
6174 startCommentBlock(yyscanner,false);
6175 BEGIN( DocBlock );
6176 }
6177 }
6178<SkipCurlyEndDoc>"}" {
6179 //addToBody("}");
6180 if (yyextra->tempEntry) // we can only switch back to yyextra->current if no new item was created
6181 {
6182 yyextra->current = yyextra->tempEntry;
6183 yyextra->tempEntry.reset();
6184 }
6185 BEGIN( yyextra->lastCurlyContext );
6186 }
6187<SkipCurly,ReadExpressionBody>\" {
6188 //addToBody(yytext);
6189 yyextra->lastStringContext=YY_START;
6190 BEGIN( SkipString );
6191 }
6192<SkipCurly>^{B}*"#" {
6193 if (yyextra->insidePHP)
6194 REJECT;
6195 //addToBody(yytext);
6196 BEGIN( SkipCurlyCpp );
6197 }
6198<SkipCurly,SkipC11Inits,SkipInits,ReadExpressionBody>\n {
6199 lineCount(yyscanner);
6200 //addToBody(yytext);
6201 }
6202<SkipCurly,SkipCurlyCpp,ReadInitializer,ReadInitializerPtr>"<<<" {
6203 if (!yyextra->insidePHP)
6204 {
6205 REJECT;
6206 }
6207 else
6208 {
6209 yyextra->lastHereDocContext = YY_START;
6210 BEGIN(HereDoc);
6211 }
6212 }
6213<SkipCurly,SkipCurlyCpp>{B}*{RAWBEGIN} {
6214 yyextra->delimiter = extractBeginRawStringDelimiter(yytext);
6215 yyextra->lastRawStringContext = YY_START;
6216 yyextra->dummyRawString.clear();
6217 yyextra->pCopyRawString = &yyextra->dummyRawString;
6218 *yyextra->pCopyRawString += yytext;
6219 BEGIN(RawString);
6220 }
6221<SkipCurly,SkipCurlyCpp>[^\n#"R'@\\/{}<\$]+ {
6222 lineCount(yyscanner); // for yyextra->column updates
6223 //addToBody(yytext);
6224 }
6225<SkipCurly,SkipCurlyCpp>"\$" {}
6226<SkipCurlyCpp>\n {
6227 //addToBody(yytext);
6228 lineCount(yyscanner);
6229 yyextra->lastCurlyContext = FindMembers;
6230 BEGIN( SkipCurly );
6231 }
6232<SkipCurlyCpp>\\‍[\r]*"\n"[\r]* {
6233 //addToBody(yytext);
6234 lineCount(yyscanner);
6235 }
6236<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,CopyC11Attribute,ReadExpressionBody>{CCS} {
6237 //addToBody(yytext);
6238 yyextra->lastCContext = YY_START;
6239 BEGIN(SkipComment);
6240 }
6241<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,CopyC11Attribute,ReadExpressionBody>{CPPC} {
6242 //addToBody(yytext);
6243 yyextra->lastCContext = YY_START;
6244 BEGIN(SkipCxxComment);
6245 }
6246<SkipInits,SkipC11Inits>"(" {
6247 yyextra->roundCount=0;
6248 yyextra->lastSkipRoundContext=YY_START;
6249 BEGIN(SkipRound);
6250 }
6251<SkipInits,SkipC11Inits>\" {
6252 yyextra->lastStringContext=YY_START;
6253 BEGIN( SkipString );
6254 }
6255<SkipInits>; {
6256 warn(yyextra->fileName,yyextra->yyLineNr,
6257 "Found ';' while parsing initializer list! "
6258 "(doxygen could be confused by a macro call without semicolon)"
6259 );
6260 BEGIN( FindMembers );
6261 }
6262<SkipInits,SkipCurly,SkipCurlyCpp>"#" {
6263 if (!yyextra->insidePHP)
6264 REJECT;
6265 //addToBody(yytext);
6266 yyextra->lastCContext = YY_START;
6267 BEGIN(SkipCxxComment);
6268 }
6269<SkipInits,SkipCurly,SkipCurlyCpp,ReadExpressionBody>@\" {
6270 if (!yyextra->insideCS) REJECT;
6271 // C# verbatim string
6272 // we want to discard the string, due to reuse of states we need a dummy stream
6273 yyextra->lastSkipVerbStringContext=YY_START;
6274 yyextra->pSkipVerbString=&yyextra->dummyTextStream;
6275 yyextra->dummyTextStream.clear(); // remove old data so it won't grow too much
6276 BEGIN(SkipVerbString);
6277 }
6278<SkipInits,SkipCurly,SkipCurlyCpp,ReadExpressionBody>{CHARLIT} {
6279 if (yyextra->insidePHP) REJECT;
6280 }
6281<SkipInits,SkipCurly,SkipCurlyCpp>\' {
6282 if (yyextra->insidePHP)
6283 {
6284 yyextra->lastStringContext=YY_START;
6285 BEGIN(SkipPHPString);
6286 }
6287 }
6288<SkipInits,SkipC11Inits,SkipCurly,SkipCurlyCpp,ReadExpressionBody>. { }
6289<SkipString,SkipPHPString>\\. { }
6290<SkipString>\" {
6291 BEGIN( yyextra->lastStringContext );
6292 }
6293<SkipPHPString>\' {
6294 BEGIN( yyextra->lastStringContext );
6295 }
6296<SkipString,SkipPHPString>{CCS}|{CCE}|{CPPC} { }
6297<SkipString,SkipPHPString>\n {
6298 lineCount(yyscanner);
6299 }
6300<SkipString>"[[" { }
6301<SkipString,SkipPHPString>. { }
6302<CompoundName>":" { // for "class : public base {} var;" construct, see bug 608359
6303 unput(':');
6304 BEGIN(ClassVar);
6305 }
6306<CompoundName>";" {
6307 yyextra->current->section = EntryType::makeEmpty() ;
6308 yyextra->current->type.clear() ;
6309 yyextra->current->name.clear() ;
6310 yyextra->current->args.clear() ;
6311 yyextra->current->argList.clear();
6312 BEGIN( FindMembers ) ;
6313 }
6314<Bases>";" {
6315 if (yyextra->insideIDL && (yyextra->current->spec.isSingleton() || yyextra->current->spec.isService()))
6316 {
6317 // in UNO IDL a service or singleton may be defined
6318 // completely like this: "service Foo : XFoo;"
6319 if (!yyextra->current->name.empty() && !yyextra->current_root->name.empty())
6320 {
6321 prependScope(yyscanner);
6322 }
6323 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
6324 // there can be only one base class here
6325 if (!yyextra->baseName.empty())
6326 {
6327 yyextra->current->extends.emplace_back(
6328 yyextra->baseName,Protection::Public,Specifier::Normal);
6329 yyextra->baseName.clear();
6330 }
6331 yyextra->current_root->moveToSubEntryAndRefresh( yyextra->current ) ;
6332 initEntry(yyscanner);
6333 }
6334 else
6335 {
6336 yyextra->current->section = EntryType::makeEmpty() ;
6337 yyextra->current->type.clear() ;
6338 yyextra->current->name.clear() ;
6339 yyextra->current->args.clear() ;
6340 yyextra->current->argList.clear();
6341 }
6342 BEGIN( FindMembers ) ;
6343 }
6344<CompoundName>{SCOPENAME}/{BN}*"<" {
6345 yyextra->sharpCount = 0;
6346 yyextra->current->name = yytext ;
6347 storeClangId(yyscanner,yytext);
6348 if (yyextra->current->spec.isProtocol())
6349 {
6350 yyextra->current->name+="-p";
6351 }
6352 lineCount(yyscanner);
6353 yyextra->lastClassTemplSpecContext = ClassVar;
6354 if (yyextra->insideObjC) // protocol list
6355 {
6356 BEGIN( ObjCProtocolList );
6357 }
6358 else if (yyextra->insideCS) // C# generic class
6359 {
6360 //yyextra->current->name+="-g";
6361 BEGIN( CSGeneric );
6362 }
6363 else // C++ template specialization
6364 {
6365 yyextra->roundCount=0;
6366 BEGIN( ClassTemplSpec );
6367 }
6368 }
6369<CSGeneric>"<" {
6370 ArgumentList al;
6371 // check bug 612858 before enabling the next line
6372 //yyextra->current->spec |= Entry::Template;
6373 yyextra->current->tArgLists.push_back(al);
6374 yyextra->currentArgumentList = &yyextra->current->tArgLists.back();
6375 yyextra->templateStr="<";
6376 yyextra->current->name += "<";
6377 yyextra->fullArgString = yyextra->templateStr;
6378 yyextra->copyArgString = &yyextra->current->name;
6379 //yyextra->copyArgString = &yyextra->templateStr;
6380 yyextra->currentArgumentContext = ClassVar;
6381 BEGIN( ReadTempArgs );
6382 }
6383<ObjCProtocolList>"<" {
6384 yyextra->insideProtocolList=true;
6385 BEGIN( Bases );
6386 }
6387<ClassTemplSpec>">"({BN}*"::"{BN}*{SCOPENAME})? {
6388 yyextra->current->name += yytext;
6389 lineCount(yyscanner);
6390 if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
6391 {
6392 yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
6393 if (yyextra->current->spec.isProtocol())
6394 { // Objective-C protocol
6395 unput('{'); // fake start of body
6396 BEGIN( ClassVar );
6397 }
6398 else
6399 {
6400 BEGIN( yyextra->lastClassTemplSpecContext );
6401 }
6402 }
6403 }
6404<ClassTemplSpec>"<" {
6405 yyextra->current->name += yytext;
6406 if (yyextra->roundCount==0) yyextra->sharpCount++;
6407 }
6408<ClassTemplSpec>. {
6409 yyextra->current->name += yytext;
6410 }
6411<CompoundName>({SCOPENAME}|{CSSCOPENAME}){BN}*";" { // forward declaration?
6412 if (yyextra->insideCS && yyextra->current->type == "namespace")
6413 {
6414 // file scoped CSharp namespace
6415 lineCount(yyscanner);
6416 yyextra->current->name = substitute(yytext,".","::");
6417 yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
6418 yyextra->fakeNS++;
6419 unput('{'); // fake start of body
6420 BEGIN( ClassVar );
6421 }
6422 else if (!yyextra->current->tArgLists.empty())
6423 {
6424 // found a forward template declaration, this has
6425 // a purpose of its own
6426 yyextra->current->name = yytext;
6427 yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
6428 storeClangId(yyscanner,yyextra->current->name.data());
6429 //printf("template class declaration for %s!\n",qPrint(yyextra->current->name));
6430 DString rn = yyextra->current_root->name;
6431 //printf("cn='%s' rn='%s' yyextra->isTypedef=%d\n",qPrint(cn),qPrint(rn),yyextra->isTypedef);
6432 if (!yyextra->current->name.empty() && !rn.empty())
6433 {
6434 prependScope(yyscanner);
6435 }
6436 yyextra->current->spec.setForwardDecl(true);
6437 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
6438 }
6439 else if (yyextra->insideIDL &&
6440 (((yyextra->current_root->spec.isInterface() || yyextra->current_root->spec.isService()) &&
6441 yyextra->current->spec.isInterface()) ||
6442 ((yyextra->current_root->spec.isService() || yyextra->current_root->spec.isSingleton()) &&
6443 yyextra->current->spec.isService())
6444 )
6445 )
6446 {
6447 // interface yyextra->inside of UNO IDL service or interface
6448 // service yyextra->inside of UNO IDL service or singleton
6449 // there may be documentation on the member,
6450 // so do not throw it away...
6451 yyextra->current->name = yytext;
6452 yyextra->current->name=yyextra->current->name.left(yyextra->current->name.length()-1).stripWhiteSpace();
6453 yyextra->current->section = yyextra->current->spec.isInterface() ? EntryType::makeExportedInterface()
6454 : EntryType::makeIncludedService();
6455// yyextra->current->section = EntryType::makeMemberDoc();
6456 yyextra->current->spec.setInterface(false).setService(false);
6457 // FIXME: horrible: Interface == Gettable, so need to clear it - actually we're mixing values from
6458 // different enums in this case...
6459 // granted only Optional and Interface are actually valid in this context but urgh...
6460 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
6461 }
6462
6463 if (!(yyextra->insideCS && yyextra->current->type == "namespace"))
6464 {
6465 unput(';');
6466 yyextra->current->reset();
6467 initEntry(yyscanner);
6468 if (yyextra->insideObjC) // see bug746361
6469 {
6470 yyextra->language = yyextra->current->lang = SrcLangExt::Cpp;
6471 yyextra->insideObjC = false;
6472 }
6473 if (yyextra->isTypedef) // typedef of a class, put typedef keyword back
6474 {
6475 yyextra->current->type.prepend("typedef");
6476 }
6477 BEGIN( FindMembers );
6478 }
6479 }
Wrapper class for the Entry type.
Definition types.h:856
6480<CompoundName>{SCOPENAME}/{BN}*"(" {
6481 yyextra->current->name = yytext ;
6482 storeClangId(yyscanner,yytext);
6483 lineCount(yyscanner);
6484 if (yyextra->insideCpp && yyextra->current->name=="alignas") // C++11
6485 {
6486 yyextra->lastAlignAsContext = YY_START;
6487 BEGIN( AlignAs );
6488 }
6489 else
6490 {
6491 if (yyextra->current->spec.isProtocol())
6492 {
6493 yyextra->current->name += "-p";
6494 }
6495 BEGIN( ClassVar );
6496 }
6497 }
6498<AlignAs>"(" { yyextra->roundCount=0;
6499 BEGIN( AlignAsEnd );
6500 }
6501<AlignAs>\n { lineCount(yyscanner); }
6502<AlignAs>.
6503<AlignAsEnd>"(" { yyextra->roundCount++; }
6504<AlignAsEnd>")" { if (--yyextra->roundCount<0)
6505 {
6506 BEGIN( yyextra->lastAlignAsContext );
6507 }
6508 }
6509<AlignAsEnd>\n { lineCount(yyscanner); }
6510<AlignAsEnd>.
6511<ConceptName>{ID} {
6512 yyextra->current->name = yytext ;
6513 storeClangId(yyscanner,yytext);
6514 }
6515<ConceptName>"=" {
6516 yyextra->current->bodyLine = yyextra->yyLineNr;
6517 yyextra->current->bodyColumn = yyextra->yyColNr;
6518 yyextra->current->initializer.str(std::string());
6519 yyextra->lastInitializerContext = FindMembers;
6520 yyextra->sharpCount=0;
6521 yyextra->initBracketCount=0;
6522 BEGIN(ReadInitializer);
6523 }
6524<CompoundName>{SCOPENAME}/{BN}*"," { // multiple forward declarations on one line
6525 // e.g. @protocol A,B;
6526 yyextra->current->reset();
6527 initEntry(yyscanner);
6528 }
6529<CompoundName>{SCOPENAME} {
6530 yyextra->current->name = yytext ;
6531 storeClangId(yyscanner,yytext);
6532 lineCount(yyscanner);
6533 if (yyextra->current->spec.isProtocol())
6534 {
6535 yyextra->current->name += "-p";
6536 }
6537 if (yyextra->current->spec.isProtocol() || yyextra->current->section.isObjcImpl())
6538 {
6539 unput('{'); // fake start of body
6540 }
6541 BEGIN( ClassVar );
6542 }
6543<CompoundName>({ID}{BN}*"::"{BN}*)+("inline"{BN}+({ID}{BN}*"::"{BN}*)*)+{ID} { // C++20 style nested inline namespace syntax
6544 if (yyextra->current->section.isNamespace())
6545 {
6546 yyextra->current->name = DString(yytext).simplifyWhiteSpace();
6547 storeClangId(yyscanner,yyextra->current->name.data());
6548 lineCount(yyscanner);
6549 BEGIN( ClassVar );
6550 }
6551 else
6552 {
6553 REJECT;
6554 }
6555 }
DString simplifyWhiteSpace() const
return a copy of this string with leading and trailing whitespace removed and multiple internal white...
Definition dstring.cpp:127
6556<CompoundName>{CSSCOPENAME} { // C# style scope
6557 yyextra->current->name = substitute(yytext,".","::");
6558 lineCount(yyscanner);
6559 BEGIN( ClassVar );
6560 }
6561<ClassVar>{SCOPENAME}{BNopt}/"(" {
6562 if (yyextra->insideIDL && literal_at(yytext,"switch") && !isId(yytext[6]))
6563 {
6564 // Corba IDL style union
6565 yyextra->roundCount=0;
6566 BEGIN(SkipUnionSwitch);
6567 }
6568 else
6569 {
6570 addType(yyscanner);
6571 yyextra->yyBegColNr=yyextra->yyColNr;
6572 yyextra->yyBegLineNr=yyextra->yyLineNr;
6573 yyextra->current->name = yytext;
6574 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
6575 storeClangId(yyscanner,yyextra->current->name.data());
6576 lineCount(yyscanner);
6577 BEGIN( FindMembers );
6578 }
6579 }
6580<ClassVar>"," {
6581 if (yyextra->isTypedef)
6582 {
6583 // multiple types in one typedef
6584 unput(',');
6585 yyextra->current->type.prepend("typedef ");
6586 BEGIN(FindMembers);
6587 }
6588 else
6589 {
6590 // Multiple class forward declaration
6591 }
6592 }
6593<ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") {
6594 if (yyextra->insideCli)
6595 {
6596 if (yytext[0]=='s') // sealed
6597 yyextra->current->spec.setSealedClass(true);
6598 else // abstract
6599 yyextra->current->spec.setAbstractClass(true);
6600 BEGIN( ClassVar );
6601 }
6602 else
6603 {
6604 REJECT;
6605 }
6606 }
6607<ClassVar>({ID}{BN}*"::"{BN}*)+{ID} {
6608 yyextra->yyBegColNr=yyextra->yyColNr;
6609 yyextra->yyBegLineNr=yyextra->yyLineNr;
6610 storeClangId(yyscanner,yytext);
6611 lineCount(yyscanner);
6612 if (yyextra->current->section.isEnum())
6613 { // found "enum a N::b" -> variable
6614 yyextra->current->section = EntryType::makeVariable() ;
6615 }
6616 yyextra->current->type += ' ' ;
6617 yyextra->current->type += yyextra->current->name ;
6618 yyextra->current->name = DString(yytext).simplifyWhiteSpace();
6619
6620 if (nameIsOperator(yyextra->current->name))
6621 {
6622 BEGIN( Operator );
6623 }
6624 }
6625<ClassVar>{ID} {
6626 yyextra->yyBegColNr=yyextra->yyColNr;
6627 yyextra->yyBegLineNr=yyextra->yyLineNr;
6628 storeClangId(yyscanner,yytext);
6629 if (yyextra->insideIDL && dstrcmp(yytext,"switch")==0)
6630 {
6631 // Corba IDL style union
6632 yyextra->roundCount=0;
6633 BEGIN(SkipUnionSwitch);
6634 }
6635 else if ((yyextra->insideJava || yyextra->insidePHP || yyextra->insideJS || yyextra->insideSlice) && (dstrcmp(yytext,"implements")==0 || dstrcmp(yytext,"extends")==0))
6636 {
6637 yyextra->current->type.clear();
6638 yyextra->baseProt = Protection::Public;
6639 yyextra->baseVirt = Specifier::Normal;
6640 yyextra->baseName.clear();
6641 BEGIN( BasesProt ) ;
6642 }
6643 else if (yyextra->insideCS && dstrcmp(yytext,"where")==0) // C# type constraint
6644 {
6645 yyextra->current->typeConstr.clear();
6646 yyextra->current->typeConstr.push_back(Argument());
6647 yyextra->lastCSConstraint = YY_START;
6648 BEGIN( CSConstraintName );
6649 }
6650 else if (yyextra->insideCli && dstrcmp(yytext,"abstract")==0)
6651 {
6652 yyextra->current->spec.setAbstract(true);
6653 }
6654 else if (yyextra->insideCli && dstrcmp(yytext,"sealed")==0)
6655 {
6656 yyextra->current->spec.setSealed(true);
6657 }
6658 else if (dstrcmp(yytext,"final")==0)
6659 {
6660 yyextra->current->spec.setFinal(true);
6661 }
6662 else
6663 {
6664 if (yyextra->current->section.isEnum())
6665 { // found "enum a b" -> variable
6666 yyextra->current->section = EntryType::makeVariable() ;
6667 }
6668 yyextra->current->type += ' ' ;
6669 yyextra->current->type += yyextra->current->name ;
6670 yyextra->current->name = yytext ;
6671
6672 if (nameIsOperator(yyextra->current->name))
6673 {
6674 BEGIN( Operator );
6675 }
6676 }
6677 }
6678<ClassVar>[(\‍[] {
6679 if (yyextra->insideObjC && *yytext=='(') // class category
6680 {
6681 yyextra->current->name+='(';
6682 yyextra->current->spec.setCategory(true);
6683 BEGIN( ClassCategory );
6684 }
6685 else if (yyextra->insideCS && *yytext=='(') // C# 12 primary constructor
6686 {
6687 yyextra->current->args=yytext;
6688 yyextra->currentArgumentContext = ClassVar;
6689 yyextra->fullArgString = yyextra->current->args;
6690 yyextra->copyArgString = &yyextra->current->args;
6691 BEGIN( ReadFuncArgType ) ;
6692 }
6693 else
6694 {
6695 // probably a function anyway
6696 unput(*yytext);
6697 BEGIN( FindMembers );
6698 }
6699 }
6700<CSConstraintType,CSConstraintName>{CCS}{CCE} { /* empty comment */ }
6701<CSConstraintType,CSConstraintName>({CCS}[*!]|{CPPC}[/!])("<"?) { // special comment
6702 yyextra->fullArgString.clear();
6703 yyextra->lastCopyArgChar='#'; // end marker
6704 yyextra->lastCommentInArgContext=YY_START;
6705 if (yytext[1]=='/')
6706 BEGIN( CopyArgCommentLine );
6707 else
6708 BEGIN( CopyArgComment );
6709 }
6710<CSConstraintType,CSConstraintName>"#" { // artificially inserted token to signal end of comment block
6711 yyextra->current->typeConstr.back().docs = yyextra->fullArgString;
6712 }
6713<CSConstraintType>"=>" { // end of type constraint reached
6714 // parse documentation of the constraints
6715 handleParametersCommentBlocks(yyscanner,yyextra->current->typeConstr);
6716 unput('>');
6717 unput('=');
6718 BEGIN( yyextra->lastCSConstraint );
6719 }
6720<CSConstraintType>"{" { // end of type constraint reached
6721 // parse documentation of the constraints
6722 handleParametersCommentBlocks(yyscanner,yyextra->current->typeConstr);
6723 unput('{');
6724 BEGIN( yyextra->lastCSConstraint );
6725 }
6726<CSConstraintType,CSConstraintName>";" {
6727 handleParametersCommentBlocks(yyscanner,yyextra->current->typeConstr);
6728 unput(';');
6729 BEGIN( yyextra->lastCSConstraint );
6730 }
6731<CSConstraintName>":" {
6732 BEGIN( CSConstraintType );
6733 }
6734<CSConstraintName>{ID} {
6735 // parameter name
6736 yyextra->current->typeConstr.back().name=yytext;
6737 }
6738<CSConstraintType>"where" { // another constraint for a different param
6739 yyextra->current->typeConstr.push_back(Argument());
6740 BEGIN( CSConstraintName );
6741 }
6742<CSConstraintType>({ID}".")*{ID}("<"{ID}">")?("()")? {
6743 if (yyextra->current->typeConstr.back().type.empty())
6744 // first type constraint for this parameter
6745 {
6746 yyextra->current->typeConstr.back().type=yytext;
6747 }
6748 else // new type constraint for same parameter
6749 {
6750 DString name = yyextra->current->typeConstr.back().name;
6751 yyextra->current->typeConstr.push_back(Argument());
6752 yyextra->current->typeConstr.back().name=name;
6753 yyextra->current->typeConstr.back().type=yytext;
6754 }
6755 }
6756<CSConstraintName,CSConstraintType>\n {
6757 lineCount(yyscanner);
6758 }
6759<CSConstraintName,CSConstraintType>. {
6760 }
6761<ClassCategory>{ID} {
6762 yyextra->current->name+=yytext;
6763 }
6764<ClassCategory>")"/{BN}*"{" {
6765 yyextra->current->name+=')';
6766 BEGIN( ClassVar );
6767 }
6768<ClassCategory>")"/{BN}*"<" {
6769 yyextra->current->name+=')';
6770 BEGIN( ObjCProtocolList );
6771 }
6772<ClassCategory>")" {
6773 yyextra->current->name+=')';
6774 if (yyextra->current->spec.isProtocol() || yyextra->current->section.isObjcImpl())
6775 {
6776 unput('{'); // fake start of body
6777 }
6778 else // category has no variables so push back an empty body
6779 {
6780 unput('}');
6781 unput('{');
6782 }
6783 BEGIN( ClassVar );
6784 }
6785<ClassVar>":" {
6786 if (yyextra->current->section.isVariable()) // enum A B:2, see bug 748208
6787 {
6788 yyextra->current->bitfields+=":";
6789 yyextra->current->args.clear();
6790 BEGIN(BitFields);
6791 }
6792 else if (yyextra->current->section.isEnum()) // enum E:2, see bug 313527,
6793 // or C++11 style enum: 'E : unsigned int {...}'
6794 {
6795 yyextra->current->args.clear();
6796 BEGIN(EnumBaseType);
6797 }
6798 else
6799 {
6800 yyextra->current->type.clear();
6801 if (yyextra->current->spec.isInterface() ||
6802 yyextra->current->spec.isStruct() ||
6803 yyextra->current->spec.isRef() ||
6804 yyextra->current->spec.isValue() ||
6805 yyextra->insidePHP || yyextra->insideCS || yyextra->insideD || yyextra->insideObjC || yyextra->insideIDL
6806 )
6807 {
6808 yyextra->baseProt = Protection::Public;
6809 }
6810 else
6811 {
6812 yyextra->baseProt = Protection::Private;
6813 }
6814 yyextra->baseVirt = Specifier::Normal;
6815 yyextra->baseName.clear();
6816 BEGIN( BasesProt ) ;
6817 }
6818 }
6819<ClassVar>[;=*&] {
6820 if (yyextra->isTypedef) // typedef of a class, put typedef keyword back
6821 {
6822 yyextra->current->type.prepend("typedef");
6823 }
6824 if ((yytext[0]=='*' || yytext[0]=='&') && yyextra->current->section.isEnum())
6825 { // found "enum a *b" -> variable
6826 yyextra->current->section = EntryType::makeVariable() ;
6827 }
6828 if (yytext[0]==';' && yyextra->current->section.isEnum())
6829 {
6830 yyextra->current->reset();
6831 initEntry(yyscanner);
6832 }
6833 else
6834 {
6835 unput(*yytext);
6836 }
6837 BEGIN( FindMembers );
6838 }
6839<Bases,ClassVar>{CPPC}"/"/[^/] {
6840 if (!yyextra->insideObjC)
6841 {
6842 REJECT;
6843 }
6844 else
6845 {
6846 lineCount(yyscanner);
6847 yyextra->current->program << yytext;
6848 yyextra->current->fileName = yyextra->fileName ;
6849 yyextra->current->startLine = yyextra->yyLineNr ;
6850 yyextra->current->startColumn = yyextra->yyColNr;
6851 yyextra->curlyCount=0;
6852 BEGIN( ReadBodyIntf );
6853 }
6854 }
6855<Bases,ClassVar>({CPPC}{B}*)?{CCS}"*"/{NCOMM} |
6856<Bases,ClassVar>({CPPC}{B}*)?{CCS}"!" |
6857<Bases,ClassVar>{CPPC}"!" |
6858<Bases,ClassVar>[\-+]{BN}* {
6859 if (!yyextra->insideObjC)
6860 {
6861 REJECT;
6862 }
6863 else
6864 {
6865 lineCount(yyscanner);
6866 yyextra->current->program << yytext;
6867 yyextra->current->fileName = yyextra->fileName ;
6868 yyextra->current->startLine = yyextra->yyLineNr ;
6869 yyextra->current->startColumn = yyextra->yyColNr;
6870 yyextra->curlyCount=0;
6871 BEGIN( ReadBodyIntf );
6872 }
6873 }
6874<CompoundName,ClassVar>{B}*"{"{B}* {
6875 yyextra->current->program.str(std::string());
6876 yyextra->current->fileName = yyextra->fileName ;
6877 yyextra->current->bodyLine = yyextra->yyLineNr;
6878 yyextra->current->bodyColumn = yyextra->yyColNr;
6879 yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
6880 if (yyextra->current->name.empty() && !yyextra->isTypedef) // anonymous compound
6881 {
6882 if (yyextra->current->section.isNamespace()) // allow reopening of anonymous namespaces
6883 {
6884 if (Config_getBool(EXTRACT_ANON_NSPACES)) // use visible name
6885 {
6886 yyextra->current->name="anonymous_namespace{"+stripPath(yyextra->current->fileName)+"}";
6887 }
6888 else // use invisible name
6889 {
6890 yyextra->current->name = generateAnonymousAnchor(yyextra->fileName,yyextra->anonNSCount);
6891 }
6892 }
6893 else
6894 {
6895 yyextra->current->name = generateAnonymousAnchor(yyextra->fileName,yyextra->anonCount++);
6896 }
6897 }
6898 yyextra->curlyCount=0;
6899 if (yyextra->current_root && // not a nested struct yyextra->inside an @interface section
6900 !yyextra->current_root->spec.isInterface() &&
6901 (yyextra->current->spec.isInterface() ||
6902 yyextra->current->spec.isProtocol() ||
6903 yyextra->current->spec.isCategory() ||
6904 yyextra->current->section.isObjcImpl()
6905 ) &&
6906 yyextra->insideObjC
6907 )
6908 { // ObjC body that ends with @end
6909 BEGIN( ReadBodyIntf );
6910 }
6911 else if (yyextra->current->section.isNamespace())
6912 { // namespace body
6913 BEGIN( ReadNSBody );
6914 }
6915 else
6916 { // class body
6917 BEGIN( ReadBody ) ;
6918 }
6919 }
DString stripPath(const DString &s)
Definition util.cpp:3961
6920<BasesProt>"virtual"{BN}+ { lineCount(yyscanner); yyextra->baseVirt = Specifier::Virtual; }
6921<BasesProt>"public"{BN}+ { lineCount(yyscanner); yyextra->baseProt = Protection::Public; }
6922<BasesProt>"protected"{BN}+ { lineCount(yyscanner); yyextra->baseProt = Protection::Protected; }
6923<BasesProt>"internal"{BN}+ { if (!yyextra->insideCli) REJECT ; lineCount(yyscanner); yyextra->baseProt = Protection::Package; }
6924<BasesProt>"private"{BN}+ { lineCount(yyscanner); yyextra->baseProt = Protection::Private; }
6925<BasesProt>{BN} { lineCount(yyscanner); }
6926<BasesProt>. { unput(*yytext); BEGIN(Bases); }
6927<Bases>"decltype"{BN}*"(" {
6928 lineCount(yyscanner);
6929 yyextra->roundCount=0;
6930 yyextra->lastSkipRoundContext=YY_START;
6931 BEGIN(SkipRound);
6932 }
6933<Bases>("\\")?({ID}"\\")*{ID} { // PHP namespace token, not sure if interspacing is allowed but it gives problems (see bug 640847)
6934 if (!yyextra->insidePHP)
6935 {
6936 REJECT;
6937 }
6938 else // PHP base class of the form \Ns\Cl or Ns\Cl
6939 {
6940 lineCount(yyscanner);
6941 DString bn=yytext;
6942 bn = substitute(bn,"\\","::");
6943 yyextra->baseName += bn;
6944 yyextra->current->args += ' ';
6945 yyextra->current->args += yytext;
6946 }
6947 }
6948<Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID}("...")? {
6949 lineCount(yyscanner);
6950 DString baseScope = yytext;
6951 if (yyextra->insideCS && baseScope.stripWhiteSpace()=="where")
6952 {
6953 // type constraint for a class
6954 yyextra->current->typeConstr.clear();
6955 yyextra->current->typeConstr.push_back(Argument());
6956 yyextra->lastCSConstraint = YY_START;
6957 BEGIN( CSConstraintName );
6958 }
6959 else
6960 {
6961 yyextra->baseName+=yytext;
6962 yyextra->current->args += ' ';
6963 yyextra->current->args += yytext;
6964 }
6965 }
6966<Bases>{BN}*{ID}("."{ID})* { // Java style class
6967 DString name = substitute(yytext,".","::");
6968 yyextra->baseName += name;
6969 yyextra->current->args += ' ';
6970 yyextra->current->args += name;
6971 }
6972<ClassVar,Bases>\n/{BN}*[^{, \t\n:] {
6973 if (!yyextra->insideObjC)
6974 {
6975 REJECT;
6976 }
6977 else
6978 {
6979 lineCount(yyscanner);
6980 unput('{');
6981 }
6982 }
6983<ClassVar,Bases>"@end" { // empty ObjC interface
6984 unput('d'); // insert fake body: {}@end
6985 unput('n');
6986 unput('e');
6987 unput('@');
6988 unput('}');
6989 unput('{');
6990 }
6991<ClassVar>"<" { yyextra->current->name += *yytext;
6992 yyextra->sharpCount=1;
6993 yyextra->roundCount=0;
6994 yyextra->lastSkipSharpContext = YY_START;
6995 yyextra->specName = &yyextra->current->name;
6996 BEGIN ( Specialization );
6997 }
6998<Bases>{BN}*"<" {
6999 lineCount(yyscanner);
7000 yyextra->sharpCount=1;
7001 yyextra->roundCount=0;
7002 yyextra->lastSkipSharpContext = YY_START;
7003 if (yyextra->insideObjC) // start of protocol list
7004 {
7005 unput(',');
7006 }
7007 else // template specialization
7008 {
7009 //if (yyextra->insideCS) // generic
7010 //{
7011 // yyextra->baseName+="-g";
7012 //}
7013 yyextra->templateStr = yytext;
7014 yyextra->specName = &yyextra->templateStr;
7015 BEGIN ( Specialization );
7016 }
7017 }
7018<Specialization>"<" { *yyextra->specName += *yytext;
7019 if (yyextra->roundCount==0) yyextra->sharpCount++;
7020 }
7021<Specialization>">" {
7022 *yyextra->specName += *yytext;
7023 if (yyextra->roundCount==0 && --yyextra->sharpCount<=0)
7024 {
7025 yyextra->baseName+=removeRedundantWhiteSpace(*yyextra->specName);
7026 BEGIN(yyextra->lastSkipSharpContext);
7027 }
7028 }
7029<Specialization>{BN}+ { lineCount(yyscanner); *yyextra->specName +=' '; }
7030<Specialization>"<<" { *yyextra->specName += yytext; }
7031<Specialization>">>"/{B}*"::" { // M$ C++ extension to allow >> to close a template...
7032 unput('>');
7033 unput(' ');
7034 unput('>');
7035 }
7036<Specialization>">>" {
7037 if (yyextra->insideCS) // for C# >> ends a nested template
7038 {
7039 REJECT;
7040 }
7041 else // for C++ >> is a bitshift
7042 // operator and > > would end
7043 // a nested template.
7044 // We require the bitshift to be enclosed in braces.
7045 // See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html
7046 {
7047 if (yyextra->roundCount>0)
7048 {
7049 *yyextra->specName += yytext;
7050 }
7051 else
7052 {
7053 unput('>');
7054 unput(' ');
7055 unput('>');
7056 }
7057 }
7058 }
7059<Specialization>"typename"{BN}+ { lineCount(yyscanner); }
7060<Specialization>"(" { *yyextra->specName += *yytext; yyextra->roundCount++; }
7061<Specialization>")" { *yyextra->specName += *yytext; yyextra->roundCount--; }
7062
7063<Specialization>"\\\\" { *yyextra->specName += *yytext;}
7064<Specialization>"\\'" { *yyextra->specName += *yytext;}
7065<Specialization>"\\\"" { *yyextra->specName += *yytext;}
7066<Specialization>"'" { *yyextra->specName += *yytext;BEGIN(SpecializationSingleQuote);}
7067<Specialization>"\"" { *yyextra->specName += *yytext;BEGIN(SpecializationDoubleQuote);}
7068<SpecializationSingleQuote,SpecializationDoubleQuote>"\\\\" { *yyextra->specName += *yytext;}
7069<SpecializationSingleQuote>"\\'" { *yyextra->specName += *yytext;}
7070<SpecializationSingleQuote>"'" { *yyextra->specName += *yytext; BEGIN(Specialization);}
7071<SpecializationDoubleQuote>"\\\"" { *yyextra->specName += *yytext;}
7072<SpecializationDoubleQuote>"\"" { *yyextra->specName += *yytext; BEGIN(Specialization);}
7073<SpecializationSingleQuote,SpecializationDoubleQuote>. { *yyextra->specName += *yytext;}
7074
7075<Specialization>. {
7076 *yyextra->specName += *yytext;
7077 }
7078<SkipRound>"(" { ++yyextra->roundCount; }
7079<SkipRound>")" { if (--yyextra->roundCount<0)
7080 BEGIN ( yyextra->lastSkipRoundContext );
7081 }
7082<SkipRound>\" {
7083 yyextra->lastStringContext=SkipRound;
7084 BEGIN(SkipString);
7085 }
7086<Bases>","|(">"({BN}*"{")?)|({BN}+"implements"{BN}*) { lineCount(yyscanner);
7087 if (yyextra->insideProtocolList)
7088 {
7089 yyextra->baseName+="-p";
7090 }
7091 else
7092 {
7093 yyextra->current->args += ',' ;
7094 }
7095 yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
7096 if (!yyextra->baseName.empty())
7097 {
7098 yyextra->current->extends.emplace_back(
7099 yyextra->baseName,yyextra->baseProt,yyextra->baseVirt
7100 );
7101 }
7102 if (yyextra->current->spec.isInterface() || yyextra->current->spec.isStruct() ||
7103 yyextra->insideJava || yyextra->insidePHP || yyextra->insideCS ||
7104 yyextra->insideD || yyextra->insideObjC || yyextra->insideIDL || yyextra->insideSlice)
7105 {
7106 yyextra->baseProt=Protection::Public;
7107 }
7108 else
7109 {
7110 yyextra->baseProt=Protection::Private;
7111 }
7112 yyextra->baseVirt=Specifier::Normal;
7113 yyextra->baseName.clear();
7114 if (*yytext=='>')
7115 { // end of a ObjC protocol list
7116 yyextra->insideProtocolList=false;
7117 if (yyleng==1)
7118 {
7119 if (yyextra->insideObjC && !yyextra->current->spec.isProtocol())
7120 {
7121 BEGIN(ClassVar); // allow parsing of ':' for base class
7122 }
7123 else
7124 {
7125 unput('{'); // dummy start body
7126 }
7127 }
7128 else
7129 {
7130 yyless(1);
7131 }
7132 }
7133 else
7134 {
7135 if (*yytext==',' && yyextra->insideObjC) // Begin of protocol list
7136 {
7137 yyextra->insideProtocolList=true;
7138 }
7139 BEGIN(BasesProt);
7140 }
7141 }
7142<Bases>{B}*"{"{B}* {
7143 yyextra->current->program.str(std::string());
7144 yyextra->current->fileName = yyextra->fileName ;
7145 yyextra->current->bodyLine = yyextra->yyLineNr;
7146 yyextra->current->bodyColumn = yyextra->yyColNr;
7147 yyextra->current->name = removeRedundantWhiteSpace(yyextra->current->name);
7148 if (!yyextra->baseName.empty())
7149 {
7150 yyextra->current->extends.emplace_back(
7151 yyextra->baseName,yyextra->baseProt,yyextra->baseVirt
7152 );
7153 yyextra->baseName.clear();
7154 }
7155 yyextra->curlyCount=0;
7156 if (yyextra->insideObjC)
7157 {
7158 BEGIN( ReadBodyIntf );
7159 }
7160 else
7161 {
7162 BEGIN( ReadBody ) ;
7163 }
7164 }
7165<SkipUnionSwitch>{B}*"(" {
7166 yyextra->roundCount++;
7167 }
7168<SkipUnionSwitch>")" {
7169 if (--yyextra->roundCount==0)
7170 {
7171 BEGIN(ClassVar);
7172 }
7173 }
7174<SkipUnionSwitch>\n { lineCount(yyscanner); }
7175<SkipUnionSwitch>.
7176<Comment>{BN}+ { yyextra->current->program << yytext ;
7177 lineCount(yyscanner) ;
7178 }
7179<Comment>{CCS} { yyextra->current->program << yytext ; }
7180<Comment>{CPPC} { yyextra->current->program << yytext ; }
7181<Comment>{CMD}("code"|"verbatim"|"iliteral") {
7182 if (yyextra->doxygenComment) yyextra->insideCode=true;
7183 yyextra->current->program << yytext ;
7184 }
7185<Comment>{CMD}("endcode"|"endverbatim"|"endiliteral") {
7186 if (yyextra->doxygenComment) yyextra->insideCode=false;
7187 yyextra->current->program << yytext ;
7188 }
7189<Comment>[^ \.\t\r\n\/\*]+ { yyextra->current->program << yytext ; }
7190<Comment>{CCE} { yyextra->current->program << yytext ;
7191 if (!yyextra->insideCode)
7192 {
7193 yyextra->doxygenComment=false;
7194 BEGIN( yyextra->lastContext );
7195 }
7196 }
7197<Comment>. { yyextra->current->program << *yytext ; }
7198
7199<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,SkipC11Inits,ReadExpressionBody,Bases,OldStyleArgs>({CPPC}{B}*)?{CCS}"!" {
7200 //printf("Start doc block at %d\n",yyextra->yyLineNr);
7201 if (!yyextra->current->doc.empty())
7202 {
7203 yyextra->current->doc+="\n\n";
7204 }
7205 else
7206 {
7207 yyextra->current->docLine = yyextra->yyLineNr;
7208 yyextra->current->docFile = yyextra->fileName;
7209 }
7210
7211 yyextra->lastDocContext = YY_START;
7212 if (yyextra->current_root->section.isScope())
7213 {
7214 yyextra->current->inside = yyextra->current_root->name+"::";
7215 }
7216 yyextra->docBlockContext = YY_START;
7217 yyextra->docBlockInBody = YY_START==SkipCurly || YY_START==ReadExpressionBody;
7218 yyextra->docBlockAutoBrief = Config_getBool(QT_AUTOBRIEF);
7219
7220 DString indent;
7221 indent.fill(' ',computeIndent(yytext,yyextra->column));
7222 yyextra->docBlock.str(indent.str());
7223
7224 if (yyextra->docBlockAutoBrief)
7225 {
7226 yyextra->current->briefLine = yyextra->yyLineNr;
7227 yyextra->current->briefFile = yyextra->fileName;
7228 }
7229 startCommentBlock(yyscanner,false);
7230 BEGIN( DocBlock );
7231 }
7232<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,ReadExpressionBody,Bases,OldStyleArgs>{CCS}"*"[*]+{BL} {
7233 bool javadocBanner = Config_getBool(JAVADOC_BANNER);
7234 lineCount(yyscanner);
7235
7236 if( javadocBanner )
7237 {
7238 yyextra->lastDocContext = YY_START;
7239
7240 //printf("Found comment banner at %s:%d\n",yyextra->fileName,yyextra->yyLineNr);
7241 if (yyextra->current_root->section.isScope())
7242 {
7243 yyextra->current->inside = yyextra->current_root->name+"::";
7244 }
7245 yyextra->current->docLine = yyextra->yyLineNr;
7246 yyextra->current->docFile = yyextra->fileName;
7247 yyextra->docBlockContext = YY_START;
7248 yyextra->docBlockInBody = YY_START==SkipCurly || YY_START==ReadExpressionBody;
7249 bool javadocAutoBrief = Config_getBool(JAVADOC_AUTOBRIEF);
7250 yyextra->docBlockAutoBrief = javadocAutoBrief;
7251
7252 DString indent;
7253 indent.fill(' ',computeIndent(yytext,yyextra->column));
7254 yyextra->docBlock.str(indent.str());
7255
7256 if (yyextra->docBlockAutoBrief)
7257 {
7258 yyextra->current->briefLine = yyextra->yyLineNr;
7259 yyextra->current->briefFile = yyextra->fileName;
7260 }
7261 startCommentBlock(yyscanner,false);
7262 BEGIN( DocBlock );
7263 }
7264 else
7265 {
7266 yyextra->current->program << yytext ;
7267 yyextra->lastContext = YY_START ;
7268 yyextra->doxygenComment=true;
7269 BEGIN( Comment ) ;
7270 }
7271 }
7272<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,ReadExpressionBody,SkipInits,Bases,OldStyleArgs>^{B}+({CPPC}{B}*)?{CCS}"*"/{NCOMM} {
7273 lineCount(yyscanner);
7274 yyextra->yyColNr=1;
7275 REJECT;
7276 }
7277<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,ReadExpressionBody,Operator,ClassVar,SkipInits,Bases,OldStyleArgs>({CPPC}{B}*)?{CCS}"*"/{NCOMM} {
7278 yyextra->lastDocContext = YY_START;
7279
7280 //printf("Found comment block at %s:%d\n",yyextra->fileName,yyextra->yyLineNr);
7281 if (yyextra->current_root->section.isScope())
7282 {
7283 yyextra->current->inside = yyextra->current_root->name+"::";
7284 }
7285 yyextra->current->docLine = yyextra->yyLineNr;
7286 yyextra->current->docFile = yyextra->fileName;
7287 yyextra->docBlockContext = YY_START;
7288 yyextra->docBlockInBody = YY_START==SkipCurly || YY_START==ReadExpressionBody;
7289 bool javadocAutoBrief = Config_getBool(JAVADOC_AUTOBRIEF);
7290 yyextra->docBlockAutoBrief = javadocAutoBrief;
7291
7292 DString indent;
7293 indent.fill(' ',computeIndent(yytext,yyextra->column));
7294 yyextra->docBlock.str(indent.str());
7295
7296 if (yyextra->docBlockAutoBrief)
7297 {
7298 yyextra->current->briefLine = yyextra->yyLineNr;
7299 yyextra->current->briefFile = yyextra->fileName;
7300 }
7301 startCommentBlock(yyscanner,false);
7302 BEGIN( DocBlock );
7303 }
7304<FindMembers,FindFields,MemberSpec,SkipCurly,ReadExpressionBody,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>{CPPC}"!" {
7305 yyextra->lastDocContext = YY_START;
7306 if (yyextra->current_root->section.isScope())
7307 {
7308 yyextra->current->inside = yyextra->current_root->name+"::";
7309 }
7310 yyextra->docBlockContext = YY_START;
7311 yyextra->docBlockInBody = YY_START==SkipCurly || YY_START==ReadExpressionBody;
7312 yyextra->docBlockAutoBrief = false;
7313
7314 DString indent;
7315 indent.fill(' ',computeIndent(yytext,yyextra->column));
7316 yyextra->docBlock.str(indent.str());
7317
7318 startCommentBlock(yyscanner,yyextra->current->brief.empty());
7319 BEGIN( DocLine );
7320 }
7321<FindMembers,FindFields,MemberSpec,SkipCurly,ReadExpressionBody,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>{CPPC}"/"/[^/] {
7322 yyextra->lastDocContext = YY_START;
7323 if (yyextra->current_root->section.isScope())
7324 {
7325 yyextra->current->inside = yyextra->current_root->name+"::";
7326 }
7327 yyextra->docBlockContext = YY_START;
7328 yyextra->docBlockInBody = YY_START==SkipCurly || YY_START==ReadExpressionBody;
7329 yyextra->docBlockAutoBrief = false;
7330 DString indent;
7331 indent.fill(' ',computeIndent(yytext,yyextra->column));
7332 yyextra->docBlock.str(indent.str());
7333 startCommentBlock(yyscanner,yyextra->current->brief.empty());
7334 BEGIN( DocLine );
7335 }
7336<FindMembers>"extern"{BN}*"\""[^\"]+"\""{BN}*("{")? {
7337 lineCount(yyscanner);
7338 yyextra->externLinkage=true;
7339 }
7340<FindMembers>"{" {
7341 if (yyextra->externLinkage)
7342 {
7343 yyextra->externLinkage=false;
7344 }
7345 else if (yyextra->insideCS &&
7346 !yyextra->current->name.empty() &&
7347 !yyextra->current->type.empty())
7348 {
7349 if (yyextra->current->mtype == MethodTypes::Event)
7350 {
7351 yyextra->mtype = MethodTypes::Event;
7352 }
7353 else if (yyextra->current->type.containsWord("event")) // event
7354 {
7355 yyextra->current->mtype = yyextra->mtype = MethodTypes::Event;
7356 }
7357 else // property
7358 {
7359 yyextra->current->mtype = yyextra->mtype = MethodTypes::Property;
7360 }
7361 yyextra->current->bodyLine = yyextra->yyLineNr;
7362 yyextra->current->bodyColumn = yyextra->yyColNr;
7363 yyextra->curlyCount=0;
7364 BEGIN( CSAccessorDecl );
7365 }
7366 else if (yyextra->insideIDL && yyextra->current->spec.isAttribute())
7367 {
7368 // UNO IDL: attributes may have setter and getter
7369 // exception specifications
7370 yyextra->current->exception = " {";
7371 BEGIN(UNOIDLAttributeBlock);
7372 }
7373 else
7374 {
7375 if ((yyextra->insideJava || yyextra->insideCS || yyextra->insideD) &&
7376 yyextra->current->name.empty()
7377 )
7378 {
7379 // static Java initializer
7380 yyextra->needsSemi = false;
7381 if (yyextra->current->isStatic)
7382 {
7383 yyextra->current->name="[static initializer]";
7384 yyextra->current->type.clear();
7385 }
7386 else
7387 {
7388 yyextra->current->name="[instance initializer]";
7389 }
7390 unput(*yytext);
7391 BEGIN( SFunction );
7392 }
7393 else
7394 {
7395 // pre C++11 code -> ignore the initializer
7396 //yyextra->needsSemi = true;
7397 //yyextra->current->type.clear();
7398 //yyextra->current->name.clear();
7399 //yyextra->current->args.clear();
7400 //yyextra->current->argList.clear();
7401 //yyextra->curlyCount=0;
7402 //BEGIN( SkipCurlyBlock );
7403
7404 // C++11 style initializer list
7405 yyextra->current->bodyLine = yyextra->yyLineNr;
7406 yyextra->current->bodyColumn = yyextra->yyColNr;
7407 yyextra->current->initializer.str(yytext);
7408 yyextra->lastInitializerContext = YY_START;
7409 yyextra->sharpCount=0;
7410 yyextra->initBracketCount=1;
7411 BEGIN(ReadInitializer);
7412 }
7413 }
7414 }
7415<CSAccessorDecl>"{" { yyextra->curlyCount++; }
7416<CSAccessorDecl>"}"{B}*"=" {
7417 // fall back to next rule if it's not the right bracket
7418 if (yyextra->curlyCount != 0) REJECT;
7419 yyextra->current->initializer.str("=");
7420 yyextra->current->endBodyLine=yyextra->yyLineNr;
7421 yyextra->lastInitializerContext = FindMembers;
7422 BEGIN(ReadInitializer);
7423 }
7424<CSAccessorDecl>"}" {
7425 if (yyextra->curlyCount)
7426 {
7427 yyextra->curlyCount--;
7428 }
7429 else
7430 {
7431 yyextra->mtype = MethodTypes::Method;
7432 yyextra->virt = Specifier::Normal;
7433 // not really important, but while we are at it
7434 yyextra->current->endBodyLine=yyextra->yyLineNr;
7435 unput(';');
7436 BEGIN(FindMembers);
7437 }
7438 }
7439<CSAccessorDecl>"private "{BN}*"set" { if (yyextra->curlyCount==0) yyextra->current->spec.setPrivateSettable(true); }
7440<CSAccessorDecl>"protected "{BN}*"set" { if (yyextra->curlyCount==0) yyextra->current->spec.setProtectedSettable(true); }
7441<CSAccessorDecl>"private "{BN}*"get" { if (yyextra->curlyCount==0) yyextra->current->spec.setPrivateGettable(true); }
7442<CSAccessorDecl>"protected "{BN}*"get" { if (yyextra->curlyCount==0) yyextra->current->spec.setProtectedGettable(true); }
7443<CSAccessorDecl>"set" { if (yyextra->curlyCount==0) yyextra->current->spec.setSettable(true); }
7444<CSAccessorDecl>"get" { if (yyextra->curlyCount==0) yyextra->current->spec.setGettable(true); }
7445<CSAccessorDecl>"init" { if (yyextra->curlyCount==0) yyextra->current->spec.setInitonly(true); }
7446<CSAccessorDecl>"add" { if (yyextra->curlyCount==0) yyextra->current->spec.setAddable(true); }
7447<CSAccessorDecl>"remove" { if (yyextra->curlyCount==0) yyextra->current->spec.setRemovable(true); }
7448<CSAccessorDecl>"raise" { if (yyextra->curlyCount==0) yyextra->current->spec.setRaisable(true); }
7449<CSAccessorDecl>{CHARLIT} {}
7450<CSAccessorDecl>{ID} {} // skip identifiers that contain a keyword, such as offset
7451<CSAccessorDecl>"\"" { BEGIN(CSString);}
7452<CSAccessorDecl>"." {}
7453<CSAccessorDecl>\n { lineCount(yyscanner); }
7454<CSString>"\"" { BEGIN(CSAccessorDecl);}
7455<CSString>{CPPC} {} // Otherwise the rule <*>"//" will kick in
7456<CSString>{CCS} {} // Otherwise the rule <*>"/*" will kick in
7457<CSString>\n { lineCount(yyscanner); }
7458<CSString>"." {}
7459
7460 /* ---- Slice-specific rules ------ */
7461
7462<SliceSequence>{SCOPENAME} {
7463 if (yyextra->current->spec.isLocal())
7464 {
7465 yyextra->current->type = "local ";
7466 }
7467 yyextra->current->type += "sequence<";
7468 yyextra->current->type += yytext;
7469 yyextra->current->type += ">";
7470 }
7471
7472<SliceSequence>{BN}*">"{BN}* {
7473 lineCount(yyscanner);
7474 BEGIN(SliceSequenceName);
7475 }
7476
7477<SliceSequenceName>{ID}{BN}* {
7478 lineCount(yyscanner);
7479 yyextra->current->name = yytext ;
7480 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
7481 }
7482
7483<SliceSequenceName>";" {
7484 yyextra->current->section = EntryType::makeVariable();
7485 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
7486 initEntry(yyscanner);
7487 BEGIN(FindMembers);
7488 }
7489
7490<SliceDictionary>{SCOPENAME}{BN}*","{BN}*{SCOPENAME} {
7491 lineCount(yyscanner);
7492 if (yyextra->current->spec.isLocal())
7493 {
7494 yyextra->current->type = "local ";
7495 }
7496 yyextra->current->type += "dictionary<";
7497 yyextra->current->type += yytext;
7498 yyextra->current->type += ">";
7499 yyextra->current->type = yyextra->current->type.simplifyWhiteSpace();
7500 }
7501
7502<SliceDictionary>{BN}*">"{BN}* {
7503 lineCount(yyscanner);
7504 BEGIN(SliceDictionaryName);
7505 }
7506
7507<SliceDictionaryName>{ID}{BN}* {
7508 lineCount(yyscanner);
7509 yyextra->current->name = yytext ;
7510 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
7511 }
7512
7513<SliceDictionaryName>";" {
7514 yyextra->current->section = EntryType::makeVariable();
7515 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
7516 initEntry(yyscanner);
7517 BEGIN(FindMembers);
7518 }
7519
7520 /**********************************************************************************/
7521 /******************** Documentation block related rules ***************************/
7522 /**********************************************************************************/
7523
7524 /* ---- Single line comments ------ */
7525<DocLine>[^\n]*"\n"[ \t]*{CPPC}[/!][<]? { // continuation of multiline C++-style comment
7526 int markerLen = yytext[yyleng-1]=='<' ? 4 : 3;
7527 yyextra->docBlock << std::string(yytext).substr(0,yyleng-markerLen);
7528 lineCount(yyscanner);
7529 }
7530<DocLine>{B}*{CPPC}"/"[/]+{Bopt}/"\n" { // ignore marker line (see bug700345)
7531 handleCommentBlock(yyscanner,yyextra->docBlock.str(),yyextra->current->brief.empty());
7532 BEGIN( yyextra->docBlockContext );
7533 }
7534<DocLine>{NONLopt}/"\n"{B}*{CPPC}[!/]{B}*{CMD}"}" { // next line is an end group marker, see bug 752712
7535 yyextra->docBlock << yytext;
7536 handleCommentBlock(yyscanner,yyextra->docBlock.str(),yyextra->current->brief.empty());
7537 BEGIN( yyextra->docBlockContext );
7538 }
7539<DocLine>{NONLopt}/"\n" { // whole line
7540 yyextra->docBlock << yytext;
7541 handleCommentBlock(yyscanner,yyextra->docBlock.str(),yyextra->current->brief.empty());
7542 BEGIN( yyextra->docBlockContext );
7543 }
7544
7545 /* ---- Comments blocks ------ */
7546
7547<DocBlock>"*"*{CCE} { // end of comment block
7548 handleCommentBlock(yyscanner,yyextra->docBlock.str(),false);
7549 BEGIN(yyextra->docBlockContext);
7550 }
7551<DocBlock>"\\ilinebr "{B}*"*"/[^/] {
7552 DString indent;
7553 indent.fill(' ',computeIndent(yytext+8,yyextra->column));
7554 yyextra->docBlock << "\\ilinebr " << indent;
7555 }
7556<DocBlock>^{B}*"*"+/[^/] {
7557 DString indent;
7558 indent.fill(' ',computeIndent(yytext,yyextra->column));
7559 yyextra->docBlock << indent;
7560 }
7561<DocBlock>^{B}*({CPPC})?{B}*"*"+/[^/a-z_A-Z0-9*] { // start of a comment line
7562 DString indent;
7563 indent.fill(' ',computeIndent(yytext,yyextra->column));
7564 yyextra->docBlock << indent;
7565 }
7566<DocBlock>^{B}*({CPPC}){B}* { // strip embedded C++ comments if at the start of a line
7567 }
7568<DocBlock>{CPPC} { // slashes in the middle of a comment block
7569 yyextra->docBlock << yytext;
7570 }
7571<DocBlock>{CCS} { // start of a new comment in the
7572 // middle of a comment block
7573 yyextra->docBlock << yytext;
7574 }
7575<DocBlock>({CMD}{CMD}){ID}/[^a-z_A-Z0-9] { // escaped command
7576 yyextra->docBlock << yytext;
7577 }
7578<DocBlock>{CMD}("f$"|"f["|"f{"|"f(") {
7579 yyextra->docBlock << yytext;
7580 char blockName[] = "f$";
7581 char c = yytext[2];
7582 if (c=='[') blockName[1]=']';
7583 else if (c=='{') blockName[1]='}';
7584 else if (c=='(') blockName[1]=')';
7585 startVerbatimBlock(yyscanner,blockName);
7586 BEGIN(DocCopyBlock);
7587 }
7588<DocBlock>{CMD}"ifile"{B}+"\""[^\n\"]+"\"" {
7589 yyextra->fileName = &yytext[6];
7590 yyextra->fileName = yyextra->fileName.stripWhiteSpace();
7591 yyextra->fileName = yyextra->fileName.mid(1,yyextra->fileName.length()-2);
7592 yyextra->docBlock << yytext;
7593 }
7594<DocBlock>{CMD}"ifile"{B}+{FILEMASK} {
7595 yyextra->fileName = &yytext[6];
7596 yyextra->fileName = yyextra->fileName.stripWhiteSpace();
7597 yyextra->docBlock << yytext;
7598 }
7599<DocBlock>{CMD}"iline"{LINENR}{B} {
7600 bool ok = false;
7601 int nr = DString(&yytext[6]).toInt(&ok);
7602 if (!ok)
7603 {
7604 warn(yyextra->fileName,yyextra->yyLineNr,"Invalid line number '{}' for iline command",yytext);
7605 }
7606 else
7607 {
7608 yyextra->yyLineNr = nr;
7609 }
7610 yyextra->docBlock << yytext;
7611 }
7612<DocBlock>{B}*"<"{PRE}">" {
7613 yyextra->docBlock << yytext;
7614 startVerbatimBlock(yyscanner,"<pre>");
7615 BEGIN(DocCopyBlock);
7616 }
7617<DocBlock>{CMD}"startuml"/[^a-z_A-Z0-9\-] { // verbatim command (which could contain nested comments!)
7618 yyextra->docBlock << yytext;
7619 startVerbatimBlock(yyscanner,"uml");
7620 BEGIN(DocCopyBlock);
7621 }
7622<DocBlock>{CMD}("verbatim"|"iliteral"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"rtfonly"|"docbookonly"|"dot"|"msc"|"mermaid")/[^a-z_A-Z0-9\-] { // verbatim command (which could contain nested comments!)
7623 yyextra->docBlock << yytext;
7624 startVerbatimBlock(yyscanner,&yytext[1]);
7625 BEGIN(DocCopyBlock);
7626 }
7627<DocBlock>{CMD}("code")/[^a-z_A-Z0-9\-] { // verbatim command (which could contain nested comments!)
7628 yyextra->docBlock << yytext;
7629 startVerbatimBlock(yyscanner,&yytext[1],0,true);
7630 BEGIN(DocCopyBlock);
7631 }
7632<DocBlock>"\\ilinebr "({B}*"*"+)?{B}{0,3}"~~~"[~]* {
7633 DString pat = substitute(yytext+9,"*"," "); // skip over "\ilinebr " part
7634 yyextra->docBlock << "\\ilinebr ";
7635 yyextra->docBlock << pat;
7636 startVerbatimBlock(yyscanner,"~~~",pat.stripWhiteSpace().length(),true);
7637 BEGIN(DocCopyBlock);
7638 }
7639<DocBlock>^({B}*"*"+)?{B}{0,3}"~~~"[~]* {
7640 DString pat = substitute(yytext,"*"," ");
7641 yyextra->docBlock << pat;
7642 startVerbatimBlock(yyscanner,"~~~",pat.stripWhiteSpace().length(),true);
7643 BEGIN(DocCopyBlock);
7644 }
7645<DocBlock>"\\ilinebr "({B}*"*"+)?{B}{0,3}"```"[`]*/(".")?[a-zA-Z0-9#_-]+ |
7646<DocBlock>"\\ilinebr "({B}*"*"+)?{B}{0,3}"```"[`]*/"{"[^}]+"}" |
7647<DocBlock>"\\ilinebr "({B}*"*"+)?{B}{0,3}"```"[`]* {
7648 DString pat = substitute(yytext+9,"*"," "); // skip over "\ilinebr " part
7649 yyextra->docBlock << "\\ilinebr ";
7650 yyextra->docBlock << pat;
7651 startVerbatimBlock(yyscanner,"```",pat.stripWhiteSpace().length(),true);
7652 BEGIN(DocCopyBlock);
7653 }
7654<DocBlock>^({B}*"*"+)?{B}{0,3}"```"[`]*/(".")?[a-zA-Z0-9#_-]+ |
7655<DocBlock>^({B}*"*"+)?{B}{0,3}"```"[`]*/"{"[^}]+"}" |
7656<DocBlock>^({B}*"*"+)?{B}{0,3}"```"[`]* {
7657 DString pat = substitute(yytext,"*"," ");
7658 yyextra->docBlock << pat;
7659 startVerbatimBlock(yyscanner,"```",pat.stripWhiteSpace().length(),true);
7660 BEGIN(DocCopyBlock);
7661 }
7662<DocBlock>"```" { // skip ``` if not at the start of a line
7663 yyextra->docBlock << "```";
7664 }
7665<DocBlock>"\\`" { // skip escaped backtick
7666 yyextra->docBlock << yytext;
7667 }
7668<DocBlock>"`"{1,2} {
7669 yyextra->docBlock << yytext;
7670 startVerbatimBlock(yyscanner,yytext,yyleng,true);
7671 BEGIN(DocCopyBlock);
7672 }
7673<DocBlock>{B}*"<"{CODE}">" {
7674 if (yyextra->insideCS)
7675 {
7676 yyextra->docBlock << yytext;
7677 startVerbatimBlock(yyscanner,"<code>",0,true);
7678 BEGIN(DocCopyBlock);
7679 }
7680 else
7681 {
7682 REJECT;
7683 }
7684 }
7685<DocBlock>[^@*~`'\/\\\n]+ { // any character that isn't special
7686 yyextra->docBlock << yytext;
7687 }
7688<DocBlock>\n { // newline
7689 lineCount(yyscanner);
7690 yyextra->docBlock << *yytext;
7691 }
7692<DocBlock>. { // command block
7693 yyextra->docBlock << *yytext;
7694 }
7695
7696 /* ---- Copy verbatim sections ------ */
7697
7698<DocCopyBlock>"</"{PRE}">" { // end of a <pre> block
7699 if (endVerbatimBlock(yyscanner,"<pre>"))
7700 {
7701 BEGIN(DocBlock);
7702 }
7703 yyextra->docBlock << yytext;
7704 }
7705<DocCopyBlock>"</"{CODE}">" { // end of a <code> block
7706 if (endVerbatimBlock(yyscanner,"<code>"))
7707 {
7708 BEGIN(DocBlock);
7709 }
7710 yyextra->docBlock << yytext;
7711 }
7712<DocCopyBlock>[\\@]("f$"|"f]"|"f}"|"f)") {
7713 if (endVerbatimBlock(yyscanner,&yytext[1]))
7714 {
7715 BEGIN(DocBlock);
7716 }
7717 yyextra->docBlock << yytext;
7718 }
7719<DocCopyBlock>[\\@]("endverbatim"|"endiliteral"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddocbookonly"|"endmanonly"|"endrtfonly"|"enddot"|"endmsc"|"endmermaid"|"enduml"|"endcode")/[^a-z_A-Z0-9] { // end of verbatim block
7720 if (endVerbatimBlock(yyscanner,&yytext[4]))
7721 {
7722 BEGIN(DocBlock);
7723 }
7724 yyextra->docBlock << yytext;
7725 }
7726<DocCopyBlock>^{B}*"*"+/{BN}+ { // start of a comment line
7727 if ((yyextra->docBlockName=="verbatim") || (yyextra->docBlockName=="code") || (yyextra->docBlockName=="iliteral"))
7728 {
7729 REJECT;
7730 }
7731 else
7732 {
7733 DString indent;
7734 indent.fill(' ',computeIndent(yytext,0));
7735 yyextra->docBlock << indent;
7736 }
7737 }
7738<DocCopyBlock>^{B}*"*"+/{B}+"*"{BN}* { // start of a comment line with two *'s
7739 if ((yyextra->docBlockName=="code") || (yyextra->docBlockName=="iliteral"))
7740 {
7741 DString indent;
7742 indent.fill(' ',computeIndent(yytext,0));
7743 yyextra->docBlock << indent;
7744 }
7745 else
7746 {
7747 REJECT;
7748 }
7749 }
7750<DocCopyBlock>^{B}*"*"+/({ID}|"(") { // Assume *var or *(... is part of source code (see bug723516)
7751 if ((yyextra->docBlockName=="code") || (yyextra->docBlockName=="iliteral"))
7752 {
7753 DString indent;
7754 indent.fill(' ',computeIndent(yytext,-1));
7755 yyextra->docBlock << indent+"*";
7756 }
7757 else
7758 {
7759 REJECT;
7760 }
7761 }
7762<DocCopyBlock>^{B}*"*"+/{BN}* { // start of a comment line with one *
7763 if ((yyextra->docBlockName=="code") || (yyextra->docBlockName=="iliteral"))
7764 {
7765 DString indent;
7766 if (yyextra->nestedComment>0) // keep * it is part of the code
7767 {
7768 indent.fill(' ',computeIndent(yytext,-1));
7769 yyextra->docBlock << indent+"*";
7770 }
7771 else // remove * it is part of the comment block
7772 {
7773 indent.fill(' ',computeIndent(yytext,0));
7774 yyextra->docBlock << indent;
7775 }
7776 }
7777 else
7778 {
7779 REJECT;
7780 }
7781 }
7782<DocCopyBlock>^({B}*"*"+)?{B}{0,3}"~~~"[~]* {
7783 DString pat = substitute(yytext,"*"," ");
7784 if (endVerbatimBlock(yyscanner,"~~~",pat.stripWhiteSpace().length()))
7785 {
7786 BEGIN(DocBlock);
7787 }
7788 yyextra->docBlock << pat;
7789 }
7790<DocCopyBlock>^({B}*"*"+)?{B}{0,3}"```"[`]* {
7791 DString pat = substitute(yytext,"*"," ");
7792 if (endVerbatimBlock(yyscanner,"```",pat.stripWhiteSpace().length()))
7793 {
7794 BEGIN(DocBlock);
7795 }
7796 yyextra->docBlock << pat;
7797 }
7798<DocCopyBlock>"```" { // backtick + end marker
7799 if (yyextra->docBlockName=="``")
7800 {
7801 yyextra->docBlock << "`";
7802 endVerbatimBlock(yyscanner,"``",2);
7803 yyextra->docBlock << "``";
7804 BEGIN(DocBlock);
7805 }
7806 else
7807 {
7808 yyextra->docBlock << yytext;
7809 }
7810 }
7811<DocCopyBlock>"''"/[^a-z_A-Z0-9-] {
7812 if (!Config_getBool(MARKDOWN_STRICT) && endVerbatimBlock(yyscanner,"``",2))
7813 {
7814 BEGIN(DocBlock);
7815 }
7816 yyextra->docBlock << yytext;
7817 }
7818<DocCopyBlock>"'"/[^'a-z_A-Z0-9-] {
7819 if (!Config_getBool(MARKDOWN_STRICT) && endVerbatimBlock(yyscanner,"`",1))
7820 {
7821 BEGIN(DocBlock);
7822 }
7823 yyextra->docBlock << yytext;
7824 }
7825<DocCopyBlock>"`"{1,2} {
7826 if (endVerbatimBlock(yyscanner,yytext,yyleng))
7827 {
7828 BEGIN(DocBlock);
7829 }
7830 yyextra->docBlock << yytext;
7831 }
7832<DocCopyBlock>[^<@/\*\‍]`'~"\$\\\n]+ { // any character that is not special
7833 yyextra->docBlock << yytext;
7834 }
7835<DocCopyBlock>\" {
7836 yyextra->docBlock << yytext;
7837 if (yyextra->docBlockName=="code" || yyextra->docBlockName=="iliteral")
7838 // to support end of comment character sequences inside
7839 // a string literal of a code block, see #6737
7840 {
7841 yyextra->lastStringContext=YY_START;
7842 yyextra->pCopyQuotedGString=&yyextra->docBlock;
7843 yyextra->stopAtInvalidString=true;
7844 BEGIN(CopyGString);
7845 }
7846 }
7847<DocCopyBlock>{CCS}|{CCE}|{CPPC} {
7848 if (yytext[1]=='*') // start comment
7849 {
7850 yyextra->nestedComment++;
7851 }
7852 else if (yytext[0]=='*' && yyextra->nestedComment>0) // end comment
7853 {
7854 yyextra->nestedComment--;
7855 }
7856 else if (yytext[0]=='*' && yyextra->nestedComment==0 && yyextra->isCodeBlock) // end comment without start
7857 {
7858 warn(yyextra->fileName,yyextra->yyLineNr,
7859 "Found end of C comment inside a '{}' block without matching start of the comment!"
7860 " Maybe the end marker for the block is missing?",
7861 yyextra->docBlockName);
7862 BEGIN(DocBlock);
7863 }
7864 yyextra->docBlock << yytext;
7865 }
7866<DocCopyBlock>\n { // newline
7867 yyextra->docBlock << *yytext;
7868 lineCount(yyscanner);
7869 }
7870<DocCopyBlock>. { // any other character
7871 yyextra->docBlock << *yytext;
7872 }
7873<DocCopyBlock><<EOF>> {
7874 warn(yyextra->fileName,yyextra->yyLineNr,
7875 "reached end of file while inside a '{}' block!"
7876 " The command that should end the block seems to be missing!",
7877 yyextra->docBlockName);
7878 yyterminate();
7879 }
7880
7881
7882 /* ------------- Prototype parser -------------- */
7883
7884<Prototype>"operator"{B}*"("{B}*")" {
7885 yyextra->current->name+=yytext;
7886 }
7887<Prototype>"(" {
7888 yyextra->current->args+=*yytext;
7889 yyextra->currentArgumentContext = PrototypeQual;
7890 yyextra->fullArgString = yyextra->current->args;
7891 yyextra->copyArgString = &yyextra->current->args;
7892 BEGIN( ReadFuncArgType ) ;
7893 }
7894<Prototype>"("({ID}"::")*({B}*[&*])+ {
7895 if (yyextra->insidePHP) // reference parameter
7896 {
7897 REJECT;
7898 }
7899 else
7900 {
7901 yyextra->current->type+=yyextra->current->name+yytext;
7902 yyextra->current->name.clear();
7903 BEGIN( PrototypePtr );
7904 }
7905 }
7906<PrototypePtr>{SCOPENAME} {
7907 yyextra->current->name+=yytext;
7908 }
7909<PrototypePtr>"(" {
7910 yyextra->current->args+=*yytext;
7911 yyextra->currentArgumentContext = PrototypeQual;
7912 yyextra->fullArgString = yyextra->current->args;
7913 yyextra->copyArgString = &yyextra->current->args;
7914 BEGIN( ReadFuncArgType ) ;
7915 }
7916<PrototypePtr>")" {
7917 yyextra->current->type+=')';
7918 BEGIN( Prototype );
7919 }
7920<PrototypePtr>. {
7921 yyextra->current->name+=yytext;
7922 }
7923<PrototypeQual>"{" {
7924 BEGIN( PrototypeSkipLine);
7925 }
7926<PrototypeQual>{B}*"const"{B}* {
7927 yyextra->current->args += " const ";
7928 yyextra->current->argList.setConstSpecifier(true);
7929 }
7930<PrototypeQual>{B}*"volatile"{B}* {
7931 yyextra->current->args += " volatile ";
7932 yyextra->current->argList.setVolatileSpecifier(true);
7933 }
7934<PrototypeQual>{B}*"="{B}*"0"{B}* {
7935 yyextra->current->args += " = 0";
7936 yyextra->current->virt = Specifier::Pure;
7937 yyextra->current->argList.setPureSpecifier(true);
7938 }
7939<PrototypeQual>"throw"{B}*"(" {
7940 yyextra->current->exception = "throw(";
7941 BEGIN(PrototypeExc);
7942 }
7943<PrototypeExc>")" {
7944 yyextra->current->exception += ')';
7945 BEGIN(PrototypeQual);
7946 }
7947<PrototypeExc>. {
7948 yyextra->current->exception += *yytext;
7949 }
7950<PrototypeQual>. {
7951 yyextra->current->args += *yytext;
7952 }
7953<Prototype>. {
7954 yyextra->current->name += *yytext;
7955 }
7956<PrototypeSkipLine>. {
7957 }
7958
7959
7960
7961
7962<SkipCxxComment>.*"\\\n" { // line continuation
7963 if (yyextra->insideCS)
7964 {
7965 REJECT;
7966 }
7967 else
7968 {
7969 lineCount(yyscanner);
7970 }
7971 }
7972<SkipCxxComment>{ANYopt}/\n {
7973 BEGIN( yyextra->lastCContext ) ;
7974 }
7975<SkipComment>[^\*\n]+
7976
7977 /* ------------ Generic rules -------------- */
7978
7979<*>"[[" { // C++11 attribute
7980 if (!yyextra->insideCpp) REJECT;
7981 if (YY_START == CopyGString || YY_START == CopyGString) REJECT;
7982 yyextra->lastC11AttributeContext = YY_START;
7983 yyextra->pCopyC11AttributeString = &yyextra->current->attributes;
7984 BEGIN( CopyC11Attribute );
7985 }
7986
7987<*>\n { lineCount(yyscanner); }
7988<*>\" {
7989 if (yyextra->insideIDL && yyextra->insideCppQuote)
7990 {
7991 BEGIN(EndCppQuote);
7992 }
7993 else if (yyextra->insidePHP)
7994 {
7995 yyextra->lastStringContext=YY_START;
7996 BEGIN(SkipString);
7997 }
7998 }
7999<*>^{B}*"#" {
8000 if (!yyextra->insidePHP)
8001 {
8002 yyextra->lastCPPContext = YY_START;
8003 BEGIN( SkipCPP ) ;
8004 }
8005 else
8006 {
8007 yyextra->lastCContext = YY_START ;
8008 BEGIN( SkipCxxComment ) ;
8009 }
8010 }
8011<*>"#" {
8012 if (!yyextra->insidePHP)
8013 REJECT;
8014 yyextra->lastCContext = YY_START ;
8015 BEGIN( SkipCxxComment ) ;
8016 }
8017<*>\' {
8018 if (yyextra->insidePHP)
8019 {
8020 yyextra->lastStringContext=YY_START;
8021 BEGIN(SkipPHPString);
8022 }
8023 }
8024<*>\? {
8025 if (yyextra->insideCS && (YY_START != SkipRound) && (YY_START != CSAccessorDecl))
8026 {
8027 if (yyextra->current->type.empty())
8028 {
8029 if (yyextra->current->name.empty())
8030 yyextra->current->name="?";
8031 else
8032 yyextra->current->name+="?";
8033 }
8034 else
8035 {
8036 yyextra->current->type+="?";
8037 }
8038 }
8039 }
8040<*>"}" { yyextra->exported=false; }
8041<*>.
8042<SkipComment>{CPPC}|{CCS}
8043<*>{CCS} { yyextra->lastCContext = YY_START ;
8044 BEGIN( SkipComment ) ;
8045 }
8046<SkipComment>{B}*{CCE} { BEGIN( yyextra->lastCContext ) ; }
8047<*>{CPPC} {
8048 yyextra->lastCContext = YY_START ;
8049 BEGIN( SkipCxxComment ) ;
8050 }
8051<<EOF>> {
8052 if (yyextra->insideCS && yyextra->fakeNS)
8053 {
8054 yyextra->fakeNS--;
8055 unput('}');
8056 BEGIN ( ReadNSBody);
8057 }
8058 else
8059 {
8060 yyterminate();
8061 }
8062 }
8063%%
8064
8065//----------------------------------------------------------------------------
8066static int yyread(yyscan_t yyscanner,char *buf,int max_size)
8067{
8068 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8069 int c=0;
8070 while( c < max_size && yyextra->inputString[yyextra->inputPosition] )
8071 {
8072 *buf = yyextra->inputString[yyextra->inputPosition++] ;
8073 //printf("%d (%c)\n",*buf,*buf);
8074 c++; buf++;
8075 }
8076 return c;
8077}
8078
8079
8080static void initParser(yyscan_t yyscanner)
8081{
8082 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8083 yyextra->outerScopeEntries.clear();
8084 yyextra->baseName.clear();
8085 yyextra->protection = Protection::Public;
8086 yyextra->baseProt = Protection::Public;
8087 yyextra->sharpCount = 0;
8088 yyextra->roundCount = 0;
8089 yyextra->curlyCount = 0;
8090 yyextra->mtype = MethodTypes::Method;
8091 yyextra->isStatic = false;
8092 yyextra->virt = Specifier::Normal;
8093 yyextra->baseVirt = Specifier::Normal;
8094 yyextra->isTypedef = false;
8095 yyextra->insideTryBlock = false;
8096 yyextra->insideFormula = false;
8097 yyextra->insideCode=false;
8098 yyextra->insideCli=Config_getBool(CPP_CLI_SUPPORT);
8099 yyextra->previous = 0;
8100 yyextra->firstTypedefEntry.reset();
8101 yyextra->memspecEntry.reset();
8102}
8103
8104static void initEntry(yyscan_t yyscanner)
8105{
8106 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8107 if (yyextra->insideJava)
8108 {
8109 yyextra->protection = (yyextra->current_root->spec.isInterface() || yyextra->current_root->spec.isEnum()) ? Protection::Public : Protection::Package;
8110 }
8111 yyextra->current->protection = yyextra->protection;
8112 yyextra->current->exported = yyextra->exported ;
8113 yyextra->current->mtype = yyextra->mtype;
8114 yyextra->current->virt = yyextra->virt;
8115 yyextra->current->isStatic = yyextra->isStatic;
8116 yyextra->current->lang = yyextra->language;
8117 //printf("*** initEntry(yyscanner) yyextra->language=%d\n",yyextra->language);
8118 yyextra->commentScanner.initGroupInfo(yyextra->current.get());
8119 yyextra->isTypedef=false;
8120}
8121
8122
8123//-----------------------------------------------------------------------------
8124
8125static DString generateAnonymousAnchor(const DString &fileName,int count)
8126{
8127 DString fn = stripFromPath(fileName)+":"+DString().setNum(count);
8128 auto md5_sig = md5hash(fn.view());
8129 char result[md5_sig.size()*3+2];
8130 char *p = result;
8131 *p++='@';
8132 for (size_t i=0;i<md5_sig.size();i++)
8133 {
8134 static const char oct[]="01234567";
8135 uint8_t byte = md5_sig[i];
8136 *p++=oct[(byte>>6)&7];
8137 *p++=oct[(byte>>3)&7];
8138 *p++=oct[(byte>>0)&7];
8139 }
8140 *p='\0';
8141 return result;
8142}
8143
8144static void storeClangId(yyscan_t yyscanner,const char *id)
8145{
8146 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8147 if (yyextra->clangParser && (yyextra->insideCpp || yyextra->insideObjC))
8148 {
8149 yyextra->current->id = yyextra->clangParser->lookup(yyextra->yyLineNr,id);
8150 }
8151}
8152
8153static void lineCount(yyscan_t yyscanner)
8154{
8155 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8156 int tabSize = Config_getInt(TAB_SIZE);
8157 const char *p;
8158 for (p = yytext ; *p ; ++p )
8159 {
8160 if (*p=='\n')
8161 {
8162 yyextra->yyLineNr++;
8163 yyextra->column=0;
8164 yyextra->yyColNr=1;
8165 }
8166 else if (*p=='\t')
8167 {
8168 yyextra->column+=tabSize - (yyextra->column%tabSize);
8169 yyextra->yyColNr=1+yyextra->column;
8170 }
8171 else
8172 {
8173 yyextra->column++;
8174 yyextra->yyColNr++;
8175 }
8176 }
8177 //printf("lineCount()=%d\n",yyextra->column);
8178}
8179
8180static inline size_t computeIndent(const char *s,size_t startIndent)
8181{
8182 size_t col=startIndent;
8183 int tabSize=Config_getInt(TAB_SIZE);
8184 const char *p=s;
8185 char c;
8186 while ((c=*p++))
8187 {
8188 if (c=='\t') col+=tabSize-(col%tabSize);
8189 else if (c=='\n') col=0;
8190 else col++;
8191 }
8192 return col;
8193}
8194
8195static inline void initMethodProtection(yyscan_t yyscanner,Protection prot)
8196{
8197 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8198 yyextra->current->protection = yyextra->protection = prot;
8199 yyextra->current->mtype = yyextra->mtype = MethodTypes::Method;
8200 yyextra->current->type.clear();
8201 yyextra->current->name.clear();
8202 yyextra->current->args.clear();
8203 yyextra->current->argList.clear();
8204 lineCount(yyscanner) ;
8205}
8206
8207static void addType(yyscan_t yyscanner)
8208{
8209 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8210 size_t tl=yyextra->current->type.length();
8211 if( tl>0 && !yyextra->current->name.empty() && yyextra->current->type.at(tl-1)!='.')
8212 {
8213 yyextra->current->type += ' ' ;
8214 }
8215 yyextra->current->type += yyextra->current->name;
8216 yyextra->current->name.clear() ;
8217 tl=yyextra->current->type.length();
8218 if( tl>0 && !yyextra->current->args.empty() && yyextra->current->type.at(tl-1)!='.')
8219 {
8220 yyextra->current->type += ' ' ;
8221 }
8222 yyextra->current->type += yyextra->current->args ;
8223 yyextra->current->args.clear() ;
8224 yyextra->current->argList.clear();
8225}
8226
8227
8228static DString stripQuotes(const char *s)
8229{
8230 DString name;
8231 if (s==nullptr || *s==0) return name;
8232 name=s;
8233 if (name.at(0)=='"' && name.at(name.length()-1)=='"')
8234 {
8235 name=name.mid(1,name.length()-2);
8236 }
8237 return name;
8238}
8239
8240static DString stripFuncPtr(const DString &type)
8241{
8242 // we need to strip any trailing * and & (see bugs 623023 and 649103 for test cases)
8243 // also needed to reset the type for 'arr' to 'int' in 'typedef int (&fp)(), arr[2]'
8244 size_t i=type.length();
8245 bool funcPtr = i>0 && type[i-1]==')';
8246 if (funcPtr) i--;
8247 while (i>0 && (type[i-1]=='*' || type[i-1]=='&' || type[i-1]==' ')) i--;
8248 if (funcPtr && i>0 && type[i-1]=='(') i--;
8249 return type.left(i);
8250}
8251
8252//-----------------------------------------------------------------
8253static void startVerbatimBlock(yyscan_t yyscanner,const DString &blockName,size_t fencedSize,bool codeBlock)
8254{
8255 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8256 if (Config_getBool(MARKDOWN_SUPPORT))
8257 {
8258 yyextra->docBlock << "\\iskip";
8259 }
8260 yyextra->docBlockName=blockName;
8261 yyextra->fencedSize=fencedSize;
8262 yyextra->isCodeBlock=codeBlock;
8263 yyextra->nestedComment=0;
8264}
8265
8266//-----------------------------------------------------------------
8267static bool endVerbatimBlock(yyscan_t yyscanner,const DString &blockName,size_t fencedSize)
8268{
8269 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8270 if (yyextra->docBlockName==blockName && (fencedSize==0 || fencedSize==yyextra->fencedSize))
8271 {
8272 if (Config_getBool(MARKDOWN_SUPPORT))
8273 {
8274 yyextra->docBlock << "\\endiskip";
8275 }
8276 yyextra->docBlockName="";
8277 return true;
8278 }
8279 return false;
8280}
8281
8282//-----------------------------------------------------------------
8283
8284// return true iff req holds the start of a requires expression
8285// or sub-expression without parenthesis, i.e. req is empty or ends with || or &&
8286static bool startOfRequiresExpression(const DString &req)
8287{
8288 DString r = req.stripWhiteSpace();
8289 return r.empty() || r.endsWith("&&") || r.endsWith("||") || r.endsWith("and") || r.endsWith("or");
8290}
8291
8292//-----------------------------------------------------------------
8293
8294static bool nameIsOperator(DString &name)
8295{
8296 size_t i=name.find("operator");
8297 if (i==DString::npos) return false;
8298 if (i==0 && !isId(name.at(8))) return true; // case operator ::X
8299 if (i>0 && !isId(name.at(i-1)) && !isId(name.at(i+8))) return true; // case X::operator
8300 return false; // case TEXToperatorTEXT
8301}
8302
8303//-----------------------------------------------------------------------------
8304
8305static void setContext(yyscan_t yyscanner)
8306{
8307 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8308 yyextra->language = getLanguageFromFileName(yyextra->fileName);
8309 yyextra->insideIDL = yyextra->language==SrcLangExt::IDL;
8310 yyextra->insideJava = yyextra->language==SrcLangExt::Java;
8311 yyextra->insideCS = yyextra->language==SrcLangExt::CSharp;
8312 yyextra->insideD = yyextra->language==SrcLangExt::D;
8313 yyextra->insidePHP = yyextra->language==SrcLangExt::PHP;
8314 yyextra->insideObjC = yyextra->language==SrcLangExt::ObjC;
8315 yyextra->insideJS = yyextra->language==SrcLangExt::JS;
8316 yyextra->insideSlice = yyextra->language==SrcLangExt::Slice;
8317 yyextra->insideCpp = (yyextra->language==SrcLangExt::Cpp ||
8318 yyextra->language==SrcLangExt::Lex);
8319 //printf("setContext(%s) yyextra->insideIDL=%d yyextra->insideJava=%d yyextra->insideCS=%d "
8320 // "yyextra->insideD=%d yyextra->insidePHP=%d yyextra->insideObjC=%d\n",
8321 // qPrint(yyextra->fileName),yyextra->insideIDL,yyextra->insideJava,yyextra->insideCS,yyextra->insideD,yyextra->insidePHP,yyextra->insideObjC
8322 // );
8323}
8324
8325//-----------------------------------------------------------------------------
8326
8327static void prependScope(yyscan_t yyscanner)
8328{
8329 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8330 if (yyextra->current_root->section.isScope())
8331 {
8332 //printf("--- prependScope %s to %s\n",qPrint(yyextra->current_root->name),qPrint(yyextra->current->name));
8333 yyextra->current->name.prepend(yyextra->current_root->name+"::");
8334 //printf("prependScope #=%d #yyextra->current=%d\n",yyextra->current_root->tArgLists->count(),yyextra->current->tArgLists->count());
8335 for (const ArgumentList &srcAl : yyextra->current_root->tArgLists)
8336 {
8337 yyextra->current->tArgLists.insert(yyextra->current->tArgLists.begin(),srcAl);
8338 }
8339 }
8340}
8341
8342//-----------------------------------------------------------------------------
8343
8344/*! Returns true iff the yyextra->current entry could be a K&R style C function */
8345static bool checkForKnRstyleC(yyscan_t yyscanner)
8346{
8347 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8348 if (!yyextra->fileName.lower().endsWith(".c")) return false; // must be a C file
8349 if (yyextra->current->argList.empty()) return false; // must have arguments
8350 for (const Argument &a : yyextra->current->argList)
8351 {
8352 // in K&R style argument do not have a type, but doxygen expects a type
8353 // so it will think the argument has no name
8354 if (a.type.empty() || !a.name.empty()) return false;
8355 }
8356 return true;
8357}
8358
8359static void setJavaProtection(yyscan_t yyscanner)
8360{
8361 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8362 if (yyextra->insideJava)
8363 {
8364 DString text=yytext;
8365 yyextra->current->protection = Protection::Public;
8366 if (text.find("protected")!=DString::npos)
8367 yyextra->current->protection = Protection::Protected;
8368 else if (text.find("private")!=DString::npos)
8369 yyextra->current->protection = Protection::Private;
8370 else if (text.find("package")!=DString::npos)
8371 yyextra->current->protection = Protection::Package;
8372 }
8373}
8374//-----------------------------------------------------------------------------
8375
8376static void splitKnRArg(yyscan_t yyscanner,DString &oldStyleArgPtr,DString &oldStyleArgName)
8377{
8378 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8379 int si = static_cast<int>(yyextra->current->args.length());
8380 if (yyextra->oldStyleArgType.empty()) // new argument
8381 {
8382 std::string args = yyextra->current->args.str();
8383 static const reg::Ex re(R"(\‍([^)]*\).*)"); // find first (...)
8384 int bi1=-1;
8385 int bi2=-1;
8386 reg::Match match;
8387 if (reg::search(args,match,re))
8388 {
8389 bi1=(int)match.position();
8390 size_t secondMatchStart = match.position()+match.length(); // search again after first match
8391 if (reg::search(args,match,re,secondMatchStart))
8392 {
8393 bi2=(int)match.position();
8394 }
8395 }
8396 char c;
8397 if (bi1!=-1 && bi2!=-1) // found something like "int (*func)(int arg)"
8398 {
8399 int s=bi2+1; // keep opening (
8400 yyextra->oldStyleArgType = yyextra->current->args.left(s);
8401 int i=s;
8402 while (i<si && ((c=yyextra->current->args.at(i))=='*' || isspace((uint8_t)c))) i++;
8403 yyextra->oldStyleArgType += yyextra->current->args.mid(s,i-s);
8404 s=i;
8405 while (i<si && isId(yyextra->current->args.at(i))) i++;
8406 oldStyleArgName = yyextra->current->args.mid(s,i-s);
8407 yyextra->oldStyleArgType+=yyextra->current->args.mid(i);
8408 }
8409 else if (bi1!=-1) // redundant braces like in "int (*var)"
8410 {
8411 int s=bi1; // strip opening (
8412 yyextra->oldStyleArgType = yyextra->current->args.left(s);
8413 s++;
8414 int i=s+1;
8415 while (i<si && ((c=yyextra->current->args.at(i))=='*' || isspace((uint8_t)c))) i++;
8416 yyextra->oldStyleArgType += yyextra->current->args.mid(s,i-s);
8417 s=i;
8418 while (i<si && isId(yyextra->current->args.at(i))) i++;
8419 oldStyleArgName = yyextra->current->args.mid(s,i-s);
8420 }
8421 else // normal "int *var"
8422 {
8423 int l=si,i=l-1,j;
8424 // look for start of name in "type *name"
8425 while (i>=0 && isId(yyextra->current->args.at(i))) i--;
8426 j=i+1;
8427 // look for start of *'s
8428 while (i>=0 && ((c=yyextra->current->args.at(i))=='*' || isspace((uint8_t)c))) i--;
8429 i++;
8430 if (i!=l)
8431 {
8432 yyextra->oldStyleArgType=yyextra->current->args.left(i);
8433 oldStyleArgPtr=yyextra->current->args.mid(i,j-i);
8434 oldStyleArgName=yyextra->current->args.mid(j).stripWhiteSpace();
8435 }
8436 else
8437 {
8438 oldStyleArgName=yyextra->current->args.stripWhiteSpace();
8439 }
8440 }
8441 }
8442 else // continuation like *arg2 in "int *args,*arg2"
8443 {
8444 int l=si,j=0;
8445 char c;
8446 while (j<l && ((c=yyextra->current->args.at(j))=='*' || isspace((uint8_t)c))) j++;
8447 if (j>0)
8448 {
8449 oldStyleArgPtr=yyextra->current->args.left(j);
8450 oldStyleArgName=yyextra->current->args.mid(j).stripWhiteSpace();
8451 }
8452 else
8453 {
8454 oldStyleArgName=yyextra->current->args.stripWhiteSpace();
8455 }
8456 }
8457}
8458
8459//-----------------------------------------------------------------------------
8460
8461/*! Update the argument \a name with additional \a type info. For K&R style
8462 * function the type is found \e after the argument list, so this routine
8463 * in needed to fix up.
8464 */
8465static void addKnRArgInfo(yyscan_t yyscanner,const DString &type,const DString &name,
8466 const DString &brief,const DString &docs)
8467{
8468 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8469 for (Argument &a : yyextra->current->argList)
8470 {
8471 if (a.type==name)
8472 {
8473 a.type=type.stripWhiteSpace();
8474 a.type.stripPrefix("register ");
8475 a.name=name.stripWhiteSpace();
8476 if (!brief.empty() && !docs.empty())
8477 {
8478 a.docs=brief+"\n\n"+docs;
8479 }
8480 else if (!brief.empty())
8481 {
8482 a.docs=brief;
8483 }
8484 else
8485 {
8486 a.docs=docs;
8487 }
8488 }
8489 }
8490}
8491
8492//-----------------------------------------------------------------------------
8493
8495{
8496 for (Argument &a : al)
8497 {
8498 if (!a.type.empty() && a.name.empty())
8499 { // a->type is actually the (typeless) parameter name, so move it
8500 a.name=a.type;
8501 a.type.clear();
8502 }
8503 }
8504}
8505
8506//-----------------------------------------------------------------------------
8507
8508static void startCommentBlock(yyscan_t yyscanner,bool brief)
8509{
8510 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8511 if (brief)
8512 {
8513 yyextra->current->briefFile = yyextra->fileName;
8514 yyextra->current->briefLine = yyextra->yyLineNr;
8515 }
8516 else
8517 {
8518 yyextra->current->docFile = yyextra->fileName;
8519 yyextra->current->docLine = yyextra->yyLineNr;
8520 }
8521}
8522
8523//----------------------------------------------------------------------------
8524
8525static void newEntry(yyscan_t yyscanner)
8526{
8527 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8528 if (yyextra->tempEntry==0) // if temp entry is not 0, it holds yyextra->current,
8529 // and yyextra->current is actually replaced by yyextra->previous which was
8530 // already added to yyextra->current_root, so we should not add it again
8531 // (see bug723314)
8532 {
8533 yyextra->previous = yyextra->current;
8534 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
8535 }
8536 else
8537 {
8538 yyextra->previous = yyextra->current;
8539 yyextra->current = yyextra->tempEntry;
8540 yyextra->tempEntry.reset();
8541 }
8542 initEntry(yyscanner);
8543}
8544
8545static void handleCommentBlock(yyscan_t yyscanner,const DString &doc,bool brief)
8546{
8547 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8548 AUTO_TRACE("doc='{}' is_brief={}",Trace::trunc(doc),brief);
8549 bool hideInBodyDocs = Config_getBool(HIDE_IN_BODY_DOCS);
8550 if (yyextra->docBlockInBody && hideInBodyDocs) return;
8551 int lineNr = brief ? yyextra->current->briefLine : yyextra->current->docLine; // line of block start
8552
8553 // fill in inbodyFile && inbodyLine the first time, see bug 633891
8554 std::shared_ptr<Entry> docEntry = yyextra->docBlockInBody && yyextra->previous ? yyextra->previous : yyextra->current;
8555 if (yyextra->docBlockInBody && docEntry && docEntry->inbodyLine==-1)
8556 {
8557 docEntry->inbodyFile = yyextra->fileName;
8558 docEntry->inbodyLine = lineNr;
8559 }
8560
8561 int position=0;
8562 bool needsEntry=false;
8563 GuardedSectionStack guards;
8564 Markdown markdown(yyextra->fileName,lineNr);
8565 DString strippedDoc = stripIndentation(doc);
8566 DString processedDoc = Config_getBool(MARKDOWN_SUPPORT) ? markdown.process(strippedDoc,lineNr) : strippedDoc;
8567 while (yyextra->commentScanner.parseCommentBlock(
8568 yyextra->thisParser,
8569 yyextra->docBlockInBody && yyextra->previous ? yyextra->previous.get() : yyextra->current.get(),
8570 processedDoc, // text
8571 yyextra->fileName, // file
8572 lineNr, // line of block start
8573 yyextra->docBlockInBody ? false : brief, // isBrief
8574 yyextra->docBlockInBody ? false : yyextra->docBlockAutoBrief, // isJavaDocStyle
8575 yyextra->docBlockInBody, // isInBody
8576 yyextra->protection,
8577 position,
8578 needsEntry,
8579 Config_getBool(MARKDOWN_SUPPORT),
8580 &guards
8581 )
8582 )
8583 {
8584 //printf("parseCommentBlock position=%d [%s]\n",position,qPrint(doc)+position);
8585 if (needsEntry)
8586 {
8587 DString docFile = yyextra->current->docFile;
8588 newEntry(yyscanner);
8589 yyextra->current->docFile = docFile;
8590 yyextra->current->docLine = lineNr;
8591 }
8592 }
8593 if (needsEntry)
8594 {
8595 newEntry(yyscanner);
8596 }
8597
8598 if (yyextra->docBlockTerm)
8599 {
8600 unput(yyextra->docBlockTerm);
8601 yyextra->docBlockTerm=0;
8602 }
8603}
8604
8606{
8607 AUTO_TRACE();
8608 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8609 for (Argument &a : al)
8610 {
8611 AUTO_TRACE_ADD("Param '{}' docs='{}'",a.name,Trace::trunc(a.docs));
8612 if (!a.docs.empty())
8613 {
8614 if (a.name.empty() && a.type == "...") a.name= "...";
8615 int position=0;
8616 bool needsEntry;
8617
8618 // save context
8619 DString orgDoc = yyextra->current->doc;
8620 DString orgBrief = yyextra->current->brief;
8621 int orgDocLine = yyextra->current->docLine;
8622 int orgBriefLine = yyextra->current->briefLine;
8623
8624 yyextra->current->doc.clear();
8625 yyextra->current->brief.clear();
8626
8627 //printf("handleParametersCommentBlock [%s]\n",qPrint(doc));
8628 int lineNr = orgDocLine;
8629 GuardedSectionStack guards;
8630 Markdown markdown(yyextra->fileName,lineNr);
8631 DString strippedDoc = stripIndentation(a.docs);
8632 DString processedDoc = Config_getBool(MARKDOWN_SUPPORT) ? markdown.process(strippedDoc,lineNr) : strippedDoc;
8633 while (yyextra->commentScanner.parseCommentBlock(
8634 yyextra->thisParser,
8635 yyextra->current.get(),
8636 processedDoc, // text
8637 yyextra->fileName, // file
8638 lineNr,
8639 false,
8640 false,
8641 false,
8642 yyextra->protection,
8643 position,
8644 needsEntry,
8645 Config_getBool(MARKDOWN_SUPPORT),
8646 &guards
8647 )
8648 )
8649 {
8650 //printf("handleParametersCommentBlock position=%d [%s]\n",position,qPrint(doc)+position);
8651 if (needsEntry) newEntry(yyscanner);
8652 }
8653 if (needsEntry)
8654 {
8655 newEntry(yyscanner);
8656 }
8657 a.docs = yyextra->current->doc;
8658
8659 // restore context
8660 yyextra->current->doc = orgDoc;
8661 yyextra->current->brief = orgBrief;
8662 yyextra->current->docLine = orgDocLine;
8663 yyextra->current->briefLine = orgBriefLine;
8664 }
8665 }
8666}
8667
8668
8669//----------------------------------------------------------------------------
8670
8671static void parseCompounds(yyscan_t yyscanner,const std::shared_ptr<Entry> &rt)
8672{
8673 AUTO_TRACE("name={}",rt->name);
8674 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8675 for (const auto &ce : rt->children())
8676 {
8677 if (!ce->program.empty())
8678 {
8679 AUTO_TRACE_ADD("compound name='{}' program='{}'",Trace::trunc(ce->name),Trace::trunc(ce->program.str()));
8680 // init scanner state
8681 yyextra->padCount=0;
8682 yyextra->column=0;
8683 yyextra->programStr = ce->program.str();
8684 yyextra->inputString = yyextra->programStr.data();
8685 yyextra->inputPosition = 0;
8686 if (ce->section.isEnum() || ce->spec.isEnum())
8687 BEGIN( FindFields ) ;
8688 else
8689 BEGIN( FindMembers ) ;
8690 yyextra->current_root = ce;
8691 yyextra->fileName = ce->fileName;
8692 //setContext();
8693 yyextra->yyLineNr = ce->bodyLine;
8694 yyextra->yyColNr = ce->bodyColumn;
8695 yyextra->insideObjC = ce->lang==SrcLangExt::ObjC;
8696 //printf("---> Inner block starts at line %d objC=%d\n",yyextra->yyLineNr,yyextra->insideObjC);
8697 yyextra->current = std::make_shared<Entry>();
8698 yyextra->isStatic = false;
8699 initEntry(yyscanner);
8700
8701 // deep copy group list from parent (see bug 727732)
8702 bool autoGroupNested = Config_getBool(GROUP_NESTED_COMPOUNDS);
8703 if (autoGroupNested && !rt->groups.empty() && !ce->section.isEnum() && !ce->spec.isEnum())
8704 {
8705 ce->groups = rt->groups;
8706 }
8707
8708 size_t ni=ce->name.rfind("::");
8709 if (ni==DString::npos) ni=0; else ni+=2;
8710 // set default protection based on the compound type
8711 if ( ce->section.isClass() ) // class
8712 {
8713 if (yyextra->insidePHP || yyextra->insideD || yyextra->insideJS || yyextra->insideIDL || yyextra->insideSlice)
8714 {
8715 yyextra->current->protection = yyextra->protection = Protection::Public ;
8716 }
8717 else if (yyextra->insideJava)
8718 {
8719 yyextra->current->protection = yyextra->protection = (ce->spec.isInterface() || ce->spec.isEnum()) ? Protection::Public : Protection::Package;
8720 }
8721 else if (ce->spec.isInterface() || ce->spec.isRef() || ce->spec.isValue() || ce->spec.isStruct() || ce->spec.isUnion())
8722 {
8723 if (ce->lang==SrcLangExt::ObjC)
8724 {
8725 yyextra->current->protection = yyextra->protection = Protection::Protected ;
8726 }
8727 else
8728 {
8729 yyextra->current->protection = yyextra->protection = Protection::Public ;
8730 }
8731 }
8732 else
8733 {
8734 yyextra->current->protection = yyextra->protection = Protection::Private ;
8735 }
8736 }
8737 else if (ce->section.isEnum() ) // enum
8738 {
8739 yyextra->current->protection = yyextra->protection = ce->protection;
8740 }
8741 else if (!ce->name.empty() && ce->name.at(ni)=='@') // unnamed union or namespace
8742 {
8743 if (ce->section.isNamespace() ) // unnamed namespace
8744 {
8745 yyextra->current->isStatic = yyextra->isStatic = true;
8746 }
8747 yyextra->current->protection = yyextra->protection = ce->protection;
8748 yyextra->current->exported = yyextra->exported = false;
8749 }
8750 else if (ce->section.isNamespace() )
8751 {
8752 yyextra->current->protection = yyextra->protection = Protection::Public ;
8753 yyextra->current->exported = yyextra->exported = ce->exported;
8754 }
8755 else // named struct, union, protocol, category
8756 {
8757 yyextra->current->protection = yyextra->protection = Protection::Public ;
8758 yyextra->current->exported = yyextra->exported = false;
8759 }
8760 yyextra->mtype = MethodTypes::Method;
8761 yyextra->virt = Specifier::Normal;
8762 //printf("name=%s yyextra->current->isStatic=%d yyextra->isStatic=%d\n",qPrint(ce->name),yyextra->current->isStatic,yyextra->isStatic);
8763
8764 //memberGroupId = DOX_NOGROUP;
8765 //memberGroupRelates.clear();
8766 //memberGroupInside.clear();
8767 DString name = ce->name;
8768 yyextra->commentScanner.enterCompound(yyextra->fileName,yyextra->yyLineNr,name);
8769
8770 scannerYYlex(yyscanner);
8771 //forceEndGroup();
8772
8773 yyextra->commentScanner.leaveCompound(yyextra->fileName,yyextra->yyLineNr,name);
8774
8775 yyextra->programStr.clear();
8776 ce->program.str(std::string());
8777
8778
8779 //if (depthIf>0)
8780 //{
8781 // warn(yyextra->fileName,yyextra->yyLineNr,"Documentation block ended in the middle of a conditional section!");
8782 //}
8783 }
8784 parseCompounds(yyscanner,ce);
8785 }
8786}
8787
8788static void parseConcepts(yyscan_t yyscanner,const std::shared_ptr<Entry> &rt)
8789{
8790 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8791 for (const auto &ce : rt->children())
8792 {
8793 if (ce->section.isConcept())
8794 {
8795 //printf("*** found concept '%s' value=[[\n%s\n]] line=%d,col=%d\n",
8796 // qPrint(ce->name),qPrint(ce->initializer.str()),ce->startLine,ce->startColumn);
8797 yyextra->commentScanner.enterCompound(yyextra->fileName,yyextra->yyLineNr,ce->name);
8798 // init scanner state
8799 yyextra->padCount =0;
8800 yyextra->column =0;
8801 yyextra->programStr = ce->initializer.str();
8802 yyextra->inputString = yyextra->programStr.data();
8803 yyextra->inputPosition = 0;
8804 yyextra->current_root = ce;
8805 yyextra->fileName = ce->fileName;
8806 yyextra->yyLineNr = ce->bodyLine;
8807 yyextra->yyColNr = ce->bodyColumn;
8808 yyextra->insideObjC = false;
8809 yyextra->current = std::make_shared<Entry>();
8810
8811 // hack to reconstruct what was in the code before the concept expression
8812 DString indent;
8813 indent.fill(' ',ce->startColumn?ce->startColumn-1:0);
8814 DString templArgs;
8815 if (!ce->args.empty())
8816 {
8817 templArgs=indent+"template"+ce->args+"\n";
8818 }
8819 yyextra->current->initializer.str(DString(templArgs+indent+"concept "+ce->name+ " =").str());
8820
8821 yyextra->isStatic = false;
8822 initEntry(yyscanner);
8823 yyextra->current->section = EntryType::makeConceptCodePart();
8824 yyextra->current->startLine = yyextra->yyLineNr;
8825 BEGIN( FindConceptParts );
8826 scannerYYlex(yyscanner);
8827 yyextra->commentScanner.leaveCompound(yyextra->fileName,yyextra->yyLineNr,ce->name);
8828
8829 }
8830 parseConcepts(yyscanner,ce);
8831 }
8832}
8833
8834//----------------------------------------------------------------------------
8835
8836static void parseMain(yyscan_t yyscanner,
8837 const DString &fileName,
8838 const char *fileBuf,
8839 const std::shared_ptr<Entry> &rt,
8840 ClangTUParser *clangParser)
8841{
8842 AUTO_TRACE("fileName={}",fileName);
8843 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8844 initParser(yyscanner);
8845
8846 yyextra->inputString = fileBuf;
8847 yyextra->inputPosition = 0;
8848 yyextra->column = 0;
8849 scannerYYrestart(nullptr,yyscanner);
8850
8851 //depthIf = 0;
8852 yyextra->protection = Protection::Public;
8853 yyextra->mtype = MethodTypes::Method;
8854 yyextra->isStatic = false;
8855 yyextra->exported = false;
8856 yyextra->virt = Specifier::Normal;
8857 yyextra->current_root = rt;
8858 yyextra->yyLineNr = 1 ;
8859 yyextra->yyBegLineNr = 1;
8860 yyextra->yyBegColNr = 0;
8861 yyextra->anonCount = 0;
8862 yyextra->anonNSCount = 0;
8863 yyextra->fileName = fileName;
8864 yyextra->clangParser = clangParser;
8865 setContext(yyscanner);
8866 rt->lang = yyextra->language;
8867 msg("Parsing file {}...\n",yyextra->fileName);
8868
8869 yyextra->current_root = rt;
8870 initParser(yyscanner);
8871 yyextra->commentScanner.enterFile(yyextra->fileName,yyextra->yyLineNr);
8872 yyextra->current = std::make_shared<Entry>();
8873 //printf("yyextra->current=%p yyextra->current_root=%p\n",yyextra->current,yyextra->current_root);
8874 EntryType sec=EntryType::guessSection(yyextra->fileName);
8875 if (!sec.isEmpty())
8876 {
8877 yyextra->current->name = yyextra->fileName;
8878 yyextra->current->section = sec;
8879 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
8880 }
8881 yyextra->current->reset();
8882 initEntry(yyscanner);
8883 if ( yyextra->insidePHP )
8884 {
8885 BEGIN( FindMembersPHP );
8886 }
8887 else if ( yyextra->insideJava ) // add default java.lang package scope
8888 {
8889 yyextra->current->name="java::lang"; // '::' is used in doxygen's internal representation as a scope separator
8890 yyextra->current->fileName = yyextra->fileName;
8891 yyextra->current->section = EntryType::makeUsingDir();
8892 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
8893 initEntry(yyscanner);
8894 BEGIN( FindMembers );
8895 }
8896 else
8897 {
8898 BEGIN( FindMembers );
8899 }
8900
8901 scannerYYlex(yyscanner);
8902
8903 if (YY_START==Comment)
8904 {
8905 warn(yyextra->fileName,yyextra->yyLineNr,"File ended in the middle of a comment block! Perhaps a missing \\endcode?");
8906 }
8907
8908 //forceEndGroup();
8909 yyextra->commentScanner.leaveFile(yyextra->fileName,yyextra->yyLineNr);
8910
8911 yyextra->programStr.clear();
8912 rt->program.str(std::string());
8913
8914 parseCompounds(yyscanner,rt);
8915 parseConcepts(yyscanner,rt);
8916
8917 yyextra->anonNSCount++;
8918
8919 // add additional entries that were created during processing
8920 for (auto &[parent,child]: yyextra->outerScopeEntries)
8921 {
8922 //printf(">>> adding '%s' to scope '%s'\n",qPrint(child->name),qPrint(parent->name));
8923 parent->moveToSubEntryAndKeep(child);
8924 }
8925 yyextra->outerScopeEntries.clear();
8926
8927}
8928
8929//----------------------------------------------------------------------------
8930
8931static void parsePrototype(yyscan_t yyscanner,const DString &text)
8932{
8933 AUTO_TRACE("text='{}'",Trace::trunc(text));
8934 struct yyguts_t *yyg = (struct yyguts_t*)yyscanner;
8935 if (text.empty())
8936 {
8937 warn(yyextra->fileName,yyextra->yyLineNr,"Empty prototype found!");
8938 return;
8939 }
8940 if (!yyextra->current) // nothing to store (see bug683516)
8941 {
8942 return;
8943 }
8944
8945 const char *orgInputString;
8946 int orgInputPosition;
8947 YY_BUFFER_STATE orgState;
8948
8949 // save scanner state
8950 orgState = YY_CURRENT_BUFFER;
8951 yy_switch_to_buffer(yy_create_buffer(nullptr, YY_BUF_SIZE, yyscanner), yyscanner);
8952 orgInputString = yyextra->inputString;
8953 orgInputPosition = yyextra->inputPosition;
8954
8955 // set new string
8956 yyextra->inputString = text.data();
8957 yyextra->inputPosition = 0;
8958 yyextra->column = 0;
8959 scannerYYrestart(nullptr, yyscanner);
8960 BEGIN(Prototype);
8961 scannerYYlex(yyscanner);
8962
8963 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
8964 if (yyextra->current->section.isMemberDoc() && yyextra->current->args.empty())
8965 {
8966 yyextra->current->section = EntryType::makeVariableDoc();
8967 }
8968
8969 // restore original scanner state
8970 yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner);
8971 yy_switch_to_buffer(orgState, yyscanner);
8972 yyextra->inputString = orgInputString;
8973 yyextra->inputPosition = orgInputPosition;
8974
8975
8976 //printf("**** parsePrototype end\n");
8977}
8978
8979//----------------------------------------------------------------------------
8980
8986
8988{
8989 scannerYYlex_init_extra(&p->state,&p->yyscanner);
8990#ifdef FLEX_DEBUG
8991 scannerYYset_debug(Debug::isFlagSet(Debug::Lex_scanner)?1:0,p->yyscanner);
8992#endif
8993}
8994
8996{
8997 scannerYYlex_destroy(p->yyscanner);
8998}
8999
9001 const char *fileBuf,
9002 const std::shared_ptr<Entry> &root,
9003 ClangTUParser *clangParser)
9004{
9005 AUTO_TRACE();
9006 struct yyguts_t *yyg = (struct yyguts_t*)p->yyscanner;
9007 yyextra->thisParser = this;
9008
9009 DebugLex debugLex(Debug::Lex_scanner, __FILE__, qPrint(fileName));
9010
9011 ::parseMain(p->yyscanner,fileName,fileBuf,root,clangParser);
9012}
9013
9014
9016{
9017 DString fe=extension.lower();
9018 SrcLangExt lang = getLanguageFromFileName(extension);
9019 return (SrcLangExt::Cpp == lang) || (SrcLangExt::Lex == lang) ||
9020 !( fe==".java" || fe==".as" || fe==".d" || fe==".php" ||
9021 fe==".php4" || fe==".inc" || fe==".phtml"|| fe==".php5"
9022 );
9023}
9024
9026{
9027 ::parsePrototype(p->yyscanner,text);
9028}
9029
9030//----------------------------------------------------------------------------
9031
9032#include "scanner.l.h"
DString docs
Definition arguments.h:48
DString name
Definition arguments.h:45
void parsePrototype(const DString &text) override
Callback function called by the comment block scanner.
Definition scanner.l:9025
bool needsPreprocessing(const DString &extension) const override
Returns true if the language identified by extension needs the C preprocessor to be run before feed t...
Definition scanner.l:9015
void parseInput(const DString &fileName, const char *fileBuf, const std::shared_ptr< Entry > &root, ClangTUParser *clangParser) override
Parses a single input file with the goal to build an Entry tree.
Definition scanner.l:9000
std::unique_ptr< Private > p
Definition scanner.h:44
~COutlineParser() override
Definition scanner.l:8995
DString & setNum(short n)
Definition dstring.h:552
DString lower() const
Definition dstring.h:326
std::string_view view() const
Definition dstring.h:162
bool stripPrefix(const DString &prefix)
Definition dstring.h:290
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition dstring.h:157
bool endsWith(const char *s) const
Definition dstring.h:617
@ Lex_scanner
Definition debug.h:69
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:132
Protection protection
class protection
Definition entry.h:179
static EntryType guessSection(const DString &name)
Definition types.cpp:22
Helper class to process markdown formatted text.
Definition markdown.h:33
DString process(const DString &input, int &startNewlines, bool fromParseInput=false)
#define YY_BUF_SIZE
Definition commentcnv.l:19
std::stack< GuardedSection > GuardedSectionStack
Definition commentscan.h:48
#define Config_getInt(name)
Definition config.h:34
#define AUTO_TRACE_ADD(...)
Definition docnode.cpp:54
#define AUTO_TRACE(...)
Definition docnode.cpp:53
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
Definition docnode.h:1335
const char * qPrint(const char *s)
Definition dstring.h:783
std::array< uint8_t, 16 > md5hash(const std::string_view &str)
Definition md5hash.h:26
#define msg(fmt,...)
Definition message.h:94
DString trunc(const DString &s, size_t numChars=15)
Definition trace.h:56
Definition dstring.h:913
static void newEntry(yyscan_t yyscanner)
Definition scanner.l:8525
static void parseMain(yyscan_t yyscanner, const DString &fileName, const char *fileBuf, const std::shared_ptr< Entry > &rt, ClangTUParser *clangParser)
Definition scanner.l:8836
static void parseCompounds(yyscan_t yyscanner, const std::shared_ptr< Entry > &rt)
Definition scanner.l:8671
static void parsePrototype(yyscan_t yyscanner, const DString &text)
Definition scanner.l:8931
static void parseConcepts(yyscan_t yyscanner, const std::shared_ptr< Entry > &rt)
Definition scanner.l:8788
scannerYY_state state
Definition scanner.l:8984
SrcLangExt getLanguageFromFileName(const DString &fileName, SrcLangExt defLang)
Definition util.cpp:4169
DString stripIndentation(const DString &s, bool skipFirstLine)
Definition util.cpp:4684
DString stripFromPath(const DString &path)
Definition util.cpp:219