codemodel.h
Go to the documentation of this file.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 // _CODEMODEL_H_
This file is part of the documentation for KDevelop Version 3.1.2.