diff --git a/CMakeLists.txt b/CMakeLists.txt index 2373eea..477b8ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.14) project(quick-ftxui - LANGUAGES CXX + LANGUAGES C CXX VERSION 0.1.0 ) @@ -9,6 +9,15 @@ set(CMAKE_CXX_STANDARD_REQUIRED 20) set(CMAKE_CXX_STANDARD 20) set(CMAKE_BUILD_TYPE Debug) +# ----------------- Cling stuff ----------------------------------------------- + +set(LLVM_NO_DEAD_STRIP 1) + +find_package(Cling REQUIRED CONFIG) +#if(NOT DEFINED ENV{CLING_DIR}) +# message(FATAL_ERROR "You must set CLING_DIR environment variable") +#endif() + # --- Fetch FTXUI -------------------------------------------------------------- include(FetchContent) @@ -53,6 +62,7 @@ target_include_directories(quick-ftxui PRIVATE include PRIVATE ${Boost_INCLUDE_DIR} PRIVATE ${ftxui_SOURCE_DIR} + PRIVATE ${Cling_DIR}/../../../include ) target_link_libraries(quick-ftxui @@ -60,9 +70,13 @@ target_link_libraries(quick-ftxui PRIVATE ftxui::screen PRIVATE ftxui::dom PRIVATE ftxui::component # Not needed for this example. + PRIVATE clingInterpreter ) -target_compile_options(quick-ftxui PRIVATE -fsanitize=address) +target_compile_options(quick-ftxui + PRIVATE -fsanitize=address + PUBLIC -DLLVM_DIR="${LLVM_INSTALL_PREFIX}" -I${LLVM_INSTALL_PREFIX}/include +) target_link_options(quick-ftxui PRIVATE -fsanitize=address) install(TARGETS quick-ftxui RUNTIME DESTINATION "bin") diff --git a/include/quick-ftxui.hpp b/include/quick-ftxui.hpp index da8ba04..f0dcd5e 100644 --- a/include/quick-ftxui.hpp +++ b/include/quick-ftxui.hpp @@ -16,6 +16,11 @@ #include "ftxui/screen/screen.hpp" #include "ftxui/util/ref.hpp" // for Ref +// Cling +#include +#include +#include + #include #include @@ -111,6 +116,8 @@ void tab(int indent) { struct component_meta_data { ftxui::ScreenInteractive *screen; ftxui::Components components; + cling::Interpreter *interp; + cling::Value *res; }; struct ast_printer { @@ -139,6 +146,10 @@ struct node_printer : boost::static_visitor<> { if (text.func == "Exit") { data->components.push_back(ftxui::Button( text.placeholder, data->screen->ExitLoopClosure())); + } else { + data->interp->process(text.func, data->res); + data->components.push_back(ftxui::Button( + text.placeholder, data->res->getAs>())); } } diff --git a/src/quick-ftxui.cpp b/src/quick-ftxui.cpp index 58842f7..9e77965 100644 --- a/src/quick-ftxui.cpp +++ b/src/quick-ftxui.cpp @@ -43,7 +43,10 @@ int main(int argc, char **argv) { std::cout << "Parsing succeeded\n"; std::cout << source_code << " Parses OK: " << std::endl; auto screen = ftxui::ScreenInteractive::Fullscreen(); - client::quick_ftxui_parser::component_meta_data data{&screen, {}}; + cling::Interpreter interp(0, nullptr, LLVM_DIR); + + client::quick_ftxui_parser::component_meta_data data{ + &screen, {}, &interp, {}}; client::quick_ftxui_parser::ast_printer printer(&data, 0); printer(expression); if (data.components.size()) { @@ -59,4 +62,4 @@ int main(int argc, char **argv) { std::cout << "-------------------------\n"; } return 0; -} \ No newline at end of file +}