tag.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 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
This file is part of the documentation for KDevelop Version 3.1.2.