[prev in list] [next in list] [prev in thread] [next in thread]
List: kdevelop-devel
Subject: Re: cpp header organizer
From: Felix Berger <bflat1 () gmx ! net>
Date: 2005-01-10 17:22:52
Message-ID: 200501101822.52819.bflat1 () gmx ! net
[Download RAW message or body]
On Monday 10 January 2005 12:36, Roberto Raggi wrote:
> please, can you send me the code.
Thanks for taking the time. I attached the patch and new files.
In
void CppHeaderOrganizer::organizeHeaders()
I tried both, using the backgroundparser and setting up a new parser, but to
no avail.
> I'm pretty sure the parser works in the
> _right_ way :) I'm using the StatementAST & friends for the code completion
> stuff, and it seems to work(look at CppCodeCompletion::computeContext()).
I added a debug statement in the following function:
void CppCodeCompletion::computeContext( SimpleContext*& ctx, StatementAST*
stmt, int line, int col )
It was never called, maybe something with my setup is messed up.
Thanks,
Felix
--
Use Debian GNU/Linux!
http://www.felix.beldesign.de/
["headerorganizer.patch" (text/x-diff)]
? cppheaderorganizer.cpp
? cppheaderorganizer.h
? creategettersetter.cpp
? creategettersetter.h
? headerorganizer.patch
? pcsincluder
Index: Makefile.am
===================================================================
RCS file: /home/kde/kdevelop/languages/cpp/Makefile.am,v
retrieving revision 1.87
diff -u -b -B -d -w -U5 -r1.87 Makefile.am
--- Makefile.am 15 Dec 2004 22:30:23 -0000 1.87
+++ Makefile.am 10 Jan 2005 17:18:32 -0000
@@ -25,11 +25,11 @@
cppnewclassdlg.cpp classgeneratorconfig.cpp classgeneratorconfigbase.ui subclassingdlg.cpp \
subclassingdlgbase.ui addattributedialogbase.ui addmethoddialogbase.ui addattributedialog.cpp \
addmethoddialog.cpp cppsupport_utils.cpp createpcsdialogbase.ui createpcsdialog.cpp \
cppimplementationwidget.cpp qtdesignercppintegration.cpp creategettersetterconfiguration.cpp \
creategettersetterconfiguration.h creategettersetterdialog.cpp creategettersetterdialog.h \
- creategettersetter.ui storeconverter.cpp
+ creategettersetter.ui storeconverter.cpp cppheaderorganizer.cpp
METASOURCES = AUTO
servicedir = $(kde_servicesdir)
service_DATA = kdevcppsupport.desktop kdevcsupport.desktop
Index: cppcodecompletion.cpp
===================================================================
RCS file: /home/kde/kdevelop/languages/cpp/cppcodecompletion.cpp,v
retrieving revision 1.147
diff -u -b -B -d -w -U5 -r1.147 cppcodecompletion.cpp
Index: cppsupportpart.cpp
===================================================================
RCS file: /home/kde/kdevelop/languages/cpp/cppsupportpart.cpp,v
retrieving revision 1.282
diff -u -b -B -d -w -U5 -r1.282 cppsupportpart.cpp
--- cppsupportpart.cpp 15 Dec 2004 22:30:23 -0000 1.282
+++ cppsupportpart.cpp 10 Jan 2005 17:18:35 -0000
@@ -21,10 +21,11 @@
#include "backgroundparser.h"
#include "store_walker.h"
#include "ast.h"
#include "ast_utils.h"
#include "cppcodecompletion.h"
+#include "cppheaderorganizer.h"
#include "ccconfigwidget.h"
#include "KDevCppSupportIface.h"
#include "cppsupportfactory.h"
#include "catalog.h"
#include "cpp_tags.h"
@@ -223,10 +224,16 @@
this, SLOT(slotNewClass()),
actionCollection(), "project_newclass");
action->setToolTip( i18n("Generate a new class") );
action->setWhatsThis( i18n("<b>New Class</b><p>Calls the <b>New Class</b> wizard.") );
+ CppHeaderOrganizer* includer = new CppHeaderOrganizer(this);
+
+ action = new KAction(i18n("Organize Header Includes"), CTRL+SHIFT+Key_O,
+ includer, SLOT(organizeHeaders()), actionCollection(),
+ "organize_headers");
+
m_pCompletion = 0;
withcpp = false;
if ( args.count() == 1 && args[ 0 ] == "Cpp" )
withcpp = true;
Index: kdevcppsupport.rc
===================================================================
RCS file: /home/kde/kdevelop/languages/cpp/kdevcppsupport.rc,v
retrieving revision 1.17
diff -u -b -B -d -w -U5 -r1.17 kdevcppsupport.rc
--- kdevcppsupport.rc 2 Jun 2004 21:18:48 -0000 1.17
+++ kdevcppsupport.rc 10 Jan 2005 17:18:35 -0000
@@ -7,10 +7,14 @@
<Menu name="edit">
<Action name="edit_make_member"/>
</Menu>
+ <Menu name="edit">
+ <Action name="organize_headers"/>
+ </Menu>
+
<Menu name="view">
<Action name="edit_switchheader"/>
</Menu>
<Menu name="project">
["cppheaderorganizer.cpp" (text/x-c++src)]
/*
*
* 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.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include "cppheaderorganizer.h"
#include "cppheaderorganizer.moc"
#include "ast.h"
#include "cppsupportpart.h"
#include "backgroundparser.h"
#include "kdevpartcontroller.h"
#include "kdevdriver.h"
#include "urlutil.h"
#include <ktexteditor/document.h>
#include <kdebug.h>
CppHeaderOrganizer::CppHeaderOrganizer(CppSupportPart* support)
: QObject(support), support(support)
{
connect(support->partController(), SIGNAL(activePartChanged(KParts::Part*)),
SLOT(activePartChanged(KParts::Part*)));
connect(support, SIGNAL(fileParsed(const QString&)),
SLOT(fileParsed(const QString&)));
}
void CppHeaderOrganizer::organizeHeaders()
{
kdDebug() << "organizeHeaders called on " << activeFileName << endl;
candidates.clear();
// BackgroundParser* parser = support->backgroundParser();
// parser->lock();
// TranslationUnitAST* unit = parser->translationUnit(activeFileName);
// if (unit) {
// kdDebug() << " got a unit for " << activeFileName << endl;
// parseTranslationUnit(unit);
// }
// parser->unlock();
KDevDriver driver(support);
driver.parseFile(activeFileName);
TranslationUnitAST* unit = driver.translationUnit(activeFileName);
if (unit) {
kdDebug() << " got a unit for " << activeFileName << endl;
parseTranslationUnit(unit);
}
}
void CppHeaderOrganizer::activePartChanged(KParts::Part* part)
{
if (KTextEditor::Document* doc = dynamic_cast<KTextEditor::Document*>(part)) {
activeFileName = URLUtil::canonicalPath(doc->url().path());
}
else {
activeFileName = QString::null;
}
}
void CppHeaderOrganizer::fileParsed(const QString& file)
{
activeFileName = file;
organizeHeaders();
}
void CppHeaderOrganizer::parseTranslationUnit(TranslationUnitAST* unit)
{
TreeParser::parseTranslationUnit(unit);
}
void CppHeaderOrganizer::parseDeclaration(DeclarationAST* decl)
{
TreeParser::parseDeclaration(decl);
}
void CppHeaderOrganizer::parseLinkageSpecification(LinkageSpecificationAST* link)
{
kdDebug() << "LinkageSpecificationAST " << link->text() << endl;
if (link->externType()) {
kdDebug() << "LinkageSpecificationAST extern type "
<< link->externType()->text() << endl;
}
TreeParser::parseLinkageSpecification(link);
}
void CppHeaderOrganizer::parseNamespace( NamespaceAST* nspace)
{
kdDebug() << "NamespaceAST " << nspace->text() << endl;
if (nspace->namespaceName()) {
kdDebug() << "NamespaceAST name " << nspace->namespaceName()->text()
<< endl;
TreeParser::parseNamespace(nspace);
}
}
void CppHeaderOrganizer::parseNamespaceAlias(NamespaceAliasAST* alias)
{
// do we have that in c++
kdDebug() << "NamespaceAliasAST called" << alias->text() << endl;
}
void CppHeaderOrganizer::parseUsing( UsingAST* )
{
// TODO
}
void CppHeaderOrganizer::parseUsingDirective( UsingDirectiveAST* )
{
// TODO
}
void CppHeaderOrganizer::parseTypedef(TypedefAST* def)
{
kdDebug() << "TypedefAST " << def->text() << endl;
if (def->typeSpec()) {
parseTypeSpecifier(def->typeSpec());
}
if (def->initDeclaratorList()) {
parseInitDeclaratorList(def->initDeclaratorList());
}
}
void CppHeaderOrganizer::parseTemplateDeclaration( TemplateDeclarationAST* )
{
// TODO
}
void CppHeaderOrganizer::parseSimpleDeclaration( SimpleDeclarationAST* decl)
{
kdDebug() << "SimpleDeclarationAST " << decl->text() << endl;
if (decl->typeSpec()) {
parseTypeSpecifier(decl->typeSpec());
}
if (decl->functionSpecifier()) {
parseGroup(decl->functionSpecifier());
}
if (decl->storageSpecifier()) {
parseGroup(decl->storageSpecifier());
}
if (decl->initDeclaratorList()) {
parseInitDeclaratorList(decl->initDeclaratorList());
}
if (decl->winDeclSpec()) {
parseGroup(decl->winDeclSpec());
}
}
void CppHeaderOrganizer::parseFunctionDefinition(FunctionDefinitionAST* func)
{
kdDebug() << "FunctionDefinitionAST " << func->text() << endl;
if (func->typeSpec()) {
parseTypeSpecifier(func->typeSpec());
}
if (func->functionSpecifier()) {
parseGroup(func->functionSpecifier());
}
if (func->storageSpecifier()) {
parseGroup(func->functionSpecifier());
}
if (func->initDeclarator()) {
parseInitDeclarator(func->initDeclarator());
}
if (func->winDeclSpec()) {
parseGroup(func->winDeclSpec());
}
if (func->functionBody()) {
parseStatements(func->functionBody());
}
}
void CppHeaderOrganizer::parseLinkageBody( LinkageBodyAST* )
{
}
void CppHeaderOrganizer::parseAccessDeclaration( AccessDeclarationAST* decl)
{
kdDebug() << "AccessDeclarationAST " << decl->text() << endl;
}
void CppHeaderOrganizer::parseTypeSpecifier( TypeSpecifierAST* type)
{
kdDebug() << "TypeSpecifierAST " << type->text() << endl;
if (type->name()) {
parseName(type->name());
}
TreeParser::parseTypeSpecifier(type);
}
void CppHeaderOrganizer::parseClassSpecifier(ClassSpecifierAST* klass)
{
kdDebug() << "ClassSpecifierAST " << klass->text() << endl;
if (klass->classKey()) {
kdDebug() << "classKey " << klass->classKey()->text() << endl;
}
if (klass->winDeclSpec()) {
parseGroup(klass->winDeclSpec());
}
if (klass->baseClause()) {
parseBaseClause(klass->baseClause());
}
// for (QPtrListIterator<DeclarationAST> i(klass->declarationList());
// i.current(); ++i) {
// parseDeclaration(i.current());
// }
TreeParser::parseClassSpecifier(klass);
}
void CppHeaderOrganizer::parseEnumSpecifier( EnumSpecifierAST* )
{
}
void CppHeaderOrganizer::parseElaboratedTypeSpecifier
(ElaboratedTypeSpecifierAST* type)
{
kdDebug() << "ElaboratedTypeSpecifierAST " << type->text() << endl;
}
void CppHeaderOrganizer::parseName(NameAST* name)
{
kdDebug() << "NameAST " << name->text() << endl;
}
void CppHeaderOrganizer::parseStatements(StatementListAST* list)
{
for (QPtrListIterator<StatementAST> i(list->statementList()); i.current();
++i) {
parseStatement(i.current());
}
}
void CppHeaderOrganizer::parseStatement(StatementAST* stat)
{
kdDebug() << "StatementAST " << stat->text() << endl;
switch (stat->nodeType()) {
case NodeType_DeclarationStatement:
parseDeclaration
(static_cast<DeclarationStatementAST*>(stat)->declaration());
break;
case NodeType_DoStatement:
parseCondition(static_cast<DoStatementAST*>(stat)->condition());
parseStatement(static_cast<DoStatementAST*>(stat)->statement());
break;
case NodeType_ExpressionStatement:
// TODO
break;
case NodeType_ForStatement:
parseStatement(static_cast<ForStatementAST*>(stat)->initStatement());
parseCondition(static_cast<ForStatementAST*>(stat)->condition());
// TODO expression ?
parseStatement(static_cast<ForStatementAST*>(stat)->statement());
break;
case NodeType_IfStatement:
parseCondition(static_cast<IfStatementAST*>(stat)->condition());
parseStatement(static_cast<IfStatementAST*>(stat)->statement());
parseStatement(static_cast<IfStatementAST*>(stat)->elseStatement());
break;
case NodeType_SwitchStatement:
parseCondition(static_cast<SwitchStatementAST*>(stat)->condition());
parseStatement(static_cast<SwitchStatementAST*>(stat)->statement());
break;
case NodeType_WhileStatement:
parseCondition(static_cast<WhileStatementAST*>(stat)->condition());
parseStatement(static_cast<WhileStatementAST*>(stat)->statement());
break;
default:
kdDebug() << "unhandled statement" << endl;
}
}
void CppHeaderOrganizer::parseGroup(GroupAST* group)
{
kdDebug() << "GroupAST " << group->text() << endl;
}
void CppHeaderOrganizer::parseCondition(ConditionAST* cond)
{
kdDebug() << "ConditionAST " << cond->text() << endl;
if (cond->typeSpec()) {
parseTypeSpecifier(cond->typeSpec());
}
if (cond->declarator()) {
parseDeclarator(cond->declarator());
}
// TODO expression ?
}
void CppHeaderOrganizer::parseDeclarator(DeclaratorAST* decl)
{
kdDebug() << "DeclaratorAST " << decl->text() << endl;
}
void CppHeaderOrganizer::parseInitDeclaratorList(InitDeclaratorListAST* list)
{
for (QPtrListIterator<InitDeclaratorAST> i(list->initDeclaratorList());
i.current(); ++i) {
parseInitDeclarator(i.current());
}
}
void CppHeaderOrganizer::parseInitDeclarator(InitDeclaratorAST* init)
{
kdDebug() << "InitDeclaratorAST " << init->text() << endl;
if (init->declarator()) {
parseDeclarator(init->declarator());
}
// TODO initializer
}
void CppHeaderOrganizer::parseBaseClause(BaseClauseAST* base)
{
kdDebug() << "BaseClauseAST " << base->text() << endl;
for (QPtrListIterator<BaseSpecifierAST> i(base->baseSpecifierList());
i.current(); ++i) {
parseBaseSpecifier(i.current());
}
}
void CppHeaderOrganizer::parseBaseSpecifier(BaseSpecifierAST* spec)
{
kdDebug() << "BaseSpecifierAST " << spec->text() << endl;
if (spec->name()) {
parseName(spec->name());
}
}
["cppheaderorganizer.h" (text/x-chdr)]
/*
*
* 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.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef CPPHEADERORGANIZER_H
#define CPPHEADERORGANIZER_H
#include <qobject.h>
#include <tree_parser.h>
#include <qmap.h>
class CppSupportPart;
namespace KParts{
class Part;
}
class CppHeaderOrganizer : public QObject, public TreeParser
{
Q_OBJECT
public:
CppHeaderOrganizer(CppSupportPart* support);
// translation-unit
virtual void parseTranslationUnit( TranslationUnitAST* );
// declarations
virtual void parseDeclaration( DeclarationAST* );
virtual void parseLinkageSpecification( LinkageSpecificationAST* );
virtual void parseNamespace( NamespaceAST* );
virtual void parseNamespaceAlias( NamespaceAliasAST* );
virtual void parseUsing( UsingAST* );
virtual void parseUsingDirective( UsingDirectiveAST* );
virtual void parseTypedef( TypedefAST* );
virtual void parseTemplateDeclaration( TemplateDeclarationAST* );
virtual void parseSimpleDeclaration( SimpleDeclarationAST* );
virtual void parseFunctionDefinition( FunctionDefinitionAST* );
virtual void parseLinkageBody( LinkageBodyAST* );
virtual void parseAccessDeclaration( AccessDeclarationAST* );
// type-specifier
virtual void parseTypeSpecifier( TypeSpecifierAST* );
virtual void parseClassSpecifier( ClassSpecifierAST* );
virtual void parseEnumSpecifier( EnumSpecifierAST* );
virtual void parseElaboratedTypeSpecifier( ElaboratedTypeSpecifierAST* );
virtual void parseName(NameAST*);
virtual void parseStatements(StatementListAST*);
virtual void parseStatement(StatementAST*);
virtual void parseGroup(GroupAST*);
virtual void parseCondition(ConditionAST*);
virtual void parseDeclarator(DeclaratorAST*);
virtual void parseInitDeclaratorList(InitDeclaratorListAST*);
virtual void parseInitDeclarator(InitDeclaratorAST*);
virtual void parseBaseClause(BaseClauseAST*);
virtual void parseBaseSpecifier(BaseSpecifierAST*);
public slots:
void organizeHeaders();
private slots:
void activePartChanged(KParts::Part* part);
void fileParsed(const QString& file);
private:
CppSupportPart* support;
QString activeFileName;
struct Candidate
{
Candidate()
: type(0)
{
}
QString name;
enum Type {
Forward = 1, Class = 2, Function = 4
};
int type;
};
QMap<QString, Candidate> candidates;
};
#endif
_______________________________________________
KDevelop-devel mailing list
KDevelop-devel@barney.cs.uni-potsdam.de
http://barney.cs.uni-potsdam.de/mailman/listinfo/kdevelop-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic