KDevelop API Documentation

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.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Feb 22 09:22:35 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003