00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ROOT_TDocParser
00013 #define ROOT_TDocParser
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <list>
00024 #include <set>
00025 #include <map>
00026
00027 #ifndef ROOT_TObject
00028 #include "TObject.h"
00029 #endif
00030 #ifndef ROOT_THashList
00031 #include "THashList.h"
00032 #endif
00033 #ifndef ROOT_TString
00034 #include "TString.h"
00035 #endif
00036 #ifndef ROOT_Riosfwd
00037 #include "Riosfwd.h"
00038 #endif
00039
00040 class TBaseClass;
00041 class TClass;
00042 class TClassDocOutput;
00043 class TDocOutput;
00044 class THtml;
00045
00046 class TDocMethodWrapper: public TObject {
00047 public:
00048 virtual TMethod* GetMethod() const = 0;
00049 virtual Int_t GetOverloadIdx() const = 0;
00050 enum { kDocumented = 14 };
00051 };
00052
00053 class TDocParser: public TObject {
00054 protected:
00055 enum EDocContext {
00056 kIgnore,
00057 kDocFunc,
00058 kDocClass,
00059 kNumDocContexts
00060 };
00061
00062 public:
00063 enum ESourceInfo {
00064 kInfoLastUpdate,
00065 kInfoAuthor,
00066 kInfoCopyright,
00067 kInfoLastChanged,
00068 kInfoLastGenerated,
00069 kNumSourceInfos
00070 };
00071 enum EAccess {
00072 kPrivate,
00073 kProtected,
00074 kPublic
00075 };
00076 enum EParseContext {
00077 kNoContext,
00078 kCode,
00079 kComment,
00080 kDirective,
00081 kString,
00082 kKeyword,
00083 kCPP,
00084 kVerbatim,
00085 kNumParseContexts,
00086 kParseContextMask = BIT(4) - 1
00087 };
00088 enum EParseContextFlag {
00089 kCXXComment = BIT(4),
00090 kParseContextFlagMask = (UInt_t)(~(BIT(4) - 1))
00091
00092 };
00093
00094 protected:
00095 THtml* fHtml;
00096 TDocOutput* fDocOutput;
00097 UInt_t fLineNo;
00098 TString fLineRaw;
00099 TString fLineStripped;
00100 TString fLineComment;
00101 TString fLineSource;
00102 TString fComment;
00103 TString fFirstClassDoc;
00104 TString fLastClassDoc;
00105 TClass* fCurrentClass;
00106 TClass* fRecentClass;
00107 TString fCurrentModule;
00108 TString fCurrentMethodTag;
00109 Int_t fDirectiveCount;
00110 Long_t fLineNumber;
00111 TString fCurrentFile;
00112 std::map<std::string , Int_t > fMethodCounts;
00113 EDocContext fDocContext;
00114 std::list<UInt_t> fParseContext;
00115 Bool_t fCheckForMethod;
00116 enum {
00117 kClassDoc_Uninitialized,
00118 kClassDoc_LookingNothingFound,
00119 kClassDoc_LookingHaveSomething,
00120 kClassDoc_Written,
00121 kClassDoc_Ignore,
00122 kClassDoc_NumStates
00123 } fClassDocState;
00124 Bool_t fCommentAtBOL;
00125 TString fClassDescrTag;
00126 TString fSourceInfoTags[kNumSourceInfos];
00127 TList fDirectiveHandlers;
00128 Bool_t fAllowDirectives;
00129 std::set<UInt_t> fExtraLinesWithAnchor;
00130 TString fSourceInfo[kNumSourceInfos];
00131 THashList fMethods[3];
00132 TList fDataMembers[6];
00133
00134 static std::set<std::string> fgKeywords;
00135
00136 void AddClassMethodsRecursively(TBaseClass* bc);
00137 void AddClassDataMembersRecursively(TBaseClass* bc);
00138 EParseContext Context() const { return fParseContext.empty() ? kComment : (EParseContext)(fParseContext.back() & kParseContextMask); }
00139 virtual void ExpandCPPLine(TString& line, Ssiz_t& pos);
00140 virtual Bool_t HandleDirective(TString& keyword, Ssiz_t& pos,
00141 TString& word, Ssiz_t& copiedToCommentUpTo);
00142 virtual void InitKeywords() const;
00143 virtual TClass* IsDirective(const TString& line, Ssiz_t pos, const TString& word, Bool_t& begin) const;
00144 TMethod* LocateMethodInCurrentLine(Ssiz_t& posMethodName, TString& ret,
00145 TString& name, TString& params, Bool_t& isconst,
00146 std::ostream &srcOut, TString &anchor,
00147 std::ifstream& sourcefile, Bool_t allowPureVirtual);
00148 void LocateMethodsInSource(std::ostream& out);
00149 void LocateMethodsInHeaderInline(std::ostream& out);
00150 void LocateMethodsInHeaderClassDecl(std::ostream& out);
00151 void LocateMethods(std::ostream& out, const char* filename,
00152 Bool_t lookForSourceInfo = kTRUE,
00153 Bool_t useDocxxStyle = kFALSE,
00154 Bool_t allowPureVirtual = kFALSE,
00155 const char* methodPattern = 0,
00156 const char* sourceExt = 0);
00157 virtual Bool_t ProcessComment();
00158 void RemoveCommentContext(Bool_t cxxcomment);
00159 void WriteClassDoc(std::ostream& out, Bool_t first = kTRUE);
00160 void WriteMethod(std::ostream& out, TString& ret,
00161 TString& name, TString& params,
00162 Bool_t isconst,
00163 const char* file, TString& anchor,
00164 TString& codeOneLiner);
00165 void WriteSourceLine(std::ostream& out);
00166
00167 public:
00168 TDocParser(TClassDocOutput& docOutput, TClass* cl);
00169 TDocParser(TDocOutput& docOutput);
00170 virtual ~TDocParser();
00171
00172 static void AnchorFromLine(const TString& line, TString& anchor);
00173 void Convert(std::ostream& out, std::istream& in, const char* relpath,
00174 Bool_t isCode, Bool_t interpretDirectives);
00175 void DecrementMethodCount(const char* name);
00176 virtual void DecorateKeywords(std::ostream& out, const char* text);
00177 virtual void DecorateKeywords(TString& text);
00178 virtual void DeleteDirectiveOutput() const;
00179 const TList* GetMethods(EAccess access) const { return &fMethods[access]; }
00180 TClass* GetCurrentClass() const { return fCurrentClass; }
00181 void GetCurrentModule(TString& out_module) const;
00182 TDocOutput* GetDocOutput() const { return fDocOutput; }
00183 Long_t GetLineNumber() const { return fLineNumber; }
00184 const TList* GetDataMembers(EAccess access) const { return &fDataMembers[access]; }
00185 const TList* GetEnums(EAccess access) const { return &fDataMembers[access+3]; }
00186 const char* GetSourceInfo(ESourceInfo type) const { return fSourceInfo[type]; }
00187 void SetCurrentModule(const char* module) { fCurrentModule = module; }
00188
00189 UInt_t InContext(Int_t context) const;
00190 static Bool_t IsName(UChar_t c);
00191 static Bool_t IsWord(UChar_t c);
00192
00193 virtual void Parse(std::ostream& out);
00194 static Bool_t Strip(TString& s);
00195
00196 ClassDef(TDocParser,0);
00197 };
00198
00199 #endif // ROOT_TDocParser