[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