|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
%option never-interactive
|
|
Packit |
1c1d7e |
%option prefix="codeYY"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%{
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* includes
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
#include <stdio.h>
|
|
Packit |
1c1d7e |
#include <assert.h>
|
|
Packit |
1c1d7e |
#include <ctype.h>
|
|
Packit |
1c1d7e |
#include <qregexp.h>
|
|
Packit |
1c1d7e |
#include <qdir.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "entry.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "message.h"
|
|
Packit |
1c1d7e |
#include "outputlist.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "membername.h"
|
|
Packit |
1c1d7e |
#include "searchindex.h"
|
|
Packit |
1c1d7e |
#include "arguments.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "groupdef.h"
|
|
Packit |
1c1d7e |
#include "classlist.h"
|
|
Packit |
1c1d7e |
#include "filedef.h"
|
|
Packit |
1c1d7e |
#include "filename.h"
|
|
Packit |
1c1d7e |
#include "namespacedef.h"
|
|
Packit |
1c1d7e |
#include "tooltip.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Toggle for some debugging info
|
|
Packit |
1c1d7e |
//#define DBG_CTX(x) fprintf x
|
|
Packit |
1c1d7e |
#define DBG_CTX(x) do { } while(0)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#define YY_NO_UNISTD_H 1
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#define CLASSBLOCK (int *)4
|
|
Packit |
1c1d7e |
#define SCOPEBLOCK (int *)8
|
|
Packit |
1c1d7e |
#define INNERBLOCK (int *)12
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/* -----------------------------------------------------------------
|
|
Packit |
1c1d7e |
* statics
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static CodeOutputInterface * g_code;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static ClassSDict *g_codeClassSDict = 0;
|
|
Packit |
1c1d7e |
static QCString g_curClassName;
|
|
Packit |
1c1d7e |
static QStrList g_curClassBases;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString g_parmType;
|
|
Packit |
1c1d7e |
static QCString g_parmName;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static const char * g_inputString; //!< the code fragment as text
|
|
Packit |
1c1d7e |
static int g_inputPosition; //!< read offset during parsing
|
|
Packit |
1c1d7e |
static int g_inputLines; //!< number of line in the code fragment
|
|
Packit |
1c1d7e |
static int g_yyLineNr; //!< current line number
|
|
Packit |
1c1d7e |
static int g_yyColNr; //!< current column number
|
|
Packit |
1c1d7e |
static bool g_needsTermination;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool g_exampleBlock;
|
|
Packit |
1c1d7e |
static QCString g_exampleName;
|
|
Packit |
1c1d7e |
static QCString g_exampleFile;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool g_insideTemplate = FALSE;
|
|
Packit |
1c1d7e |
static QCString g_type;
|
|
Packit |
1c1d7e |
static QCString g_name;
|
|
Packit |
1c1d7e |
static QCString g_args;
|
|
Packit |
1c1d7e |
static QCString g_classScope;
|
|
Packit |
1c1d7e |
static QCString g_realScope;
|
|
Packit |
1c1d7e |
static QStack<int> g_scopeStack; //!< 1 if bracket starts a scope,
|
|
Packit |
1c1d7e |
// 2 for internal blocks
|
|
Packit |
1c1d7e |
static int g_anchorCount;
|
|
Packit |
1c1d7e |
static FileDef * g_sourceFileDef;
|
|
Packit |
1c1d7e |
static bool g_lineNumbers;
|
|
Packit |
1c1d7e |
static Definition * g_currentDefinition;
|
|
Packit |
1c1d7e |
static MemberDef * g_currentMemberDef;
|
|
Packit |
1c1d7e |
static bool g_includeCodeFragment;
|
|
Packit |
1c1d7e |
static const char * g_currentFontClass;
|
|
Packit |
1c1d7e |
static bool g_searchingForBody;
|
|
Packit |
1c1d7e |
static bool g_insideBody;
|
|
Packit |
1c1d7e |
static int g_bodyCurlyCount;
|
|
Packit |
1c1d7e |
static QCString g_saveName;
|
|
Packit |
1c1d7e |
static QCString g_saveType;
|
|
Packit |
1c1d7e |
static QCString g_delimiter;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int g_bracketCount = 0;
|
|
Packit |
1c1d7e |
static int g_curlyCount = 0;
|
|
Packit |
1c1d7e |
static int g_sharpCount = 0;
|
|
Packit |
1c1d7e |
static bool g_inFunctionTryBlock = FALSE;
|
|
Packit |
1c1d7e |
static bool g_inForEachExpression = FALSE;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int g_lastTemplCastContext;
|
|
Packit |
1c1d7e |
static int g_lastSpecialCContext;
|
|
Packit |
1c1d7e |
static int g_lastStringContext;
|
|
Packit |
1c1d7e |
static int g_lastSkipCppContext;
|
|
Packit |
1c1d7e |
static int g_lastVerbStringContext;
|
|
Packit |
1c1d7e |
static int g_lastObjCCallContext;
|
|
Packit |
1c1d7e |
static int g_memCallContext;
|
|
Packit |
1c1d7e |
static int g_lastCContext;
|
|
Packit |
1c1d7e |
static int g_skipInlineInitContext;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool g_insideObjC;
|
|
Packit |
1c1d7e |
static bool g_insideJava;
|
|
Packit |
1c1d7e |
static bool g_insideCS;
|
|
Packit |
1c1d7e |
static bool g_insidePHP;
|
|
Packit |
1c1d7e |
static bool g_insideProtocolList;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool g_lexInit = FALSE;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QStack<int> g_classScopeLengthStack;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int g_prefixed_with_this_keyword = FALSE;
|
|
Packit |
1c1d7e |
static Definition *g_searchCtx;
|
|
Packit |
1c1d7e |
static bool g_collectXRefs;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// context for an Objective-C method call
|
|
Packit |
1c1d7e |
struct ObjCCallCtx
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int id;
|
|
Packit |
1c1d7e |
QCString methodName;
|
|
Packit |
1c1d7e |
QCString objectTypeOrName;
|
|
Packit |
1c1d7e |
QGString comment;
|
|
Packit |
1c1d7e |
ClassDef *objectType;
|
|
Packit |
1c1d7e |
MemberDef *objectVar;
|
|
Packit |
1c1d7e |
MemberDef *method;
|
|
Packit |
1c1d7e |
QCString format;
|
|
Packit |
1c1d7e |
int lexState;
|
|
Packit |
1c1d7e |
int braceCount;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// globals for objective-C method calls
|
|
Packit |
1c1d7e |
static ObjCCallCtx *g_currentCtx=0;
|
|
Packit |
1c1d7e |
static int g_currentCtxId=0;
|
|
Packit |
1c1d7e |
static int g_currentNameId=0;
|
|
Packit |
1c1d7e |
static int g_currentObjId=0;
|
|
Packit |
1c1d7e |
static int g_currentWordId=0;
|
|
Packit |
1c1d7e |
static int g_currentCommentId=0;
|
|
Packit |
1c1d7e |
static QStack<ObjCCallCtx> g_contextStack;
|
|
Packit |
1c1d7e |
static QIntDict<ObjCCallCtx> g_contextDict;
|
|
Packit |
1c1d7e |
static QIntDict<QCString> g_nameDict;
|
|
Packit |
1c1d7e |
static QIntDict<QCString> g_objectDict;
|
|
Packit |
1c1d7e |
static QIntDict<QCString> g_wordDict;
|
|
Packit |
1c1d7e |
static QIntDict<QCString> g_commentDict;
|
|
Packit |
1c1d7e |
static int g_braceCount=0;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void saveObjCContext();
|
|
Packit |
1c1d7e |
static void restoreObjCContext();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString g_forceTagReference;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//-------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! Represents a stack of variable to class mappings as found in the
|
|
Packit |
1c1d7e |
* code. Each scope is enclosed in pushScope() and popScope() calls.
|
|
Packit |
1c1d7e |
* Variables are added by calling addVariables() and one can search
|
|
Packit |
1c1d7e |
* for variable using findVariable().
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
class VariableContext
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
static const ClassDef *dummyContext;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class Scope : public SDict<ClassDef>
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
Scope() : SDict<ClassDef>(17) {}
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
VariableContext()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_scopes.setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
virtual ~VariableContext()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void pushScope()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_scopes.append(new Scope);
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** Push var context %d\n",m_scopes.count()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void popScope()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_scopes.count()>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** Pop var context %d\n",m_scopes.count()));
|
|
Packit |
1c1d7e |
m_scopes.remove(m_scopes.count()-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** ILLEGAL: Pop var context\n"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void clear()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_scopes.clear();
|
|
Packit |
1c1d7e |
m_globalScope.clear();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void clearExceptGlobal()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** Clear var context\n"));
|
|
Packit |
1c1d7e |
m_scopes.clear();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void addVariable(const QCString &type,const QCString &name);
|
|
Packit |
1c1d7e |
ClassDef *findVariable(const QCString &name);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int count() const { return m_scopes.count(); }
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
Scope m_globalScope;
|
|
Packit |
1c1d7e |
QList<Scope> m_scopes;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void VariableContext::addVariable(const QCString &type,const QCString &name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("VariableContext::addVariable(%s,%s)\n",type.data(),name.data());
|
|
Packit |
1c1d7e |
QCString ltype = type.simplifyWhiteSpace();
|
|
Packit |
1c1d7e |
QCString lname = name.simplifyWhiteSpace();
|
|
Packit |
1c1d7e |
if (ltype.left(7)=="struct ")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ltype = ltype.right(ltype.length()-7);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (ltype.left(6)=="union ")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ltype = ltype.right(ltype.length()-6);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (ltype.isEmpty() || lname.isEmpty()) return;
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** addVariable trying: type='%s' name='%s' g_currentDefinition=%s\n",
|
|
Packit |
1c1d7e |
ltype.data(),lname.data(),g_currentDefinition?g_currentDefinition->name().data():"<none>"));
|
|
Packit |
1c1d7e |
Scope *scope = m_scopes.count()==0 ? &m_globalScope : m_scopes.getLast();
|
|
Packit |
1c1d7e |
ClassDef *varType;
|
|
Packit |
1c1d7e |
int i=0;
|
|
Packit |
1c1d7e |
if (
|
|
Packit |
1c1d7e |
(varType=g_codeClassSDict->find(ltype)) || // look for class definitions inside the code block
|
|
Packit |
1c1d7e |
(varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,ltype)) // look for global class definitions
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** addVariable type='%s' name='%s'\n",ltype.data(),lname.data()));
|
|
Packit |
1c1d7e |
scope->append(lname,varType); // add it to a list
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if ((i=ltype.find('<'))!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// probably a template class
|
|
Packit |
1c1d7e |
QCString typeName(ltype.left(i));
|
|
Packit |
1c1d7e |
ClassDef* newDef = 0;
|
|
Packit |
1c1d7e |
QCString templateArgs(ltype.right(ltype.length() - i));
|
|
Packit |
1c1d7e |
if (
|
|
Packit |
1c1d7e |
( // look for class definitions inside the code block
|
|
Packit |
1c1d7e |
(varType=g_codeClassSDict->find(typeName)) ||
|
|
Packit |
1c1d7e |
// otherwise look for global class definitions
|
|
Packit |
1c1d7e |
(varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,typeName,0,0,TRUE,TRUE))
|
|
Packit |
1c1d7e |
) && // and it must be a template
|
|
Packit |
1c1d7e |
varType->templateArguments())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
newDef = varType->getVariableInstance( templateArgs );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (newDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** addVariable type='%s' templ='%s' name='%s'\n",typeName.data(),templateArgs.data(),lname.data()));
|
|
Packit |
1c1d7e |
scope->append(lname, newDef);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// Doesn't seem to be a template. Try just the base name.
|
|
Packit |
1c1d7e |
addVariable(typeName,name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_scopes.count()>0) // for local variables add a dummy entry so the name
|
|
Packit |
1c1d7e |
// is hidden to avoid false links to global variables with the same name
|
|
Packit |
1c1d7e |
// TODO: make this work for namespaces as well!
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** addVariable: dummy context for '%s'\n",lname.data()));
|
|
Packit |
1c1d7e |
scope->append(lname,dummyContext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** addVariable: not adding variable!\n"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ClassDef *VariableContext::findVariable(const QCString &name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (name.isEmpty()) return 0;
|
|
Packit |
1c1d7e |
ClassDef *result = 0;
|
|
Packit |
1c1d7e |
QListIterator<Scope> sli(m_scopes);
|
|
Packit |
1c1d7e |
Scope *scope;
|
|
Packit |
1c1d7e |
QCString key = name;
|
|
Packit |
1c1d7e |
// search from inner to outer scope
|
|
Packit |
1c1d7e |
for (sli.toLast();(scope=sli.current());--sli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result = scope->find(key);
|
|
Packit |
1c1d7e |
if (result)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// nothing found -> also try the global scope
|
|
Packit |
1c1d7e |
result=m_globalScope.find(name);
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static VariableContext g_theVarContext;
|
|
Packit |
1c1d7e |
const ClassDef *VariableContext::dummyContext = (ClassDef*)0x8;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//-------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class CallContext
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
struct Ctx
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Ctx() : name(g_name), type(g_type), d(0) {}
|
|
Packit |
1c1d7e |
QCString name;
|
|
Packit |
1c1d7e |
QCString type;
|
|
Packit |
1c1d7e |
Definition *d;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
CallContext()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_defList.append(new Ctx);
|
|
Packit |
1c1d7e |
m_defList.setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
virtual ~CallContext() {}
|
|
Packit |
1c1d7e |
void setScope(Definition *d)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Ctx *ctx = m_defList.getLast();
|
|
Packit |
1c1d7e |
if (ctx)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** Set call context %s (%p)\n",d==0 ? "<null>" : d->name().data(),d));
|
|
Packit |
1c1d7e |
ctx->d=d;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void pushScope()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_defList.append(new Ctx);
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** Push call context %d\n",m_defList.count()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void popScope()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_defList.count()>1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** Pop call context %d\n",m_defList.count()));
|
|
Packit |
1c1d7e |
Ctx *ctx = m_defList.getLast();
|
|
Packit |
1c1d7e |
if (ctx)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_name = ctx->name;
|
|
Packit |
1c1d7e |
g_type = ctx->type;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_defList.removeLast();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** ILLEGAL: Pop call context\n"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void clear()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** Clear call context\n"));
|
|
Packit |
1c1d7e |
m_defList.clear();
|
|
Packit |
1c1d7e |
m_defList.append(new Ctx);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
Definition *getScope() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Ctx *ctx = m_defList.getLast();
|
|
Packit |
1c1d7e |
if (ctx) return ctx->d; else return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
QList<Ctx> m_defList;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static CallContext g_theCallContext;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//-------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! add class/namespace name s to the scope */
|
|
Packit |
1c1d7e |
static void pushScope(const char *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_classScopeLengthStack.push(new int(g_classScope.length()));
|
|
Packit |
1c1d7e |
if (g_classScope.isEmpty() || leftScopeMatch(s,g_classScope))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_classScope = s;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_classScope += "::";
|
|
Packit |
1c1d7e |
g_classScope += s;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("pushScope(%s) result: `%s'\n",s,g_classScope.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! remove the top class/namespace name from the scope */
|
|
Packit |
1c1d7e |
static void popScope()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!g_classScopeLengthStack.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int *pLength = g_classScopeLengthStack.pop();
|
|
Packit |
1c1d7e |
g_classScope.truncate(*pLength);
|
|
Packit |
1c1d7e |
delete pLength;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//err("Too many end of scopes found!\n");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("popScope() result: `%s'\n",g_classScope.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void setCurrentDoc(const QCString &anchor)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (Doxygen::searchIndex)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_searchCtx)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->setCurrentDoc(g_searchCtx,g_searchCtx->anchor(),FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->setCurrentDoc(g_sourceFileDef,anchor,TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void addToSearchIndex(const char *text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (Doxygen::searchIndex)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->addWord(text,FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void setClassScope(const QCString &name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("setClassScope(%s)\n",name.data());
|
|
Packit |
1c1d7e |
QCString n=name;
|
|
Packit |
1c1d7e |
n=n.simplifyWhiteSpace();
|
|
Packit |
1c1d7e |
int ts=n.find('<'); // start of template
|
|
Packit |
1c1d7e |
int te=n.findRev('>'); // end of template
|
|
Packit |
1c1d7e |
//printf("ts=%d te=%d\n",ts,te);
|
|
Packit |
1c1d7e |
if (ts!=-1 && te!=-1 && te>ts)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// remove template from scope
|
|
Packit |
1c1d7e |
n=n.left(ts)+n.right(n.length()-te-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
while (!g_classScopeLengthStack.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
popScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_classScope.resize(0);
|
|
Packit |
1c1d7e |
int i;
|
|
Packit |
1c1d7e |
while ((i=n.find("::"))!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
pushScope(n.left(i));
|
|
Packit |
1c1d7e |
n = n.mid(i+2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
pushScope(n);
|
|
Packit |
1c1d7e |
//printf("--->New class scope `%s'\n",g_classScope.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! start a new line of code, inserting a line number if g_sourceFileDef
|
|
Packit |
1c1d7e |
* is TRUE. If a definition starts at the current line, then the line
|
|
Packit |
1c1d7e |
* number is linked to the documentation of that definition.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
static void startCodeLine()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//if (g_currentFontClass) { g_code->endFontClass(); }
|
|
Packit |
1c1d7e |
if (g_sourceFileDef && g_lineNumbers)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//QCString lineNumber,lineAnchor;
|
|
Packit |
1c1d7e |
//lineNumber.sprintf("%05d",g_yyLineNr);
|
|
Packit |
1c1d7e |
//lineAnchor.sprintf("l%05d",g_yyLineNr);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
|
|
Packit |
1c1d7e |
//printf("%s:startCodeLine(%d)=%p\n",g_sourceFileDef->name().data(),g_yyLineNr,d);
|
|
Packit |
1c1d7e |
if (!g_includeCodeFragment && d)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentDefinition = d;
|
|
Packit |
1c1d7e |
g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
|
|
Packit |
1c1d7e |
g_insideBody = FALSE;
|
|
Packit |
1c1d7e |
g_searchingForBody = TRUE;
|
|
Packit |
1c1d7e |
g_realScope = d->name();
|
|
Packit |
1c1d7e |
//g_classScope = "";
|
|
Packit |
1c1d7e |
g_type.resize(0);
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
g_args.resize(0);
|
|
Packit |
1c1d7e |
g_parmType.resize(0);
|
|
Packit |
1c1d7e |
g_parmName.resize(0);
|
|
Packit |
1c1d7e |
//printf("Real scope: `%s'\n",g_realScope.data());
|
|
Packit |
1c1d7e |
g_bodyCurlyCount = 0;
|
|
Packit |
1c1d7e |
QCString lineAnchor;
|
|
Packit |
1c1d7e |
lineAnchor.sprintf("l%05d",g_yyLineNr);
|
|
Packit |
1c1d7e |
if (g_currentMemberDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->writeLineNumber(g_currentMemberDef->getReference(),
|
|
Packit |
1c1d7e |
g_currentMemberDef->getOutputFileBase(),
|
|
Packit |
1c1d7e |
g_currentMemberDef->anchor(),g_yyLineNr);
|
|
Packit |
1c1d7e |
setCurrentDoc(lineAnchor);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (d->isLinkableInProject())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->writeLineNumber(d->getReference(),
|
|
Packit |
1c1d7e |
d->getOutputFileBase(),
|
|
Packit |
1c1d7e |
0,g_yyLineNr);
|
|
Packit |
1c1d7e |
setCurrentDoc(lineAnchor);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->writeLineNumber(0,0,0,g_yyLineNr);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"startCodeLine(%d)\n",g_yyLineNr));
|
|
Packit |
1c1d7e |
g_code->startCodeLine(g_sourceFileDef && g_lineNumbers);
|
|
Packit |
1c1d7e |
if (g_currentFontClass)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->startFontClass(g_currentFontClass);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void endFontClass();
|
|
Packit |
1c1d7e |
static void startFontClass(const char *s);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void endCodeLine()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"endCodeLine(%d)\n",g_yyLineNr));
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_code->endCodeLine();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void nextCodeLine()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
const char * fc = g_currentFontClass;
|
|
Packit |
1c1d7e |
endCodeLine();
|
|
Packit |
1c1d7e |
if (g_yyLineNr
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentFontClass = fc;
|
|
Packit |
1c1d7e |
startCodeLine();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! write a code fragment `text' that may span multiple lines, inserting
|
|
Packit |
1c1d7e |
* line numbers for each line.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
static void codifyLines(const char *text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
|
|
Packit |
1c1d7e |
const char *p=text,*sp=p;
|
|
Packit |
1c1d7e |
char c;
|
|
Packit |
1c1d7e |
bool done=FALSE;
|
|
Packit |
1c1d7e |
while (!done)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
sp=p;
|
|
Packit |
1c1d7e |
while ((c=*p++) && c!='\n') { g_yyColNr++; }
|
|
Packit |
1c1d7e |
if (c=='\n')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_yyLineNr++;
|
|
Packit |
1c1d7e |
g_yyColNr=1;
|
|
Packit |
1c1d7e |
//*(p-1)='\0';
|
|
Packit |
1c1d7e |
int l = (int)(p-sp-1);
|
|
Packit |
1c1d7e |
char *tmp = (char*)malloc(l+1);
|
|
Packit |
1c1d7e |
memcpy(tmp,sp,l);
|
|
Packit |
1c1d7e |
tmp[l]='\0';
|
|
Packit |
1c1d7e |
g_code->codify(tmp);
|
|
Packit |
1c1d7e |
free(tmp);
|
|
Packit |
1c1d7e |
nextCodeLine();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify(sp);
|
|
Packit |
1c1d7e |
done=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! writes a link to a fragment \a text that may span multiple lines, inserting
|
|
Packit |
1c1d7e |
* line numbers for each line. If \a text contains newlines, the link will be
|
|
Packit |
1c1d7e |
* split into multiple links with the same destination, one for each line.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
static void writeMultiLineCodeLink(CodeOutputInterface &ol,
|
|
Packit |
1c1d7e |
Definition *d,
|
|
Packit |
1c1d7e |
const char *text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
|
|
Packit |
1c1d7e |
TooltipManager::instance()->addTooltip(d);
|
|
Packit |
1c1d7e |
QCString ref = d->getReference();
|
|
Packit |
1c1d7e |
QCString file = d->getOutputFileBase();
|
|
Packit |
1c1d7e |
QCString anchor = d->anchor();
|
|
Packit |
1c1d7e |
QCString tooltip;
|
|
Packit |
1c1d7e |
if (!sourceTooltips) // fall back to simple "title" tooltips
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tooltip = d->briefDescriptionAsTooltip();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
bool done=FALSE;
|
|
Packit |
1c1d7e |
char *p=(char *)text;
|
|
Packit |
1c1d7e |
while (!done)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char *sp=p;
|
|
Packit |
1c1d7e |
char c;
|
|
Packit |
1c1d7e |
while ((c=*p++) && c!='\n') { }
|
|
Packit |
1c1d7e |
if (c=='\n')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_yyLineNr++;
|
|
Packit |
1c1d7e |
*(p-1)='\0';
|
|
Packit |
1c1d7e |
//printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
|
|
Packit |
1c1d7e |
ol.writeCodeLink(ref,file,anchor,sp,tooltip);
|
|
Packit |
1c1d7e |
nextCodeLine();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
|
|
Packit |
1c1d7e |
ol.writeCodeLink(ref,file,anchor,sp,tooltip);
|
|
Packit |
1c1d7e |
done=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void addType()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_name=="const") { g_name.resize(0); return; }
|
|
Packit |
1c1d7e |
if (!g_type.isEmpty()) g_type += ' ' ;
|
|
Packit |
1c1d7e |
g_type += g_name ;
|
|
Packit |
1c1d7e |
g_name.resize(0) ;
|
|
Packit |
1c1d7e |
if (!g_type.isEmpty()) g_type += ' ' ;
|
|
Packit |
1c1d7e |
g_type += g_args ;
|
|
Packit |
1c1d7e |
g_args.resize(0) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void addParmType()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_parmName=="const") { g_parmName.resize(0); return; }
|
|
Packit |
1c1d7e |
if (!g_parmType.isEmpty()) g_parmType += ' ' ;
|
|
Packit |
1c1d7e |
g_parmType += g_parmName ;
|
|
Packit |
1c1d7e |
g_parmName.resize(0) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void addUsingDirective(const char *name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_sourceFileDef && name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
NamespaceDef *nd = Doxygen::namespaceSDict->find(name);
|
|
Packit |
1c1d7e |
if (nd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_sourceFileDef->addUsingDirective(nd);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void setParameterList(MemberDef *md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
|
|
Packit |
1c1d7e |
ArgumentList *al = md->argumentList();
|
|
Packit |
1c1d7e |
if (al==0) return;
|
|
Packit |
1c1d7e |
ArgumentListIterator it(*al);
|
|
Packit |
1c1d7e |
Argument *a;
|
|
Packit |
1c1d7e |
for (;(a=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_parmName = a->name.copy();
|
|
Packit |
1c1d7e |
g_parmType = a->type.copy();
|
|
Packit |
1c1d7e |
int i = g_parmType.find('*');
|
|
Packit |
1c1d7e |
if (i!=-1) g_parmType = g_parmType.left(i);
|
|
Packit |
1c1d7e |
i = g_parmType.find('&';;
|
|
Packit |
1c1d7e |
if (i!=-1) g_parmType = g_parmType.left(i);
|
|
Packit |
1c1d7e |
g_parmType.stripPrefix("const ");
|
|
Packit |
1c1d7e |
g_parmType=g_parmType.stripWhiteSpace();
|
|
Packit |
1c1d7e |
g_theVarContext.addVariable(g_parmType,g_parmName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static ClassDef *stripClassName(const char *s,Definition *d=g_currentDefinition)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int pos=0;
|
|
Packit |
1c1d7e |
QCString type = s;
|
|
Packit |
1c1d7e |
QCString className;
|
|
Packit |
1c1d7e |
QCString templSpec;
|
|
Packit |
1c1d7e |
while (extractClassNameFromType(type,pos,className,templSpec)!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString clName=className+templSpec;
|
|
Packit |
1c1d7e |
ClassDef *cd=0;
|
|
Packit |
1c1d7e |
if (!g_classScope.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
cd=getResolvedClass(d,g_sourceFileDef,g_classScope+"::"+clName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (cd==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
cd=getResolvedClass(d,g_sourceFileDef,clName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("stripClass trying `%s' = %p\n",clName.data(),cd);
|
|
Packit |
1c1d7e |
if (cd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return cd;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static MemberDef *setCallContextForVar(const QCString &name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (name.isEmpty()) return 0;
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"setCallContextForVar(%s) g_classScope=%s\n",name.data(),g_classScope.data()));
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int scopeEnd = name.findRev("::");
|
|
Packit |
1c1d7e |
if (scopeEnd!=-1) // name with explicit scope
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString scope = name.left(scopeEnd);
|
|
Packit |
1c1d7e |
QCString locName = name.right(name.length()-scopeEnd-2);
|
|
Packit |
1c1d7e |
//printf("explicit scope: name=%s scope=%s\n",locName.data(),scope.data());
|
|
Packit |
1c1d7e |
ClassDef *mcd = getClass(scope);
|
|
Packit |
1c1d7e |
if (mcd && !locName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberDef *md=mcd->getMemberByName(locName);
|
|
Packit |
1c1d7e |
if (md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("name=%s scope=%s\n",locName.data(),scope.data());
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
|
|
Packit |
1c1d7e |
return md;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // check namespace as well
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
NamespaceDef *mnd = getResolvedNamespace(scope);
|
|
Packit |
1c1d7e |
if (mnd && !locName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberDef *md=mnd->getMemberByName(locName);
|
|
Packit |
1c1d7e |
if (md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("name=%s scope=%s\n",locName.data(),scope.data());
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
|
|
Packit |
1c1d7e |
return md;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
MemberName *mn;
|
|
Packit |
1c1d7e |
ClassDef *mcd = g_theVarContext.findVariable(name);
|
|
Packit |
1c1d7e |
if (mcd) // local variable
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"local variable?\n"));
|
|
Packit |
1c1d7e |
if (mcd!=VariableContext::dummyContext)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"local var `%s' mcd=%s\n",name.data(),mcd->name().data()));
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(mcd);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"class member? scope=%s\n",g_classScope.data()));
|
|
Packit |
1c1d7e |
// look for a class member
|
|
Packit |
1c1d7e |
mcd = getClass(g_classScope);
|
|
Packit |
1c1d7e |
if (mcd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"Inside class %s\n",mcd->name().data()));
|
|
Packit |
1c1d7e |
MemberDef *md=mcd->getMemberByName(name);
|
|
Packit |
1c1d7e |
if (md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"Found member %s\n",md->name().data()));
|
|
Packit |
1c1d7e |
if (g_scopeStack.top()!=CLASSBLOCK)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"class member `%s' mcd=%s\n",name.data(),mcd->name().data()));
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return md;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// look for a global member
|
|
Packit |
1c1d7e |
if ((mn=Doxygen::functionNameSDict->find(name)))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("global var `%s'\n",name.data());
|
|
Packit |
1c1d7e |
if (mn->count()==1) // global defined only once
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberDef *md=mn->getFirst();
|
|
Packit |
1c1d7e |
if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
|
|
Packit |
1c1d7e |
return md;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (mn->count()>1) // global defined more than once
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberNameIterator it(*mn);
|
|
Packit |
1c1d7e |
MemberDef *md;
|
|
Packit |
1c1d7e |
for (;(md=it.current());++it)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("mn=%p md=%p md->getBodyDef()=%p g_sourceFileDef=%p\n",
|
|
Packit |
1c1d7e |
// mn,md,
|
|
Packit |
1c1d7e |
// md->getBodyDef(),g_sourceFileDef);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// in case there are multiple members we could link to, we
|
|
Packit |
1c1d7e |
// only link to members if defined in the same file or
|
|
Packit |
1c1d7e |
// defined as external.
|
|
Packit |
1c1d7e |
if ((!md->isStatic() || md->getBodyDef()==g_sourceFileDef) &&
|
|
Packit |
1c1d7e |
(g_forceTagReference.isEmpty() || g_forceTagReference==md->getReference())
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
|
|
Packit |
1c1d7e |
//printf("returning member %s in source file %s\n",md->name().data(),g_sourceFileDef->name().data());
|
|
Packit |
1c1d7e |
return md;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void updateCallContextForSmartPointer()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Definition *d = g_theCallContext.getScope();
|
|
Packit |
1c1d7e |
//printf("updateCallContextForSmartPointer() cd=%s\n",cd ? d->name().data() : "<none>");
|
|
Packit |
1c1d7e |
MemberDef *md;
|
|
Packit |
1c1d7e |
if (d && d->definitionType()==Definition::TypeClass && (md=((ClassDef*)d)->isSmartPointer()))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ClassDef *ncd = stripClassName(md->typeString(),md->getOuterScope());
|
|
Packit |
1c1d7e |
if (ncd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(ncd);
|
|
Packit |
1c1d7e |
//printf("Found smart pointer call %s->%s!\n",cd->name().data(),ncd->name().data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool getLinkInScope(const QCString &c, // scope
|
|
Packit |
1c1d7e |
const QCString &m, // member
|
|
Packit |
1c1d7e |
const char *memberText, // exact text
|
|
Packit |
1c1d7e |
CodeOutputInterface &ol,
|
|
Packit |
1c1d7e |
const char *text,
|
|
Packit |
1c1d7e |
bool varOnly=FALSE
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberDef *md;
|
|
Packit |
1c1d7e |
ClassDef *cd;
|
|
Packit |
1c1d7e |
FileDef *fd;
|
|
Packit |
1c1d7e |
NamespaceDef *nd;
|
|
Packit |
1c1d7e |
GroupDef *gd;
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"getLinkInScope: trying `%s'::`%s' varOnly=%d\n",c.data(),m.data(),varOnly));
|
|
Packit |
1c1d7e |
if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef,FALSE,g_forceTagReference) &&
|
|
Packit |
1c1d7e |
(!varOnly || md->isVariable()))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (md->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("found it %s!\n",md->qualifiedName().data());
|
|
Packit |
1c1d7e |
if (g_exampleBlock)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString anchor;
|
|
Packit |
1c1d7e |
anchor.sprintf("a%d",g_anchorCount);
|
|
Packit |
1c1d7e |
//printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
|
|
Packit |
1c1d7e |
// g_exampleFile.data());
|
|
Packit |
1c1d7e |
if (md->addExample(anchor,g_exampleName,g_exampleFile))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.writeCodeAnchor(anchor);
|
|
Packit |
1c1d7e |
g_anchorCount++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Definition *d = md->getOuterScope()==Doxygen::globalScope ?
|
|
Packit |
1c1d7e |
md->getFileDef() : md->getOuterScope();
|
|
Packit |
1c1d7e |
if (md->getGroupDef()) d = md->getGroupDef();
|
|
Packit |
1c1d7e |
if (d && d->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
|
|
Packit |
1c1d7e |
//printf("g_currentDefinition=%p g_currentMemberDef=%p g_insideBody=%d\n",
|
|
Packit |
1c1d7e |
// g_currentDefinition,g_currentMemberDef,g_insideBody);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (g_currentDefinition && g_currentMemberDef &&
|
|
Packit |
1c1d7e |
md!=g_currentMemberDef && g_insideBody && g_collectXRefs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
addDocCrossReference(g_currentMemberDef,md);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("d->getReference()=`%s' d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(ol,md, text ? text : memberText);
|
|
Packit |
1c1d7e |
addToSearchIndex(text ? text : memberText);
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // found member, but is is not linkable, so make sure content inside is not assign
|
|
Packit |
1c1d7e |
// to the previous member, see bug762760
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"unlinkable member %s\n",md->name().data()));
|
|
Packit |
1c1d7e |
g_currentMemberDef = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool getLink(const char *className,
|
|
Packit |
1c1d7e |
const char *memberName,
|
|
Packit |
1c1d7e |
CodeOutputInterface &ol,
|
|
Packit |
1c1d7e |
const char *text=0,
|
|
Packit |
1c1d7e |
bool varOnly=FALSE)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("getLink(%s,%s) g_curClassName=%s\n",className,memberName,g_curClassName.data());
|
|
Packit |
1c1d7e |
QCString m=removeRedundantWhiteSpace(memberName);
|
|
Packit |
1c1d7e |
QCString c=className;
|
|
Packit |
1c1d7e |
if (!getLinkInScope(c,m,memberName,ol,text,varOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!g_curClassName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!c.isEmpty()) c.prepend("::");
|
|
Packit |
1c1d7e |
c.prepend(g_curClassName);
|
|
Packit |
1c1d7e |
return getLinkInScope(c,m,memberName,ol,text,varOnly);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName,
|
|
Packit |
1c1d7e |
bool typeOnly=FALSE,bool varOnly=FALSE)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int i=0;
|
|
Packit |
1c1d7e |
if (*clName=='~') // correct for matching negated values i.s.o. destructors.
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify("~");
|
|
Packit |
1c1d7e |
clName++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QCString className=clName;
|
|
Packit |
1c1d7e |
if (className.isEmpty()) return;
|
|
Packit |
1c1d7e |
if (g_insideProtocolList) // for Obj-C
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
className+="-p";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (g_insidePHP)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
className = substitute(className,"\\","::"); // for PHP namespaces
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (g_insideCS || g_insideJava)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
className = substitute(className,".","::"); // for PHP namespaces
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ClassDef *cd=0,*lcd=0;
|
|
Packit |
1c1d7e |
MemberDef *md=0;
|
|
Packit |
1c1d7e |
bool isLocal=FALSE;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf("generateClassOrGlobalLink(className=%s)\n",className.data());
|
|
Packit |
1c1d7e |
if (!g_prefixed_with_this_keyword || (lcd=g_theVarContext.findVariable(className))==0) // not a local variable
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Definition *d = g_currentDefinition;
|
|
Packit |
1c1d7e |
//printf("d=%s g_sourceFileDef=%s\n",d?d->name().data():"<none>",g_sourceFileDef?g_sourceFileDef->name().data():"<none>");
|
|
Packit |
1c1d7e |
cd = getResolvedClass(d,g_sourceFileDef,className,&md);
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"non-local variable name=%s context=%d cd=%s md=%s!\n",
|
|
Packit |
1c1d7e |
className.data(),g_theVarContext.count(),cd?cd->name().data():"<none>",
|
|
Packit |
1c1d7e |
md?md->name().data():"<none>"));
|
|
Packit |
1c1d7e |
if (cd==0 && md==0 && (i=className.find('<'))!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString bareName = className.left(i); //stripTemplateSpecifiersFromScope(className);
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"bareName=%s\n",bareName.data()));
|
|
Packit |
1c1d7e |
if (bareName!=className)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
cd=getResolvedClass(d,g_sourceFileDef,bareName,&md); // try unspecialized version
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
NamespaceDef *nd = getResolvedNamespace(className);
|
|
Packit |
1c1d7e |
if (nd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(nd);
|
|
Packit |
1c1d7e |
addToSearchIndex(className);
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(*g_code,nd,clName);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("md=%s\n",md?md->name().data():"<none>");
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"is found as a type cd=%s nd=%s\n",
|
|
Packit |
1c1d7e |
cd?cd->name().data():"<null>",
|
|
Packit |
1c1d7e |
nd?nd->name().data():"<null>"));
|
|
Packit |
1c1d7e |
if (cd==0 && md==0) // also see if it is variable or enum or enum value
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (getLink(g_classScope,clName,ol,clName,varOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("local variable!\n");
|
|
Packit |
1c1d7e |
if (lcd!=VariableContext::dummyContext)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("non-dummy context lcd=%s!\n",lcd->name().data());
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(lcd);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// to following is needed for links to a global variable, but is
|
|
Packit |
1c1d7e |
// no good for a link to a local variable that is also a global symbol.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//if (getLink(g_classScope,clName,ol,clName))
|
|
Packit |
1c1d7e |
//{
|
|
Packit |
1c1d7e |
//return;
|
|
Packit |
1c1d7e |
//}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
isLocal=TRUE;
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"is a local variable cd=%p!\n",cd));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_prefixed_with_this_keyword = FALSE; // discard the "this" prefix for the next calls
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (cd && cd->isLinkable()) // is it a linkable class
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"is linkable class %s\n",clName));
|
|
Packit |
1c1d7e |
if (g_exampleBlock)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString anchor;
|
|
Packit |
1c1d7e |
anchor.sprintf("_a%d",g_anchorCount);
|
|
Packit |
1c1d7e |
//printf("addExampleClass(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
|
|
Packit |
1c1d7e |
// g_exampleFile.data());
|
|
Packit |
1c1d7e |
if (cd->addExample(anchor,g_exampleName,g_exampleFile))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.writeCodeAnchor(anchor);
|
|
Packit |
1c1d7e |
g_anchorCount++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(ol,cd,clName);
|
|
Packit |
1c1d7e |
addToSearchIndex(className);
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(cd);
|
|
Packit |
1c1d7e |
if (md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Definition *d = md->getOuterScope()==Doxygen::globalScope ?
|
|
Packit |
1c1d7e |
md->getFileDef() : md->getOuterScope();
|
|
Packit |
1c1d7e |
if (md->getGroupDef()) d = md->getGroupDef();
|
|
Packit |
1c1d7e |
if (d && d->isLinkable() && md->isLinkable() &&
|
|
Packit |
1c1d7e |
g_currentMemberDef && g_collectXRefs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
addDocCrossReference(g_currentMemberDef,md);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // not a class, maybe a global member
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly));
|
|
Packit |
1c1d7e |
if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef.
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (md==0) // not found as a typedef
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
md = setCallContextForVar(clName);
|
|
Packit |
1c1d7e |
//printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition);
|
|
Packit |
1c1d7e |
if (md && g_currentDefinition)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
|
|
Packit |
1c1d7e |
md->name().data(),g_currentDefinition->name().data(),
|
|
Packit |
1c1d7e |
isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
|
|
Packit |
1c1d7e |
md->getOuterScope()->name().data()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md && g_currentDefinition &&
|
|
Packit |
1c1d7e |
isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
md=0; // variable not accessible
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (md && (!varOnly || md->isVariable()))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"is a global md=%p g_currentDefinition=%s linkable=%d\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>",md->isLinkable()));
|
|
Packit |
1c1d7e |
if (md->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString text;
|
|
Packit |
1c1d7e |
if (!g_forceTagReference.isEmpty()) // explicit reference to symbol in tag file
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
text=g_forceTagReference;
|
|
Packit |
1c1d7e |
if (text.right(4)==".tag") // strip .tag if present
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
text=text.left(text.length()-4);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
text+=getLanguageSpecificSeparator(md->getLanguage());
|
|
Packit |
1c1d7e |
text+=clName;
|
|
Packit |
1c1d7e |
md->setName(text);
|
|
Packit |
1c1d7e |
md->setLocalName(text);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // normal reference
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
text=clName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(ol,md,text);
|
|
Packit |
1c1d7e |
addToSearchIndex(clName);
|
|
Packit |
1c1d7e |
if (g_currentMemberDef && g_collectXRefs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
addDocCrossReference(g_currentMemberDef,md);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// nothing found, just write out the word
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"not found!\n"));
|
|
Packit |
1c1d7e |
codifyLines(clName);
|
|
Packit |
1c1d7e |
addToSearchIndex(clName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const char *memName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// extract class definition of the return type in order to resolve
|
|
Packit |
1c1d7e |
// a->b()->c() like call chains
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf("type=`%s' args=`%s' class=%s\n",
|
|
Packit |
1c1d7e |
// xmd->typeString(),xmd->argsString(),
|
|
Packit |
1c1d7e |
// xmd->getClassDef()->name().data());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (g_exampleBlock)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString anchor;
|
|
Packit |
1c1d7e |
anchor.sprintf("a%d",g_anchorCount);
|
|
Packit |
1c1d7e |
//printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
|
|
Packit |
1c1d7e |
// g_exampleFile.data());
|
|
Packit |
1c1d7e |
if (xmd->addExample(anchor,g_exampleName,g_exampleFile))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.writeCodeAnchor(anchor);
|
|
Packit |
1c1d7e |
g_anchorCount++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ClassDef *typeClass = stripClassName(removeAnonymousScopes(xmd->typeString()),xmd->getOuterScope());
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass));
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(typeClass);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ?
|
|
Packit |
1c1d7e |
xmd->getFileDef() : xmd->getOuterScope();
|
|
Packit |
1c1d7e |
if (xmd->getGroupDef()) xd = xmd->getGroupDef();
|
|
Packit |
1c1d7e |
if (xd && xd->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf("g_currentDefiniton=%p g_currentMemberDef=%p xmd=%p g_insideBody=%d\n",g_currentDefinition,g_currentMemberDef,xmd,g_insideBody);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (xmd->templateMaster()) xmd = xmd->templateMaster();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (xmd->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// add usage reference
|
|
Packit |
1c1d7e |
if (g_currentDefinition && g_currentMemberDef &&
|
|
Packit |
1c1d7e |
/*xmd!=g_currentMemberDef &&*/ g_insideBody && g_collectXRefs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
addDocCrossReference(g_currentMemberDef,xmd);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// write the actual link
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(ol,xmd,memName);
|
|
Packit |
1c1d7e |
addToSearchIndex(memName);
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool generateClassMemberLink(CodeOutputInterface &ol,Definition *def,const char *memName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (def && def->definitionType()==Definition::TypeClass)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ClassDef *cd = (ClassDef*)def;
|
|
Packit |
1c1d7e |
MemberDef *xmd = cd->getMemberByName(memName);
|
|
Packit |
1c1d7e |
//printf("generateClassMemberLink(class=%s,member=%s)=%p\n",def->name().data(),memName,xmd);
|
|
Packit |
1c1d7e |
if (xmd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return generateClassMemberLink(ol,xmd,memName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Definition *innerDef = cd->findInnerCompound(memName);
|
|
Packit |
1c1d7e |
if (innerDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(innerDef);
|
|
Packit |
1c1d7e |
addToSearchIndex(memName);
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(*g_code,innerDef,memName);
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (def && def->definitionType()==Definition::TypeNamespace)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
NamespaceDef *nd = (NamespaceDef*)def;
|
|
Packit |
1c1d7e |
//printf("Looking for %s inside namespace %s\n",memName,nd->name().data());
|
|
Packit |
1c1d7e |
Definition *innerDef = nd->findInnerCompound(memName);
|
|
Packit |
1c1d7e |
if (innerDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(innerDef);
|
|
Packit |
1c1d7e |
addToSearchIndex(memName);
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(*g_code,innerDef,memName);
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName,
|
|
Packit |
1c1d7e |
char *memName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("generateMemberLink(object=%s,mem=%s) classScope=%s\n",
|
|
Packit |
1c1d7e |
// varName.data(),memName,g_classScope.data());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (varName.isEmpty()) return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// look for the variable in the current context
|
|
Packit |
1c1d7e |
ClassDef *vcd = g_theVarContext.findVariable(varName);
|
|
Packit |
1c1d7e |
if (vcd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (vcd!=VariableContext::dummyContext)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Class found!\n");
|
|
Packit |
1c1d7e |
if (getLink(vcd->name(),memName,ol))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Found result!\n");
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (vcd->baseClasses())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BaseClassListIterator bcli(*vcd->baseClasses());
|
|
Packit |
1c1d7e |
for ( ; bcli.current() ; ++bcli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (getLink(bcli.current()->classDef->name(),memName,ol))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Found result!\n");
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // variable not in current context, maybe it is in a parent context
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
vcd = getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope);
|
|
Packit |
1c1d7e |
if (vcd && vcd->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Found class %s for variable `%s'\n",g_classScope.data(),varName.data());
|
|
Packit |
1c1d7e |
MemberName *vmn=Doxygen::memberNameSDict->find(varName);
|
|
Packit |
1c1d7e |
if (vmn==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int vi;
|
|
Packit |
1c1d7e |
QCString vn=varName;
|
|
Packit |
1c1d7e |
if ((vi=vn.findRev("::"))!=-1 || (vi=vn.findRev('.'))!=-1) // explicit scope A::b(), probably static member
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ClassDef *jcd = getClass(vn.left(vi));
|
|
Packit |
1c1d7e |
vn=vn.right(vn.length()-vi-2);
|
|
Packit |
1c1d7e |
vmn=Doxygen::memberNameSDict->find(vn);
|
|
Packit |
1c1d7e |
//printf("Trying name `%s' scope=%s\n",vn.data(),scope.data());
|
|
Packit |
1c1d7e |
if (vmn)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberNameIterator vmni(*vmn);
|
|
Packit |
1c1d7e |
MemberDef *vmd;
|
|
Packit |
1c1d7e |
for (;(vmd=vmni.current());++vmni)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (/*(vmd->isVariable() || vmd->isFunction()) && */
|
|
Packit |
1c1d7e |
vmd->getClassDef()==jcd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Found variable type=%s\n",vmd->typeString());
|
|
Packit |
1c1d7e |
ClassDef *mcd=stripClassName(vmd->typeString(),vmd->getOuterScope());
|
|
Packit |
1c1d7e |
if (mcd && mcd->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (generateClassMemberLink(ol,mcd,memName)) return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (vmn)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("There is a variable with name `%s'\n",varName);
|
|
Packit |
1c1d7e |
MemberNameIterator vmni(*vmn);
|
|
Packit |
1c1d7e |
MemberDef *vmd;
|
|
Packit |
1c1d7e |
for (;(vmd=vmni.current());++vmni)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (/*(vmd->isVariable() || vmd->isFunction()) && */
|
|
Packit |
1c1d7e |
vmd->getClassDef()==vcd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Found variable type=%s\n",vmd->typeString());
|
|
Packit |
1c1d7e |
ClassDef *mcd=stripClassName(vmd->typeString(),vmd->getOuterScope());
|
|
Packit |
1c1d7e |
if (mcd && mcd->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (generateClassMemberLink(ol,mcd,memName)) return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// nothing found -> write result as is
|
|
Packit |
1c1d7e |
codifyLines(memName);
|
|
Packit |
1c1d7e |
addToSearchIndex(memName);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generatePHPVariableLink(CodeOutputInterface &ol,const char *varName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString name = varName+7; // strip $this->
|
|
Packit |
1c1d7e |
name.prepend("$");
|
|
Packit |
1c1d7e |
//printf("generatePHPVariableLink(%s) name=%s scope=%s\n",varName,name.data(),g_classScope.data());
|
|
Packit |
1c1d7e |
if (!getLink(g_classScope,name,ol,varName))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
codifyLines(varName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateFunctionLink(CodeOutputInterface &ol,const char *funcName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//CodeClassDef *ccd=0;
|
|
Packit |
1c1d7e |
ClassDef *ccd=0;
|
|
Packit |
1c1d7e |
QCString locScope=g_classScope;
|
|
Packit |
1c1d7e |
QCString locFunc=removeRedundantWhiteSpace(funcName);
|
|
Packit |
1c1d7e |
QCString funcScope;
|
|
Packit |
1c1d7e |
QCString funcWithScope=locFunc;
|
|
Packit |
1c1d7e |
QCString funcWithFullScope=locFunc;
|
|
Packit |
1c1d7e |
QCString fullScope=locScope;
|
|
Packit |
1c1d7e |
DBG_CTX((stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data()));
|
|
Packit |
1c1d7e |
int len=2;
|
|
Packit |
1c1d7e |
int i=locFunc.findRev("::");
|
|
Packit |
1c1d7e |
if (g_currentMemberDef && g_currentMemberDef->getClassDef() &&
|
|
Packit |
1c1d7e |
funcName==g_currentMemberDef->localName() &&
|
|
Packit |
1c1d7e |
g_currentMemberDef->getDefLine()==g_yyLineNr &&
|
|
Packit |
1c1d7e |
generateClassMemberLink(ol,g_currentMemberDef,funcName)
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// special case where funcName is the name of a method that is also
|
|
Packit |
1c1d7e |
// defined on this line. In this case we can directly link to
|
|
Packit |
1c1d7e |
// g_currentMemberDef, which is not only faster, but
|
|
Packit |
1c1d7e |
// in case of overloaded methods, this will make sure that we link to
|
|
Packit |
1c1d7e |
// the correct method, and thereby get the correct reimplemented relations.
|
|
Packit |
1c1d7e |
// See also bug 549022.
|
|
Packit |
1c1d7e |
goto exit;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (i==-1) i=locFunc.findRev("."),len=1;
|
|
Packit |
1c1d7e |
if (i==-1) i=locFunc.findRev("\\"),len=1; // for PHP
|
|
Packit |
1c1d7e |
if (i>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
funcScope=locFunc.left(i);
|
|
Packit |
1c1d7e |
locFunc=locFunc.right(locFunc.length()-i-len).stripWhiteSpace();
|
|
Packit |
1c1d7e |
int ts=locScope.find('<'); // start of template
|
|
Packit |
1c1d7e |
int te=locScope.findRev('>'); // end of template
|
|
Packit |
1c1d7e |
//printf("ts=%d te=%d\n",ts,te);
|
|
Packit |
1c1d7e |
if (ts!=-1 && te!=-1 && te>ts)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// remove template from scope
|
|
Packit |
1c1d7e |
locScope=locScope.left(ts)+locScope.right(locScope.length()-te-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ts=funcScope.find('<'); // start of template
|
|
Packit |
1c1d7e |
te=funcScope.findRev('>'); // end of template
|
|
Packit |
1c1d7e |
//printf("ts=%d te=%d\n",ts,te);
|
|
Packit |
1c1d7e |
if (ts!=-1 && te!=-1 && te>ts)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// remove template from scope
|
|
Packit |
1c1d7e |
funcScope=funcScope.left(ts)+funcScope.right(funcScope.length()-te-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!funcScope.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
funcWithScope = funcScope+"::"+locFunc;
|
|
Packit |
1c1d7e |
if (!locScope.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
fullScope=locScope+"::"+funcScope;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!locScope.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
funcWithFullScope = locScope+"::"+funcWithScope;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!fullScope.isEmpty() && (ccd=g_codeClassSDict->find(fullScope)))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("using classScope %s\n",g_classScope.data());
|
|
Packit |
1c1d7e |
if (ccd->baseClasses())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BaseClassListIterator bcli(*ccd->baseClasses());
|
|
Packit |
1c1d7e |
for ( ; bcli.current() ; ++bcli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
goto exit;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!locScope.isEmpty() && fullScope!=locScope && (ccd=g_codeClassSDict->find(locScope)))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("using classScope %s\n",g_classScope.data());
|
|
Packit |
1c1d7e |
if (ccd->baseClasses())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BaseClassListIterator bcli(*ccd->baseClasses());
|
|
Packit |
1c1d7e |
for ( ; bcli.current() ; ++bcli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (getLink(bcli.current()->classDef->name(),funcWithScope,ol,funcName))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
goto exit;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!getLink(locScope,funcWithScope,ol,funcName))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(ol,funcName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
exit:
|
|
Packit |
1c1d7e |
g_forceTagReference.resize(0);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*! counts the number of lines in the input */
|
|
Packit |
1c1d7e |
static int countLines()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
const char *p=g_inputString;
|
|
Packit |
1c1d7e |
char c;
|
|
Packit |
1c1d7e |
int count=1;
|
|
Packit |
1c1d7e |
while ((c=*p))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
p++ ;
|
|
Packit |
1c1d7e |
if (c=='\n') count++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (p>g_inputString && *(p-1)!='\n')
|
|
Packit |
1c1d7e |
{ // last line does not end with a \n, so we add an extra
|
|
Packit |
1c1d7e |
// line and explicitly terminate the line after parsing.
|
|
Packit |
1c1d7e |
count++,
|
|
Packit |
1c1d7e |
g_needsTermination=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return count;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void endFontClass()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_currentFontClass)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->endFontClass();
|
|
Packit |
1c1d7e |
g_currentFontClass=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void startFontClass(const char *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_code->startFontClass(s);
|
|
Packit |
1c1d7e |
g_currentFontClass=s;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// recursively writes a linkified Objective-C method call
|
|
Packit |
1c1d7e |
static void writeObjCMethodCall(ObjCCallCtx *ctx)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (ctx==0) return;
|
|
Packit |
1c1d7e |
char c;
|
|
Packit |
1c1d7e |
const char *p = ctx->format.data();
|
|
Packit |
1c1d7e |
if (!ctx->methodName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("writeObjCMethodCall(%s) obj=%s method=%s\n",
|
|
Packit |
1c1d7e |
// ctx->format.data(),ctx->objectTypeOrName.data(),ctx->methodName.data());
|
|
Packit |
1c1d7e |
if (!ctx->objectTypeOrName.isEmpty() && ctx->objectTypeOrName.at(0)!='$')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Looking for object=%s method=%s\n",ctx->objectTypeOrName.data(),
|
|
Packit |
1c1d7e |
// ctx->methodName.data());
|
|
Packit |
1c1d7e |
ClassDef *cd = g_theVarContext.findVariable(ctx->objectTypeOrName);
|
|
Packit |
1c1d7e |
if (cd==0) // not a local variable
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (ctx->objectTypeOrName=="self")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_currentDefinition &&
|
|
Packit |
1c1d7e |
g_currentDefinition->definitionType()==Definition::TypeClass)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->objectType = (ClassDef *)g_currentDefinition;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->objectType = getResolvedClass(
|
|
Packit |
1c1d7e |
g_currentDefinition,
|
|
Packit |
1c1d7e |
g_sourceFileDef,
|
|
Packit |
1c1d7e |
ctx->objectTypeOrName,
|
|
Packit |
1c1d7e |
&ctx->method);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf(" object is class? %p\n",ctx->objectType);
|
|
Packit |
1c1d7e |
if (ctx->objectType) // found class
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
|
|
Packit |
1c1d7e |
//printf(" yes->method=%s\n",ctx->method?ctx->method->name().data():"<none>");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (ctx->method==0) // search for class variable with the same name
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" no\n");
|
|
Packit |
1c1d7e |
//printf("g_currentDefinition=%p\n",g_currentDefinition);
|
|
Packit |
1c1d7e |
if (g_currentDefinition &&
|
|
Packit |
1c1d7e |
g_currentDefinition->definitionType()==Definition::TypeClass)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->objectVar = ((ClassDef *)g_currentDefinition)->getMemberByName(ctx->objectTypeOrName);
|
|
Packit |
1c1d7e |
//printf(" ctx->objectVar=%p\n",ctx->objectVar);
|
|
Packit |
1c1d7e |
if (ctx->objectVar)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->objectType = stripClassName(ctx->objectVar->typeString());
|
|
Packit |
1c1d7e |
//printf(" ctx->objectType=%p\n",ctx->objectType);
|
|
Packit |
1c1d7e |
if (ctx->objectType)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
|
|
Packit |
1c1d7e |
//printf(" ctx->method=%p\n",ctx->method);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // local variable
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf(" object is local variable\n");
|
|
Packit |
1c1d7e |
if (cd!=VariableContext::dummyContext)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->method = cd->getMemberByName(ctx->methodName);
|
|
Packit |
1c1d7e |
//printf(" class=%p method=%p\n",cd,ctx->method);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf("[");
|
|
Packit |
1c1d7e |
while ((c=*p++)) // for each character in ctx->format
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (c=='$')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char nc=*p++;
|
|
Packit |
1c1d7e |
if (nc=='$') // escaped $
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify("$");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // name fragment or reference to a nested call
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (nc=='n') // name fragment
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
nc=*p++;
|
|
Packit |
1c1d7e |
QCString refIdStr;
|
|
Packit |
1c1d7e |
while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
|
|
Packit |
1c1d7e |
p--;
|
|
Packit |
1c1d7e |
int refId=refIdStr.toInt();
|
|
Packit |
1c1d7e |
QCString *pName = g_nameDict.find(refId);
|
|
Packit |
1c1d7e |
if (pName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (ctx->method && ctx->method->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(*g_code,ctx->method,pName->data());
|
|
Packit |
1c1d7e |
if (g_currentMemberDef && g_collectXRefs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
addDocCrossReference(g_currentMemberDef,ctx->method);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
codifyLines(pName->data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Invalid name: id=%d\n",refId);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (nc=='o') // reference to potential object name
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
nc=*p++;
|
|
Packit |
1c1d7e |
QCString refIdStr;
|
|
Packit |
1c1d7e |
while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
|
|
Packit |
1c1d7e |
p--;
|
|
Packit |
1c1d7e |
int refId=refIdStr.toInt();
|
|
Packit |
1c1d7e |
QCString *pObject = g_objectDict.find(refId);
|
|
Packit |
1c1d7e |
if (pObject)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (*pObject=="self")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_currentDefinition &&
|
|
Packit |
1c1d7e |
g_currentDefinition->definitionType()==Definition::TypeClass)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->objectType = (ClassDef *)g_currentDefinition;
|
|
Packit |
1c1d7e |
if (ctx->objectType->categoryOf())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->objectType = ctx->objectType->categoryOf();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (ctx->objectType)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(pObject->data());
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (*pObject=="super")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_currentDefinition &&
|
|
Packit |
1c1d7e |
g_currentDefinition->definitionType()==Definition::TypeClass)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ClassDef *cd = (ClassDef *)g_currentDefinition;
|
|
Packit |
1c1d7e |
if (cd->categoryOf())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
cd = cd->categoryOf();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
BaseClassList *bcd = cd->baseClasses();
|
|
Packit |
1c1d7e |
if (bcd) // get direct base class (there should be only one)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BaseClassListIterator bli(*bcd);
|
|
Packit |
1c1d7e |
BaseClassDef *bclass;
|
|
Packit |
1c1d7e |
for (bli.toFirst();(bclass=bli.current());++bli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (bclass->classDef->compoundType()!=ClassDef::Protocol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->objectType = bclass->classDef;
|
|
Packit |
1c1d7e |
if (ctx->objectType)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(pObject->data());
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(*g_code,ctx->objectVar,pObject->data());
|
|
Packit |
1c1d7e |
if (g_currentMemberDef && g_collectXRefs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
addDocCrossReference(g_currentMemberDef,ctx->objectVar);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (ctx->objectType &&
|
|
Packit |
1c1d7e |
ctx->objectType!=VariableContext::dummyContext &&
|
|
Packit |
1c1d7e |
ctx->objectType->isLinkable()
|
|
Packit |
1c1d7e |
) // object is class name
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ClassDef *cd = ctx->objectType;
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(*g_code,cd,pObject->data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // object still needs to be resolved
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ClassDef *cd = getResolvedClass(g_currentDefinition,
|
|
Packit |
1c1d7e |
g_sourceFileDef, *pObject);
|
|
Packit |
1c1d7e |
if (cd && cd->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (ctx->objectType==0) ctx->objectType=cd;
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(*g_code,cd,pObject->data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
codifyLines(pObject->data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Invalid object: id=%d\n",refId);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (nc=='c') // reference to nested call
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
nc=*p++;
|
|
Packit |
1c1d7e |
QCString refIdStr;
|
|
Packit |
1c1d7e |
while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
|
|
Packit |
1c1d7e |
p--;
|
|
Packit |
1c1d7e |
int refId=refIdStr.toInt();
|
|
Packit |
1c1d7e |
ObjCCallCtx *ictx = g_contextDict.find(refId);
|
|
Packit |
1c1d7e |
if (ictx) // recurse into nested call
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeObjCMethodCall(ictx);
|
|
Packit |
1c1d7e |
if (ictx->method) // link to nested call successfully
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// get the ClassDef representing the method's return type
|
|
Packit |
1c1d7e |
if (QCString(ictx->method->typeString())=="id")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// see if the method name is unique, if so we link to it
|
|
Packit |
1c1d7e |
MemberName *mn=Doxygen::memberNameSDict->find(ctx->methodName);
|
|
Packit |
1c1d7e |
//printf("mn->count=%d ictx->method=%s ctx->methodName=%s\n",
|
|
Packit |
1c1d7e |
// mn==0?-1:(int)mn->count(),
|
|
Packit |
1c1d7e |
// ictx->method->name().data(),
|
|
Packit |
1c1d7e |
// ctx->methodName.data());
|
|
Packit |
1c1d7e |
if (mn && mn->count()==1) // member name unique
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->method = mn->getFirst();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->objectType = stripClassName(ictx->method->typeString());
|
|
Packit |
1c1d7e |
if (ctx->objectType)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf(" ***** method=%s -> object=%p\n",ictx->method->name().data(),ctx->objectType);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Invalid context: id=%d\n",refId);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (nc=='w') // some word
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
nc=*p++;
|
|
Packit |
1c1d7e |
QCString refIdStr;
|
|
Packit |
1c1d7e |
while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
|
|
Packit |
1c1d7e |
p--;
|
|
Packit |
1c1d7e |
int refId=refIdStr.toInt();
|
|
Packit |
1c1d7e |
QCString *pWord = g_wordDict.find(refId);
|
|
Packit |
1c1d7e |
if (pWord)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
codifyLines(pWord->data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (nc=='d') // comment block
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
nc=*p++;
|
|
Packit |
1c1d7e |
QCString refIdStr;
|
|
Packit |
1c1d7e |
while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
|
|
Packit |
1c1d7e |
p--;
|
|
Packit |
1c1d7e |
int refId=refIdStr.toInt();
|
|
Packit |
1c1d7e |
QCString *pComment = g_commentDict.find(refId);
|
|
Packit |
1c1d7e |
if (pComment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
codifyLines(pComment->data());
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // illegal marker
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ASSERT(!"invalid escape sequence");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // normal non-marker character
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char s[2];
|
|
Packit |
1c1d7e |
s[0]=c;s[1]=0;
|
|
Packit |
1c1d7e |
codifyLines(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("%s %s]\n",ctx->objectTypeOrName.data(),ctx->methodName.data());
|
|
Packit |
1c1d7e |
//printf("}=(type='%s',name='%s')",
|
|
Packit |
1c1d7e |
// ctx->objectTypeOrName.data(),
|
|
Packit |
1c1d7e |
// ctx->methodName.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Replaces an Objective-C method name fragment s by a marker of the form
|
|
Packit |
1c1d7e |
// $n12, the number (12) can later be used as a key for obtaining the name
|
|
Packit |
1c1d7e |
// fragment, from g_nameDict
|
|
Packit |
1c1d7e |
static QCString escapeName(const char *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString result;
|
|
Packit |
1c1d7e |
result.sprintf("$n%d",g_currentNameId);
|
|
Packit |
1c1d7e |
g_nameDict.insert(g_currentNameId,new QCString(s));
|
|
Packit |
1c1d7e |
g_currentNameId++;
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString escapeObject(const char *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString result;
|
|
Packit |
1c1d7e |
result.sprintf("$o%d",g_currentObjId);
|
|
Packit |
1c1d7e |
g_objectDict.insert(g_currentObjId,new QCString(s));
|
|
Packit |
1c1d7e |
g_currentObjId++;
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString escapeWord(const char *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString result;
|
|
Packit |
1c1d7e |
result.sprintf("$w%d",g_currentWordId);
|
|
Packit |
1c1d7e |
g_wordDict.insert(g_currentWordId,new QCString(s));
|
|
Packit |
1c1d7e |
g_currentWordId++;
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString escapeComment(const char *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString result;
|
|
Packit |
1c1d7e |
result.sprintf("$d%d",g_currentCommentId);
|
|
Packit |
1c1d7e |
g_commentDict.insert(g_currentCommentId,new QCString(s));
|
|
Packit |
1c1d7e |
g_currentCommentId++;
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/* -----------------------------------------------------------------
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
#undef YY_INPUT
|
|
Packit |
1c1d7e |
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int yyread(char *buf,int max_size)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int c=0;
|
|
Packit |
1c1d7e |
while( c < max_size && g_inputString[g_inputPosition] )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
*buf = g_inputString[g_inputPosition++] ;
|
|
Packit |
1c1d7e |
c++; buf++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
B [ \t]
|
|
Packit |
1c1d7e |
BN [ \t\n\r]
|
|
Packit |
1c1d7e |
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
|
|
Packit |
1c1d7e |
SEP ("::"|"\\")
|
|
Packit |
1c1d7e |
SCOPENAME ({SEP}{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID}
|
|
Packit |
1c1d7e |
TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
|
|
Packit |
1c1d7e |
SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID})
|
|
Packit |
1c1d7e |
SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+
|
|
Packit |
1c1d7e |
KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw"|"@synthesize"|"@property")
|
|
Packit |
1c1d7e |
KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"set"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|"alignas"|"alignof"|{KEYWORD_OBJC})
|
|
Packit |
1c1d7e |
FLOWKW ("break"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"return"|"switch"|"throw"|"throws"|"@catch"|"@finally")
|
|
Packit |
1c1d7e |
FLOWCONDITION ("case"|"for"|"foreach"|"for each"|"goto"|"if"|"try"|"while"|"@try")
|
|
Packit |
1c1d7e |
TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string"|"nullptr")
|
|
Packit |
1c1d7e |
CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast")
|
|
Packit |
1c1d7e |
CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
|
|
Packit |
1c1d7e |
ARITHOP "+"|"-"|"/"|"*"|"%"|"--"|"++"
|
|
Packit |
1c1d7e |
ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="
|
|
Packit |
1c1d7e |
LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"
|
|
Packit |
1c1d7e |
BITOP "&"|"|"|"^"|"<<"|">>"|"~"
|
|
Packit |
1c1d7e |
OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
|
|
Packit |
1c1d7e |
RAWBEGIN (u|U|L|u8)?R\"[^ \t\(\)\\]{0,16}"("
|
|
Packit |
1c1d7e |
RAWEND ")"[^ \t\(\)\\]{0,16}\"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%option noyywrap
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%x SkipString
|
|
Packit |
1c1d7e |
%x SkipStringS
|
|
Packit |
1c1d7e |
%x SkipVerbString
|
|
Packit |
1c1d7e |
%x SkipCPP
|
|
Packit |
1c1d7e |
%x SkipComment
|
|
Packit |
1c1d7e |
%x SkipCxxComment
|
|
Packit |
1c1d7e |
%x RemoveSpecialCComment
|
|
Packit |
1c1d7e |
%x StripSpecialCComment
|
|
Packit |
1c1d7e |
%x Body
|
|
Packit |
1c1d7e |
%x FuncCall
|
|
Packit |
1c1d7e |
%x MemberCall
|
|
Packit |
1c1d7e |
%x MemberCall2
|
|
Packit |
1c1d7e |
%x SkipInits
|
|
Packit |
1c1d7e |
%x ClassName
|
|
Packit |
1c1d7e |
%x AlignAs
|
|
Packit |
1c1d7e |
%x AlignAsEnd
|
|
Packit |
1c1d7e |
%x PackageName
|
|
Packit |
1c1d7e |
%x ClassVar
|
|
Packit |
1c1d7e |
%x CppCliTypeModifierFollowup
|
|
Packit |
1c1d7e |
%x Bases
|
|
Packit |
1c1d7e |
%x SkipSharp
|
|
Packit |
1c1d7e |
%x ReadInclude
|
|
Packit |
1c1d7e |
%x TemplDecl
|
|
Packit |
1c1d7e |
%x TemplCast
|
|
Packit |
1c1d7e |
%x CallEnd
|
|
Packit |
1c1d7e |
%x ObjCMethod
|
|
Packit |
1c1d7e |
%x ObjCParams
|
|
Packit |
1c1d7e |
%x ObjCParamType
|
|
Packit |
1c1d7e |
%x ObjCCall
|
|
Packit |
1c1d7e |
%x ObjCMName
|
|
Packit |
1c1d7e |
%x ObjCSkipStr
|
|
Packit |
1c1d7e |
%x ObjCCallComment
|
|
Packit |
1c1d7e |
%x OldStyleArgs
|
|
Packit |
1c1d7e |
%x UsingName
|
|
Packit |
1c1d7e |
%x RawString
|
|
Packit |
1c1d7e |
%x InlineInit
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%%
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<*>\x0d
|
|
Packit |
1c1d7e |
<Body>^([ \t]*"#"[ \t]*("include"|"import")[ \t]*)("<"|"\"") {
|
|
Packit |
1c1d7e |
startFontClass("preprocessor");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN( ReadInclude );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>("@interface"|"@implementation"|"@protocol")[ \t\n]+ {
|
|
Packit |
1c1d7e |
g_insideObjC=TRUE;
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
if (!g_insideTemplate)
|
|
Packit |
1c1d7e |
BEGIN( ClassName );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>(("public"|"private"){B}+)?("ref"|"value"|"interface"|"enum"){B}+("class"|"struct") {
|
|
Packit |
1c1d7e |
if (g_insideTemplate) REJECT;
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( ClassName );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>"property"|"event"/{BN}* {
|
|
Packit |
1c1d7e |
if (g_insideTemplate) REJECT;
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>(KEYWORD_CPPCLI_DATATYPE|("partial"{B}+)?"class"|"struct"|"union"|"namespace"|"interface"){B}+ {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
if (!g_insideTemplate)
|
|
Packit |
1c1d7e |
BEGIN( ClassName );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>("package")[ \t\n]+ {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( PackageName );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ClassVar>\n {
|
|
Packit |
1c1d7e |
if (!g_insideObjC) REJECT;
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
BEGIN(Body);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body,ClassVar,Bases>"-"|"+" {
|
|
Packit |
1c1d7e |
if (!g_insideObjC || g_insideBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // Start of Objective-C method
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Method!\n");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN(ObjCMethod);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCMethod>":" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN(ObjCParams);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCParams>"(" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN(ObjCParamType);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCParams,ObjCMethod>";"|"{" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
if (*yytext=='{')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_searchingForBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_searchingForBody=FALSE;
|
|
Packit |
1c1d7e |
g_insideBody=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (g_insideBody) g_bodyCurlyCount++;
|
|
Packit |
1c1d7e |
if (!g_curClassName.isEmpty()) // valid class name
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
pushScope(g_curClassName);
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
|
|
Packit |
1c1d7e |
g_scopeStack.push(SCOPEBLOCK);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_type.resize(0);
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
BEGIN(Body);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCParams>{ID}{B}*":" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCParamType>{TYPEKW} {
|
|
Packit |
1c1d7e |
startFontClass("keywordtype");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_parmType=yytext;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCParamType>{ID} {
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
g_parmType=yytext;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCParamType>")" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN(ObjCParams);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCParams>{ID} {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_parmName=yytext;
|
|
Packit |
1c1d7e |
g_theVarContext.addVariable(g_parmType,g_parmName);
|
|
Packit |
1c1d7e |
g_parmType.resize(0);g_parmName.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCMethod,ObjCParams,ObjCParamType>{ID} {
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCMethod,ObjCParams,ObjCParamType>. {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCMethod,ObjCParams,ObjCParamType>\n {
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ReadInclude>[^\n\"\>]+/(">"|"\"") {
|
|
Packit |
1c1d7e |
//FileInfo *f;
|
|
Packit |
1c1d7e |
bool ambig;
|
|
Packit |
1c1d7e |
bool found=FALSE;
|
|
Packit |
1c1d7e |
//QCString absPath = yytext;
|
|
Packit |
1c1d7e |
//if (g_sourceFileDef && QDir::isRelativePath(absPath))
|
|
Packit |
1c1d7e |
//{
|
|
Packit |
1c1d7e |
// absPath = QDir::cleanDirPath(g_sourceFileDef->getPath()+"/"+absPath);
|
|
Packit |
1c1d7e |
//}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FileDef *fd=findFileDef(Doxygen::inputNameDict,yytext,ambig);
|
|
Packit |
1c1d7e |
//printf("looking for include %s -> %s fd=%p\n",yytext,absPath.data(),fd);
|
|
Packit |
1c1d7e |
if (fd && fd->isLinkable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (ambig) // multiple input files match the name
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("===== yes %s is ambiguous\n",yytext);
|
|
Packit |
1c1d7e |
QCString name = QDir::cleanDirPath(yytext).utf8();
|
|
Packit |
1c1d7e |
if (!name.isEmpty() && g_sourceFileDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FileName *fn = Doxygen::inputNameDict->find(name);
|
|
Packit |
1c1d7e |
if (fn)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FileNameIterator fni(*fn);
|
|
Packit |
1c1d7e |
// for each include name
|
|
Packit |
1c1d7e |
for (fni.toFirst();!found && (fd=fni.current());++fni)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// see if this source file actually includes the file
|
|
Packit |
1c1d7e |
found = g_sourceFileDef->isIncluded(fd->absFilePath());
|
|
Packit |
1c1d7e |
//printf(" include file %s found=%d\n",fd->absFilePath().data(),found);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // not ambiguous
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
found = TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf(" include file %s found=%d\n",fd ? fd->absFilePath().data() : "<none>",found);
|
|
Packit |
1c1d7e |
if (found)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeMultiLineCodeLink(*g_code,fd,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
char c=yyinput();
|
|
Packit |
1c1d7e |
QCString text;
|
|
Packit |
1c1d7e |
text+=c;
|
|
Packit |
1c1d7e |
g_code->codify(text);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body,Bases>^[ \t]*"#" {
|
|
Packit |
1c1d7e |
startFontClass("preprocessor");
|
|
Packit |
1c1d7e |
g_lastSkipCppContext = YY_START;
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN( SkipCPP ) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipCPP>. {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipCPP>[^\n\/\\]+ {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipCPP>\\[\r]?\n {
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipCPP>"//" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body,FuncCall>"{" {
|
|
Packit |
1c1d7e |
g_theVarContext.pushScope();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
|
|
Packit |
1c1d7e |
g_scopeStack.push(INNERBLOCK);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (g_searchingForBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_searchingForBody=FALSE;
|
|
Packit |
1c1d7e |
g_insideBody=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
if (g_insideBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_bodyCurlyCount++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_type.resize(0);
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body,FuncCall,MemberCall,MemberCall2>"}" {
|
|
Packit |
1c1d7e |
g_theVarContext.popScope();
|
|
Packit |
1c1d7e |
g_type.resize(0);
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int *scope = g_scopeStack.pop();
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
|
|
Packit |
1c1d7e |
if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
popScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"g_bodyCurlyCount=%d\n",g_bodyCurlyCount));
|
|
Packit |
1c1d7e |
if (--g_bodyCurlyCount<=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_insideBody=FALSE;
|
|
Packit |
1c1d7e |
g_currentMemberDef=0;
|
|
Packit |
1c1d7e |
if (g_currentDefinition)
|
|
Packit |
1c1d7e |
g_currentDefinition=g_currentDefinition->getOuterScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
BEGIN(Body);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body,ClassVar>"@end" {
|
|
Packit |
1c1d7e |
//printf("End of objc scope fd=%s\n",g_sourceFileDef->name().data());
|
|
Packit |
1c1d7e |
if (g_sourceFileDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FileDef *fd=g_sourceFileDef;
|
|
Packit |
1c1d7e |
g_insideObjC = fd->name().lower().right(2)==".m" ||
|
|
Packit |
1c1d7e |
fd->name().lower().right(3)==".mm";
|
|
Packit |
1c1d7e |
//printf("insideObjC=%d\n",g_insideObjC);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_insideObjC = FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (g_insideBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theVarContext.popScope();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int *scope = g_scopeStack.pop();
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
|
|
Packit |
1c1d7e |
if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
popScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_insideBody=FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
g_currentMemberDef=0;
|
|
Packit |
1c1d7e |
if (g_currentDefinition)
|
|
Packit |
1c1d7e |
g_currentDefinition=g_currentDefinition->getOuterScope();
|
|
Packit |
1c1d7e |
BEGIN(Body);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ClassName,ClassVar>";" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_searchingForBody=FALSE;
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ClassName,ClassVar>[*&^%]+ {
|
|
Packit |
1c1d7e |
g_type=g_curClassName.copy();
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN( Body ); // variable of type struct *
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ClassName>"__declspec"{B}*"("{B}*{ID}{B}*")" {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ClassName>{ID}("::"{ID})* {
|
|
Packit |
1c1d7e |
g_curClassName=yytext;
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
if (g_curClassName=="alignas")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( AlignAs );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
BEGIN( ClassVar );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<AlignAs>"(" {
|
|
Packit |
1c1d7e |
g_bracketCount=1;
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN( AlignAsEnd );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<AlignAs>\n { g_yyLineNr++;
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<AlignAs>. { g_code->codify(yytext); }
|
|
Packit |
1c1d7e |
<AlignAsEnd>"(" { g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_bracketCount++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<AlignAsEnd>")" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
if (--g_bracketCount<=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BEGIN(ClassName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<AlignAsEnd>\n { g_yyLineNr++;
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<AlignAsEnd>. { g_code->codify(yytext); }
|
|
Packit |
1c1d7e |
<ClassName>{ID}("\\"{ID})* { // PHP namespace
|
|
Packit |
1c1d7e |
g_curClassName=substitute(yytext,"\\","::");
|
|
Packit |
1c1d7e |
g_scopeStack.push(CLASSBLOCK);
|
|
Packit |
1c1d7e |
pushScope(g_curClassName);
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
BEGIN( ClassVar );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ClassName>{ID}{B}*"("{ID}")" { // Obj-C category
|
|
Packit |
1c1d7e |
g_curClassName=removeRedundantWhiteSpace(yytext);
|
|
Packit |
1c1d7e |
g_scopeStack.push(CLASSBLOCK);
|
|
Packit |
1c1d7e |
pushScope(g_curClassName);
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
BEGIN( ClassVar );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<PackageName>{ID}("."{ID})* {
|
|
Packit |
1c1d7e |
g_curClassName=substitute(yytext,".","::");
|
|
Packit |
1c1d7e |
//printf("found package: %s\n",g_curClassName.data());
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ClassVar>"=" {
|
|
Packit |
1c1d7e |
unput(*yytext);
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ClassVar>("extends"|"implements") { // Java
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_curClassBases.clear();
|
|
Packit |
1c1d7e |
BEGIN( Bases );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") {
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"***** C++/CLI modifier %s on g_curClassName=%s\n",yytext,g_curClassName.data()));
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( CppCliTypeModifierFollowup );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ClassVar>{ID} {
|
|
Packit |
1c1d7e |
g_type = g_curClassName.copy();
|
|
Packit |
1c1d7e |
g_name = yytext;
|
|
Packit |
1c1d7e |
if (g_insideBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theVarContext.addVariable(g_type,g_name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*":"{B}* {
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
g_curClassBases.clear();
|
|
Packit |
1c1d7e |
BEGIN( Bases );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<PackageName>[ \t]*";" |
|
|
Packit |
1c1d7e |
<Bases>^{B}*/"@"{ID} | // Objective-C interface
|
|
Packit |
1c1d7e |
<Bases,ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*"{"{B}* {
|
|
Packit |
1c1d7e |
g_theVarContext.pushScope();
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
if (YY_START==ClassVar && g_curClassName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_curClassName = g_name.copy();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (g_searchingForBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_searchingForBody=FALSE;
|
|
Packit |
1c1d7e |
g_insideBody=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (g_insideBody) g_bodyCurlyCount++;
|
|
Packit |
1c1d7e |
if (!g_curClassName.isEmpty()) // valid class name
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
|
|
Packit |
1c1d7e |
g_scopeStack.push(CLASSBLOCK);
|
|
Packit |
1c1d7e |
pushScope(g_curClassName);
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"***** g_curClassName=%s\n",g_curClassName.data()));
|
|
Packit |
1c1d7e |
if (getResolvedClass(g_currentDefinition,g_sourceFileDef,g_curClassName)==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"Adding new class %s\n",g_curClassName.data()));
|
|
Packit |
1c1d7e |
ClassDef *ncd=new ClassDef("",1,1,
|
|
Packit |
1c1d7e |
g_curClassName,ClassDef::Class,0,0,FALSE);
|
|
Packit |
1c1d7e |
g_codeClassSDict->append(g_curClassName,ncd);
|
|
Packit |
1c1d7e |
// insert base classes.
|
|
Packit |
1c1d7e |
char *s=g_curClassBases.first();
|
|
Packit |
1c1d7e |
while (s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ClassDef *bcd;
|
|
Packit |
1c1d7e |
bcd=g_codeClassSDict->find(s);
|
|
Packit |
1c1d7e |
if (bcd==0) bcd=getResolvedClass(g_currentDefinition,g_sourceFileDef,s);
|
|
Packit |
1c1d7e |
if (bcd && bcd!=ncd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ncd->insertBaseClass(bcd,s,Public,Normal);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
s=g_curClassBases.next();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("g_codeClassList.count()=%d\n",g_codeClassList.count());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // not a class name -> assume inner block
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
|
|
Packit |
1c1d7e |
g_scopeStack.push(INNERBLOCK);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_curClassName.resize(0);
|
|
Packit |
1c1d7e |
g_curClassBases.clear();
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Bases>"virtual"|"public"|"protected"|"private"|"@public"|"@private"|"@protected" {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Bases>{SEP}?({ID}{SEP})*{ID} {
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"%s:addBase(%s)\n",g_curClassName.data(),yytext));
|
|
Packit |
1c1d7e |
g_curClassBases.inSort(yytext);
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Bases>"<" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
if (!g_insideObjC)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_sharpCount=1;
|
|
Packit |
1c1d7e |
BEGIN ( SkipSharp );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_insideProtocolList=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Bases>">" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_insideProtocolList=FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipSharp>"<" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
++g_sharpCount;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipSharp>">" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
if (--g_sharpCount<=0)
|
|
Packit |
1c1d7e |
BEGIN ( Bases );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Bases>"(" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_sharpCount=1;
|
|
Packit |
1c1d7e |
BEGIN ( SkipSharp );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipSharp>"(" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
++g_sharpCount;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipSharp>")" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
if (--g_sharpCount<=0)
|
|
Packit |
1c1d7e |
BEGIN ( Bases );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<Bases>"," {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<Body>{SCOPEPREFIX}?"operator"{B}*"()"{B}*/"(" {
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
generateFunctionLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
g_bracketCount=0;
|
|
Packit |
1c1d7e |
g_args.resize(0);
|
|
Packit |
1c1d7e |
g_name+=yytext;
|
|
Packit |
1c1d7e |
BEGIN( FuncCall );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{SCOPEPREFIX}?"operator"/"(" {
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
generateFunctionLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
g_bracketCount=0;
|
|
Packit |
1c1d7e |
g_args.resize(0);
|
|
Packit |
1c1d7e |
g_name+=yytext;
|
|
Packit |
1c1d7e |
BEGIN( FuncCall );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{SCOPEPREFIX}?"operator"[^a-z_A-Z0-9\(\n]+/"(" {
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
generateFunctionLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
g_bracketCount=0;
|
|
Packit |
1c1d7e |
g_args.resize(0);
|
|
Packit |
1c1d7e |
g_name+=yytext;
|
|
Packit |
1c1d7e |
BEGIN( FuncCall );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body,TemplDecl>("template"|"generic")/([^a-zA-Z0-9]) {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_insideTemplate=TRUE;
|
|
Packit |
1c1d7e |
g_sharpCount=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>"using"{BN}+"namespace"{BN}+ {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN(UsingName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<UsingName>{ID}("::"{ID})* { addUsingDirective(yytext);
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
|
|
Packit |
1c1d7e |
g_scopeStack.push(CLASSBLOCK);
|
|
Packit |
1c1d7e |
pushScope(yytext);
|
|
Packit |
1c1d7e |
BEGIN(Body);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<UsingName>\n { codifyLines(yytext); BEGIN(Body); }
|
|
Packit |
1c1d7e |
<UsingName>. { codifyLines(yytext); BEGIN(Body); }
|
|
Packit |
1c1d7e |
<Body,FuncCall>"$"?"this"("->"|".") { g_code->codify(yytext); // this-> for C++, this. for C#
|
|
Packit |
1c1d7e |
g_prefixed_with_this_keyword = TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{KEYWORD}/([^a-z_A-Z0-9]) {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
if (QCString(yytext)=="typedef")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
g_name+=yytext;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{KEYWORD}/{B}* {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{KEYWORD}/{BN}*"(" {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_name.resize(0);g_type.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<FuncCall>"in"/{BN}* {
|
|
Packit |
1c1d7e |
if (!g_inForEachExpression) REJECT;
|
|
Packit |
1c1d7e |
startFontClass("keywordflow");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
// insert the variable in the parent scope, see bug 546158
|
|
Packit |
1c1d7e |
g_theVarContext.popScope();
|
|
Packit |
1c1d7e |
g_theVarContext.addVariable(g_parmType,g_parmName);
|
|
Packit |
1c1d7e |
g_theVarContext.pushScope();
|
|
Packit |
1c1d7e |
g_name.resize(0);g_type.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{FLOWKW}/{BN}*"(" {
|
|
Packit |
1c1d7e |
startFontClass("keywordflow");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_name.resize(0);g_type.resize(0);
|
|
Packit |
1c1d7e |
g_inForEachExpression = (qstrcmp(yytext,"for each")==0 || qstrcmp(yytext, "foreach")==0);
|
|
Packit |
1c1d7e |
BEGIN(FuncCall);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{FLOWCONDITION}/{BN}*"(" {
|
|
Packit |
1c1d7e |
if (g_currentMemberDef && g_currentMemberDef->isFunction())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentMemberDef->addFlowKeyWord();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
startFontClass("keywordflow");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_name.resize(0);g_type.resize(0);
|
|
Packit |
1c1d7e |
g_inForEachExpression = (strcmp(yytext,"for each")==0 || strcmp(yytext, "foreach")==0);
|
|
Packit |
1c1d7e |
BEGIN(FuncCall);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{FLOWKW}/([^a-z_A-Z0-9]) {
|
|
Packit |
1c1d7e |
startFontClass("keywordflow");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
if (g_inFunctionTryBlock && (qstrcmp(yytext,"catch")==0 || qstrcmp(yytext,"finally")==0))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_inFunctionTryBlock=FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{FLOWCONDITION}/([^a-z_A-Z0-9]) {
|
|
Packit |
1c1d7e |
if (g_currentMemberDef && g_currentMemberDef->isFunction())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentMemberDef->addFlowKeyWord();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
startFontClass("keywordflow");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
if (g_inFunctionTryBlock && (strcmp(yytext,"catch")==0 || strcmp(yytext,"finally")==0))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_inFunctionTryBlock=FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{FLOWKW}/{B}* {
|
|
Packit |
1c1d7e |
startFontClass("keywordflow");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{FLOWCONDITION}/{B}* {
|
|
Packit |
1c1d7e |
if (g_currentMemberDef && g_currentMemberDef->isFunction())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentMemberDef->addFlowKeyWord();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
startFontClass("keywordflow");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>"*"{B}*")" { // end of cast?
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_theCallContext.popScope();
|
|
Packit |
1c1d7e |
g_bracketCount--;
|
|
Packit |
1c1d7e |
g_parmType = g_name;
|
|
Packit |
1c1d7e |
BEGIN(FuncCall);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>[\\|\)\+\-\/\%\~\!] {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_name.resize(0);g_type.resize(0);
|
|
Packit |
1c1d7e |
if (*yytext==')')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theCallContext.popScope();
|
|
Packit |
1c1d7e |
g_bracketCount--;
|
|
Packit |
1c1d7e |
BEGIN(FuncCall);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body,TemplDecl,ObjCMethod>{TYPEKW}/{B}* {
|
|
Packit |
1c1d7e |
startFontClass("keywordtype");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
g_name+=yytext;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>"generic"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_sharpCount=0;
|
|
Packit |
1c1d7e |
BEGIN(TemplDecl);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>"template"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* { // template<...>
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_sharpCount=0;
|
|
Packit |
1c1d7e |
BEGIN(TemplDecl);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<TemplDecl>"class"|"typename" {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<TemplDecl>"<" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_sharpCount++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<TemplDecl>">" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_sharpCount--;
|
|
Packit |
1c1d7e |
if (g_sharpCount<=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BEGIN(Body);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<TemplCast>">" {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( g_lastTemplCastContext );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<TemplCast>{ID}("::"{ID})* {
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<TemplCast>("const"|"volatile"){B}* {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<TemplCast>[*^]* {
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body,FuncCall>{CASTKW}"<" { // static_cast<T>(
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_lastTemplCastContext = YY_START;
|
|
Packit |
1c1d7e |
BEGIN(TemplCast);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>"$this->"{SCOPENAME}/{BN}*[;,)\]] { // PHP member variable
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
generatePHPVariableLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
g_name+=yytext+7;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body,TemplCast>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>]*">"("::"{ID})*/{B}* { // A<T> *pt;
|
|
Packit |
1c1d7e |
int i=QCString(yytext).find('<');
|
|
Packit |
1c1d7e |
QCString kw = QCString(yytext).left(i).stripWhiteSpace();
|
|
Packit |
1c1d7e |
if (kw.right(5)=="_cast" && YY_START==Body)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
REJECT;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
g_name+=yytext;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{SCOPENAME}/{BN}*[:;,)\]] { // "int var;" or "var, var2" or "debug(f) macro" , or int var : 5;
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
// changed this to generateFunctionLink, see bug 624514
|
|
Packit |
1c1d7e |
//generateClassOrGlobalLink(*g_code,yytext,FALSE,TRUE);
|
|
Packit |
1c1d7e |
generateFunctionLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
g_name+=yytext;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{SCOPENAME}/{B}* { // p->func()
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
g_name+=yytext;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>"("{B}*("*"{B}*)+{SCOPENAME}*{B}*")"/{B}* { // (*p)->func() but not "if (p) ..."
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
int s=0;while (s<(int)yyleng && !isId(yytext[s])) s++;
|
|
Packit |
1c1d7e |
int e=(int)yyleng-1;while (e>=0 && !isId(yytext[e])) e--;
|
|
Packit |
1c1d7e |
QCString varname = ((QCString)yytext).mid(s,e-s+1);
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
g_name=varname;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>{SCOPETNAME}/{BN}*"(" { // a() or c::a() or t<A,B>::a() or A\B\foo()
|
|
Packit |
1c1d7e |
addType();
|
|
Packit |
1c1d7e |
generateFunctionLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
g_bracketCount=0;
|
|
Packit |
1c1d7e |
g_args.resize(0);
|
|
Packit |
1c1d7e |
g_name+=yytext;
|
|
Packit |
1c1d7e |
BEGIN( FuncCall );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>{RAWBEGIN} {
|
|
Packit |
1c1d7e |
QCString text=yytext;
|
|
Packit |
1c1d7e |
int i=text.find('R');
|
|
Packit |
1c1d7e |
g_code->codify(text.left(i+1));
|
|
Packit |
1c1d7e |
startFontClass("stringliteral");
|
|
Packit |
1c1d7e |
g_code->codify(yytext+i+1);
|
|
Packit |
1c1d7e |
g_lastStringContext=YY_START;
|
|
Packit |
1c1d7e |
g_inForEachExpression = FALSE;
|
|
Packit |
1c1d7e |
g_delimiter = yytext+i+2;
|
|
Packit |
1c1d7e |
g_delimiter=g_delimiter.left(g_delimiter.length()-1);
|
|
Packit |
1c1d7e |
BEGIN( RawString );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\" {
|
|
Packit |
1c1d7e |
startFontClass("stringliteral");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_lastStringContext=YY_START;
|
|
Packit |
1c1d7e |
g_inForEachExpression = FALSE;
|
|
Packit |
1c1d7e |
BEGIN( SkipString );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\' {
|
|
Packit |
1c1d7e |
startFontClass("stringliteral");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_lastStringContext=YY_START;
|
|
Packit |
1c1d7e |
g_inForEachExpression = FALSE;
|
|
Packit |
1c1d7e |
BEGIN( SkipStringS );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipString>[^\"\\\r\n]* {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipStringS>[^\'\\\r\n]* {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipString,SkipStringS>"//"|"/*" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipString>@?\" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( g_lastStringContext );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipStringS>\' {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( g_lastStringContext );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipString,SkipStringS>\\. {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<RawString>{RAWEND} {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
QCString delimiter = yytext+1;
|
|
Packit |
1c1d7e |
delimiter=delimiter.left(delimiter.length()-1);
|
|
Packit |
1c1d7e |
if (delimiter==g_delimiter)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BEGIN( g_lastStringContext );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<RawString>[^)\n]+ { g_code->codify(yytext); }
|
|
Packit |
1c1d7e |
<RawString>. { g_code->codify(yytext); }
|
|
Packit |
1c1d7e |
<RawString>\n { codifyLines(yytext); }
|
|
Packit |
1c1d7e |
<SkipVerbString>[^"\n]+ {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipVerbString>\"\" { // escaped quote
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipVerbString>\" { // end of string
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( g_lastVerbStringContext );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipVerbString>. {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipVerbString>\n {
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>":" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_name.resize(0);g_type.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>"<" {
|
|
Packit |
1c1d7e |
if (g_insideTemplate)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_sharpCount++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>">" {
|
|
Packit |
1c1d7e |
if (g_insideTemplate)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (--g_sharpCount<=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_insideTemplate=FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'" {
|
|
Packit |
1c1d7e |
startFontClass("charliteral");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>"."|"->" {
|
|
Packit |
1c1d7e |
if (yytext[0]=='-') // -> could be overloaded
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
updateCallContextForSmartPointer();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_memCallContext = YY_START;
|
|
Packit |
1c1d7e |
BEGIN( MemberCall );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall>{SCOPETNAME}/{BN}*"(" {
|
|
Packit |
1c1d7e |
if (g_theCallContext.getScope())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!generateClassMemberLink(*g_code,g_theCallContext.getScope(),yytext))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
addToSearchIndex(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
addToSearchIndex(yytext);
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_type.resize(0);
|
|
Packit |
1c1d7e |
g_bracketCount=0;
|
|
Packit |
1c1d7e |
if (g_memCallContext==Body)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BEGIN(FuncCall);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BEGIN(g_memCallContext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall>{SCOPENAME}/{B}* {
|
|
Packit |
1c1d7e |
if (g_theCallContext.getScope())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getScope()));
|
|
Packit |
1c1d7e |
if (!generateClassMemberLink(*g_code,g_theCallContext.getScope(),yytext))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
addToSearchIndex(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"no class context!\n"));
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
addToSearchIndex(yytext);
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_type.resize(0);
|
|
Packit |
1c1d7e |
BEGIN(g_memCallContext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>[,=;\[] {
|
|
Packit |
1c1d7e |
if (g_insideObjC && *yytext=='[')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Found start of ObjC call!\n");
|
|
Packit |
1c1d7e |
// start of a method call
|
|
Packit |
1c1d7e |
g_contextDict.setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
g_nameDict.setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
g_objectDict.setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
g_wordDict.setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
g_commentDict.setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
g_contextDict.clear();
|
|
Packit |
1c1d7e |
g_nameDict.clear();
|
|
Packit |
1c1d7e |
g_objectDict.clear();
|
|
Packit |
1c1d7e |
g_wordDict.clear();
|
|
Packit |
1c1d7e |
g_commentDict.clear();
|
|
Packit |
1c1d7e |
g_currentCtxId = 0;
|
|
Packit |
1c1d7e |
g_currentNameId = 0;
|
|
Packit |
1c1d7e |
g_currentObjId = 0;
|
|
Packit |
1c1d7e |
g_currentCtx = 0;
|
|
Packit |
1c1d7e |
g_braceCount = 0;
|
|
Packit |
1c1d7e |
unput('[');
|
|
Packit |
1c1d7e |
BEGIN(ObjCCall);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_saveName = g_name.copy();
|
|
Packit |
1c1d7e |
g_saveType = g_type.copy();
|
|
Packit |
1c1d7e |
if (*yytext!='[' && !g_type.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("g_scopeStack.bottom()=%p\n",g_scopeStack.bottom());
|
|
Packit |
1c1d7e |
//if (g_scopeStack.top()!=CLASSBLOCK) // commented out for bug731363
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("AddVariable: '%s' '%s' context=%d\n",
|
|
Packit |
1c1d7e |
// g_type.data(),g_name.data(),g_theVarContext.count());
|
|
Packit |
1c1d7e |
g_theVarContext.addVariable(g_type,g_name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (*yytext==';' || *yytext=='=')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_type.resize(0);
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (*yytext=='[')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theCallContext.pushScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_args.resize(0);
|
|
Packit |
1c1d7e |
g_parmType.resize(0);
|
|
Packit |
1c1d7e |
g_parmName.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
<ObjCMemberCall>{ID} {
|
|
Packit |
1c1d7e |
if (qstrcmp(yytext,"self")==0 || qstrcmp(yytext,"super")==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// TODO: get proper base class for "super"
|
|
Packit |
1c1d7e |
g_theCallContext.setClass(getClass(g_curClassName));
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
BEGIN(ObjCMemberCall2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCMemberCall>"[" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_theCallContext.pushScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCMemberCall2>{ID}":"? {
|
|
Packit |
1c1d7e |
g_name+=yytext;
|
|
Packit |
1c1d7e |
if (g_theCallContext.getClass())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Calling method %s\n",g_name.data());
|
|
Packit |
1c1d7e |
if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),g_name))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
addToSearchIndex(g_name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
addToSearchIndex(g_name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
BEGIN(ObjCMemberCall3);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCMemberCall2,ObjCMemberCall3>"]" {
|
|
Packit |
1c1d7e |
g_theCallContext.popScope();
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN(Body);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName>"["|"{" {
|
|
Packit |
1c1d7e |
saveObjCContext();
|
|
Packit |
1c1d7e |
g_currentCtx->format+=*yytext;
|
|
Packit |
1c1d7e |
BEGIN(ObjCCall);
|
|
Packit |
1c1d7e |
//printf("open\n");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName>"]"|"}" {
|
|
Packit |
1c1d7e |
g_currentCtx->format+=*yytext;
|
|
Packit |
1c1d7e |
restoreObjCContext();
|
|
Packit |
1c1d7e |
BEGIN(ObjCMName);
|
|
Packit |
1c1d7e |
if (g_currentCtx==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// end of call
|
|
Packit |
1c1d7e |
writeObjCMethodCall(g_contextDict.find(0));
|
|
Packit |
1c1d7e |
BEGIN(Body);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("close\n");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName>"//".* {
|
|
Packit |
1c1d7e |
g_currentCtx->format+=escapeComment(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName>"/*" {
|
|
Packit |
1c1d7e |
g_lastObjCCallContext = YY_START;
|
|
Packit |
1c1d7e |
g_currentCtx->comment=yytext;
|
|
Packit |
1c1d7e |
BEGIN(ObjCCallComment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCCallComment>"*/" {
|
|
Packit |
1c1d7e |
g_currentCtx->comment+=yytext;
|
|
Packit |
1c1d7e |
g_currentCtx->format+=escapeComment(g_currentCtx->comment);
|
|
Packit |
1c1d7e |
BEGIN(g_lastObjCCallContext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCCallComment>[^*\n]+ { g_currentCtx->comment+=yytext; }
|
|
Packit |
1c1d7e |
<ObjCCallComment>"//"|"/*" { g_currentCtx->comment+=yytext; }
|
|
Packit |
1c1d7e |
<ObjCCallComment>\n { g_currentCtx->comment+=*yytext; }
|
|
Packit |
1c1d7e |
<ObjCCallComment>. { g_currentCtx->comment+=*yytext; }
|
|
Packit |
1c1d7e |
<ObjCCall>{ID} {
|
|
Packit |
1c1d7e |
g_currentCtx->format+=escapeObject(yytext);
|
|
Packit |
1c1d7e |
if (g_braceCount==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentCtx->objectTypeOrName=yytext;
|
|
Packit |
1c1d7e |
//printf("new type=%s\n",g_currentCtx->objectTypeOrName.data());
|
|
Packit |
1c1d7e |
BEGIN(ObjCMName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCMName>{ID}/{BN}*"]" {
|
|
Packit |
1c1d7e |
if (g_braceCount==0 &&
|
|
Packit |
1c1d7e |
g_currentCtx->methodName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentCtx->methodName=yytext;
|
|
Packit |
1c1d7e |
g_currentCtx->format+=escapeName(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentCtx->format+=escapeWord(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCMName>{ID}/{BN}*":" {
|
|
Packit |
1c1d7e |
if (g_braceCount==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentCtx->methodName+=yytext;
|
|
Packit |
1c1d7e |
g_currentCtx->methodName+=":";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_currentCtx->format+=escapeName(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCSkipStr>[^\n\"$\\]* { g_currentCtx->format+=yytext; }
|
|
Packit |
1c1d7e |
<ObjCSkipStr>\\. { g_currentCtx->format+=yytext; }
|
|
Packit |
1c1d7e |
<ObjCSkipStr>"\"" { g_currentCtx->format+=yytext;
|
|
Packit |
1c1d7e |
BEGIN(g_lastStringContext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName>{CHARLIT} { g_currentCtx->format+=yytext; }
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName>"@"?"\"" { g_currentCtx->format+=yytext;
|
|
Packit |
1c1d7e |
g_lastStringContext=YY_START;
|
|
Packit |
1c1d7e |
BEGIN(ObjCSkipStr);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName,ObjCSkipStr>"$" { g_currentCtx->format+="$$"; }
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName>"(" { g_currentCtx->format+=*yytext; g_braceCount++; }
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName>")" { g_currentCtx->format+=*yytext; g_braceCount--; }
|
|
Packit |
1c1d7e |
<ObjCSkipStr>"@"/"\"" { // needed to prevent matching the global rule (for C#)
|
|
Packit |
1c1d7e |
g_currentCtx->format+=yytext;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName,ObjCSkipStr>{ID} { g_currentCtx->format+=escapeWord(yytext); }
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName,ObjCSkipStr>. { g_currentCtx->format+=*yytext; }
|
|
Packit |
1c1d7e |
<ObjCCall,ObjCMName,ObjCSkipStr>\n { g_currentCtx->format+=*yytext; }
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<Body>"]" {
|
|
Packit |
1c1d7e |
g_theCallContext.popScope();
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
// TODO: nested arrays like: a[b[0]->func()]->func()
|
|
Packit |
1c1d7e |
g_name = g_saveName.copy();
|
|
Packit |
1c1d7e |
g_type = g_saveType.copy();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>[0-9]+ {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Body>[0-9]+[xX][0-9A-Fa-f]+ {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2,FuncCall>{KEYWORD}/([^a-z_A-Z0-9]) {
|
|
Packit |
1c1d7e |
//addParmType();
|
|
Packit |
1c1d7e |
//g_parmName=yytext;
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2,FuncCall,OldStyleArgs,TemplCast>{TYPEKW}/([^a-z_A-Z0-9]) {
|
|
Packit |
1c1d7e |
addParmType();
|
|
Packit |
1c1d7e |
g_parmName=yytext;
|
|
Packit |
1c1d7e |
startFontClass("keywordtype");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2,FuncCall>{FLOWKW}/([^a-z_A-Z0-9]) {
|
|
Packit |
1c1d7e |
addParmType();
|
|
Packit |
1c1d7e |
g_parmName=yytext;
|
|
Packit |
1c1d7e |
startFontClass("keywordflow");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2,FuncCall>{FLOWCONDITION}/([^a-z_A-Z0-9]) {
|
|
Packit |
1c1d7e |
if (g_currentMemberDef && g_currentMemberDef->isFunction())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentMemberDef->addFlowKeyWord();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
addParmType();
|
|
Packit |
1c1d7e |
g_parmName=yytext;
|
|
Packit |
1c1d7e |
startFontClass("keywordflow");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2,FuncCall>{ID}(({B}*"<"[^\n\[\](){}<>]*">")?({B}*"::"{B}*{ID})?)* {
|
|
Packit |
1c1d7e |
addParmType();
|
|
Packit |
1c1d7e |
g_parmName=yytext;
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<FuncCall>";" { // probably a cast, not a function call
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_inForEachExpression = FALSE;
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2,FuncCall>, {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_theVarContext.addVariable(g_parmType,g_parmName);
|
|
Packit |
1c1d7e |
g_parmType.resize(0);g_parmName.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2,FuncCall>"{" {
|
|
Packit |
1c1d7e |
if (g_bracketCount>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_skipInlineInitContext=YY_START;
|
|
Packit |
1c1d7e |
g_curlyCount=0;
|
|
Packit |
1c1d7e |
BEGIN(InlineInit);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
REJECT;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<InlineInit>"{" { g_curlyCount++;
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<InlineInit>"}" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
if (--g_curlyCount<=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BEGIN(g_skipInlineInitContext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<InlineInit>\n {
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<InlineInit>. {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2,FuncCall>"(" {
|
|
Packit |
1c1d7e |
g_parmType.resize(0);g_parmName.resize(0);
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_bracketCount++;
|
|
Packit |
1c1d7e |
g_theCallContext.pushScope();
|
|
Packit |
1c1d7e |
if (YY_START==FuncCall && !g_insideBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theVarContext.pushScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2,FuncCall>{OPERATOR} { // operator
|
|
Packit |
1c1d7e |
if (qstrcmp(yytext,"*") &&
|
|
Packit |
1c1d7e |
qstrcmp(yytext,"&") &&
|
|
Packit |
1c1d7e |
qstrcmp(yytext,"^") &&
|
|
Packit |
1c1d7e |
qstrcmp(yytext,"%")) // typically a pointer or reference
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// not a * or &, or C++/CLI's ^ or %
|
|
Packit |
1c1d7e |
g_parmType.resize(0);g_parmName.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall,MemberCall2,FuncCall>("*"{B}*)?")" {
|
|
Packit |
1c1d7e |
if (yytext[0]==')') // no a pointer cast
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("addVariable(%s,%s)\n",g_parmType.data(),g_parmName.data());
|
|
Packit |
1c1d7e |
if (g_parmType.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_parmType=g_parmName;
|
|
Packit |
1c1d7e |
g_parmName.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_theVarContext.addVariable(g_parmType,g_parmName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_parmType = g_parmName;
|
|
Packit |
1c1d7e |
g_parmName.resize(0);
|
|
Packit |
1c1d7e |
g_theVarContext.addVariable(g_parmType,g_parmName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_theCallContext.popScope();
|
|
Packit |
1c1d7e |
g_inForEachExpression = FALSE;
|
|
Packit |
1c1d7e |
//g_theCallContext.setClass(0); // commented out, otherwise a()->b() does not work for b().
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
if (--g_bracketCount<=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_name.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BEGIN( CallEnd );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<CallEnd>[ \t\n]* { codifyLines(yytext); }
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
<MemberCall2,FuncCall>")"[ \t\n]*[;:] {
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
<CallEnd>[;:] {
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
g_bracketCount=0;
|
|
Packit |
1c1d7e |
if (*yytext==';') g_searchingForBody=FALSE;
|
|
Packit |
1c1d7e |
if (!g_type.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"add variable g_type=%s g_name=%s)\n",g_type.data(),g_name.data()));
|
|
Packit |
1c1d7e |
g_theVarContext.addVariable(g_type,g_name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_parmType.resize(0);g_parmName.resize(0);
|
|
Packit |
1c1d7e |
g_theCallContext.setScope(0);
|
|
Packit |
1c1d7e |
if (*yytext==';' || g_insideBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!g_insideBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theVarContext.popScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_name.resize(0);g_type.resize(0);
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_bracketCount=0;
|
|
Packit |
1c1d7e |
BEGIN( SkipInits );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<CallEnd>("const"|"volatile"|"sealed"|"override")({BN}+("const"|"volatile"|"sealed"|"override"))*/{BN}*(";"|"="|"throw"{BN}*"(") {
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<CallEnd,OldStyleArgs>("const"|"volatile"|"sealed"|"override")*({BN}+("const"|"volatile"|"sealed"|"override"))*{BN}*"{" {
|
|
Packit |
1c1d7e |
if (g_insideBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theVarContext.pushScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_theVarContext.addVariable(g_parmType,g_parmName);
|
|
Packit |
1c1d7e |
//g_theCallContext.popScope();
|
|
Packit |
1c1d7e |
g_parmType.resize(0);g_parmName.resize(0);
|
|
Packit |
1c1d7e |
int index = g_name.findRev("::");
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"g_name=%s\n",g_name.data()));
|
|
Packit |
1c1d7e |
if (index!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString scope = g_name.left(index);
|
|
Packit |
1c1d7e |
if (!g_classScope.isEmpty()) scope.prepend(g_classScope+"::");
|
|
Packit |
1c1d7e |
ClassDef *cd=getResolvedClass(Doxygen::globalScope,g_sourceFileDef,scope);
|
|
Packit |
1c1d7e |
if (cd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
setClassScope(cd->name());
|
|
Packit |
1c1d7e |
g_scopeStack.push(SCOPEBLOCK);
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//setClassScope(g_realScope);
|
|
Packit |
1c1d7e |
g_scopeStack.push(INNERBLOCK);
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
|
|
Packit |
1c1d7e |
g_scopeStack.push(INNERBLOCK);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
yytext[yyleng-1]='\0';
|
|
Packit |
1c1d7e |
QCString cv(yytext);
|
|
Packit |
1c1d7e |
if (!cv.stripWhiteSpace().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // just whitespace
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_code->codify("{");
|
|
Packit |
1c1d7e |
if (g_searchingForBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_searchingForBody=FALSE;
|
|
Packit |
1c1d7e |
g_insideBody=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (g_insideBody) g_bodyCurlyCount++;
|
|
Packit |
1c1d7e |
g_type.resize(0); g_name.resize(0);
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<CallEnd>"try" { // function-try-block
|
|
Packit |
1c1d7e |
startFontClass("keyword");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
g_inFunctionTryBlock=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<CallEnd>{ID} {
|
|
Packit |
1c1d7e |
if (g_insideBody || !g_parmType.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
REJECT;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// could be K&R style definition
|
|
Packit |
1c1d7e |
addParmType();
|
|
Packit |
1c1d7e |
g_parmName=yytext;
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
|
|
Packit |
1c1d7e |
BEGIN(OldStyleArgs);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<OldStyleArgs>{ID} {
|
|
Packit |
1c1d7e |
addParmType();
|
|
Packit |
1c1d7e |
g_parmName=yytext;
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<OldStyleArgs>[,;] {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_theVarContext.addVariable(g_parmType,g_parmName);
|
|
Packit |
1c1d7e |
if (*yytext==';') g_parmType.resize(0);
|
|
Packit |
1c1d7e |
g_parmName.resize(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<CallEnd,OldStyleArgs>"#" {
|
|
Packit |
1c1d7e |
startFontClass("preprocessor");
|
|
Packit |
1c1d7e |
g_lastSkipCppContext = Body;
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN( SkipCPP );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<CallEnd>. {
|
|
Packit |
1c1d7e |
unput(*yytext);
|
|
Packit |
1c1d7e |
if (!g_insideBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_theVarContext.popScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_name.resize(0);g_args.resize(0);
|
|
Packit |
1c1d7e |
g_parmType.resize(0);g_parmName.resize(0);
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipInits>";" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_type.resize(0); g_name.resize(0);
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipInits>"{" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
if (g_searchingForBody)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_searchingForBody=FALSE;
|
|
Packit |
1c1d7e |
g_insideBody=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (g_insideBody) g_bodyCurlyCount++;
|
|
Packit |
1c1d7e |
if (g_name.find("::")!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
|
|
Packit |
1c1d7e |
g_scopeStack.push(SCOPEBLOCK);
|
|
Packit |
1c1d7e |
setClassScope(g_realScope);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
|
|
Packit |
1c1d7e |
g_scopeStack.push(INNERBLOCK);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_type.resize(0); g_name.resize(0);
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipInits>{ID} {
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<FuncCall>{ID}/"(" {
|
|
Packit |
1c1d7e |
generateFunctionLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<FuncCall>{ID}/("."|"->") {
|
|
Packit |
1c1d7e |
g_name=yytext;
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
BEGIN( MemberCall2 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<FuncCall,MemberCall2>("("{B}*("*"{B}*)+{ID}*{B}*")"{B}*)/("."|"->") {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
int s=0;while (!isId(yytext[s])) s++;
|
|
Packit |
1c1d7e |
int e=(int)yyleng-1;while (!isId(yytext[e])) e--;
|
|
Packit |
1c1d7e |
g_name=((QCString)yytext).mid(s,e-s+1);
|
|
Packit |
1c1d7e |
BEGIN( MemberCall2 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2>{ID}/([ \t\n]*"(") {
|
|
Packit |
1c1d7e |
if (!g_args.isEmpty())
|
|
Packit |
1c1d7e |
generateMemberLink(*g_code,g_args,yytext);
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
g_args.resize(0);
|
|
Packit |
1c1d7e |
BEGIN( FuncCall );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2>{ID}/([ \t\n]*("."|"->")) {
|
|
Packit |
1c1d7e |
//g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_name=yytext;
|
|
Packit |
1c1d7e |
generateClassOrGlobalLink(*g_code,yytext);
|
|
Packit |
1c1d7e |
BEGIN( MemberCall2 );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<MemberCall2>"->"|"." {
|
|
Packit |
1c1d7e |
if (yytext[0]=='-') // -> could be overloaded
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
updateCallContextForSmartPointer();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_memCallContext = YY_START;
|
|
Packit |
1c1d7e |
BEGIN( MemberCall );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipComment>"/*"("!"?)"*/" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( g_lastCContext ) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipComment>"//"|"/*" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipComment>[^*/\n]+ {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipComment>[ \t]*"*/" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
if (g_lastCContext==SkipCPP)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startFontClass("preprocessor");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
BEGIN( g_lastCContext ) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipCxxComment>[^\r\n]*"\\"[\r]?\n { // line continuation
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipCxxComment>[^\r\n]+ {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipCxxComment>\r
|
|
Packit |
1c1d7e |
<SkipCxxComment>\n {
|
|
Packit |
1c1d7e |
unput('\n');
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( g_lastCContext ) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipCxxComment>. {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)?{B}*"/*"[*!]/[^/*] {
|
|
Packit |
1c1d7e |
g_yyLineNr+=QCString(yytext).contains('\n');
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)? {
|
|
Packit |
1c1d7e |
g_yyLineNr+=QCString(yytext).contains('\n');
|
|
Packit |
1c1d7e |
nextCodeLine();
|
|
Packit |
1c1d7e |
if (g_lastSpecialCContext==SkipCxxComment)
|
|
Packit |
1c1d7e |
{ // force end of C++ comment here
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( g_lastCContext ) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BEGIN(g_lastSpecialCContext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<RemoveSpecialCComment>"*/" {
|
|
Packit |
1c1d7e |
BEGIN(g_lastSpecialCContext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<RemoveSpecialCComment>[^*\n]+
|
|
Packit |
1c1d7e |
<RemoveSpecialCComment>"//"|"/*"
|
|
Packit |
1c1d7e |
<RemoveSpecialCComment>\n { g_yyLineNr++; }
|
|
Packit |
1c1d7e |
<RemoveSpecialCComment>.
|
|
Packit |
1c1d7e |
<MemberCall>[^a-z_A-Z0-9(\n] {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_type.resize(0);
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
BEGIN(g_memCallContext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>\n({B}*"//"[!/][^\n]*\n)+ { // remove special one-line comment
|
|
Packit |
1c1d7e |
if (YY_START==SkipCPP) REJECT;
|
|
Packit |
1c1d7e |
if (Config_getBool(STRIP_CODE_COMMENTS))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_yyLineNr+=((QCString)yytext).contains('\n');
|
|
Packit |
1c1d7e |
nextCodeLine();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (YY_START==SkipCxxComment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( g_lastCContext ) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipCPP>\n/.*\n {
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
BEGIN( g_lastSkipCppContext ) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>\n{B}*"//@"[{}].*\n { // remove one-line group marker
|
|
Packit |
1c1d7e |
if (Config_getBool(STRIP_CODE_COMMENTS))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_yyLineNr+=2;
|
|
Packit |
1c1d7e |
nextCodeLine();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (YY_START==SkipCxxComment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
BEGIN( g_lastCContext ) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>\n{B}*"/*@"[{}] { // remove one-line group marker
|
|
Packit |
1c1d7e |
if (Config_getBool(STRIP_CODE_COMMENTS))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_lastSpecialCContext = YY_START;
|
|
Packit |
1c1d7e |
g_yyLineNr++;
|
|
Packit |
1c1d7e |
BEGIN(RemoveSpecialCComment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// check is to prevent getting stuck in skipping C++ comments
|
|
Packit |
1c1d7e |
if (YY_START != SkipCxxComment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_lastCContext = YY_START ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
BEGIN(SkipComment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>^{B}*"//@"[{}].*\n { // remove one-line group marker
|
|
Packit |
1c1d7e |
if (Config_getBool(STRIP_CODE_COMMENTS))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_yyLineNr++;
|
|
Packit |
1c1d7e |
nextCodeLine();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>^{B}*"/*@"[{}] { // remove multi-line group marker
|
|
Packit |
1c1d7e |
if (Config_getBool(STRIP_CODE_COMMENTS))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_lastSpecialCContext = YY_START;
|
|
Packit |
1c1d7e |
BEGIN(RemoveSpecialCComment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// check is to prevent getting stuck in skipping C++ comments
|
|
Packit |
1c1d7e |
if (YY_START != SkipCxxComment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_lastCContext = YY_START ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN(SkipComment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment
|
|
Packit |
1c1d7e |
if (Config_getBool(STRIP_CODE_COMMENTS))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_yyLineNr++;
|
|
Packit |
1c1d7e |
//nextCodeLine();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>"//"[!/][^\n]*\n { // strip special one-line comment
|
|
Packit |
1c1d7e |
if (YY_START==SkipComment || YY_START==SkipString) REJECT;
|
|
Packit |
1c1d7e |
if (Config_getBool(STRIP_CODE_COMMENTS))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char c[2]; c[0]='\n'; c[1]=0;
|
|
Packit |
1c1d7e |
codifyLines(c);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>"/*[tag:"[^\]\n]*"]*/"{B}* { // special pattern /*[tag:filename]*/ to force linking to a tag file
|
|
Packit |
1c1d7e |
g_forceTagReference=yytext;
|
|
Packit |
1c1d7e |
int s=g_forceTagReference.find(':');
|
|
Packit |
1c1d7e |
int e=g_forceTagReference.findRev(']');
|
|
Packit |
1c1d7e |
g_forceTagReference = g_forceTagReference.mid(s+1,e-s-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>\n{B}*"/*"[!*]/[^/*] {
|
|
Packit |
1c1d7e |
if (Config_getBool(STRIP_CODE_COMMENTS))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_lastSpecialCContext = YY_START;
|
|
Packit |
1c1d7e |
g_yyLineNr++;
|
|
Packit |
1c1d7e |
BEGIN(RemoveSpecialCComment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// check is to prevent getting stuck in skipping C++ comments
|
|
Packit |
1c1d7e |
if (YY_START != SkipCxxComment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_lastCContext = YY_START ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
BEGIN(SkipComment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>^{B}*"/*"[!*]/[^/*] { // special C comment block at a new line
|
|
Packit |
1c1d7e |
if (Config_getBool(STRIP_CODE_COMMENTS))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_lastSpecialCContext = YY_START;
|
|
Packit |
1c1d7e |
BEGIN(RemoveSpecialCComment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// check is to prevent getting stuck in skipping C++ comments
|
|
Packit |
1c1d7e |
if (YY_START != SkipCxxComment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_lastCContext = YY_START ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN(SkipComment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>"/*"[!*]/[^/*] { // special C comment block half way a line
|
|
Packit |
1c1d7e |
if (YY_START==SkipString) REJECT;
|
|
Packit |
1c1d7e |
if (Config_getBool(STRIP_CODE_COMMENTS))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_lastSpecialCContext = YY_START;
|
|
Packit |
1c1d7e |
BEGIN(RemoveSpecialCComment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// check is to prevent getting stuck in skipping C++ comments
|
|
Packit |
1c1d7e |
if (YY_START != SkipCxxComment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_lastCContext = YY_START ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
BEGIN(SkipComment);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>"/*"("!"?)"*/" {
|
|
Packit |
1c1d7e |
if (YY_START==SkipString) REJECT;
|
|
Packit |
1c1d7e |
if (!Config_getBool(STRIP_CODE_COMMENTS))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>"/*" {
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
// check is to prevent getting stuck in skipping C++ comments
|
|
Packit |
1c1d7e |
if (YY_START != SkipCxxComment)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_lastCContext = YY_START ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
BEGIN( SkipComment ) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>@\" { // C# verbatim string
|
|
Packit |
1c1d7e |
startFontClass("stringliteral");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_lastVerbStringContext=YY_START;
|
|
Packit |
1c1d7e |
BEGIN(SkipVerbString);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>"//" {
|
|
Packit |
1c1d7e |
startFontClass("comment");
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_lastCContext = YY_START ;
|
|
Packit |
1c1d7e |
BEGIN( SkipCxxComment ) ;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>"("|"[" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_theCallContext.pushScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>")"|"]" {
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
g_theCallContext.popScope();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>\n {
|
|
Packit |
1c1d7e |
g_yyColNr++;
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<*>. {
|
|
Packit |
1c1d7e |
g_yyColNr++;
|
|
Packit |
1c1d7e |
g_code->codify(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
<*>([ \t\n]*"\n"){2,} { // combine multiple blank lines
|
|
Packit |
1c1d7e |
//QCString sepLine=yytext;
|
|
Packit |
1c1d7e |
//g_code->codify("\n\n");
|
|
Packit |
1c1d7e |
//g_yyLineNr+=sepLine.contains('\n');
|
|
Packit |
1c1d7e |
//char sepLine[3]="\n\n";
|
|
Packit |
1c1d7e |
codifyLines(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%%
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*@ ----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void saveObjCContext()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_currentCtx)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentCtx->format+=QCString().sprintf("$c%d",g_currentCtxId);
|
|
Packit |
1c1d7e |
if (g_braceCount==0 && YY_START==ObjCCall)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentCtx->objectTypeOrName=g_currentCtx->format.mid(1);
|
|
Packit |
1c1d7e |
//printf("new type=%s\n",g_currentCtx->objectTypeOrName.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_contextStack.push(g_currentCtx);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Trying to save NULL context!\n");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ObjCCallCtx *newCtx = new ObjCCallCtx;
|
|
Packit |
1c1d7e |
newCtx->id = g_currentCtxId;
|
|
Packit |
1c1d7e |
newCtx->lexState = YY_START;
|
|
Packit |
1c1d7e |
newCtx->braceCount = g_braceCount;
|
|
Packit |
1c1d7e |
newCtx->objectType = 0;
|
|
Packit |
1c1d7e |
newCtx->objectVar = 0;
|
|
Packit |
1c1d7e |
newCtx->method = 0;
|
|
Packit |
1c1d7e |
//printf("save state=%d\n",YY_START);
|
|
Packit |
1c1d7e |
g_contextDict.insert(g_currentCtxId,newCtx);
|
|
Packit |
1c1d7e |
g_currentCtx = newCtx;
|
|
Packit |
1c1d7e |
g_braceCount = 0;
|
|
Packit |
1c1d7e |
g_currentCtxId++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void restoreObjCContext()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("restore state=%d->%d\n",YY_START,g_currentCtx->lexState);
|
|
Packit |
1c1d7e |
BEGIN(g_currentCtx->lexState);
|
|
Packit |
1c1d7e |
g_braceCount = g_currentCtx->braceCount;
|
|
Packit |
1c1d7e |
if (!g_contextStack.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentCtx = g_contextStack.pop();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_currentCtx = 0;
|
|
Packit |
1c1d7e |
//printf("Trying to pop context while g_contextStack is empty!\n");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void resetCCodeParserState()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("***initParseCodeContext()\n");
|
|
Packit |
1c1d7e |
g_forceTagReference.resize(0);
|
|
Packit |
1c1d7e |
g_theVarContext.clear();
|
|
Packit |
1c1d7e |
g_classScopeLengthStack.setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
g_classScopeLengthStack.clear();
|
|
Packit |
1c1d7e |
delete g_codeClassSDict;
|
|
Packit |
1c1d7e |
g_codeClassSDict = new ClassSDict(17);
|
|
Packit |
1c1d7e |
g_codeClassSDict->setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
g_codeClassSDict->clear();
|
|
Packit |
1c1d7e |
g_curClassBases.clear();
|
|
Packit |
1c1d7e |
g_anchorCount = 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s,
|
|
Packit |
1c1d7e |
SrcLangExt lang,bool exBlock, const char *exName,FileDef *fd,
|
|
Packit |
1c1d7e |
int startLine,int endLine,bool inlineFragment,
|
|
Packit |
1c1d7e |
MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx,
|
|
Packit |
1c1d7e |
bool collectXRefs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("***parseCode() exBlock=%d exName=%s fd=%p className=%s searchCtx=%s\n",
|
|
Packit |
1c1d7e |
// exBlock,exName,fd,className,searchCtx?searchCtx->name().data():"<none>");
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (s.isEmpty()) return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
TooltipManager::instance()->clearTooltips();
|
|
Packit |
1c1d7e |
if (g_codeClassSDict==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
resetCCodeParserState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_code = &od;
|
|
Packit |
1c1d7e |
g_inputString = s;
|
|
Packit |
1c1d7e |
g_inputPosition = 0;
|
|
Packit |
1c1d7e |
g_currentFontClass = 0;
|
|
Packit |
1c1d7e |
g_needsTermination = FALSE;
|
|
Packit |
1c1d7e |
g_searchCtx = searchCtx;
|
|
Packit |
1c1d7e |
g_collectXRefs = collectXRefs;
|
|
Packit |
1c1d7e |
g_inFunctionTryBlock = FALSE;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (startLine!=-1)
|
|
Packit |
1c1d7e |
g_yyLineNr = startLine;
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
g_yyLineNr = 1;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (endLine!=-1)
|
|
Packit |
1c1d7e |
g_inputLines = endLine+1;
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
g_inputLines = g_yyLineNr + countLines() - 1;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
g_curlyCount = 0;
|
|
Packit |
1c1d7e |
g_bodyCurlyCount = 0;
|
|
Packit |
1c1d7e |
g_bracketCount = 0;
|
|
Packit |
1c1d7e |
g_sharpCount = 0;
|
|
Packit |
1c1d7e |
g_insideTemplate = FALSE;
|
|
Packit |
1c1d7e |
g_theCallContext.clear();
|
|
Packit |
1c1d7e |
g_scopeStack.clear();
|
|
Packit |
1c1d7e |
g_classScope = className;
|
|
Packit |
1c1d7e |
//printf("parseCCode %s\n",className);
|
|
Packit |
1c1d7e |
g_exampleBlock = exBlock;
|
|
Packit |
1c1d7e |
g_exampleName = exName;
|
|
Packit |
1c1d7e |
g_sourceFileDef = fd;
|
|
Packit |
1c1d7e |
g_lineNumbers = fd!=0 && showLineNumbers;
|
|
Packit |
1c1d7e |
bool cleanupSourceDef = FALSE;
|
|
Packit |
1c1d7e |
if (fd==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// create a dummy filedef for the example
|
|
Packit |
1c1d7e |
g_sourceFileDef = new FileDef("",(exName?exName:"generated"));
|
|
Packit |
1c1d7e |
cleanupSourceDef = TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_insideObjC = lang==SrcLangExt_ObjC;
|
|
Packit |
1c1d7e |
g_insideJava = lang==SrcLangExt_Java;
|
|
Packit |
1c1d7e |
g_insideCS = lang==SrcLangExt_CSharp;
|
|
Packit |
1c1d7e |
g_insidePHP = lang==SrcLangExt_PHP;
|
|
Packit |
1c1d7e |
if (g_sourceFileDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
setCurrentDoc("l00001");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_currentDefinition = 0;
|
|
Packit |
1c1d7e |
g_currentMemberDef = 0;
|
|
Packit |
1c1d7e |
g_searchingForBody = exBlock;
|
|
Packit |
1c1d7e |
g_insideBody = FALSE;
|
|
Packit |
1c1d7e |
g_bracketCount = 0;
|
|
Packit |
1c1d7e |
if (!g_exampleName.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_exampleFile = convertNameToFile(g_exampleName+"-example",FALSE,TRUE);
|
|
Packit |
1c1d7e |
//printf("g_exampleFile=%s\n",g_exampleFile.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_includeCodeFragment = inlineFragment;
|
|
Packit |
1c1d7e |
//printf("** exBlock=%d exName=%s include=%d\n",exBlock,exName,inlineFragment);
|
|
Packit |
1c1d7e |
startCodeLine();
|
|
Packit |
1c1d7e |
g_type.resize(0);
|
|
Packit |
1c1d7e |
g_name.resize(0);
|
|
Packit |
1c1d7e |
g_args.resize(0);
|
|
Packit |
1c1d7e |
g_parmName.resize(0);
|
|
Packit |
1c1d7e |
g_parmType.resize(0);
|
|
Packit |
1c1d7e |
if (memberDef) setParameterList(memberDef);
|
|
Packit |
1c1d7e |
codeYYrestart( codeYYin );
|
|
Packit |
1c1d7e |
BEGIN( Body );
|
|
Packit |
1c1d7e |
codeYYlex();
|
|
Packit |
1c1d7e |
g_lexInit=TRUE;
|
|
Packit |
1c1d7e |
if (g_needsTermination)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
endFontClass();
|
|
Packit |
1c1d7e |
DBG_CTX((stderr,"endCodeLine(%d)\n",g_yyLineNr));
|
|
Packit |
1c1d7e |
g_code->endCodeLine();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (fd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
TooltipManager::instance()->writeTooltips(*g_code);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (cleanupSourceDef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// delete the temporary file definition used for this example
|
|
Packit |
1c1d7e |
delete g_sourceFileDef;
|
|
Packit |
1c1d7e |
g_sourceFileDef=0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void codeFreeScanner()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(YY_FLEX_SUBMINOR_VERSION)
|
|
Packit |
1c1d7e |
if (g_lexInit)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
codeYYlex_destroy();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if !defined(YY_FLEX_SUBMINOR_VERSION)
|
|
Packit |
1c1d7e |
extern "C" { // some bogus code to keep the compiler happy
|
|
Packit |
1c1d7e |
void codeYYdummy() { yy_flex_realloc(0,0); }
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33
|
|
Packit |
1c1d7e |
#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)."
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|