From ab89822535e2a4584d56515c46f7ed5d28d801d6 Mon Sep 17 00:00:00 2001 From: arkpar Date: Sun, 21 Dec 2014 14:26:13 +0100 Subject: [PATCH] continue code model impl --- mix/AppContext.cpp | 37 +++++++-------- mix/AppContext.h | 37 +++++++++------ mix/AssemblyDebuggerCtrl.cpp | 43 ++++++++--------- mix/AssemblyDebuggerCtrl.h | 12 ++--- mix/AssemblyDebuggerModel.cpp | 15 ++++-- mix/CodeEditorExtensionManager.cpp | 51 +++++++++++--------- mix/CodeEditorExtensionManager.h | 5 +- mix/CodeModel.cpp | 55 ++++++++++++++++----- mix/CodeModel.h | 31 ++++++++---- mix/ConstantCompilationCtrl.cpp | 50 ++++++++------------ mix/ConstantCompilationCtrl.h | 9 +--- mix/ConstantCompilationModel.cpp | 66 -------------------------- mix/ConstantCompilationModel.h | 53 --------------------- mix/ContractCallDataEncoder.cpp | 6 +-- mix/ContractCallDataEncoder.h | 6 +-- mix/Extension.cpp | 21 +++++---- mix/Extension.h | 11 +++-- mix/KeyEventManager.cpp | 8 ++++ mix/KeyEventManager.h | 7 +++ mix/MixApplication.cpp | 26 +++++----- mix/MixApplication.h | 13 ++++- mix/QBasicNodeDefinition.h | 6 +-- mix/QContractDefinition.cpp | 22 ++------- mix/QContractDefinition.h | 10 ++-- mix/QFunctionDefinition.cpp | 6 +-- mix/QFunctionDefinition.h | 3 +- mix/QVariableDeclaration.h | 6 ++- mix/QVariableDefinition.h | 8 ++-- mix/TransactionListModel.cpp | 76 ++++++++++++------------------ mix/TransactionListModel.h | 8 ++-- mix/TransactionListView.cpp | 5 +- mix/TransactionListView.h | 4 +- mix/main.cpp | 13 +---- 33 files changed, 320 insertions(+), 409 deletions(-) delete mode 100644 mix/ConstantCompilationModel.cpp delete mode 100644 mix/ConstantCompilationModel.h diff --git a/mix/AppContext.cpp b/mix/AppContext.cpp index 3cafe219e..37cf4070a 100644 --- a/mix/AppContext.cpp +++ b/mix/AppContext.cpp @@ -27,26 +27,31 @@ #include #include #include "libdevcrypto/FileSystem.h" +#include "libwebthree/WebThree.h" #include "KeyEventManager.h" #include "AppContext.h" +#include "CodeModel.h" + using namespace dev; using namespace dev::eth; using namespace dev::solidity; using namespace dev::mix; -AppContext* AppContext::Instance = nullptr; - AppContext::AppContext(QQmlApplicationEngine* _engine) { - m_applicationEngine = std::unique_ptr(_engine); + m_applicationEngine = _engine; m_keyEventManager = std::unique_ptr(new KeyEventManager()); m_webThree = std::unique_ptr(new WebThreeDirect(std::string("Mix/v") + dev::Version + "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM), getDataDir() + "/Mix", false, {"eth", "shh"})); - m_compiler = std::unique_ptr(new CompilerStack()); + m_codeModel = std::unique_ptr(new CodeModel(this)); +} + +AppContext::~AppContext() +{ } QQmlApplicationEngine* AppContext::appEngine() { - return m_applicationEngine.get(); + return m_applicationEngine; } dev::eth::Client* AppContext::getEthereumClient() @@ -68,22 +73,10 @@ KeyEventManager* AppContext::getKeyEventManager() return m_keyEventManager.get(); } -CompilerStack* AppContext::compiler() -{ - m_compiler.reset(new CompilerStack()); - return m_compiler.get(); -} - -void AppContext::setApplicationContext(QQmlApplicationEngine* _engine) -{ - if (Instance == nullptr) - Instance = new AppContext(_engine); -} - void AppContext::displayMessageDialog(QString _title, QString _message) { - QObject* dialogWin = m_applicationEngine.get()->rootObjects().at(0)->findChild("alertMessageDialog", Qt::FindChildrenRecursively); - QObject* dialogWinComponent = m_applicationEngine.get()->rootObjects().at(0)->findChild("alertMessageDialogContent", Qt::FindChildrenRecursively); + QObject* dialogWin = m_applicationEngine->rootObjects().at(0)->findChild("alertMessageDialog", Qt::FindChildrenRecursively); + QObject* dialogWinComponent = m_applicationEngine->rootObjects().at(0)->findChild("alertMessageDialogContent", Qt::FindChildrenRecursively); dialogWinComponent->setProperty("source", QString("qrc:/qml/BasicMessage.qml")); dialogWin->setProperty("title", _title); dialogWin->setProperty("width", "250"); @@ -91,3 +84,9 @@ void AppContext::displayMessageDialog(QString _title, QString _message) dialogWin->findChild("messageContent", Qt::FindChildrenRecursively)->setProperty("text", _message); QMetaObject::invokeMethod(dialogWin, "open"); } + +void AppContext::resourceLoaded(QObject *_obj, QUrl _url) +{ + Q_UNUSED(_url); + initKeyEventManager(_obj); +} diff --git a/mix/AppContext.h b/mix/AppContext.h index 88e70f3f4..6657a675e 100644 --- a/mix/AppContext.h +++ b/mix/AppContext.h @@ -27,42 +27,51 @@ #pragma once -#include -#include "libsolidity/CompilerStack.h" -#include "libwebthree/WebThree.h" -#include "KeyEventManager.h" +#include +#include +#include + +class QQmlApplicationEngine; namespace dev { + +class WebThreeDirect; + +namespace eth +{ + class Client; +} + namespace mix { -class AppContext: public QObject +class CodeModel; +class KeyEventManager; + +class AppContext : public QObject { Q_OBJECT public: AppContext(QQmlApplicationEngine* _engine); - ~AppContext() {} - static AppContext* getInstance() { return Instance; } - static void setApplicationContext(QQmlApplicationEngine* _engine); + ~AppContext(); QQmlApplicationEngine* appEngine(); dev::eth::Client* getEthereumClient(); void initKeyEventManager(QObject* _obj); KeyEventManager* getKeyEventManager(); - dev::solidity::CompilerStack* compiler(); + CodeModel* codeModel() { return m_codeModel.get(); } void displayMessageDialog(QString _title, QString _message); private: - static AppContext* Instance; - std::unique_ptr m_applicationEngine; + QQmlApplicationEngine* m_applicationEngine; //owned by app std::unique_ptr m_webThree; std::unique_ptr m_keyEventManager; - std::unique_ptr m_compiler; + std::unique_ptr m_codeModel; public slots: - void quitApplication() { delete Instance; } - void resourceLoaded(QObject* _obj, QUrl _url) { Q_UNUSED(_url); initKeyEventManager(_obj); } + void quitApplication() {} + void resourceLoaded(QObject* _obj, QUrl _url); }; } diff --git a/mix/AssemblyDebuggerCtrl.cpp b/mix/AssemblyDebuggerCtrl.cpp index 3c82c5a16..588565628 100644 --- a/mix/AssemblyDebuggerCtrl.cpp +++ b/mix/AssemblyDebuggerCtrl.cpp @@ -19,12 +19,11 @@ #include #include -#include #include +#include #include #include -#include "libethereum/Transaction.h" -#include "AssemblyDebuggerModel.h" +#include #include "AssemblyDebuggerCtrl.h" #include "KeyEventManager.h" #include "AppContext.h" @@ -33,10 +32,14 @@ #include "QContractDefinition.h" #include "QVariableDeclaration.h" #include "ContractCallDataEncoder.h" +#include "KeyEventManager.h" +#include "CodeModel.h" +#include "AssemblyDebuggerModel.h" + using namespace dev::eth; using namespace dev::mix; -AssemblyDebuggerCtrl::AssemblyDebuggerCtrl(QTextDocument* _doc): Extension(ExtensionDisplayBehavior::ModalDialog) +AssemblyDebuggerCtrl::AssemblyDebuggerCtrl(AppContext* _context): Extension(_context, ExtensionDisplayBehavior::ModalDialog) { qRegisterMetaType("QVariableDefinition*"); qRegisterMetaType("QVariableDefinitionList*"); @@ -48,8 +51,6 @@ AssemblyDebuggerCtrl::AssemblyDebuggerCtrl(QTextDocument* _doc): Extension(Exten this, SLOT(updateGUI(bool, DebuggingStatusResult, QList, QList, AssemblyDebuggerData)), Qt::QueuedConnection); m_modelDebugger = std::unique_ptr(new AssemblyDebuggerModel); - m_compilation = std::unique_ptr(new ConstantCompilationModel); - m_doc = _doc; } QString AssemblyDebuggerCtrl::contentUrl() const @@ -74,41 +75,41 @@ void AssemblyDebuggerCtrl::keyPressed(int _key) { QtConcurrent::run([this]() { - deployContract(m_doc->toPlainText()); + deployContract(); }); } } void AssemblyDebuggerCtrl::callContract(dev::mix::TransactionSettings _tr) { - CompilerResult compilerRes = m_compilation.get()->compile(m_doc->toPlainText()); - if (!compilerRes.success) + auto compilerRes = m_ctx->codeModel()->lastCompilationResult(); + if (!compilerRes->successfull()) { - AppContext::getInstance()->displayMessageDialog("debugger","compilation failed"); + m_ctx->displayMessageDialog("debugger","compilation failed"); return; } ContractCallDataEncoder c; - std::shared_ptr contractDef = QContractDefinition::Contract(m_doc->toPlainText()); + QContractDefinition const* contractDef = compilerRes->contract(); - QFunctionDefinition* f = nullptr; - for (int k = 0; k < contractDef.get()->functions().size(); k++) + QFunctionDefinition const* f = nullptr; + for (int k = 0; k < contractDef->functions().size(); k++) { - if (contractDef.get()->functions().at(k)->name() == _tr.functionId) + if (contractDef->functions().at(k)->name() == _tr.functionId) { - f = (QFunctionDefinition*)contractDef->functions().at(k); + f = contractDef->functions().at(k); } } if (!f) { - AppContext::getInstance()->displayMessageDialog("debugger","contract code changed. redeploy contract"); + m_ctx->displayMessageDialog("debugger","contract code changed. redeploy contract"); return; } c.encode(f->index()); for (int k = 0; k < f->parameters().size(); k++) { - QVariableDeclaration* var = (QVariableDeclaration*)f->parameters().at(k); + QVariableDeclaration const* var = static_cast(f->parameters().at(k)); c.encode(var, _tr.parameterValues[var->name()]); } @@ -120,16 +121,16 @@ void AssemblyDebuggerCtrl::callContract(dev::mix::TransactionSettings _tr) finalizeExecution(debuggingContent); } -void AssemblyDebuggerCtrl::deployContract(QString _source) +void AssemblyDebuggerCtrl::deployContract() { - CompilerResult compilerRes = m_compilation.get()->compile(_source); - if (!compilerRes.success) + auto compilerRes = m_ctx->codeModel()->lastCompilationResult(); + if (!compilerRes->successfull()) { emit dataAvailable(false, DebuggingStatusResult::Compilationfailed); return; } - m_previousDebugResult = m_modelDebugger->getContractInitiationDebugStates(compilerRes.bytes); + m_previousDebugResult = m_modelDebugger->getContractInitiationDebugStates(compilerRes->bytes()); finalizeExecution(m_previousDebugResult); } diff --git a/mix/AssemblyDebuggerCtrl.h b/mix/AssemblyDebuggerCtrl.h index 03a0acfbe..61807cbb9 100644 --- a/mix/AssemblyDebuggerCtrl.h +++ b/mix/AssemblyDebuggerCtrl.h @@ -20,12 +20,9 @@ #pragma once #include -#include "QTextDocument" #include "Extension.h" -#include "ConstantCompilationModel.h" #include "TransactionListModel.h" #include "AssemblyDebuggerModel.h" -#include "AppContext.h" using AssemblyDebuggerData = std::tuple, dev::mix::QQMLMap*>; enum DebuggingStatusResult @@ -38,6 +35,8 @@ Q_DECLARE_METATYPE(AssemblyDebuggerData) Q_DECLARE_METATYPE(DebuggingStatusResult) Q_DECLARE_METATYPE(dev::mix::DebuggingContent) +class AppContext; + namespace dev { namespace mix @@ -48,7 +47,7 @@ class AssemblyDebuggerCtrl: public Extension Q_OBJECT public: - AssemblyDebuggerCtrl(QTextDocument*); + AssemblyDebuggerCtrl(AppContext* _context); ~AssemblyDebuggerCtrl() {} void start() const override; QString title() const override; @@ -56,9 +55,7 @@ public: private: std::unique_ptr m_modelDebugger; - std::unique_ptr m_compilation; - QTextDocument* m_doc; - void deployContract(QString _source); + void deployContract(); void callContract(dev::mix::TransactionSettings _contractAddress); void finalizeExecution(DebuggingContent _content); DebuggingContent m_previousDebugResult; //used for now to keep the contract address in case of transaction call. @@ -70,7 +67,6 @@ public slots: signals: void dataAvailable(bool _success, DebuggingStatusResult _reason, QList _returnParams = QList(), QList _wStates = QList(), AssemblyDebuggerData _code = AssemblyDebuggerData()); - }; } diff --git a/mix/AssemblyDebuggerModel.cpp b/mix/AssemblyDebuggerModel.cpp index af6de8ed7..994e2208c 100644 --- a/mix/AssemblyDebuggerModel.cpp +++ b/mix/AssemblyDebuggerModel.cpp @@ -23,15 +23,19 @@ #include #include #include +#include "AssemblyDebuggerModel.h" #include "AppContext.h" #include "TransactionListModel.h" -#include "AssemblyDebuggerModel.h" -#include "ConstantCompilationModel.h" #include "DebuggingStateWrapper.h" + using namespace std; using namespace dev; using namespace dev::eth; -using namespace dev::mix; + +namespace dev +{ +namespace mix +{ AssemblyDebuggerModel::AssemblyDebuggerModel(): m_userAccount(KeyPair::create()), @@ -44,11 +48,9 @@ AssemblyDebuggerModel::AssemblyDebuggerModel(): DebuggingContent AssemblyDebuggerModel::executeTransaction(bytesConstRef _rawTransaction) { - QList machineStates; // Reset the state back to our clean premine. m_currentExecution = std::unique_ptr(new Executive(m_executiveState, 0)); - QList states; m_currentExecution->setup(_rawTransaction); std::vector levels; bytes code; @@ -119,3 +121,6 @@ void AssemblyDebuggerModel::resetState() { m_executiveState = m_baseState; } + +} +} diff --git a/mix/CodeEditorExtensionManager.cpp b/mix/CodeEditorExtensionManager.cpp index a6f7e798a..cd5e725e3 100644 --- a/mix/CodeEditorExtensionManager.cpp +++ b/mix/CodeEditorExtensionManager.cpp @@ -30,9 +30,17 @@ #include "AssemblyDebuggerCtrl.h" #include "TransactionListView.h" #include "AppContext.h" +#include "MixApplication.h" +#include "CodeModel.h" #include "CodeEditorExtensionManager.h" + using namespace dev::mix; +CodeEditorExtensionManager::CodeEditorExtensionManager(): + m_appContext(static_cast(QApplication::instance())->context()) +{ +} + CodeEditorExtensionManager::~CodeEditorExtensionManager() { m_features.clear(); @@ -42,38 +50,26 @@ void CodeEditorExtensionManager::loadEditor(QQuickItem* _editor) { if (!_editor) return; - try + + QVariant doc = _editor->property("textDocument"); + if (doc.canConvert()) { - QVariant doc = _editor->property("textDocument"); - if (doc.canConvert()) + QQuickTextDocument* qqdoc = doc.value(); + if (qqdoc) { - QQuickTextDocument* qqdoc = doc.value(); - if (qqdoc) - { - m_doc = qqdoc->textDocument(); - auto args = QApplication::arguments(); - if (args.length() > 1) - { - QString path = args[1]; - QFile file(path); - if (file.exists() && file.open(QFile::ReadOnly)) - m_doc->setPlainText(file.readAll()); - } - } + m_doc = qqdoc->textDocument(); } } - catch (...) - { - qDebug() << "unable to load editor: "; - } } void CodeEditorExtensionManager::initExtensions() { - initExtension(std::make_shared(m_doc)); - std::shared_ptr debug = std::make_shared(m_doc); - std::shared_ptr tr = std::make_shared(m_doc); + initExtension(std::make_shared(m_appContext)); + std::shared_ptr debug = std::make_shared(m_appContext); + std::shared_ptr tr = std::make_shared(m_appContext); QObject::connect(tr->model(), &TransactionListModel::transactionStarted, debug.get(), &AssemblyDebuggerCtrl::runTransaction); + QObject::connect(m_doc, &QTextDocument::contentsChanged, [=]() { m_appContext->codeModel()->registerCodeChange(m_doc->toPlainText()); }); + initExtension(debug); initExtension(tr); } @@ -103,6 +99,15 @@ void CodeEditorExtensionManager::setEditor(QQuickItem* _editor) { this->loadEditor(_editor); this->initExtensions(); + + auto args = QApplication::arguments(); + if (args.length() > 1) + { + QString path = args[1]; + QFile file(path); + if (file.exists() && file.open(QFile::ReadOnly)) + m_doc->setPlainText(file.readAll()); + } } void CodeEditorExtensionManager::setRightTabView(QQuickItem* _tabView) diff --git a/mix/CodeEditorExtensionManager.h b/mix/CodeEditorExtensionManager.h index 9e931664d..475981cc9 100644 --- a/mix/CodeEditorExtensionManager.h +++ b/mix/CodeEditorExtensionManager.h @@ -33,6 +33,8 @@ namespace dev namespace mix { +class AppContext; + class CodeEditorExtensionManager: public QObject { Q_OBJECT @@ -42,7 +44,7 @@ class CodeEditorExtensionManager: public QObject Q_PROPERTY(QQuickItem* rightTabView MEMBER m_rightTabView WRITE setRightTabView) public: - CodeEditorExtensionManager() {} + CodeEditorExtensionManager(); ~CodeEditorExtensionManager(); void initExtensions(); void initExtension(std::shared_ptr); @@ -56,6 +58,7 @@ private: QQuickItem* m_tabView; QQuickItem* m_rightTabView; QTextDocument* m_doc; + AppContext* m_appContext; void loadEditor(QQuickItem*); }; diff --git a/mix/CodeModel.cpp b/mix/CodeModel.cpp index 120a81ac7..eebd9ed1f 100644 --- a/mix/CodeModel.cpp +++ b/mix/CodeModel.cpp @@ -20,6 +20,13 @@ * Ethereum IDE client. */ +#include +#include +#include +#include +#include +#include +#include "QContractDefinition.h" #include "CodeModel.h" namespace dev @@ -32,12 +39,27 @@ void BackgroundWorker::queueCodeChange(int _jobId, QString const& _content) m_model->runCompilationJob(_jobId, _content); } - -CodeModel::CodeModel(QObject* _parent) : QObject(_parent), m_backgroundWorker(this) +CompilationResult::CompilationResult(const solidity::CompilerStack& _compiler, QObject *_parent): + QObject(_parent), m_successfull(true), + m_contract(new QContractDefinition(&_compiler.getContractDefinition(std::string()))), + m_bytes(_compiler.getBytecode()), + m_assemblyCode(QString::fromStdString((dev::eth::disassemble(m_bytes)))) +{} + +CompilationResult::CompilationResult(CompilationResult const& _prev, QString const& _compilerMessage, QObject* _parent): + QObject(_parent), m_successfull(false), + m_contract(_prev.m_contract), + m_compilerMessage(_compilerMessage), + m_bytes(_prev.m_bytes), + m_assemblyCode(_prev.m_assemblyCode) +{} + +CodeModel::CodeModel(QObject* _parent) : QObject(_parent), + m_backgroundWorker(this), m_backgroundJobId(0) { m_backgroundWorker.moveToThread(&m_backgroundThread); - connect(this, &CodeModel::compilationComplete, this, &CodeModel::onCompilationComplete, Qt::QueuedConnection); + //connect(this, &CodeModel::compilationComplete, this, &CodeModel::onCompilationComplete, Qt::QueuedConnection); connect(this, &CodeModel::scheduleCompilationJob, &m_backgroundWorker, &BackgroundWorker::queueCodeChange, Qt::QueuedConnection); m_backgroundThread.start(); } @@ -62,20 +84,31 @@ void CodeModel::registerCodeChange(const QString &_code) emit scheduleCompilationJob(m_backgroundJobId, _code); } -void CodeModel::onCompilationComplete(std::shared_ptr _compilationResult) -{ - m_result.swap(_compilationResult); -} - -void CodeModel::runCompilationJob(int _jobId, QString const& _content) +void CodeModel::runCompilationJob(int _jobId, QString const& _code) { if (_jobId != m_backgroundJobId) return; //obsolete job - + solidity::CompilerStack cs; + try + { + cs.setSource(_code.toStdString()); + cs.compile(false); + std::shared_ptr result(new CompilationResult(cs, nullptr)); + m_result.swap(result); + qDebug() << QString(QApplication::tr("compilation succeeded")); + } + catch (dev::Exception const& _exception) + { + std::ostringstream error; + solidity::SourceReferenceFormatter::printExceptionInformation(error, _exception, "Error", cs); + std::shared_ptr result(new CompilationResult(*m_result, QString::fromStdString(error.str()), nullptr)); + m_result.swap(result); + qDebug() << QString(QApplication::tr("compilation failed") + " " + m_result->compilerMessage()); + } + emit compilationComplete(); } - } } diff --git a/mix/CodeModel.h b/mix/CodeModel.h index 1667f19a4..4c3b60089 100644 --- a/mix/CodeModel.h +++ b/mix/CodeModel.h @@ -22,12 +22,19 @@ #pragma once +#include #include #include #include namespace dev { + +namespace solidity +{ + class CompilerStack; +} + namespace mix { @@ -54,14 +61,24 @@ class CompilationResult : public QObject Q_PROPERTY(QContractDefinition const* contract READ contract) public: - QContractDefinition const* contract() { return m_contract; } + /// Successfull compilation result constructor + CompilationResult(solidity::CompilerStack const& _compiler, QObject* parent); + /// Failed compilation result constructor + CompilationResult(CompilationResult const& _prev, QString const& _compilerMessage, QObject* parent); + QContractDefinition const* contract() { return m_contract.get(); } + + bool successfull() const { return m_successfull; } + QContractDefinition const* contract() const { return m_contract.get(); } + QString compilerMessage() const { return m_compilerMessage; } + dev::bytes const& bytes() const { return m_bytes; } + QString assemblyCode() const { return m_assemblyCode; } private: bool m_successfull; - QContractDefinition* m_contract; - QString m_hexCode; + std::shared_ptr m_contract; QString m_compilerMessage; ///< @todo: use some structure here dev::bytes m_bytes; + QString m_assemblyCode; ///@todo syntax highlighting, etc }; @@ -79,19 +96,16 @@ public: CodeModel(QObject* _parent); ~CodeModel(); - CompilationResult* getLastCompilationResult(); + std::shared_ptr lastCompilationResult() { return m_result; } signals: void statusChanged(Status _from, Status _to); - void compilationComplete(std::shared_ptr _compilationResult); + void compilationComplete(); void scheduleCompilationJob(int _jobId, QString const& _content); public slots: void registerCodeChange(QString const& _code); -private slots: - void onCompilationComplete(std::shared_ptr _compilationResult); - private: void runCompilationJob(int _jobId, QString const& _content); void stop(); @@ -100,7 +114,6 @@ private: QThread m_backgroundThread; BackgroundWorker m_backgroundWorker; int m_backgroundJobId = 0; //protects from starting obsolete compilation job - friend class BackgroundWorker; }; diff --git a/mix/ConstantCompilationCtrl.cpp b/mix/ConstantCompilationCtrl.cpp index 012556c3a..14bb36033 100644 --- a/mix/ConstantCompilationCtrl.cpp +++ b/mix/ConstantCompilationCtrl.cpp @@ -27,15 +27,16 @@ #include #include #include -#include "ConstantCompilationCtrl.h" -#include "ConstantCompilationModel.h" #include "QContractDefinition.h" +#include "AppContext.h" +#include "CodeModel.h" +#include "ConstantCompilationCtrl.h" + using namespace dev::mix; -ConstantCompilationCtrl::ConstantCompilationCtrl(QTextDocument* _doc): Extension(ExtensionDisplayBehavior::Tab) +ConstantCompilationCtrl::ConstantCompilationCtrl(AppContext* _context): Extension(_context, ExtensionDisplayBehavior::Tab) { - m_editor = _doc; - m_compilationModel = std::unique_ptr(new ConstantCompilationModel()); + connect(_context->codeModel(), &CodeModel::compilationComplete, this, &ConstantCompilationCtrl::update); } QString ConstantCompilationCtrl::contentUrl() const @@ -50,45 +51,32 @@ QString ConstantCompilationCtrl::title() const void ConstantCompilationCtrl::start() const { - connect(m_editor, SIGNAL(contentsChange(int,int,int)), this, SLOT(compile())); } -void ConstantCompilationCtrl::compile() +void ConstantCompilationCtrl::update() { - QString codeContent = m_editor->toPlainText().replace("\n", ""); - if (codeContent.isEmpty()) - { - resetOutPut(); - return; - } - CompilerResult res = m_compilationModel->compile(m_editor->toPlainText().replace("\t", " ")); - writeOutPut(res); -} + auto result = m_ctx->codeModel()->lastCompilationResult(); -void ConstantCompilationCtrl::resetOutPut() -{ QObject* status = m_view->findChild("status", Qt::FindChildrenRecursively); QObject* content = m_view->findChild("content", Qt::FindChildrenRecursively); - status->setProperty("text", ""); - content->setProperty("text", ""); -} - -void ConstantCompilationCtrl::writeOutPut(CompilerResult const& _res) -{ - QObject* status = m_view->findChild("status", Qt::FindChildrenRecursively); - QObject* content = m_view->findChild("content", Qt::FindChildrenRecursively); - if (_res.success) + if (result->successfull()) { status->setProperty("text", "succeeded"); status->setProperty("color", "green"); - content->setProperty("text", _res.hexCode); - qDebug() << QString(QApplication::tr("compile succeeded") + " " + _res.hexCode); + content->setProperty("text", result->assemblyCode()); } else { status->setProperty("text", "failure"); status->setProperty("color", "red"); - content->setProperty("text", _res.comment); - qDebug() << QString(QApplication::tr("compile failed") + " " + _res.comment); + content->setProperty("text", result->compilerMessage()); } } + +void ConstantCompilationCtrl::resetOutPut() +{ + QObject* status = m_view->findChild("status", Qt::FindChildrenRecursively); + QObject* content = m_view->findChild("content", Qt::FindChildrenRecursively); + status->setProperty("text", ""); + content->setProperty("text", ""); +} diff --git a/mix/ConstantCompilationCtrl.h b/mix/ConstantCompilationCtrl.h index 4e6aa53de..8aad7a2db 100644 --- a/mix/ConstantCompilationCtrl.h +++ b/mix/ConstantCompilationCtrl.h @@ -19,8 +19,6 @@ #pragma once -#include -#include "ConstantCompilationModel.h" #include "Extension.h" namespace dev @@ -33,20 +31,17 @@ class ConstantCompilationCtrl: public Extension Q_OBJECT public: - ConstantCompilationCtrl(QTextDocument*); + ConstantCompilationCtrl(AppContext* _appContext); ~ConstantCompilationCtrl() {} void start() const override; QString title() const override; QString contentUrl() const override; private: - QTextDocument* m_editor; - std::unique_ptr m_compilationModel; - void writeOutPut(CompilerResult const&); void resetOutPut(); public slots: - void compile(); + void update(); }; } diff --git a/mix/ConstantCompilationModel.cpp b/mix/ConstantCompilationModel.cpp deleted file mode 100644 index 06141da26..000000000 --- a/mix/ConstantCompilationModel.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - 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 ConstantCompilationModel.cpp - * @author Yann yann@ethdev.com - * @date 2014 - * Ethereum IDE client. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "ConstantCompilationModel.h" -using namespace std; -using namespace dev; -using namespace dev::eth; -using namespace dev::mix; -using namespace dev::solidity; - -CompilerResult ConstantCompilationModel::compile(QString _code) -{ - dev::solidity::CompilerStack compiler; - dev::bytes m_data; - CompilerResult res; - try - { - m_data = compiler.compile(_code.toStdString(), true); - res.success = true; - res.comment = "ok"; - res.hexCode = QString::fromStdString(dev::eth::disassemble(m_data)); - res.bytes = m_data; - } - catch (dev::Exception const& _exception) - { - ostringstream error; - solidity::SourceReferenceFormatter::printExceptionInformation(error, _exception, "Error", compiler); - res.success = false; - res.comment = QString::fromStdString(error.str()); - res.hexCode = ""; - } - catch (...) - { - res.success = false; - res.comment = QApplication::tr("Uncaught exception."); - res.hexCode = ""; - } - return res; -} diff --git a/mix/ConstantCompilationModel.h b/mix/ConstantCompilationModel.h deleted file mode 100644 index cecb0d817..000000000 --- a/mix/ConstantCompilationModel.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - 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 ConstantCompilationModel.h - * @author Yann yann@ethdev.com - * @date 2014 - * Ethereum IDE client. - */ - -#pragma once - -#include -#include -#include - -namespace dev -{ -namespace mix -{ - -struct CompilerResult -{ - QString hexCode; - QString comment; - dev::bytes bytes; - bool success; -}; - -class ConstantCompilationModel -{ - -public: - ConstantCompilationModel() {} - ~ConstantCompilationModel() {} - CompilerResult compile(QString _code); -}; - -} - -} diff --git a/mix/ContractCallDataEncoder.cpp b/mix/ContractCallDataEncoder.cpp index 0254b7a21..5758e2174 100644 --- a/mix/ContractCallDataEncoder.cpp +++ b/mix/ContractCallDataEncoder.cpp @@ -46,19 +46,19 @@ void ContractCallDataEncoder::encode(int _functionIndex) m_encodedData.insert(m_encodedData.end(), i.begin(), i.end()); } -void ContractCallDataEncoder::encode(QVariableDeclaration* _dec, bool _value) +void ContractCallDataEncoder::encode(QVariableDeclaration const* _dec, bool _value) { return encode(_dec, QString(formatBool(_value))); } -void ContractCallDataEncoder::encode(QVariableDeclaration* _dec, QString _value) +void ContractCallDataEncoder::encode(QVariableDeclaration const* _dec, QString _value) { int padding = this->padding(_dec->type()); bytes data = padded(jsToBytes(_value.toStdString()), padding); m_encodedData.insert(m_encodedData.end(), data.begin(), data.end()); } -void ContractCallDataEncoder::encode(QVariableDeclaration* _dec, u256 _value) +void ContractCallDataEncoder::encode(QVariableDeclaration const* _dec, u256 _value) { int padding = this->padding(_dec->type()); std::ostringstream s; diff --git a/mix/ContractCallDataEncoder.h b/mix/ContractCallDataEncoder.h index 4677b97c8..01e346035 100644 --- a/mix/ContractCallDataEncoder.h +++ b/mix/ContractCallDataEncoder.h @@ -34,10 +34,10 @@ class ContractCallDataEncoder { public: ContractCallDataEncoder(); - void encode(QVariableDeclaration* _dec, QString _value); - void encode(QVariableDeclaration* _dec, u256 _value); + void encode(QVariableDeclaration const* _dec, QString _value); + void encode(QVariableDeclaration const* _dec, u256 _value); QList decode(QList _dec, bytes _value); - void encode(QVariableDeclaration* _dec, bool _value); + void encode(QVariableDeclaration const* _dec, bool _value); void encode(int _functionIndex); bytes encodedData(); diff --git a/mix/Extension.cpp b/mix/Extension.cpp index c6a41995a..2744fb6cb 100644 --- a/mix/Extension.cpp +++ b/mix/Extension.cpp @@ -19,26 +19,27 @@ #include #include +#include #include #include "Extension.h" #include "AppContext.h" using namespace dev; using namespace dev::mix; -Extension::Extension() +Extension::Extension(AppContext* _context) { - init(); + init(_context); } -Extension::Extension(ExtensionDisplayBehavior _displayBehavior) +Extension::Extension(AppContext* _context, ExtensionDisplayBehavior _displayBehavior) { - init(); + init(_context); m_displayBehavior = _displayBehavior; } -void Extension::init() +void Extension::init(AppContext* _context) { - m_ctx = AppContext::getInstance(); + m_ctx = _context; m_appEngine = m_ctx->appEngine(); } @@ -49,7 +50,7 @@ void Extension::addTabOn(QObject* _view) QVariant returnValue; QQmlComponent* component = new QQmlComponent( - AppContext::getInstance()->appEngine(), + m_appEngine, QUrl(contentUrl()), _view); QMetaObject::invokeMethod(_view, "addTab", @@ -65,9 +66,9 @@ void Extension::addContentOn(QObject* _view) Q_UNUSED(_view); if (m_displayBehavior == ExtensionDisplayBehavior::ModalDialog) { - QQmlComponent* component = new QQmlComponent(AppContext::getInstance()->appEngine(), QUrl(contentUrl()), _view); - QObject* dialogWin = AppContext::getInstance()->appEngine()->rootObjects().at(0)->findChild("dialog", Qt::FindChildrenRecursively); - QObject* dialogWinComponent = AppContext::getInstance()->appEngine()->rootObjects().at(0)->findChild("modalDialogContent", Qt::FindChildrenRecursively); + QQmlComponent* component = new QQmlComponent(m_appEngine, QUrl(contentUrl()), _view); + QObject* dialogWin = m_appEngine->rootObjects().at(0)->findChild("dialog", Qt::FindChildrenRecursively); + QObject* dialogWinComponent = m_appEngine->rootObjects().at(0)->findChild("modalDialogContent", Qt::FindChildrenRecursively); dialogWinComponent->setProperty("sourceComponent", QVariant::fromValue(component)); dialogWin->setProperty("title", title()); QMetaObject::invokeMethod(dialogWin, "open"); diff --git a/mix/Extension.h b/mix/Extension.h index f983cd74c..85ef52711 100644 --- a/mix/Extension.h +++ b/mix/Extension.h @@ -21,13 +21,16 @@ #include #include -#include "AppContext.h" + +class QQmlApplicationEngine; namespace dev { namespace mix { +class AppContext; + enum ExtensionDisplayBehavior { Tab, @@ -41,8 +44,8 @@ class Extension: public QObject Q_OBJECT public: - Extension(); - Extension(ExtensionDisplayBehavior _displayBehavior); + Extension(AppContext* _context); + Extension(AppContext* _context, ExtensionDisplayBehavior _displayBehavior); virtual QString contentUrl() const { return ""; } virtual QString title() const { return ""; } virtual void start() const {} @@ -58,7 +61,7 @@ protected: QQmlApplicationEngine* m_appEngine; private: - void init(); + void init(AppContext* _context); }; } diff --git a/mix/KeyEventManager.cpp b/mix/KeyEventManager.cpp index c32caadb8..f7af8270b 100644 --- a/mix/KeyEventManager.cpp +++ b/mix/KeyEventManager.cpp @@ -25,6 +25,11 @@ #include #include "KeyEventManager.h" +namespace dev +{ +namespace mix +{ + void KeyEventManager::registerEvent(const QObject* _receiver, const char* _slot) { QObject::connect(this, SIGNAL(onKeyPressed(int)), _receiver, _slot); @@ -39,3 +44,6 @@ void KeyEventManager::keyPressed(QVariant _event) { emit onKeyPressed(_event.toInt()); } + +} +} diff --git a/mix/KeyEventManager.h b/mix/KeyEventManager.h index f3343cc45..2710a804f 100644 --- a/mix/KeyEventManager.h +++ b/mix/KeyEventManager.h @@ -24,6 +24,11 @@ #include +namespace dev +{ +namespace mix +{ + class KeyEventManager: public QObject { Q_OBJECT @@ -40,3 +45,5 @@ public slots: void keyPressed(QVariant _event); }; +} +} diff --git a/mix/MixApplication.cpp b/mix/MixApplication.cpp index 0c217dace..ce0f78ccd 100644 --- a/mix/MixApplication.cpp +++ b/mix/MixApplication.cpp @@ -20,26 +20,22 @@ */ #include +#include +#include "CodeEditorExtensionManager.h" #include "MixApplication.h" +#include "AppContext.h" + using namespace dev::mix; -MixApplication::MixApplication(int _argc, char* _argv[]): QApplication(_argc, _argv) +MixApplication::MixApplication(int _argc, char* _argv[]): + QApplication(_argc, _argv), m_engine(new QQmlApplicationEngine()), m_appContext(new AppContext(m_engine.get())) { + qmlRegisterType("CodeEditorExtensionManager", 1, 0, "CodeEditorExtensionManager"); + m_engine->load(QUrl("qrc:/qml/main.qml")); + QObject::connect(this, SIGNAL(lastWindowClosed()), context(), SLOT(quitApplication())); //use to kill ApplicationContext and other stuff + QObject::connect(engine(), SIGNAL(objectCreated(QObject*, QUrl)), context(), SLOT(resourceLoaded(QObject*, QUrl))); } -bool MixApplication::notify(QObject* _receiver, QEvent* _event) +MixApplication::~MixApplication() { - try - { - return MixApplication::notify(_receiver, _event); - } - catch (std::exception& _ex) - { - qDebug() << "std::exception was caught " << _ex.what(); - } - catch (...) - { - qDebug() << "uncaught exception "; - } - return false; } diff --git a/mix/MixApplication.h b/mix/MixApplication.h index 383c5849c..7cb9b512f 100644 --- a/mix/MixApplication.h +++ b/mix/MixApplication.h @@ -23,21 +23,30 @@ #pragma once +#include #include +class QQmlApplicationEngine; + namespace dev { namespace mix { +class AppContext; + class MixApplication: public QApplication { Q_OBJECT public: MixApplication(int _argc, char* _argv[]); - virtual ~MixApplication() {} - virtual bool notify(QObject* _receiver, QEvent* _event); + virtual ~MixApplication(); + AppContext* context() { return m_appContext.get(); } + QQmlApplicationEngine* engine( ) { return m_engine.get(); } +private: + std::unique_ptr m_engine; + std::unique_ptr m_appContext; }; } diff --git a/mix/QBasicNodeDefinition.h b/mix/QBasicNodeDefinition.h index d5a22db30..399a92123 100644 --- a/mix/QBasicNodeDefinition.h +++ b/mix/QBasicNodeDefinition.h @@ -38,11 +38,11 @@ public: QBasicNodeDefinition(): QObject() {} ~QBasicNodeDefinition() { } - QBasicNodeDefinition(dev::solidity::Declaration* _d): QObject(), m_dec(_d) {} - QString name() const { return QString::fromStdString(m_dec->getName()); } + QBasicNodeDefinition(dev::solidity::Declaration const* _d): QObject(), m_name(QString::fromStdString(_d->getName())) {} + QString name() const { return m_name; } protected: - dev::solidity::Declaration* m_dec; + QString m_name; }; } diff --git a/mix/QContractDefinition.cpp b/mix/QContractDefinition.cpp index bf85030f5..fcc265241 100644 --- a/mix/QContractDefinition.cpp +++ b/mix/QContractDefinition.cpp @@ -31,27 +31,13 @@ using namespace dev::solidity; using namespace dev::mix; -std::shared_ptr QContractDefinition::Contract(QString _source) +QContractDefinition::QContractDefinition(dev::solidity::ContractDefinition const* _contract): QBasicNodeDefinition(_contract) { - CompilerStack* comp = AppContext::getInstance()->compiler(); - comp->addSource("contract", _source.toStdString()); - comp->parse(); - SourceUnit const& unit = comp->getAST("contract"); - ContractDefinition* def = (ContractDefinition*)unit.getNodes().at(0).get(); - return std::make_shared(def); -} - -QContractDefinition::QContractDefinition(ContractDefinition* _contract): QBasicNodeDefinition(_contract) -{ - initQFunctions(); -} - -void QContractDefinition::initQFunctions() -{ - std::vector functions = ((ContractDefinition*)m_dec)->getInterfaceFunctions(); + std::vector functions = _contract->getInterfaceFunctions(); for (unsigned i = 0; i < functions.size(); i++) { - FunctionDefinition* func = (FunctionDefinition*)functions.at(i); + FunctionDefinition const* func = functions.at(i); m_functions.append(new QFunctionDefinition(func, i)); } } + diff --git a/mix/QContractDefinition.h b/mix/QContractDefinition.h index 7cc145cf8..d4e2e609f 100644 --- a/mix/QContractDefinition.h +++ b/mix/QContractDefinition.h @@ -34,16 +34,14 @@ namespace mix class QContractDefinition: public QBasicNodeDefinition { Q_OBJECT - Q_PROPERTY(QList functions READ functions) + Q_PROPERTY(QList functions READ functions) public: - QContractDefinition(dev::solidity::ContractDefinition* _contract); - QList functions() const { return m_functions; } - static std::shared_ptr Contract(QString _code); + QContractDefinition(dev::solidity::ContractDefinition const* _contract); + QList functions() const { return m_functions; } private: - QList m_functions; - void initQFunctions(); + QList m_functions; }; } diff --git a/mix/QFunctionDefinition.cpp b/mix/QFunctionDefinition.cpp index 9923e5277..09e4ae89a 100644 --- a/mix/QFunctionDefinition.cpp +++ b/mix/QFunctionDefinition.cpp @@ -25,15 +25,15 @@ using namespace dev::solidity; using namespace dev::mix; -void QFunctionDefinition::initQParameters() +QFunctionDefinition::QFunctionDefinition(dev::solidity::FunctionDefinition const* _f, int _index): QBasicNodeDefinition(_f), m_index(_index) { - std::vector> parameters = ((FunctionDefinition*)m_dec)->getParameterList().getParameters(); + std::vector> parameters = _f->getParameterList().getParameters(); for (unsigned i = 0; i < parameters.size(); i++) { m_parameters.append(new QVariableDeclaration(parameters.at(i).get())); } - std::vector> returnParameters = ((FunctionDefinition*)m_dec)->getReturnParameters(); + std::vector> returnParameters = _f->getReturnParameters(); for (unsigned i = 0; i < returnParameters.size(); i++) { m_returnParameters.append(new QVariableDeclaration(returnParameters.at(i).get())); diff --git a/mix/QFunctionDefinition.h b/mix/QFunctionDefinition.h index 877e1bd53..1cfbbb15f 100644 --- a/mix/QFunctionDefinition.h +++ b/mix/QFunctionDefinition.h @@ -37,7 +37,7 @@ class QFunctionDefinition: public QBasicNodeDefinition Q_PROPERTY(int index READ index) public: - QFunctionDefinition(dev::solidity::FunctionDefinition* _f, int _index): QBasicNodeDefinition(_f), m_index(_index) { initQParameters(); } + QFunctionDefinition(dev::solidity::FunctionDefinition const* _f, int _index); QList parameters() const { return m_parameters; } QList returnParameters() const { return m_returnParameters; } int index() const { return m_index; } @@ -46,7 +46,6 @@ private: QList m_parameters; QList m_returnParameters; int m_index; - void initQParameters(); }; } diff --git a/mix/QVariableDeclaration.h b/mix/QVariableDeclaration.h index 8b7cb52bb..9be2baf66 100644 --- a/mix/QVariableDeclaration.h +++ b/mix/QVariableDeclaration.h @@ -35,8 +35,10 @@ class QVariableDeclaration: public QBasicNodeDefinition Q_PROPERTY(QString type READ type) public: - QVariableDeclaration(dev::solidity::VariableDeclaration* _v): QBasicNodeDefinition(_v){} - QString type() const { return QString::fromStdString(((solidity::VariableDeclaration*)m_dec)->getType()->toString()); } + QVariableDeclaration(dev::solidity::VariableDeclaration const* _v): QBasicNodeDefinition(_v), m_type(QString::fromStdString(_v->getType()->toString())) {} + QString type() const { return m_type; } +private: + QString m_type; }; } diff --git a/mix/QVariableDefinition.h b/mix/QVariableDefinition.h index 907ddd6c1..9ee532cfc 100644 --- a/mix/QVariableDefinition.h +++ b/mix/QVariableDefinition.h @@ -33,16 +33,16 @@ class QVariableDefinition: public QObject { Q_OBJECT Q_PROPERTY(QString value READ value) - Q_PROPERTY(QVariableDeclaration* declaration READ declaration) + Q_PROPERTY(QVariableDeclaration const* declaration READ declaration) public: - QVariableDefinition(QVariableDeclaration* _def, QString _value): QObject(_def->parent()), m_value(_value), m_dec(_def) {} + QVariableDefinition(QVariableDeclaration const* _dec, QString _value): QObject(_dec->parent()), m_dec(_dec), m_value(_value) {} - QVariableDeclaration* declaration() const { return m_dec; } + QVariableDeclaration const* declaration() const { return m_dec; } QString value() const { return m_value; } private: - QVariableDeclaration* m_dec; + QVariableDeclaration const* m_dec; QString m_value; }; diff --git a/mix/TransactionListModel.cpp b/mix/TransactionListModel.cpp index 44474a232..344301edd 100644 --- a/mix/TransactionListModel.cpp +++ b/mix/TransactionListModel.cpp @@ -24,11 +24,13 @@ #include #include #include +#include "libdevcore/CommonJS.h" #include "TransactionListModel.h" #include "QContractDefinition.h" #include "QFunctionDefinition.h" #include "QVariableDeclaration.h" -#include "libdevcore/CommonJS.h" +#include "AppContext.h" +#include "CodeModel.h" namespace dev { @@ -54,8 +56,8 @@ TransactionListItem::TransactionListItem(int _index, TransactionSettings const& m_gas(toQString(_t.gas)), m_gasPrice(toQString(_t.gasPrice)) {} -TransactionListModel::TransactionListModel(QObject* _parent, QTextDocument* _document): - QAbstractListModel(_parent), m_document(_document) +TransactionListModel::TransactionListModel(QObject* _parent, AppContext* _appContext): + QAbstractListModel(_parent), m_appContext(_appContext) {} QHash TransactionListModel::roleNames() const @@ -89,43 +91,34 @@ QVariant TransactionListModel::data(QModelIndex const& _index, int _role) const } ///@todo: get parameters from code model -QList buildParameters(QTextDocument* _document, TransactionSettings const& _transaction, QString const& _functionId) +QList buildParameters(CodeModel* _codeModel, TransactionSettings const& _transaction, QString const& _functionId) { QList params; - try + QContractDefinition const* contract = _codeModel->lastCompilationResult()->contract(); + auto functions = contract->functions(); + for (auto qf : functions) { - QString code = _document->toPlainText().replace("\n", ""); //TODO: is this required? - std::shared_ptr contract = QContractDefinition::Contract(code); - auto functions = contract->functions(); - for (auto qf : functions) - { - QFunctionDefinition const& f = (QFunctionDefinition const&) *qf; - if (f.name() != _functionId) - continue; + QFunctionDefinition const& f = (QFunctionDefinition const&) *qf; + if (f.name() != _functionId) + continue; - auto parameters = f.parameters(); - for (auto qp : parameters) + auto parameters = f.parameters(); + for (auto qp : parameters) + { + QVariableDeclaration const& p = (QVariableDeclaration const&) *qp; + QString paramValue; + if (f.name() == _transaction.functionId) { - QVariableDeclaration const& p = (QVariableDeclaration const&) *qp; - QString paramValue; - if (f.name() == _transaction.functionId) - { - auto paramValueIter = _transaction.parameterValues.find(p.name()); - if (paramValueIter != _transaction.parameterValues.cend()) - paramValue = toQString(paramValueIter->second); - } - - TransactionParameterItem* item = new TransactionParameterItem(p.name(), p.type(), paramValue); - QQmlEngine::setObjectOwnership(item, QQmlEngine::JavaScriptOwnership); - params.append(item); + auto paramValueIter = _transaction.parameterValues.find(p.name()); + if (paramValueIter != _transaction.parameterValues.cend()) + paramValue = toQString(paramValueIter->second); } + + TransactionParameterItem* item = new TransactionParameterItem(p.name(), p.type(), paramValue); + QQmlEngine::setObjectOwnership(item, QQmlEngine::JavaScriptOwnership); + params.append(item); } } - catch (boost::exception const&) - { - //TODO: - } - return params; } @@ -133,19 +126,12 @@ QList buildParameters(QTextDocument* _document, Trans QList TransactionListModel::getFunctions() { QList functionNames; - try - { - QString code = m_document->toPlainText().replace("\n", ""); //TODO: is this required? - std::shared_ptr contract(QContractDefinition::Contract(code)); - auto functions = contract->functions(); - for (auto qf : functions) - { - QFunctionDefinition const& f = (QFunctionDefinition const&) * qf; - functionNames.append(f.name()); - } - } - catch (boost::exception const&) + QContractDefinition const* contract = m_appContext->codeModel()->lastCompilationResult()->contract(); + auto functions = contract->functions(); + for (auto qf : functions) { + QFunctionDefinition const& f = (QFunctionDefinition const&) * qf; + functionNames.append(f.name()); } return functionNames; } @@ -153,7 +139,7 @@ QList TransactionListModel::getFunctions() QVariantList TransactionListModel::getParameters(int _index, QString const& _functionId) { TransactionSettings const& transaction = (_index >= 0 && _index < (int)m_transactions.size()) ? m_transactions[_index] : TransactionSettings(); - auto plist = buildParameters(m_document, transaction, _functionId); + auto plist = buildParameters(m_appContext->codeModel(), transaction, _functionId); QVariantList vl; for (QObject* p : plist) vl.append(QVariant::fromValue(p)); diff --git a/mix/TransactionListModel.h b/mix/TransactionListModel.h index 28800a4ff..9faf7d63f 100644 --- a/mix/TransactionListModel.h +++ b/mix/TransactionListModel.h @@ -30,13 +30,13 @@ #include #include -class QTextDocument; - namespace dev { namespace mix { +class AppContext; + /// Backend transaction config class struct TransactionSettings { @@ -132,7 +132,7 @@ class TransactionListModel: public QAbstractListModel }; public: - TransactionListModel(QObject* _parent, QTextDocument* _document); + TransactionListModel(QObject* _parent, AppContext* _appContext); ~TransactionListModel() {} QHash roleNames() const override; @@ -159,7 +159,7 @@ signals: private: std::vector m_transactions; - QTextDocument* m_document; + AppContext* m_appContext; }; } diff --git a/mix/TransactionListView.cpp b/mix/TransactionListView.cpp index 7e2bfaa25..55df90b8a 100644 --- a/mix/TransactionListView.cpp +++ b/mix/TransactionListView.cpp @@ -29,10 +29,9 @@ #include "TransactionListModel.h" using namespace dev::mix; -TransactionListView::TransactionListView(QTextDocument* _doc): Extension(ExtensionDisplayBehavior::RightTab) +TransactionListView::TransactionListView(AppContext* _context): Extension(_context, ExtensionDisplayBehavior::RightTab) { - m_editor = _doc; - m_model.reset(new TransactionListModel(this, _doc)); + m_model.reset(new TransactionListModel(this, _context)); m_appEngine->rootContext()->setContextProperty("transactionListModel", m_model.get()); } diff --git a/mix/TransactionListView.h b/mix/TransactionListView.h index be1aef905..e21d7ecd8 100644 --- a/mix/TransactionListView.h +++ b/mix/TransactionListView.h @@ -19,6 +19,7 @@ #pragma once +#include #include #include "TransactionListView.h" #include "Extension.h" @@ -37,7 +38,7 @@ class TransactionListView: public Extension Q_OBJECT public: - TransactionListView(QTextDocument*); + TransactionListView(AppContext* _context); ~TransactionListView(); void start() const override; QString title() const override; @@ -46,7 +47,6 @@ public: TransactionListModel* model() const { return m_model.get(); } private: - QTextDocument* m_editor; std::unique_ptr m_model; }; diff --git a/mix/main.cpp b/mix/main.cpp index 36a742f8f..e10903c80 100644 --- a/mix/main.cpp +++ b/mix/main.cpp @@ -20,22 +20,11 @@ * Ethereum IDE client. */ -#include -#include -#include -#include "CodeEditorExtensionManager.h" -#include "AppContext.h" #include "MixApplication.h" using namespace dev::mix; int main(int _argc, char *_argv[]) { - QApplication app(_argc, _argv); - qmlRegisterType("CodeEditorExtensionManager", 1, 0, "CodeEditorExtensionManager"); - QQmlApplicationEngine* engine = new QQmlApplicationEngine(); - AppContext::setApplicationContext(engine); - QObject::connect(&app, SIGNAL(lastWindowClosed()), AppContext::getInstance(), SLOT(quitApplication())); //use to kill ApplicationContext and other stuff - QObject::connect(engine, SIGNAL(objectCreated(QObject*, QUrl)), AppContext::getInstance(), SLOT(resourceLoaded(QObject*, QUrl))); - engine->load(QUrl("qrc:/qml/main.qml")); + MixApplication app(_argc, _argv); return app.exec(); }