/*************************************************************************** * Copyright (C) 2002 by Roberto Raggi * * roberto@kdevelop.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "ast_utils.h" #include "ast.h" #include #include #include #include #include AST* findNodeAt( AST* node, int line, int column ) { // kdDebug(9007) << "findNodeAt(" << node << ")" << endl; if( !node ) return 0; int startLine, startColumn; int endLine, endColumn; node->getStartPosition( &startLine, &startColumn ); node->getEndPosition( &endLine, &endColumn ); if( (line > startLine || (line == startLine && column >= startColumn)) && (line < endLine || (line == endLine && column < endColumn)) ){ TQPtrList children = node->children(); TQPtrListIterator it( children ); while( it.current() ){ AST* a = it.current(); ++it; AST* r = findNodeAt( a, line, column ); if( r ) return r; } return node; } return 0; } void scopeOfNode( AST* ast, TQStringList& scope ) { if( !ast ) return; if( ast->parent() ) scopeOfNode( ast->parent(), scope ); TQString s; switch( ast->nodeType() ) { case NodeType_ClassSpecifier: if( ((ClassSpecifierAST*)ast)->name() ){ s = ((ClassSpecifierAST*)ast)->name()->text(); s = s.isEmpty() ? TQString::fromLatin1("") : s; scope.push_back( s ); } break; case NodeType_Namespace: { AST* namespaceName = ((NamespaceAST*)ast)->namespaceName(); s = namespaceName ? namespaceName->text() : TQString::fromLatin1(""); scope.push_back( s ); } break; case NodeType_FunctionDefinition: { FunctionDefinitionAST* funDef = static_cast( ast ); DeclaratorAST* d = funDef->initDeclarator()->declarator(); // hotfix for bug #68726 if ( !d->declaratorId() ) break; TQPtrList l = d->declaratorId()->classOrNamespaceNameList(); TQPtrListIterator nameIt( l ); while( nameIt.current() ){ AST* name = nameIt.current()->name(); scope.push_back( name->text() ); ++nameIt; } } break; default: break; } } TQString typeSpecToString( TypeSpecifierAST* typeSpec ) /// @todo remove { if( !typeSpec ) return TQString(); return typeSpec->text().replace( TQRegExp(" :: "), "::" ); } TQString declaratorToString( DeclaratorAST* declarator, const TQString& scope, bool skipPtrOp ) { if( !declarator ) return TQString(); TQString text; if( !skipPtrOp ){ TQPtrList ptrOpList = declarator->ptrOpList(); for( TQPtrListIterator it(ptrOpList); it.current(); ++it ){ text += it.current()->text(); } text += ' '; } text += scope; if( declarator->subDeclarator() ) text += TQString::fromLatin1("(") + declaratorToString(declarator->subDeclarator()) + TQString::fromLatin1(")"); if( declarator->declaratorId() ) text += declarator->declaratorId()->text(); TQPtrList arrays = declarator->arrayDimensionList(); TQPtrListIterator it( arrays ); while( it.current() ){ text += "[]"; ++it; } if( declarator->parameterDeclarationClause() ){ text += "( "; ParameterDeclarationListAST* l = declarator->parameterDeclarationClause()->parameterDeclarationList(); if( l != 0 ){ TQPtrList params = l->parameterList(); TQPtrListIterator it( params ); while( it.current() ){ TQString type = typeSpecToString( it.current()->typeSpec() ); text += type; if( !type.isEmpty() ) text += ' '; text += declaratorToString( it.current()->declarator() ); ++it; if( it.current() ) text += ", "; } } text += " )"; if( declarator->constant() != 0 ) text += " const"; } return text.replace( TQRegExp(" :: "), "::" ).simplifyWhiteSpace(); }