You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdevelop/lib/catalog/tag.h

310 lines
6.7 KiB

/* This file is part of TDevelop
Copyright (C) 2003 Roberto Raggi <roberto@tdevelop.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef TAG_H
#define TAG_H
#include <tqmap.h>
#include <tqvariant.h>
#include <tqshared.h>
class TQDataStream;
union TagFlags
{
unsigned long flags;
struct
{
unsigned long access:
3;
unsigned long isVirtual:
1;
}
data;
} ;
class Tag
{
public:
enum Kind
{
Kind_Unknown,
Kind_Typedef = 1000,
Kind_Namespace,
Kind_UsingDirective,
Kind_Base_class,
Kind_Enum,
Kind_Enumerator,
Kind_Class,
Kind_Struct,
Kind_Union,
Kind_VariableDeclaration,
Kind_Variable,
Kind_FunctionDeclaration,
Kind_Function,
Kind_NamespaceAlias,
Kind_TranslationUnit,
// ...
Kind_Custom = 2000
};
public:
Tag();
Tag( const Tag& source );
~Tag();
operator bool() const {
return kind() != Kind_Unknown && kind() != 0;
}
Tag& operator = ( const Tag& source );
TQCString id() const
{
return data->id;
}
void setId( const TQCString& id )
{
detach();
data->id = id;
}
int kind() const
{
return data->kind;
}
void setKind( int kind )
{
detach();
data->kind = kind;
}
unsigned long flags() const
{
return data->flags;
}
void setFlags( unsigned long flags )
{
detach();
data->flags = flags;
}
TQString fileName() const
{
return data->fileName;
}
void setFileName( const TQString& fileName )
{
detach();
data->fileName = fileName;
}
TQString path( const TQString& sep = TQString::fromLatin1("::") ) const
{
TQString s = scope().join( sep );
if( s.isNull() )
return name();
return s + sep + name();
}
TQString name() const
{
return data->name;
}
TQString comment() const {
if( hasAttribute( "cmt" ) ) {
return attribute( "cmt" ).asString();
} else {
return "";
}
}
void setComment( const TQString& comment ) {
setAttribute( "cmt", comment );
}
void setName( const TQString& name )
{
detach();
data->name = name;
}
TQStringList scope() const
{
return data->scope;
}
void setScope( const TQStringList& scope )
{
detach();
data->scope = scope;
}
void getStartPosition( int* line, int* column ) const
{
if( line ) *line = data->startLine;
if( column ) *column = data->startColumn;
}
void setStartPosition( int line, int column )
{
detach();
data->startLine = line;
data->startColumn = column;
}
void getEndPosition( int* line, int* column ) const
{
if( line ) *line = data->endLine;
if( column ) *column = data->endColumn;
}
void setEndPosition( int line, int column )
{
detach();
data->endLine = line;
data->endColumn = column;
}
TQString getSpecializationDeclaration() const {
if( hasAttribute( "spc" ) )
return data->attributes["spc"].asString();
else
return TQString();
}
bool hasSpecializationDeclaration() const {
return data->attributes.contains( "spc" );
}
void setSpecializationDeclaration( const TQString& str ) {
data->attributes["spc"] = str;
}
bool hasAttribute( const TQCString& name ) const
{
if( name == "kind" ||
name == "name" ||
name == "scope" ||
name == "fileName" ||
name == "startLine" ||
name == "startColumn" ||
name == "endLine" ||
name == "endColumn" )
return true;
return data->attributes.contains( name );
}
TQVariant attribute( const TQCString& name ) const
{
if( name == "id" )
return data->id;
else if( name == "kind" )
return data->kind;
else if( name == "name" )
return data->name;
else if( name == "scope" )
return data->scope;
else if( name == "fileName" )
return data->fileName;
else if( name == "startLine" )
return data->startLine;
else if( name == "startColumn" )
return data->startColumn;
else if( name == "endLine" )
return data->endLine;
else if( name == "endColumn" )
return data->endColumn;
else if( name == "prefix" )
return data->name.left( 2 );
return data->attributes[ name ];
}
void setAttribute( const TQCString& name, const TQVariant& value )
{
detach();
if( name == "id" )
data->id = value.toCString();
else if( name == "kind" )
data->kind = value.toInt();
else if( name == "name" )
data->name = value.toString();
else if( name == "scope" )
data->scope = value.toStringList();
else if( name == "fileName" )
data->fileName = value.toString();
else if( name == "startLine" )
data->startLine = value.toInt();
else if( name == "startColumn" )
data->startColumn = value.toInt();
else if( name == "endLine" )
data->endLine = value.toInt();
else if( name == "endColumn" )
data->endColumn = value.toInt();
else
data->attributes[ name ] = value;
}
void addTemplateParam( const TQString& param , const TQString& def = "" ) {
TQMap<TQCString, TQVariant>::iterator it = data->attributes.find( "tpl" );
if( it != data->attributes.end() && (*it).type() == TQVariant::StringList ) {
}else{
it = data->attributes.insert( "tpl", TQVariant( TQStringList() ) );
}
TQStringList& l( (*it).asStringList() );
l << param;
l << def;
}
void load( TQDataStream& stream );
void store( TQDataStream& stream ) const;
private:
Tag copy();
void detach();
private:
struct TagData: public TQShared
{
TQCString id;
int kind;
unsigned long flags;
TQString name;
TQStringList scope;
TQString fileName;
int startLine, startColumn;
int endLine, endColumn;
TQMap<TQCString, TQVariant> attributes;
} *data;
};
TQDataStream& operator << ( TQDataStream&, const Tag& );
TQDataStream& operator >> ( TQDataStream&, Tag& );
#endif