From 0730f0910cc04e34370d5097881cb1afca5b6554 Mon Sep 17 00:00:00 2001 From: yann300 Date: Thu, 11 Dec 2014 11:48:13 +0100 Subject: [PATCH] add QContractDefinition, QBasicNodeDefinition, QFunctionDefinition, QVariableDeclaration --- mix/QBasicNodeDefinition.cpp | 23 +++++++++++++++ mix/QBasicNodeDefinition.h | 48 +++++++++++++++++++++++++++++++ mix/QContractDefinition.cpp | 55 ++++++++++++++++++++++++++++++++++++ mix/QContractDefinition.h | 51 +++++++++++++++++++++++++++++++++ mix/QFunctionDefinition.cpp | 41 +++++++++++++++++++++++++++ mix/QFunctionDefinition.h | 53 ++++++++++++++++++++++++++++++++++ mix/QVariableDeclaration.cpp | 23 +++++++++++++++ mix/QVariableDeclaration.h | 46 ++++++++++++++++++++++++++++++ 8 files changed, 340 insertions(+) create mode 100644 mix/QBasicNodeDefinition.cpp create mode 100644 mix/QBasicNodeDefinition.h create mode 100644 mix/QContractDefinition.cpp create mode 100644 mix/QContractDefinition.h create mode 100644 mix/QFunctionDefinition.cpp create mode 100644 mix/QFunctionDefinition.h create mode 100644 mix/QVariableDeclaration.cpp create mode 100644 mix/QVariableDeclaration.h diff --git a/mix/QBasicNodeDefinition.cpp b/mix/QBasicNodeDefinition.cpp new file mode 100644 index 000000000..5a8378500 --- /dev/null +++ b/mix/QBasicNodeDefinition.cpp @@ -0,0 +1,23 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum 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 3 of the License, or + (at your option) any later version. + + cpp-ethereum 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 cpp-ethereum. If not, see . +*/ +/** @file QBasicNodeDefinition.cpp + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#include "QBasicNodeDefinition.h" + diff --git a/mix/QBasicNodeDefinition.h b/mix/QBasicNodeDefinition.h new file mode 100644 index 000000000..5b4cc6c9a --- /dev/null +++ b/mix/QBasicNodeDefinition.h @@ -0,0 +1,48 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum 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 3 of the License, or + (at your option) any later version. + + cpp-ethereum 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 cpp-ethereum. If not, see . +*/ +/** @file QBasicNodeDefinition.h + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#pragma once + +#include +#include "libsolidity/AST.h" + +namespace dev +{ +namespace mix +{ + +class QBasicNodeDefinition: public QObject +{ + Q_OBJECT + Q_PROPERTY(QString name READ name) + +public: + QBasicNodeDefinition(): QObject() {} + ~QBasicNodeDefinition() {} + QBasicNodeDefinition(std::shared_ptr _d, QObject* _parent): QObject(_parent), m_dec(_d) {} + QString name() { return QString::fromStdString(m_dec.get()->getName()); } + +protected: + std::shared_ptr m_dec; +}; + +} +} diff --git a/mix/QContractDefinition.cpp b/mix/QContractDefinition.cpp new file mode 100644 index 000000000..2e6a99db3 --- /dev/null +++ b/mix/QContractDefinition.cpp @@ -0,0 +1,55 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum 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 3 of the License, or + (at your option) any later version. + + cpp-ethereum 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 cpp-ethereum. If not, see . +*/ +/** @file QContractDefinition.cpp + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#include +#include "QContractDefinition.h" +#include "libsolidity/Scanner.h" +#include "libsolidity/Parser.h" +#include "libsolidity/Scanner.h" +#include "libsolidity/NameAndTypeResolver.h" +#include "QContractDefinition.h" +using namespace dev::solidity; +using namespace dev::mix; + +QContractDefinition* QContractDefinition::Contract(QString _source, QObject* _parent) +{ + Parser parser; + std::shared_ptr contract = parser.parse(std::make_shared(CharStream(_source.toStdString()))); + NameAndTypeResolver resolver({}); + resolver.resolveNamesAndTypes(*contract); + return new QContractDefinition(contract, _parent); +} + +QContractDefinition::QContractDefinition(std::shared_ptr _contract, QObject* _parent): QBasicNodeDefinition(_contract, _parent), m_def(_contract) +{ + initQFunctions(); +} + +void QContractDefinition::initQFunctions() +{ + std::vector functions = m_def.get()->getInterfaceFunctions(); + for (unsigned i = 0; i < functions.size(); i++) + { + FunctionDefinition* func = (FunctionDefinition*)functions.at(i); + std::shared_ptr sharedFunc(func); + m_functions.append(new QFunctionDefinition(sharedFunc, parent(), i)); + } +} diff --git a/mix/QContractDefinition.h b/mix/QContractDefinition.h new file mode 100644 index 000000000..19b4b0179 --- /dev/null +++ b/mix/QContractDefinition.h @@ -0,0 +1,51 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum 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 3 of the License, or + (at your option) any later version. + + cpp-ethereum 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 cpp-ethereum. If not, see . +*/ +/** @file QContractDefinition.h + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#pragma once + +#include +#include "libsolidity/AST.h" +#include "QFunctionDefinition.h" +#include "QBasicNodeDefinition.h" + +namespace dev +{ +namespace mix +{ + +class QContractDefinition: public QBasicNodeDefinition +{ + Q_OBJECT + Q_PROPERTY(QList functions READ functions) + +public: + QContractDefinition(std::shared_ptr _contract, QObject* _parent); + QList functions() { return m_functions; } + static QContractDefinition* Contract(QString _code, QObject* _parent); + +private: + std::shared_ptr m_def; + QList m_functions; + void initQFunctions(); +}; + +} +} diff --git a/mix/QFunctionDefinition.cpp b/mix/QFunctionDefinition.cpp new file mode 100644 index 000000000..7e95988c7 --- /dev/null +++ b/mix/QFunctionDefinition.cpp @@ -0,0 +1,41 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum 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 3 of the License, or + (at your option) any later version. + + cpp-ethereum 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 cpp-ethereum. If not, see . +*/ +/** @file QFunctionDefinition.cpp + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#include "QVariableDeclaration.h" +#include "QFunctionDefinition.h" +#include "libsolidity/AST.h" +using namespace dev::solidity; +using namespace dev::mix; + +void QFunctionDefinition::initQParameters() +{ + std::vector> parameters = ((FunctionDefinition*)m_dec.get())->getParameterList().getParameters(); + for (unsigned i = 0; i < parameters.size(); i++) + { + m_parameters.append(new QVariableDeclaration(parameters.at(i), parent())); + } + + std::vector> returnParameters = ((FunctionDefinition*)m_dec.get())->getReturnParameters(); + for (unsigned i = 0; i < returnParameters.size(); i++) + { + m_returnParameters.append(new QVariableDeclaration(returnParameters.at(i), parent())); + } +} diff --git a/mix/QFunctionDefinition.h b/mix/QFunctionDefinition.h new file mode 100644 index 000000000..4db296348 --- /dev/null +++ b/mix/QFunctionDefinition.h @@ -0,0 +1,53 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum 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 3 of the License, or + (at your option) any later version. + + cpp-ethereum 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 cpp-ethereum. If not, see . +*/ +/** @file QFunctionDefinition.h + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#pragma once + +#include +#include +#include "QBasicNodeDefinition.h" + +namespace dev +{ +namespace mix +{ + +class QFunctionDefinition: public QBasicNodeDefinition +{ + Q_OBJECT + Q_PROPERTY(QList parameters READ parameters) + Q_PROPERTY(int index READ index) + +public: + QFunctionDefinition(std::shared_ptr _f, QObject* _parent, int _index): QBasicNodeDefinition(_f, _parent), m_index(_index) { initQParameters(); } + QList parameters() { return m_parameters; } + QList returnParameters() { return m_returnParameters; } + int index() { return m_index; } + +private: + QList m_parameters; + QList m_returnParameters; + int m_index; + void initQParameters(); +}; + +} +} diff --git a/mix/QVariableDeclaration.cpp b/mix/QVariableDeclaration.cpp new file mode 100644 index 000000000..d8e07a689 --- /dev/null +++ b/mix/QVariableDeclaration.cpp @@ -0,0 +1,23 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum 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 3 of the License, or + (at your option) any later version. + + cpp-ethereum 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 cpp-ethereum. If not, see . +*/ +/** @file QVariableDeclaration.cpp + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#include "QVariableDeclaration.h" +using namespace dev::mix; diff --git a/mix/QVariableDeclaration.h b/mix/QVariableDeclaration.h new file mode 100644 index 000000000..c9aa0d6cd --- /dev/null +++ b/mix/QVariableDeclaration.h @@ -0,0 +1,46 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum 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 3 of the License, or + (at your option) any later version. + + cpp-ethereum 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 cpp-ethereum. If not, see . +*/ +/** @file QVariableDeclaration.h + * @author Yann yann@ethdev.com + * @date 2014 + */ + +#include "libsolidity/AST.h" +#include "QBasicNodeDefinition.h" + +#pragma once + +namespace dev +{ +namespace mix +{ + +class QVariableDeclaration: public QBasicNodeDefinition +{ + Q_OBJECT + Q_PROPERTY(QString type READ type) + +public: + QVariableDeclaration(std::shared_ptr _v, QObject* _parent): QBasicNodeDefinition(_v, _parent), m_var(_v) {} + QString type() { return QString::fromStdString(m_var.get()->getType()->toString()); } + +private: + std::shared_ptr m_var; +}; + +} +}