KDevelop API Documentation

tag.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 TAG_H
00021 #define TAG_H
00022 
00023 #include <qmap.h>
00024 #include <qvariant.h>
00025 #include <qshared.h>
00026 
00027 class QDataStream;
00028 
00029 class Tag
00030 {
00031 public:
00032     enum Kind
00033     {
00034     Kind_Unknown,
00035 
00036     Kind_Typedef = 1000,
00037         Kind_Namespace,
00038         Kind_UsingDirective,
00039     Kind_Base_class,
00040     Kind_Enum,
00041     Kind_Enumerator,
00042     Kind_Class,
00043     Kind_Struct,
00044     Kind_Union,
00045     Kind_VariableDeclaration,
00046     Kind_Variable,
00047     Kind_FunctionDeclaration,
00048     Kind_Function,
00049     // ...
00050 
00051     Kind_Custom = 2000
00052     };
00053 
00054 public:
00055     Tag();
00056     Tag( const Tag& source );
00057     ~Tag();
00058 
00059     Tag& operator = ( const Tag& source );
00060     
00061     QCString id() const
00062     {
00063         return data->id;
00064     }
00065 
00066     void setId( const QCString& id )
00067     {
00068     detach();
00069         data->id = id;
00070     }
00071 
00072     int kind() const
00073     {
00074         return data->kind;
00075     }
00076 
00077     void setKind( int kind )
00078     {
00079     detach();
00080         data->kind = kind;
00081     }
00082 
00083     unsigned long flags() const
00084     {
00085         return data->flags;
00086     }
00087 
00088     void setFlags( unsigned long flags )
00089     {
00090     detach();
00091         data->flags = flags;
00092     }
00093 
00094     QString fileName() const
00095     {
00096         return data->fileName;
00097     }
00098 
00099     void setFileName( const QString& fileName )
00100     {
00101     detach();
00102         data->fileName = fileName;
00103     }
00104 
00105     QString path( const QString& sep = QString::fromLatin1("::") ) const
00106     {
00107         QString s = scope().join( sep );
00108         if( s.isNull() )
00109             return name();
00110     return s + sep + name();
00111     }
00112 
00113     QString name() const
00114     {
00115         return data->name;
00116     }
00117 
00118     void setName( const QString& name )
00119     {
00120     detach();
00121         data->name = name;
00122     }
00123     
00124     QStringList scope() const
00125     {
00126         return data->scope;
00127     }
00128 
00129     void setScope( const QStringList& scope )
00130     {
00131     detach();
00132         data->scope = scope;
00133     }
00134 
00135     void getStartPosition( int* line, int* column ) const
00136     {
00137     if( line ) *line = data->startLine;
00138     if( column ) *column = data->startColumn;
00139     }
00140 
00141     void setStartPosition( int line, int column )
00142     {
00143     detach();
00144     data->startLine = line;
00145     data->startColumn = column;
00146     }
00147 
00148     void getEndPosition( int* line, int* column ) const
00149     {
00150     if( line ) *line = data->endLine;
00151     if( column ) *column = data->endColumn;
00152     }
00153 
00154     void setEndPosition( int line, int column )
00155     {
00156     detach();
00157     data->endLine = line;
00158     data->endColumn = column;
00159     }
00160 
00161     bool hasAttribute( const QCString& name ) const
00162     {
00163     if( name == "kind" ||
00164         name == "name" ||
00165         name == "scope" ||
00166         name == "fileName" ||
00167         name == "startLine" ||
00168         name == "startColumn" ||
00169         name == "endLine" ||
00170         name == "endColumn" )
00171         return true;
00172         return data->attributes.contains( name );
00173     }
00174 
00175     QVariant attribute( const QCString& name ) const
00176     {
00177     if( name == "id" )
00178         return data->id;
00179     else if( name == "kind" )
00180         return data->kind;
00181     else if( name == "name" )
00182         return data->name;
00183     else if( name == "scope" )
00184         return data->scope;
00185     else if( name == "fileName" )
00186         return data->fileName;
00187     else if( name == "startLine" )
00188         return data->startLine;
00189     else if( name == "startColumn" )
00190         return data->startColumn;
00191     else if( name == "endLine" )
00192         return data->endLine;
00193     else if( name == "endColumn" )
00194         return data->endColumn;
00195     else if( name == "prefix" )
00196         return data->name.left( 2 );
00197         return data->attributes[ name ];
00198     }
00199 
00200     void setAttribute( const QCString& name, const QVariant& value )
00201     {
00202     detach();
00203     if( name == "id" )
00204         data->id = value.toCString();
00205     else if( name == "kind" )
00206         data->kind = value.toInt();
00207     else if( name == "name" )
00208         data->name = value.toString();
00209     else if( name == "scope" )
00210         data->scope = value.toStringList();
00211     else if( name == "fileName" )
00212         data->fileName = value.toString();
00213     else if( name == "startLine" )
00214         data->startLine = value.toInt();
00215     else if( name == "startColumn" )
00216         data->startColumn = value.toInt();
00217     else if( name == "endLine" )
00218         data->endLine = value.toInt();
00219     else if( name == "endColumn" )
00220         data->endColumn = value.toInt();
00221     else
00222         data->attributes[ name ] = value;
00223     }
00224     
00225     void load( QDataStream& stream );
00226     void store( QDataStream& stream ) const;
00227 
00228 private:
00229     Tag copy();
00230     void detach();
00231     
00232 private:
00233     struct TagData: public QShared
00234     {
00235     QCString id;
00236     int kind;
00237     unsigned long flags;
00238     QString name;
00239     QStringList scope;
00240     QString fileName;
00241     int startLine, startColumn;
00242     int endLine, endColumn;
00243     QMap<QCString, QVariant> attributes;
00244     } *data;
00245 };
00246 
00247 QDataStream& operator << ( QDataStream&, const Tag& );
00248 QDataStream& operator >> ( QDataStream&, Tag& );
00249 
00250 #endif
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 00:03:51 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003