summaryrefslogtreecommitdiffstats
path: root/languages/cpp/storeconverter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'languages/cpp/storeconverter.cpp')
-rw-r--r--languages/cpp/storeconverter.cpp149
1 files changed, 149 insertions, 0 deletions
diff --git a/languages/cpp/storeconverter.cpp b/languages/cpp/storeconverter.cpp
new file mode 100644
index 00000000..3569bdea
--- /dev/null
+++ b/languages/cpp/storeconverter.cpp
@@ -0,0 +1,149 @@
+/***************************************************************************
+* Copyright (C) 2003-2004 by Alexander Dymo *
+* adymo@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 "storeconverter.h"
+
+#include <qvaluelist.h>
+
+#include <kdebug.h>
+
+#include <kdevcoderepository.h>
+
+#include "cppcodecompletion.h"
+#include "codeinformationrepository.h"
+#include "cppsupportpart.h"
+
+StoreConverter::StoreConverter(CppSupportPart *part, CodeModel *model)
+:m_part(part), m_model(model)
+{
+}
+
+void StoreConverter::PCSClassToCodeModel(const QString &className, const QStringList &/*classScope*/)
+{
+ QValueList<Catalog*> catalogs = m_part->codeRepository()->registeredCatalogs();
+ for (QValueList<Catalog*>::iterator it = catalogs.begin();
+ it != catalogs.end(); ++it)
+ {
+ Catalog *catalog = *it;
+ kdDebug() << "looking in catalog: " << catalog->dbName() << endl;
+
+ QValueList<Catalog::QueryArgument> args;
+ args << Catalog::QueryArgument( "kind", Tag::Kind_Class );
+ args << Catalog::QueryArgument( "name", className );
+ QValueList<Tag> tags = catalog->query(args);
+ for (QValueList<Tag>::iterator it = tags.begin(); it != tags.end(); ++it )
+ {
+ Tag& tag = *it;
+ kdDebug() << "TAG: " << tag.name() << " in file " << tag.fileName() << endl;
+ FileDom file;
+ bool addFile = false;
+ if (m_model->hasFile(tag.name()))
+ file = m_model->fileByName(tag.name());
+ else
+ {
+ file = m_model->create<FileModel>();
+ file->setName(tag.fileName());
+ addFile = true;
+ }
+ if (!file->hasClass(tag.name()))
+ parseClass(tag, file);
+ if (addFile) m_model->addFile(file);
+ }
+ }
+/* kdDebug() << "m_model class count: " << m_model->globalNamespace()->classList().count() << endl;
+ kdDebug() << "m_model file count: " << m_model->fileList().count() << endl;*/
+}
+
+void StoreConverter::parseClass(Tag &classTag, FileDom file)
+{
+ ClassDom klass = m_model->create<ClassModel>();
+ klass->setName(classTag.name());
+ klass->setFileName(classTag.fileName());
+
+ QStringList scope;
+ scope.append(classTag.name());
+ QValueList<Tag> symbolTags = m_part->codeCompletion()->repository()->
+ getTagsInScope(scope, false);
+
+// kdDebug() << "got tags: " << endl;
+ for (QValueList<Tag>::iterator sit = symbolTags.begin(); sit != symbolTags.end(); ++sit )
+ {
+ Tag &symbol = *sit;
+// kdDebug() << symbol.name() << endl;
+
+ switch (symbol.kind())
+ {
+ case Tag::Kind_FunctionDeclaration:
+ parseFunctionDeclaration(symbol, klass);
+ break;
+ case Tag::Kind_Variable:
+ parseVariable(symbol, klass);
+ }
+ }
+
+ QValueList<Tag> baseClassTags = m_part->codeCompletion()->repository()->getBaseClassList(classTag.name());
+ for (QValueList<Tag>::iterator bit = baseClassTags.begin();
+ bit != baseClassTags.end(); ++bit)
+ klass->addBaseClass((*bit).name());
+
+ file->addClass(klass);
+}
+
+void StoreConverter::parseFunctionDeclaration(Tag &fun, ClassDom klass)
+{
+ FunctionDom function = m_model->create<FunctionModel>();
+ function->setName(fun.name());
+ function->setFileName(fun.fileName());
+ function->setScope(fun.scope());
+
+ CppFunction<Tag> cppFun(fun);
+ function->setAccess(cppFun.access());
+ function->setSignal(cppFun.isSignal());
+ function->setSlot(cppFun.isSlot());
+ function->setVirtual(cppFun.isVirtual());
+ function->setStatic(cppFun.isStatic());
+ function->setInline(cppFun.isInline());
+ function->setConstant(cppFun.isConst());
+ function->setAbstract(cppFun.isPure());
+ function->setResultType(cppFun.type());
+
+ parseArguments(function, cppFun);
+
+ klass->addFunction(function);
+}
+
+void StoreConverter::parseVariable(Tag &var, ClassDom klass)
+{
+ VariableDom variable = m_model->create<VariableModel>();
+ variable->setName(var.name());
+ variable->setFileName(var.fileName());
+
+ CppVariable<Tag> cppVar(var);
+ variable->setAccess(cppVar.access());
+ variable->setStatic(cppVar.isStatic());
+ variable->setType(cppVar.type());
+
+ klass->addVariable(variable);
+}
+
+void StoreConverter::parseArguments(FunctionDom function, CppFunction<Tag> &cppFun)
+{
+ QStringList args = cppFun.arguments();
+ for (QStringList::const_iterator it = args.constBegin(); it != args.constEnd(); ++it)
+ {
+ ArgumentDom arg = m_model->create<ArgumentModel>();
+ arg->setType(*it);
+ arg->setName(cppFun.argumentNames()[args.findIndex(*it)]);
+
+ function->addArgument(arg);
+ }
+}
+
+//kate: indent-mode csands; tab-width 4; space-indent off;