KDevelop API Documentation

lib/interfaces/codemodel.h

Go to the documentation of this file.
00001 /* This file is part of KDevelop 00002 Copyright (C) 2003 Roberto Raggi <roberto@kdevelop.org> 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public License 00015 along with this library; see the file COPYING.LIB. If not, write to 00016 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00017 Boston, MA 02111-1307, USA. 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_
KDE Logo
This file is part of the documentation for KDevelop Version 3.0.4.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Oct 19 08:01:48 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003