00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#ifndef _CODEMODEL_H_
00021
#define _CODEMODEL_H_
00022
00023
#include <qmap.h>
00024
#include <qstringlist.h>
00025
#include <ksharedptr.h>
00026
00027
class CodeModel;
00028
class CodeModelItem;
00029
class FileModel;
00030
class NamespaceModel;
00031
class ClassModel;
00032
class FunctionModel;
00033
class FunctionDefinitionModel;
00034
class VariableModel;
00035
class ArgumentModel;
00036
class EnumModel;
00037
class EnumeratorModel;
00038
class TypeAliasModel;
00039
00040 typedef KSharedPtr<CodeModelItem> ItemDom;
00041 typedef KSharedPtr<FileModel> FileDom;
00042 typedef KSharedPtr<NamespaceModel> NamespaceDom;
00043 typedef KSharedPtr<ClassModel> ClassDom;
00044 typedef KSharedPtr<FunctionModel> FunctionDom;
00045 typedef KSharedPtr<FunctionDefinitionModel> FunctionDefinitionDom;
00046 typedef KSharedPtr<VariableModel> VariableDom;
00047 typedef KSharedPtr<ArgumentModel> ArgumentDom;
00048 typedef KSharedPtr<EnumModel> EnumDom;
00049 typedef KSharedPtr<TypeAliasModel> TypeAliasDom;
00050 typedef KSharedPtr<EnumeratorModel> EnumeratorDom;
00051
00052 typedef QValueList<ItemDom> ItemList;
00053 typedef QValueList<FileDom> FileList;
00054 typedef QValueList<NamespaceDom> NamespaceList;
00055 typedef QValueList<ClassDom> ClassList;
00056 typedef QValueList<FunctionDom> FunctionList;
00057 typedef QValueList<FunctionDefinitionDom> FunctionDefinitionList;
00058 typedef QValueList<VariableDom> VariableList;
00059 typedef QValueList<ArgumentDom> ArgumentList;
00060 typedef QValueList<EnumDom> EnumList;
00061 typedef QValueList<TypeAliasDom> TypeAliasList;
00062 typedef QValueList<EnumeratorDom> EnumeratorList;
00063
00064
template <
class ItemList>
00065 QStringList sortedNameList(
const ItemList& lst )
00066 {
00067
QStringList nameList;
00068
00069
typename ItemList::ConstIterator it = lst.begin();
00070
while( it != lst.end() ){
00071
if( !(*it)->name().isEmpty() )
00072 nameList << (*it)->name();
00073 ++it;
00074 }
00075
00076 nameList.sort();
00077
return nameList;
00078 }
00079
00080
template <
class Result,
class T>
00081 Result
model_cast(
KSharedPtr<T> x )
00082 {
00083 Result r( static_cast<T*>(x) );
00084
return r;
00085 }
00086
00087
template <
class Result,
class T>
00088 Result
model_cast( T* x )
00089 {
00090 Result r( static_cast<T*>(x) );
00091
return r;
00092 }
00093
00094 class CodeModel
00095 {
00096
public:
00097
CodeModel();
00098
virtual ~CodeModel();
00099
00100 template <
class T>
typename T::Ptr
create()
00101 {
00102
typename T::Ptr ptr(
new T(
this) );
00103
return ptr;
00104 }
00105
00106
void wipeout();
00107
00108
FileList fileList();
00109
const FileList fileList() const;
00110
00111
bool hasFile( const
QString& name ) const;
00112
00113 FileDom fileByName( const
QString& name );
00114 const FileDom fileByName( const
QString& name ) const;
00115
00116
bool addFile( FileDom file );
00117
void removeFile( FileDom file );
00118
00119 const NamespaceDom globalNamespace() const;
00120
00121 virtual
void read(
QDataStream& stream );
00122 virtual
void write(
QDataStream& stream ) const;
00123
00124 private:
00125
void addNamespace( NamespaceDom target, NamespaceDom source );
00126
void removeNamespace( NamespaceDom target, NamespaceDom source );
00127
00128 private:
00129 QMap<
QString, FileDom> m_files;
00130 NamespaceDom m_globalNamespace;
00131
00132 private:
00133
CodeModel( const
CodeModel& source );
00134
void operator = ( const
CodeModel& source );
00135 friend class
CodeModelItem;
00136 };
00137
00138 class CodeModelItem: public
KShared
00139 {
00140
public:
00141 typedef ItemDom Ptr;
00142
00143
enum
00144 {
00145 File,
00146 Namespace,
00147 Class,
00148 Function,
00149 Variable,
00150 Argument,
00151 FunctionDefinition,
00152 Enum,
00153 Enumerator,
00154 TypeAlias,
00155
00156 Custom = 1000
00157 };
00158
00159
enum
00160 {
00161 Public,
00162 Protected,
00163 Private
00164 };
00165
00166
protected:
00167 CodeModelItem(
int kind,
CodeModel* model );
00168
00169
public:
00170
virtual ~CodeModelItem();
00171
00172 int kind()
const {
return m_kind; }
00173 void setKind(
int kind ) { m_kind = kind; }
00174
00175 QString name() const;
00176
void setName( const QString& name );
00177
00178 FileDom file();
00179 const FileDom file() const;
00180
00181 QString fileName() const;
00182
void setFileName( const QString& fileName );
00183
00184
void getStartPosition(
int* line,
int* col ) const;
00185
void setStartPosition(
int line,
int col );
00186
00187
void getEndPosition(
int* line,
int* col ) const;
00188
void setEndPosition(
int line,
int col );
00189
00190 virtual
bool isFile()
const {
return false; }
00191 virtual bool isNamespace()
const {
return false; }
00192 virtual bool isClass()
const {
return false; }
00193 virtual bool isFunction()
const {
return false; }
00194 virtual bool isFunctionDefinition()
const {
return false; }
00195 virtual bool isVariable()
const {
return false; }
00196 virtual bool isArgument()
const {
return false; }
00197 virtual bool isEnum()
const {
return false; }
00198 virtual bool isEnumerator()
const {
return false; }
00199 virtual bool isTypeAlias()
const {
return false; }
00200 virtual bool isCustom()
const {
return false; }
00201
00202
virtual void read(
QDataStream& stream );
00203
virtual void write(
QDataStream& stream )
const;
00204
00205
protected:
00206 CodeModel* codeModel() {
return m_model; }
00207 const CodeModel* codeModel()
const {
return m_model; }
00208
00209
private:
00210 int m_kind;
00211 CodeModel* m_model;
00212 QString m_name;
00213 QString m_fileName;
00214 int m_startLine, m_startColumn;
00215 int m_endLine, m_endColumn;
00216
00217
private:
00218 CodeModelItem(
const CodeModelItem& source );
00219
void operator = (
const CodeModelItem& source );
00220 };
00221
00222 class ClassModel:
public CodeModelItem
00223 {
00224
protected:
00225
ClassModel(
CodeModel* model );
00226
00227
public:
00228 typedef ClassDom Ptr;
00229
00230 virtual bool isClass()
const {
return true; }
00231
00232 QStringList scope()
const {
return m_scope; }
00233 void setScope(
const QStringList& scope ) { m_scope = scope; }
00234
00235
QStringList baseClassList() const;
00236
bool addBaseClass( const
QString& baseClass );
00237
void removeBaseClass( const
QString& baseClass );
00238
00239 ClassList classList();
00240 const ClassList classList() const;
00241
bool hasClass( const
QString& name ) const;
00242 ClassList classByName( const
QString& name );
00243 const ClassList classByName( const
QString& name ) const;
00244
bool addClass( ClassDom klass );
00245
void removeClass( ClassDom klass );
00246
00247 FunctionList functionList();
00248 const FunctionList functionList() const;
00249
bool hasFunction( const
QString& name ) const;
00250 FunctionList functionByName( const
QString& name );
00251 const FunctionList functionByName( const
QString& name ) const;
00252
bool addFunction( FunctionDom fun );
00253
void removeFunction( FunctionDom fun );
00254
00255 FunctionDefinitionList functionDefinitionList();
00256 const FunctionDefinitionList functionDefinitionList() const;
00257
bool hasFunctionDefinition( const
QString& name ) const;
00258 FunctionDefinitionList functionDefinitionByName( const
QString& name );
00259 const FunctionDefinitionList functionDefinitionByName( const
QString& name ) const;
00260
bool addFunctionDefinition( FunctionDefinitionDom fun );
00261
void removeFunctionDefinition( FunctionDefinitionDom fun );
00262
00263 VariableList variableList();
00264 const VariableList variableList() const;
00265
bool hasVariable( const
QString& name ) const;
00266 VariableDom variableByName( const
QString& name );
00267 const VariableDom variableByName( const
QString& name ) const;
00268
bool addVariable( VariableDom var );
00269
void removeVariable( VariableDom var );
00270
00271 TypeAliasList typeAliasList();
00272 const TypeAliasList typeAliasList() const;
00273
bool hasTypeAlias( const
QString& name ) const;
00274 TypeAliasList typeAliasByName( const
QString& name );
00275 const TypeAliasList typeAliasByName( const
QString& name ) const;
00276
bool addTypeAlias( TypeAliasDom typeAlias );
00277
void removeTypeAlias( TypeAliasDom typeAlias );
00278
00279 EnumList enumList();
00280 const EnumList enumList() const;
00281
bool hasEnum( const
QString& name ) const;
00282 EnumDom enumByName( const
QString& name );
00283 const EnumDom enumByName( const
QString& name ) const;
00284
bool addEnum( EnumDom e );
00285
void removeEnum( EnumDom e );
00286
00287 virtual
void read(
QDataStream& stream );
00288 virtual
void write(
QDataStream& stream ) const;
00289
00290 private:
00291 QStringList m_scope;
00292 QStringList m_baseClassList;
00293 QMap<
QString, ClassList> m_classes;
00294 QMap<QString, FunctionList> m_functions;
00295 QMap<QString, FunctionDefinitionList> m_functionDefinitions;
00296 QMap<QString, VariableDom> m_variables;
00297 QMap<QString, TypeAliasList> m_typeAliases;
00298 QMap<QString, EnumDom> m_enumerators;
00299
00300 private:
00301
ClassModel( const
ClassModel& source );
00302
void operator = ( const
ClassModel& source );
00303 friend class
CodeModel;
00304 };
00305
00306 class
NamespaceModel: public
ClassModel
00307 {
00308
protected:
00309
NamespaceModel( CodeModel* model );
00310
00311
public:
00312 typedef NamespaceDom Ptr;
00313
00314 virtual bool isClass()
const {
return false; }
00315 virtual bool isNamespace()
const {
return true; }
00316
00317
NamespaceList namespaceList();
00318
const NamespaceList namespaceList() const;
00319
bool hasNamespace( const QString& name ) const;
00320 NamespaceDom namespaceByName( const QString& name );
00321 const NamespaceDom namespaceByName( const QString& name ) const;
00322
bool addNamespace( NamespaceDom ns );
00323
void removeNamespace( NamespaceDom ns );
00324
00325 virtual
void read(
QDataStream& stream );
00326 virtual
void write(
QDataStream& stream ) const;
00327
00328 private:
00329 QMap<QString, NamespaceDom> m_namespaces;
00330
00331 private:
00332
NamespaceModel( const
NamespaceModel& source );
00333
void operator = ( const
NamespaceModel& source );
00334 friend class CodeModel;
00335 };
00336
00337 class
FileModel: public
NamespaceModel
00338 {
00339
protected:
00340
FileModel( CodeModel* model );
00341
00342
public:
00343 typedef FileDom Ptr;
00344
00345 virtual bool isFile()
const {
return true; }
00346
00347
virtual void read(
QDataStream& stream );
00348
virtual void write(
QDataStream& stream )
const;
00349
00350
private:
00351
FileModel(
const FileModel& );
00352
void operator = (
const FileModel& );
00353
friend class CodeModel;
00354 };
00355
00356 class ArgumentModel:
public CodeModelItem
00357 {
00358
protected:
00359
ArgumentModel( CodeModel* model );
00360
00361
public:
00362 typedef ArgumentDom Ptr;
00363
00364 virtual bool isArgument()
const {
return true; }
00365
00366 QString type() const;
00367
void setType( const QString& type );
00368
00369 QString defaultValue() const;
00370
void setDefaultValue( const QString& defaultValue );
00371
00372 virtual
void read(
QDataStream& stream );
00373 virtual
void write(
QDataStream& stream ) const;
00374
00375 private:
00376 QString m_type;
00377 QString m_defaultValue;
00378
00379 private:
00380
ArgumentModel( const
ArgumentModel& source );
00381
void operator = ( const
ArgumentModel& source );
00382 friend class CodeModel;
00383 };
00384
00385 class
FunctionModel: public
CodeModelItem
00386 {
00387
protected:
00388
FunctionModel( CodeModel* model );
00389
00390
public:
00391 typedef FunctionDom Ptr;
00392
00393 virtual bool isFunction()
const {
return true; }
00394
00395 QStringList scope()
const {
return m_scope; }
00396 void setScope(
const QStringList& scope ) { m_scope = scope; }
00397
00398
int access() const;
00399
void setAccess(
int access );
00400
00401
bool isSignal() const;
00402
void setSignal(
bool isSignal );
00403
00404
bool isSlot() const;
00405
void setSlot(
bool isSlot );
00406
00407
bool isVirtual() const;
00408
void setVirtual(
bool isVirtual );
00409
00410
bool isStatic() const;
00411
void setStatic(
bool isStatic );
00412
00413
bool isInline() const;
00414
void setInline(
bool isInline );
00415
00416
bool isConstant() const;
00417
void setConstant(
bool isConstant );
00418
00419
bool isAbstract() const;
00420
void setAbstract(
bool isAbstract );
00421
00422 QString resultType() const;
00423
void setResultType( const QString& type );
00424
00425 ArgumentList argumentList();
00426 const ArgumentList argumentList() const;
00427
bool addArgument( ArgumentDom arg );
00428
void removeArgument( ArgumentDom arg );
00429
00430 virtual
void read(
QDataStream& stream );
00431 virtual
void write(
QDataStream& stream ) const;
00432
00433 private:
00434 QStringList m_scope;
00435 int m_access;
00436
00437 union {
00438
struct {
00439 int m_signal : 1;
00440 int m_slot : 1;
00441 int m_virtual : 1;
00442 int m_static : 1;
00443 int m_inline : 1;
00444 int m_constant : 1;
00445 int m_abstract : 1;
00446 } v;
00447 int flags;
00448 } d;
00449
00450 QString m_resultType;
00451 ArgumentList m_arguments;
00452
00453
private:
00454
FunctionModel(
const FunctionModel& source );
00455
void operator = (
const FunctionModel& source );
00456
friend class CodeModel;
00457 };
00458
00459 class FunctionDefinitionModel:
public FunctionModel
00460 {
00461
protected:
00462
FunctionDefinitionModel( CodeModel* model );
00463
00464
public:
00465 typedef FunctionDefinitionDom Ptr;
00466
00467 virtual bool isFunctionDefinition()
const {
return true; }
00468
00469
private:
00470
FunctionDefinitionModel(
const FunctionDefinitionModel& source );
00471
void operator = (
const FunctionDefinitionModel& source );
00472
friend class CodeModel;
00473 };
00474
00475
00476 class VariableModel:
public CodeModelItem
00477 {
00478
protected:
00479
VariableModel( CodeModel* model );
00480
00481
public:
00482 typedef VariableDom Ptr;
00483
00484 virtual bool isVariable()
const {
return true; }
00485
00486
int access() const;
00487
void setAccess(
int access );
00488
00489
bool isStatic() const;
00490
void setStatic(
bool isStatic );
00491
00492 QString type() const;
00493
void setType( const QString& type );
00494
00495 virtual
void read(
QDataStream& stream );
00496 virtual
void write(
QDataStream& stream ) const;
00497
00498 private:
00499 int m_access;
00500 int m_static;
00501 QString m_type;
00502
00503 private:
00504
VariableModel( const
VariableModel& source );
00505
void operator = ( const
VariableModel& source );
00506 friend class CodeModel;
00507 };
00508
00509 class
EnumModel: public
CodeModelItem
00510 {
00511
protected:
00512
EnumModel( CodeModel* model );
00513
00514
public:
00515 typedef EnumDom Ptr;
00516
00517 virtual bool isEnum()
const {
return true; }
00518
00519
int access() const;
00520
void setAccess(
int access );
00521
00522 EnumeratorList enumeratorList();
00523 const EnumeratorList enumeratorList() const;
00524
void addEnumerator( EnumeratorDom e );
00525
void removeEnumerator( EnumeratorDom e );
00526
00527 virtual
void read(
QDataStream& stream );
00528 virtual
void write(
QDataStream& stream ) const;
00529
00530 private:
00531 int m_access;
00532 QMap<QString, EnumeratorDom> m_enumerators;
00533
00534 private:
00535
EnumModel( const
EnumModel& source );
00536
void operator = ( const
EnumModel& source );
00537 friend class CodeModel;
00538 };
00539
00540
00541 class
EnumeratorModel: public CodeModelItem
00542 {
00543
protected:
00544
EnumeratorModel( CodeModel* model );
00545
00546
public:
00547 typedef EnumeratorDom Ptr;
00548
00549 virtual bool isEnumerator()
const {
return true; }
00550
00551 QString value() const;
00552
void setValue( const QString& value );
00553
00554 virtual
void read(
QDataStream& stream );
00555 virtual
void write(
QDataStream& stream ) const;
00556
00557 private:
00558 QString m_value;
00559
00560 private:
00561
EnumeratorModel( const
EnumeratorModel& source );
00562
void operator = ( const
EnumeratorModel& source );
00563 friend class CodeModel;
00564 };
00565
00566 class
TypeAliasModel: public CodeModelItem
00567 {
00568
protected:
00569
TypeAliasModel( CodeModel* model );
00570
00571
public:
00572 typedef TypeAliasDom Ptr;
00573
00574 virtual bool isTypeAlias()
const {
return true; }
00575
00576 QString type() const;
00577
void setType( const QString& type );
00578
00579 virtual
void read(
QDataStream& stream );
00580 virtual
void write(
QDataStream& stream ) const;
00581
00582 private:
00583 QString m_type;
00584
00585 private:
00586
TypeAliasModel( const
TypeAliasModel& source );
00587
void operator = ( const
TypeAliasModel& source );
00588 friend class CodeModel;
00589 };
00590
00591
00592 #endif