#ifndef PARSERTHREAD_H
#define PARSERTHREAD_H
#include <wx/thread.h>
#include <wx/event.h>
#include <wx/string.h>
#include <wx/dynarray.h>
#include "tokenizer.h"
#include "token.h"
#include <cbthreadpool.h>
//extern int THREAD_START;
//extern int THREAD_END;
extern int NEW_TOKEN;
extern int FILE_NEEDS_PARSING;
static wxMutex s_mutexProtection;
struct ParserThreadOptions
{
bool useBuffer;
bool bufferSkipBlocks;
bool wantPreprocessor;
};
class ParserThread : public cbThreadPoolTask
{
public:
ParserThread(wxEvtHandler* parent,bool* abortflag,
const wxString& bufferOrFilename,
bool isLocal,
ParserThreadOptions& options,
TokensArray* tokens);
virtual ~ParserThread();
int Execute(){ return Parse() ? 0 : 1; }
bool Parse();
bool ParseBufferForFunctions(const wxString& buffer);
virtual void* DoRun();
virtual void SetTokens(TokensArray* tokens);
const wxString& GetFilename(){ return m_Filename; }
protected:
wxChar SkipToOneOfChars(const wxString& chars, bool supportNesting = false);
void SkipBlock();
void SkipAngleBraces();
void HandleIncludes();
void HandleDefines();
void HandleNamespace();
void HandleClass(bool isClass = true);
void HandleFunction(const wxString& name, bool isOperator = false);
void HandleEnum();
Token* DoAddToken(TokenKind kind, const wxString& name, const wxString& args = wxEmptyString, bool isOperator = false);
wxString GetActualTokenType();
private:
void Log(const wxString& log);
Token* TokenExists(const wxString& name, Token* parent = 0, short int kindMask = 0xFFFF); // if parent is 0, all tokens are searched
Tokenizer m_Tokens;
wxEvtHandler* m_pParent;
TokensArray* m_pTokens;
Token* m_pLastParent;
TokenScope m_LastScope;
wxString m_Filename;
bool m_IsLocal;
int m_StartBlockIndex;
wxString m_Str;
wxString m_LastToken;
ParserThreadOptions m_Options;
wxArrayString m_EncounteredNamespaces; // for member funcs implementation
};
#endif // PARSERTHREAD_H
syntax highlighted by Code2HTML, v. 0.9.1