Skip to content

Commit

Permalink
basic implementation of generating properties. Also added q_object ma…
Browse files Browse the repository at this point in the history
…cros generating if object contains slots or signals.
  • Loading branch information
vt4a2h committed Nov 22, 2015
1 parent 6b4ac13 commit 11c8f7e
Show file tree
Hide file tree
Showing 12 changed files with 61 additions and 72 deletions.
2 changes: 1 addition & 1 deletion generator/abstractprojectgenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ namespace generator {
* @param outputDirectory
*/
AbstractProjectGenerator::AbstractProjectGenerator(const db::SharedDatabase &globalDb,
const db::SharedDatabase &projectDb,
const db::SharedProjectDatabase &projectDb,
const QString &outputDirectory)
: m_ProjectTranslator(globalDb, projectDb)
, m_OutputDirectory(outputDirectory)
Expand Down
2 changes: 1 addition & 1 deletion generator/abstractprojectgenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ namespace generator {

AbstractProjectGenerator();
AbstractProjectGenerator(const db::SharedDatabase &globalDb,
const db::SharedDatabase &projectDb,
const db::SharedProjectDatabase &projectDb,
const QString &outputDirectory = "");
virtual ~AbstractProjectGenerator();

Expand Down
3 changes: 2 additions & 1 deletion generator/basiccppprojectgenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <QMap>

#include <db/database.h>
#include <db/projectdatabase.h>
#include <entity/scope.h>
#include <entity/type.h>
#include <entity/class.h>
Expand All @@ -56,7 +57,7 @@ namespace generator {
* @param outputDirectory
*/
BasicCppProjectGenerator::BasicCppProjectGenerator(const db::SharedDatabase &globalDb,
const db::SharedDatabase &projectDb,
const db::SharedProjectDatabase &projectDb,
const QString &outputDirectory)
: AbstractProjectGenerator(globalDb, projectDb, outputDirectory)
, m_RootOutputDirectory(std::make_shared<VirtualDirectory>(outputDirectory))
Expand Down
4 changes: 2 additions & 2 deletions generator/basiccppprojectgenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ namespace generator {
public:
BasicCppProjectGenerator();
BasicCppProjectGenerator(const db::SharedDatabase &globalDb,
const db::SharedDatabase &projectDb,
const QString &outputDirectory = "");
const db::SharedProjectDatabase &projectDb,
const QString &outputDirectory = "");

private:
void doWrite() const override;
Expand Down
6 changes: 4 additions & 2 deletions gui/editentitydialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,10 @@ namespace gui {
}
// }

auto signatureMaker =
std::make_unique<translation::SignatureMaker>(m_ApplicationModel, m_Project, m_Scope, m_Type);
auto signatureMaker = std::make_unique<translation::SignatureMaker>(
m_ApplicationModel->globalDatabase(), m_Project->database(),
m_Scope, m_Type
);
m_ComponentsModel->setSignatureMaker(std::move(signatureMaker));
m_ComponentsModel->setComponents(m_Type);

Expand Down
2 changes: 1 addition & 1 deletion tests/test/TestProjectMaker.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class ProjectMaker : public ::testing::Test
}

db::SharedDatabase globalDb_ = std::make_shared<db::Database>("Global");
db::SharedDatabase projectDb_ = std::make_shared<db::ProjectDatabase>("Project");
db::SharedProjectDatabase projectDb_ = std::make_shared<db::ProjectDatabase>("Project");

entity::SharedScope globalScope_ = globalDb_->addScope();
entity::SharedScope standartScope_ = globalDb_->addScope("std");
Expand Down
2 changes: 1 addition & 1 deletion tests/test/TestProjectTranslator.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class ProjectTranslatorTest : public ::testing::Test
}

db::SharedDatabase _globalDb;
db::SharedDatabase _projectDb;
db::SharedProjectDatabase _projectDb;

translation::SharedTranslator _translator;

Expand Down
4 changes: 2 additions & 2 deletions tests/test/TestSignatureMaker.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ class SignatureMaker : public ComponentsBase, public ::testing::Test
{
protected:
SignatureMaker()
: m_Maker(std::make_unique<translation::SignatureMaker>(m_ApplicationModel, m_Project, m_Scope,
m_Type))
: m_Maker(std::make_unique<translation::SignatureMaker>(m_ApplicationModel->globalDatabase(),
m_Project->database(), m_Scope, m_Type))
{}

protected:
Expand Down
37 changes: 31 additions & 6 deletions translation/projecttranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,14 @@
#include <entity/class.h>
#include <entity/templateclassmethod.h>
#include <entity/templateclass.h>
#include <entity/property.h>
#include <utility/helpfunctions.h>

#include "enums.h"
#include "templates.cpp"
#include "constants.h"
#include "code.h"
#include "signaturemaker.h"

using namespace boost;

Expand Down Expand Up @@ -91,7 +93,7 @@ namespace translation {
* @param projectDb
*/
ProjectTranslator::ProjectTranslator(const db::SharedDatabase &globalDb,
const db::SharedDatabase &projectDb)
const db::SharedProjectDatabase &projectDb)
: m_GlobalDatabase(globalDb)
, m_ProjectDatabase(projectDb)
{
Expand Down Expand Up @@ -487,21 +489,41 @@ namespace translation {

QString toHeader(CLASS_TEMPLATE);

// TODO: implement: stub!
toHeader.remove("%qobject%");
toHeader.remove("%property%");
// Add q_object
auto allMethods = _class->allMethods(entity::All);
bool addQObject = range::find_if(allMethods, [](auto m){ return m->isSlot() || m->isSignal(); })
!= boost::end(allMethods);
toHeader.replace("%qobject%", addQObject ? "Q_OBJECT\n" : "");

// Add properties
auto properties = _class->properties();
QStringList signatures;
if (!properties.isEmpty()) {
SignatureMaker maker(m_GlobalDatabase, m_ProjectDatabase,
m_ProjectDatabase->getScope(_class->scopeId()), _class);
for (auto &&p : properties)
signatures << maker.signature(p);
}
QString prop = signatures.isEmpty() ? "" : signatures.join(";\n");
if (addQObject && !prop.isEmpty())
prop.prepend("\n");
toHeader.replace("%property%", prop);

// Add template part if needed
db::SharedDatabase templateDb = nullptr;
if (_class->hashType() == entity::TemplateClass::staticHashType()) {
auto tc = std::static_pointer_cast<entity::TemplateClass>(_class);
templateDb = tc->database();
generateTemplatePart(toHeader, tc);
}

// Add class type
toHeader.replace("%kind%", _class->kind() == entity::ClassType ? "class " : "struct ");

// Add class name
toHeader.replace("%name%", _class->name());

// Add parents
QString parents;
if (_class->anyParents()) {
QStringList parentsList;
Expand Down Expand Up @@ -530,10 +552,13 @@ namespace translation {
parents.append("\n");
toHeader.replace("%parents%", parents);

// Add sections
QString section;
generateClassSection(_class, templateDb, entity::Public, section);
generateClassSection(_class, templateDb, entity::Protected, section);
generateClassSection(_class, templateDb, entity::Private, section);
if (!prop.isEmpty() && !section.isEmpty())
section.prepend("\n");
toHeader.replace("%section%", section);

if (section.isEmpty() && parents.isEmpty())
Expand Down Expand Up @@ -752,7 +777,7 @@ namespace translation {
* @brief ProjectTranslator::projectDatabase
* @return
*/
db::SharedDatabase ProjectTranslator::projectDatabase() const
db::SharedProjectDatabase ProjectTranslator::projectDatabase() const
{
return m_ProjectDatabase;
}
Expand All @@ -761,7 +786,7 @@ namespace translation {
* @brief ProjectTranslator::setProjectDatabase
* @param projectDatabase
*/
void ProjectTranslator::setProjectDatabase(const db::SharedDatabase &projectDatabase)
void ProjectTranslator::setProjectDatabase(const db::SharedProjectDatabase &projectDatabase)
{
m_ProjectDatabase = projectDatabase;
}
Expand Down
8 changes: 4 additions & 4 deletions translation/projecttranslator.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,13 @@ namespace translation {

ProjectTranslator();
ProjectTranslator(const db::SharedDatabase &globalDb,
const db::SharedDatabase &projectDb);
const db::SharedProjectDatabase &projectDb);

db::SharedDatabase globalDatabase() const;
void setGlobalDatabase(const db::SharedDatabase &globalDatabase);

db::SharedDatabase projectDatabase() const;
void setProjectDatabase(const db::SharedDatabase &projectDatabase);
db::SharedProjectDatabase projectDatabase() const;
void setProjectDatabase(const db::SharedProjectDatabase &projectDatabase);

Code translate(const entity::SharedBasicEntity &e,
const TranslatorOptions &options = WithNamespace,
Expand Down Expand Up @@ -124,7 +124,7 @@ namespace translation {
const db::SharedDatabase &classDatabase = nullptr) const;

db::SharedDatabase m_GlobalDatabase;
db::SharedDatabase m_ProjectDatabase;
db::SharedProjectDatabase m_ProjectDatabase;

using TranslatorsMap = QHash<size_t, std::function<Code(const entity::SharedBasicEntity &,
const ProjectTranslator::TranslatorOptions &,
Expand Down
49 changes: 7 additions & 42 deletions translation/signaturemaker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,12 +89,13 @@ namespace translation {
* @param scope
* @param type
*/
SignatureMaker::SignatureMaker(const models::SharedApplicationModel &model, const project::SharedProject &project,
SignatureMaker::SignatureMaker(const db::SharedDatabase &globalDb,
const db::SharedProjectDatabase &projectDb,
const entity::SharedScope &scope, const entity::SharedType &type)
: m_Type(type)
, m_Scope(scope)
, m_Project(project)
, m_ApplicationModel(model)
, m_GlobalDatabase(globalDb)
, m_ProjectDatabase(projectDb)
{
m_MakersMap[entity::Field::staticHashType()] =
[&](const entity::SharedBasicEntity &component) {
Expand Down Expand Up @@ -163,42 +164,6 @@ namespace translation {
m_Scope = scope;
}

/**
* @brief SignatureMaker::Project
* @return
*/
project::SharedProject SignatureMaker::project() const
{
return m_Project;
}

/**
* @brief SignatureMaker::setProject
* @param project
*/
void SignatureMaker::setProject(const project::SharedProject &project)
{
m_Project = project;
}

/**
* @brief SignatureMaker::ApplicationModel
* @return
*/
models::SharedApplicationModel SignatureMaker::applicationModel() const
{
return m_ApplicationModel;
}

/**
* @brief SignatureMaker::setApplicationModel
* @param applicationModel
*/
void SignatureMaker::setApplicationModel(const models::SharedApplicationModel &applicationModel)
{
m_ApplicationModel = applicationModel;
}

/**
* @brief SignatureMaker::makeType
* @param type
Expand All @@ -215,7 +180,7 @@ namespace translation {
auto scopeId = type->scopeId();
while (!globalIds.contains(scopeId)) {
if (auto scope = findScope(scopeId)) {
if (!scope->name().isEmpty() && scope->id() != m_Project->database()->defaultScopeID())
if (!scope->name().isEmpty() && scope->id() != m_ProjectDatabase->defaultScopeID())
scopes.prepend(scope->name());
scopeId = scope->parentScopeId();
} else {
Expand Down Expand Up @@ -487,7 +452,7 @@ namespace translation {
*/
entity::SharedScope SignatureMaker::findScope(const QString &scopeId) const
{
return utility::findScope(scopeId, m_Project->database(), m_ApplicationModel->globalDatabase());
return utility::findScope(scopeId, m_ProjectDatabase, m_GlobalDatabase);
}

/**
Expand All @@ -497,7 +462,7 @@ namespace translation {
*/
entity::SharedType SignatureMaker::findType(const QString &typeId) const
{
return utility::findType(typeId, m_Project->database(), m_ApplicationModel->globalDatabase());
return utility::findType(typeId, m_ProjectDatabase, m_GlobalDatabase);
}

} // namespace translation
Expand Down
14 changes: 5 additions & 9 deletions translation/signaturemaker.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <models/models_types.hpp>
#include <entity/entity_types.hpp>
#include <project/project_types.hpp>
#include <db/db_types.hpp>

namespace translation {

Expand All @@ -38,7 +39,7 @@ namespace translation {

public:
SignatureMaker();
SignatureMaker(const models::SharedApplicationModel &model, const project::SharedProject &project,
SignatureMaker(const db::SharedDatabase &globalDb, const db::SharedProjectDatabase &projectDb,
const entity::SharedScope &scope, const entity::SharedType &type);

~SignatureMaker();
Expand All @@ -51,12 +52,6 @@ namespace translation {
entity::SharedScope scope() const;
void setScope(const entity::SharedScope &scope);

project::SharedProject project() const;
void setProject(const project::SharedProject &project);

models::SharedApplicationModel applicationModel() const;
void setApplicationModel(const models::SharedApplicationModel &applicationModel);

private:
QString makeType(const entity::SharedType &type) const;
QString makeExtType(const entity::SharedExtendedType &type) const;
Expand All @@ -73,8 +68,9 @@ namespace translation {

entity::SharedType m_Type;
entity::SharedScope m_Scope;
project::SharedProject m_Project;
models::SharedApplicationModel m_ApplicationModel;

db::SharedDatabase m_GlobalDatabase;
db::SharedProjectDatabase m_ProjectDatabase;

using MakerFunction = std::function<QString(const entity::SharedBasicEntity &)>;
QMap<size_t, MakerFunction> m_MakersMap;
Expand Down

0 comments on commit 11c8f7e

Please sign in to comment.