This is an automated email from the ASF dual-hosted git repository. jking pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/thrift.git
The following commit(s) were added to refs/heads/master by this push: new 29f7f8f THRIFT-4743: remove cpp compiler plugin support to simplify the project 29f7f8f is described below commit 29f7f8f32f6bf88751e0ef3c8e3f2fba1aac5b8f Author: James E. King III <jk...@apache.org> AuthorDate: Sat Jan 26 09:15:19 2019 -0500 THRIFT-4743: remove cpp compiler plugin support to simplify the project --- .travis.yml | 9 - Makefile.am | 8 - appveyor.yml | 8 +- build/cmake/DefineOptions.cmake | 9 +- build/cmake/DefinePlatformSpecifc.cmake | 8 - compiler/cpp/CMakeLists.txt | 94 +---- compiler/cpp/Makefile.am | 131 ++---- compiler/cpp/README.md | 4 +- compiler/cpp/src/Makefile.am | 48 --- compiler/cpp/src/thrift/common.cc | 4 - compiler/cpp/src/thrift/logging.cc | 5 - compiler/cpp/src/thrift/main.cc | 21 - compiler/cpp/src/thrift/parse/t_const_value.h | 9 - compiler/cpp/src/thrift/parse/t_scope.h | 9 - compiler/cpp/src/thrift/plugin/Makefile.am | 47 --- compiler/cpp/src/thrift/plugin/plugin.cc | 511 ------------------------ compiler/cpp/src/thrift/plugin/plugin.h | 44 -- compiler/cpp/src/thrift/plugin/plugin.thrift | 207 ---------- compiler/cpp/src/thrift/plugin/plugin_output.cc | 455 --------------------- compiler/cpp/src/thrift/plugin/plugin_output.h | 38 -- compiler/cpp/src/thrift/plugin/type_util.h | 95 ----- compiler/cpp/test/CMakeLists.txt | 46 +-- compiler/cpp/test/Makefile.am | 32 -- compiler/cpp/test/cpp_plugin_test.cmake | 45 --- compiler/cpp/test/cpp_plugin_test.sh | 27 -- compiler/cpp/test/plugin/conversion_test.cc | 498 ----------------------- compiler/cpp/test/plugin/cpp_plugin.cc | 43 -- compiler/cpp/test/plugin_stability_test.sh | 32 -- configure.ac | 16 - lib/Makefile.am | 3 - lib/cpp/Makefile.am | 4 - 31 files changed, 36 insertions(+), 2474 deletions(-) diff --git a/.travis.yml b/.travis.yml index aecdd13..4a399a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -130,15 +130,6 @@ jobs: - JOB="CMake" - BUILD_ARG="-DCMAKE_BUILD_TYPE=Release" - # C++ specific options: compiler plug-in, threading model - - script: build/docker/run.sh - env: - - JOB="C++ (Std Thread) and Plugin" - - SCRIPT="cmake.sh" - - BUILD_LIBS="CPP TESTING TUTORIALS" - - BUILD_ARG="-DWITH_PLUGIN=ON -DWITH_PYTHON=OFF -DWITH_C_GLIB=OFF -DWITH_JAVA=OFF -DWITH_HASKELL=OFF" - - BUILD_ENV="-e CC=clang -e CXX=clang++" - # ------------------------- phase: dist ------------------------- - script: build/docker/run.sh env: diff --git a/Makefile.am b/Makefile.am index 104d370..1f2d483 100755 --- a/Makefile.am +++ b/Makefile.am @@ -19,15 +19,7 @@ ACLOCAL_AMFLAGS = -I ./aclocal -if WITH_PLUGIN -# To enable bootstrap, build order is lib/cpp -> compiler -> others -SUBDIRS = lib/cpp compiler/cpp lib -if WITH_TESTS -SUBDIRS += lib/cpp/test -endif -else SUBDIRS = compiler/cpp lib -endif if WITH_TESTS SUBDIRS += test diff --git a/appveyor.yml b/appveyor.yml index 6cbabf1..2dee45f 100755 --- a/appveyor.yml +++ b/appveyor.yml @@ -45,7 +45,7 @@ environment: PYTHON_VERSION: 3.6 QT_VERSION: 5.10 ZLIB_VERSION: 1.2.11 - DISABLED_TESTS: StressTestNonBlocking + DISABLED_TESTS: (concurrency_test|StressTestNonBlocking) - PROFILE: MSVC2015 PLATFORM: x86 @@ -56,18 +56,18 @@ environment: PYTHON_VERSION: 3.5 QT_VERSION: 5.8 ZLIB_VERSION: 1.2.8 - DISABLED_TESTS: StressTestNonBlocking + DISABLED_TESTS: (concurrency_test|StressTestNonBlocking) APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - PROFILE: MINGW PLATFORM: x64 CONFIGURATION: RelWithDebInfo - DISABLED_TESTS: StressTestNonBlocking + DISABLED_TESTS: (concurrency_test|StressTestNonBlocking) - PROFILE: CYGWIN PLATFORM: x64 CONFIGURATION: RelWithDebInfo - DISABLED_TESTS: (ZlibTest|OpenSSLManualInitTest|TNonblockingServerTest|StressTestNonBlocking) + DISABLED_TESTS: (concurrency_test|ZlibTest|OpenSSLManualInitTest|TNonblockingServerTest|StressTestNonBlocking) install: - cd %APPVEYOR_BUILD_FOLDER% diff --git a/build/cmake/DefineOptions.cmake b/build/cmake/DefineOptions.cmake index 2c8ea50..eea0b29 100644 --- a/build/cmake/DefineOptions.cmake +++ b/build/cmake/DefineOptions.cmake @@ -79,8 +79,6 @@ if(WITH_CPP) endif() CMAKE_DEPENDENT_OPTION(BUILD_CPP "Build C++ library" ON "BUILD_LIBRARIES;WITH_CPP" OFF) -CMAKE_DEPENDENT_OPTION(WITH_PLUGIN "Build compiler plugin support" OFF - "BUILD_COMPILER;BUILD_CPP" OFF) # C GLib option(WITH_C_GLIB "Build C (GLib) Thrift library" ON) @@ -149,14 +147,13 @@ message(STATUS "----------------------------------------------------------") message(STATUS "Thrift version: ${thrift_VERSION} (${thrift_VERSION_MAJOR}.${thrift_VERSION_MINOR}.${thrift_VERSION_PATCH})") message(STATUS "Thrift package version: ${PACKAGE_VERSION}") message(STATUS "Build configuration Summary") -if (UNIX) - message(STATUS " Build type: ${CMAKE_BUILD_TYPE}") -endif () message(STATUS " Build compiler: ${BUILD_COMPILER}") -message(STATUS " Build compiler plugin support: ${WITH_PLUGIN}") message(STATUS " Build libraries: ${BUILD_LIBRARIES}") message(STATUS " Build tests: ${BUILD_TESTING}") MESSAGE_DEP(HAVE_COMPILER "Disabled because BUILD_THRIFT=OFF and no valid THRIFT_COMPILER is given") +if (UNIX) + message(STATUS " Build type: ${CMAKE_BUILD_TYPE}") +endif () message(STATUS " Language libraries:") message(STATUS " Build as3 library: ${BUILD_AS3}") MESSAGE_DEP(WITH_AS3 "Disabled by WITH_AS3=OFF") diff --git a/build/cmake/DefinePlatformSpecifc.cmake b/build/cmake/DefinePlatformSpecifc.cmake index 298780c..b87fd65 100644 --- a/build/cmake/DefinePlatformSpecifc.cmake +++ b/build/cmake/DefinePlatformSpecifc.cmake @@ -94,11 +94,3 @@ endif() if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-register") endif() - -# Building WITH_PLUGIN requires boost memory operations, for now, and gcc >= 4.8 -if (WITH_PLUGIN) - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8") - message(SEND_ERROR "Thrift compiler plug-in support is not possible with older gcc ( < 4.8 ) compiler") - endif() -endif() - diff --git a/compiler/cpp/CMakeLists.txt b/compiler/cpp/CMakeLists.txt index 372cbab..6f7ae5d 100644 --- a/compiler/cpp/CMakeLists.txt +++ b/compiler/cpp/CMakeLists.txt @@ -106,51 +106,10 @@ THRIFT_ADD_COMPILER(xsd "Enable compiler for XSD" ON) # we also add the current binary directory for generated files include_directories(${CMAKE_CURRENT_BINARY_DIR} src) -if(NOT DEFINED WITH_PLUGIN OR NOT ${WITH_PLUGIN}) - list(APPEND thrift-compiler_SOURCES ${compiler_core}) -endif() +list(APPEND thrift-compiler_SOURCES ${compiler_core}) add_executable(thrift-compiler ${thrift-compiler_SOURCES}) -if(${WITH_PLUGIN}) - add_executable(thrift-bootstrap ${compiler_core} - src/thrift/main.cc - src/thrift/audit/t_audit.cpp - src/thrift/generate/t_cpp_generator.cc - ) - target_link_libraries(thrift-bootstrap parse) - - set(PLUGIN_GEN_SOURCES - ${CMAKE_CURRENT_BINARY_DIR}/thrift/plugin/plugin_types.h - ${CMAKE_CURRENT_BINARY_DIR}/thrift/plugin/plugin_types.cpp - ${CMAKE_CURRENT_BINARY_DIR}/thrift/plugin/plugin_constants.h - ${CMAKE_CURRENT_BINARY_DIR}/thrift/plugin/plugin_constants.cpp - ) - - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/thrift/plugin) - add_custom_command(OUTPUT ${PLUGIN_GEN_SOURCES} - DEPENDS thrift-bootstrap src/thrift/plugin/plugin.thrift - COMMAND thrift-bootstrap -gen cpp - -out ${CMAKE_CURRENT_BINARY_DIR}/thrift/plugin - ${CMAKE_CURRENT_SOURCE_DIR}/src/thrift/plugin/plugin.thrift - ) - - include_directories(../../lib/cpp/src) - - include(ThriftMacros) - ADD_LIBRARY_THRIFT(thriftc - ${compiler_core} - ${PLUGIN_GEN_SOURCES} - src/thrift/logging.cc - src/thrift/plugin/plugin_output.cc - src/thrift/plugin/plugin.cc - ) - TARGET_INCLUDE_DIRECTORIES_THRIFT(thriftc PUBLIC ${Boost_INCLUDE_DIRS}) - TARGET_LINK_LIBRARIES_THRIFT_AGAINST_THRIFT_LIBRARY(thriftc thrift PUBLIC) - target_compile_definitions(thrift-compiler PUBLIC THRIFT_ENABLE_PLUGIN) - LINK_AGAINST_THRIFT_LIBRARY(thrift-compiler thriftc) -endif() - set_target_properties(thrift-compiler PROPERTIES RUNTIME_OUTPUT_DIRECTORY bin/) set_target_properties(thrift-compiler PROPERTIES OUTPUT_NAME thrift) @@ -158,57 +117,6 @@ target_link_libraries(thrift-compiler parse) install(TARGETS thrift-compiler DESTINATION bin) -if(${WITH_PLUGIN}) - # Install the headers - install(FILES - "src/thrift/common.h" - "src/thrift/globals.h" - "src/thrift/logging.h" - "src/thrift/main.h" - "src/thrift/platform.h" - "${CMAKE_BINARY_DIR}/compiler/cpp/thrift/version.h" - DESTINATION "${INCLUDE_INSTALL_DIR}/thrift") - install(FILES - "src/thrift/audit/t_audit.h" - DESTINATION "${INCLUDE_INSTALL_DIR}/thrift/audit") - install(FILES - "src/thrift/generate/t_generator.h" - "src/thrift/generate/t_generator_registry.h" - "src/thrift/generate/t_html_generator.h" - "src/thrift/generate/t_oop_generator.h" - DESTINATION "${INCLUDE_INSTALL_DIR}/thrift/generate") - install(FILES - "src/thrift/parse/t_base_type.h" - "src/thrift/parse/t_const.h" - "src/thrift/parse/t_const_value.h" - "src/thrift/parse/t_container.h" - "src/thrift/parse/t_doc.h" - "src/thrift/parse/t_enum.h" - "src/thrift/parse/t_enum_value.h" - "src/thrift/parse/t_field.h" - "src/thrift/parse/t_function.h" - "src/thrift/parse/t_list.h" - "src/thrift/parse/t_map.h" - "src/thrift/parse/t_program.h" - "src/thrift/parse/t_scope.h" - "src/thrift/parse/t_service.h" - "src/thrift/parse/t_set.h" - "src/thrift/parse/t_struct.h" - "src/thrift/parse/t_typedef.h" - "src/thrift/parse/t_type.h" - DESTINATION "${INCLUDE_INSTALL_DIR}/thrift/parse") - install(FILES - "src/thrift/plugin/plugin.h" - "src/thrift/plugin/plugin_output.h" - "src/thrift/plugin/type_util.h" - DESTINATION "${INCLUDE_INSTALL_DIR}/thrift/plugin") -if(MSVC) - install(FILES - "src/thrift/windows/config.h" - DESTINATION "${INCLUDE_INSTALL_DIR}/thrift/windows") -endif() -endif() - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/compiler/cpp/Makefile.am b/compiler/cpp/Makefile.am index 087f6bd..9b5742f 100644 --- a/compiler/cpp/Makefile.am +++ b/compiler/cpp/Makefile.am @@ -23,12 +23,7 @@ AUTOMAKE_OPTIONS = subdir-objects -# Note on why we have src/thrift and src/thrift/plugin directories: -# Since Automake supports only one set of BUILT_SOURCES per file and does not allow -# SUBDIRS built before BUILT_SOURCES, we end up separate Makefile.am for each source -# code generation, i.e. lex-yacc and Thrift, to achieve stable parallel make. - -SUBDIRS = src src/thrift/plugin . +SUBDIRS = src . if WITH_TESTS SUBDIRS += test endif @@ -37,46 +32,40 @@ bin_PROGRAMS = thrift thrift_OBJDIR = obj -plugin_gen = src/thrift/plugin/plugin_types.h \ - src/thrift/plugin/plugin_types.cpp \ - src/thrift/plugin/plugin_constants.h \ - src/thrift/plugin/plugin_constants.cpp - -compiler_core = src/thrift/common.h \ +thrift_SOURCES = src/thrift/audit/t_audit.cpp \ + src/thrift/audit/t_audit.h \ src/thrift/common.cc \ + src/thrift/common.h \ src/thrift/generate/t_generator.cc \ + src/thrift/generate/t_generator.h \ src/thrift/generate/t_generator_registry.h \ + src/thrift/generate/t_html_generator.h \ + src/thrift/generate/t_oop_generator.h \ src/thrift/globals.h \ - src/thrift/platform.h \ src/thrift/logging.h \ - src/thrift/parse/t_doc.h \ - src/thrift/parse/t_type.h \ + src/thrift/main.cc \ + src/thrift/main.h \ + src/thrift/parse/parse.cc \ src/thrift/parse/t_base_type.h \ + src/thrift/parse/t_const.h \ + src/thrift/parse/t_const_value.h \ + src/thrift/parse/t_container.h \ + src/thrift/parse/t_doc.h \ src/thrift/parse/t_enum.h \ src/thrift/parse/t_enum_value.h \ - src/thrift/parse/t_typedef.h \ - src/thrift/parse/t_typedef.cc \ - src/thrift/parse/t_container.h \ - src/thrift/parse/t_list.h \ - src/thrift/parse/t_set.h \ - src/thrift/parse/t_map.h \ - src/thrift/parse/t_struct.h \ src/thrift/parse/t_field.h \ - src/thrift/parse/t_service.h \ src/thrift/parse/t_function.h \ + src/thrift/parse/t_list.h \ + src/thrift/parse/t_map.h \ src/thrift/parse/t_program.h \ src/thrift/parse/t_scope.h \ - src/thrift/parse/t_const.h \ - src/thrift/parse/t_const_value.h \ - src/thrift/parse/parse.cc \ - src/thrift/generate/t_generator.h \ - src/thrift/generate/t_oop_generator.h \ - src/thrift/generate/t_html_generator.h - -thrift_SOURCES = src/thrift/main.h \ - src/thrift/main.cc \ - src/thrift/audit/t_audit.cpp \ - src/thrift/audit/t_audit.h + src/thrift/parse/t_service.h \ + src/thrift/parse/t_set.h \ + src/thrift/parse/t_struct.h \ + src/thrift/parse/t_type.h \ + src/thrift/parse/t_typedef.cc \ + src/thrift/parse/t_typedef.h \ + src/thrift/platform.h # Specific client generator source thrift_SOURCES += src/thrift/generate/t_as3_generator.cc \ @@ -115,76 +104,6 @@ thrift_CPPFLAGS = -I$(srcdir)/src thrift_CXXFLAGS = -Wall -Wextra -pedantic -Werror thrift_LDADD = @LEXLIB@ src/thrift/libparse.a -if !WITH_PLUGIN -thrift_SOURCES += $(compiler_core) -else - -lib_LTLIBRARIES = libthriftc.la - -thrift_CPPFLAGS += -DTHRIFT_ENABLE_PLUGIN=1 -thrift_LDADD += libthriftc.la - -nodist_libthriftc_la_SOURCES = $(plugin_gen) -libthriftc_la_SOURCES = $(compiler_core) \ - src/thrift/plugin/type_util.h \ - src/thrift/plugin/plugin.h \ - src/thrift/plugin/plugin.cc \ - src/thrift/plugin/plugin_output.h \ - src/thrift/plugin/plugin_output.cc \ - src/thrift/plugin/plugin.thrift \ - src/thrift/logging.cc - - -libthriftc_la_CPPFLAGS = -I$(srcdir)/src -Isrc -I$(top_builddir)/lib/cpp/src -DTHRIFT_ENABLE_PLUGIN=1 -libthriftc_la_CXXFLAGS = -Wall -Wextra -pedantic -libthriftc_la_LIBADD = $(top_builddir)/lib/cpp/libthrift.la - -include_thriftdir = $(includedir)/thrift -include_thrift_HEADERS = src/thrift/common.h \ - src/thrift/globals.h \ - src/thrift/logging.h \ - src/thrift/main.h \ - src/thrift/platform.h \ - src/thrift/version.h - -include_auditdir = $(include_thriftdir)/windows -include_audit_HEADERS = src/thrift/audit/t_audit.h - -include_generatedir = $(include_thriftdir)/generate -include_generate_HEADERS = src/thrift/generate/t_generator.h \ - src/thrift/generate/t_generator_registry.h \ - src/thrift/generate/t_oop_generator.h \ - src/thrift/generate/t_html_generator.h - -include_parsedir = $(include_thriftdir)/parse -include_parse_HEADERS = src/thrift/parse/t_service.h \ - src/thrift/parse/t_program.h \ - src/thrift/parse/t_field.h \ - src/thrift/parse/t_scope.h \ - src/thrift/parse/t_typedef.h \ - src/thrift/parse/t_set.h \ - src/thrift/parse/t_const_value.h \ - src/thrift/parse/t_enum_value.h \ - src/thrift/parse/t_const.h \ - src/thrift/parse/t_list.h \ - src/thrift/parse/t_map.h \ - src/thrift/parse/t_container.h \ - src/thrift/parse/t_base_type.h \ - src/thrift/parse/t_enum.h \ - src/thrift/parse/t_function.h \ - src/thrift/parse/t_type.h \ - src/thrift/parse/t_doc.h \ - src/thrift/parse/t_struct.h - -include_plugindir = $(include_thriftdir)/plugin -include_plugin_HEADERS = src/thrift/plugin/plugin.h \ - src/thrift/plugin/type_util.h \ - src/thrift/plugin/plugin_output.h - -include_windowsdir = $(include_thriftdir)/windows -include_windows_HEADERS = src/thrift/windows/config.h -endif - WINDOWS_DIST = \ compiler.sln \ compiler.vcxproj \ @@ -198,9 +117,9 @@ EXTRA_DIST = \ $(WINDOWS_DIST) clean-local: - $(RM) version.h $(plugin_gen) + $(RM) version.h src/thrift/main.cc: src/thrift/version.h style-local: - $(CPPSTYLE_CMD) + $(CPPSTYLE_CMD) diff --git a/compiler/cpp/README.md b/compiler/cpp/README.md index 3551912..5c04cd8 100644 --- a/compiler/cpp/README.md +++ b/compiler/cpp/README.md @@ -67,7 +67,7 @@ brew install bison ``` mkdir cmake-build && cd cmake-build -cmake -G "Xcode" -DWITH_PLUGIN=OFF .. +cmake -G "Xcode" .. cmake --build . ``` @@ -107,7 +107,7 @@ cmake --build . ``` mkdir cmake-vs cd cmake-vs -cmake -G "Visual Studio 15 2017" -DWITH_PLUGIN=OFF .. +cmake -G "Visual Studio 15 2017" .. ``` - Now open the folder cmake-vs using Visual Studio. diff --git a/compiler/cpp/src/Makefile.am b/compiler/cpp/src/Makefile.am index bc2c5cb..b3139e2 100644 --- a/compiler/cpp/src/Makefile.am +++ b/compiler/cpp/src/Makefile.am @@ -37,51 +37,3 @@ thrift_libparse_a_SOURCES = thrift/thrifty.yy \ clean-local: $(RM) thrift/thriftl.cc thrift/thrifty.cc thrift/thrifty.h thrift/thrifty.hh - -if WITH_PLUGIN -noinst_PROGRAMS = thrift/thrift-bootstrap - -thrift_thrift_bootstrap_SOURCES = \ - thrift/common.h \ - thrift/common.cc \ - thrift/audit/t_audit.h \ - thrift/audit/t_audit.cpp \ - thrift/generate/t_generator.cc \ - thrift/generate/t_generator_registry.h \ - thrift/globals.h \ - thrift/platform.h \ - thrift/logging.h \ - thrift/parse/t_doc.h \ - thrift/parse/t_type.h \ - thrift/parse/t_base_type.h \ - thrift/parse/t_enum.h \ - thrift/parse/t_enum_value.h \ - thrift/parse/t_typedef.h \ - thrift/parse/t_typedef.cc \ - thrift/parse/t_container.h \ - thrift/parse/t_list.h \ - thrift/parse/t_set.h \ - thrift/parse/t_map.h \ - thrift/parse/t_struct.h \ - thrift/parse/t_field.h \ - thrift/parse/t_service.h \ - thrift/parse/t_function.h \ - thrift/parse/t_program.h \ - thrift/parse/t_scope.h \ - thrift/parse/t_const.h \ - thrift/parse/t_const_value.h \ - thrift/parse/parse.cc \ - thrift/generate/t_generator.h \ - thrift/generate/t_oop_generator.h \ - thrift/generate/t_html_generator.h \ - thrift/windows/config.h \ - thrift/version.h \ - thrift/generate/t_cpp_generator.cc \ - thrift/main.h \ - thrift/main.cc - -main.cc: version.h - -thrift_thrift_bootstrap_CXXFLAGS = -Wall -Wextra -pedantic -thrift_thrift_bootstrap_LDADD = @LEXLIB@ thrift/libparse.a -endif diff --git a/compiler/cpp/src/thrift/common.cc b/compiler/cpp/src/thrift/common.cc index 3a2b9d3..fb1832d 100644 --- a/compiler/cpp/src/thrift/common.cc +++ b/compiler/cpp/src/thrift/common.cc @@ -58,10 +58,6 @@ void clearGlobals() { } /** - * Those are not really needed for plugins but causes link errors without - */ - -/** * The location of the last parsed doctext comment. */ int g_doctext_lineno; diff --git a/compiler/cpp/src/thrift/logging.cc b/compiler/cpp/src/thrift/logging.cc index f821f5f..4811c4e 100644 --- a/compiler/cpp/src/thrift/logging.cc +++ b/compiler/cpp/src/thrift/logging.cc @@ -17,17 +17,12 @@ * under the License. */ -/** - * Logging functions copied from main.cc to avoid link errors for plugins - */ - #include "thrift/logging.h" #include "thrift/globals.h" #include <cstdarg> #include <cstdio> #include <cstdlib> -// TODO: make plugins accept log options from main compiler int g_debug = 0; int g_warn = 1; int g_verbose = 0; diff --git a/compiler/cpp/src/thrift/main.cc b/compiler/cpp/src/thrift/main.cc index eddbd56..adcab83 100644 --- a/compiler/cpp/src/thrift/main.cc +++ b/compiler/cpp/src/thrift/main.cc @@ -53,9 +53,6 @@ #include "thrift/parse/t_scope.h" #include "thrift/generate/t_generator.h" #include "thrift/audit/t_audit.h" -#ifdef THRIFT_ENABLE_PLUGIN -#include "thrift/plugin/plugin_output.h" -#endif #include "thrift/version.h" @@ -1007,26 +1004,8 @@ void generate(t_program* program, const vector<string>& generator_strings) { t_generator* generator = t_generator_registry::get_generator(program, *iter); if (generator == NULL) { -#ifdef THRIFT_ENABLE_PLUGIN - switch (plugin_output::delegateToPlugin(program, *iter)) { - case plugin_output::PLUGIN_NOT_FOUND: - pwarning(1, "Unable to get a generator for \"%s\".\n", iter->c_str()); - g_generator_failure = true; - break; - case plugin_output::PLUGIN_FAILURE: - pwarning(1, "Plugin generator for \"%s\" failed.\n", iter->c_str()); - g_generator_failure = true; - break; - case plugin_output::PLUGIN_SUCCEESS: - break; - default: - assert(false); - break; - } -#else pwarning(1, "Unable to get a generator for \"%s\".\n", iter->c_str()); g_generator_failure = true; -#endif } else if (generator) { generator->validate_input(); pverbose("Generating \"%s\"\n", iter->c_str()); diff --git a/compiler/cpp/src/thrift/parse/t_const_value.h b/compiler/cpp/src/thrift/parse/t_const_value.h index 6a114cf..e5ecc1d 100644 --- a/compiler/cpp/src/thrift/parse/t_const_value.h +++ b/compiler/cpp/src/thrift/parse/t_const_value.h @@ -26,11 +26,6 @@ #include <vector> #include <string> -namespace plugin_output { -template <typename From, typename To> -void convert(From*, To&); -} - /** * A const value is something parsed that could be a map, set, list, struct * or whatever. @@ -204,10 +199,6 @@ private: t_enum* enum_; t_const_value_type valType_; - - // to read enum_ - template <typename From, typename To> - friend void plugin_output::convert(From*, To&); }; #endif diff --git a/compiler/cpp/src/thrift/parse/t_scope.h b/compiler/cpp/src/thrift/parse/t_scope.h index 6f160a5..137af88 100644 --- a/compiler/cpp/src/thrift/parse/t_scope.h +++ b/compiler/cpp/src/thrift/parse/t_scope.h @@ -33,11 +33,6 @@ #include "thrift/parse/t_list.h" #include "thrift/parse/t_set.h" -namespace plugin_output { -template <typename From, typename To> -void convert(From*, To&); -} - /** * This represents a variable scope used for looking up predefined types and * services. Typically, a scope is associated with a t_program. Scopes are not @@ -179,10 +174,6 @@ private: // Map of names to services std::map<std::string, t_service*> services_; - - // to list map entries - template <typename From, typename To> - friend void plugin_output::convert(From*, To&); }; #endif diff --git a/compiler/cpp/src/thrift/plugin/Makefile.am b/compiler/cpp/src/thrift/plugin/Makefile.am deleted file mode 100644 index e84cdbd..0000000 --- a/compiler/cpp/src/thrift/plugin/Makefile.am +++ /dev/null @@ -1,47 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# -# Contains some contributions under the Thrift Software License. -# Please see doc/old-thrift-license.txt in the Thrift distribution for -# details. - -AUTOMAKE_OPTIONS = subdir-objects - -if WITH_PLUGIN -plugin_gen = plugin_types.h \ - plugin_types.cpp \ - plugin_constants.h \ - plugin_constants.cpp - -BUILT_SOURCES = $(plugin_gen) -gen.stamp: plugin.thrift $(top_builddir)/compiler/cpp/src/thrift/thrift-bootstrap - @$(RM) -f gen.tmp - @touch gen.tmp - $(top_builddir)/compiler/cpp/src/thrift/thrift-bootstrap -gen cpp -out . $< - @mv -f gen.tmp $@ - -$(plugin_gen): gen.stamp - @if test -f $@; then :; else \ - $(RM) -f gen.stamp; \ - $(MAKE) $(AM_MAKEFLAGS) gen.stamp; \ - fi - -clean-local: - $(RM) version.h windows/version.h $(plugin_gen) -endif diff --git a/compiler/cpp/src/thrift/plugin/plugin.cc b/compiler/cpp/src/thrift/plugin/plugin.cc deleted file mode 100644 index 7c4c432..0000000 --- a/compiler/cpp/src/thrift/plugin/plugin.cc +++ /dev/null @@ -1,511 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#include "thrift/plugin/plugin.h" - -#ifdef _WIN32 -#include <fcntl.h> -#include <io.h> -#endif - -#include <cassert> -#include <functional> -#include <iostream> -#include <memory> - -#include <boost/range/adaptor/map.hpp> -#include <boost/range/algorithm/for_each.hpp> - -#include "thrift/generate/t_generator.h" -#include "thrift/plugin/type_util.h" -#include "thrift/protocol/TBinaryProtocol.h" -#include "thrift/transport/TBufferTransports.h" -#include "thrift/transport/TFDTransport.h" -#include "thrift/plugin/plugin_types.h" - -namespace apache { -namespace thrift { -namespace plugin { - -using apache::thrift::protocol::TBinaryProtocol; -using apache::thrift::transport::TFDTransport; -using apache::thrift::transport::TFramedTransport; - -#define THRIFT_CONVERT_FORWARD(from_type) \ - template <> \ - typename ToType<from_type>::type* convert_forward<from_type>(const from_type& from) - -#define THRIFT_CONVERT_COMPLETE_DECL(from_type) \ - template <> \ - void convert(const from_type& from, ToType<from_type>::type* to) - -#define THRIFT_CONVERT_UNARY_DECL(from_type) \ - template <> \ - typename ToType<from_type>::type* convert<from_type>(const from_type& from) - -#define THRIFT_CONVERSION_DECL(from_type) \ - THRIFT_CONVERT_FORWARD(from_type); \ - THRIFT_CONVERT_COMPLETE_DECL(from_type); \ - THRIFT_CONVERT_UNARY_DECL(from_type) - -#define THRIFT_CONVERT_COMPLETE(from_type) \ - THRIFT_CONVERSION_DECL(from_type) { \ - ToType<from_type>::type* to = convert_forward(from); \ - convert(from, to); \ - return to; \ - } \ - THRIFT_CONVERT_COMPLETE_DECL(from_type) - -#define THRIFT_CONVERSION(from_type, ...) \ - THRIFT_CONVERT_FORWARD(from_type) { \ - (void)from; \ - return new ToType<from_type>::type(__VA_ARGS__); \ - } \ - THRIFT_CONVERT_COMPLETE(from_type) - -#define THRIFT_ASSIGN_DOC() \ - do { \ - if (from.__isset.doc) \ - to->set_doc(from.doc); \ - } while (0) - -#define THRIFT_ASSIGN_ANNOTATIONS() \ - THRIFT_ASSIGN_DOC(); \ - do { \ - if (from.__isset.annotations) \ - to->annotations_ = from.annotations; \ - } while (0) - -#define THRIFT_ASSIGN_METADATA() \ - do { \ - to->set_name(from.metadata.name); \ - if (from.metadata.__isset.doc) \ - to->set_doc(from.metadata.doc); \ - if (from.metadata.__isset.annotations) \ - to->annotations_ = from.metadata.annotations; \ - } while (0) - -::t_program* g_program = 0; - -template <typename C, typename S> -struct TypeCache { - C* operator[](const int64_t& k) { - typename std::map<int64_t, C*>::iterator it = cache.find(k); - if (it != cache.end()) { - return it->second; - } else { - typename std::map<int64_t, S>::const_iterator cit = source->find(k); - if (cit == source->end()) { - throw ThriftPluginError("Type not found"); - } - return (cache)[k] = convert_forward(cit->second); - } - } - - void compileAll() { - boost::for_each(*source | boost::adaptors::map_keys, - std::bind(&TypeCache::compile, this, std::placeholders::_1)); - } - - std::map<int64_t, S> const* source; - - void clear() { - source = nullptr ; - cache.clear() ; - } - -protected: - std::map<int64_t, C*> cache; - -private: - void compile(const int64_t& k) { - typename std::map<int64_t, S>::const_iterator cit = source->find(k); - if (cit == source->end()) { - throw ThriftPluginError("Type not found "); - } - convert(cit->second, (*this)[k]); - } -}; -std::map<int64_t, ::t_program*> g_program_cache; -TypeCache< ::t_type, t_type> g_type_cache; -TypeCache< ::t_const, t_const> g_const_cache; -TypeCache< ::t_service, t_service> g_service_cache; - -void clear_global_cache() { - g_type_cache.clear(); - g_const_cache.clear(); - g_service_cache.clear(); -} - -void set_global_cache(const TypeRegistry& from) { - g_type_cache.source = &from.types; - g_const_cache.source = &from.constants; - g_service_cache.source = &from.services; - - g_type_cache.compileAll(); - g_const_cache.compileAll(); - g_service_cache.compileAll(); -} - -template <typename T> -T* resolve_type(int64_t name) { - return reinterpret_cast<T*>(g_type_cache[name]); -} - -::t_const* resolve_const(int64_t name) { - return g_const_cache[name]; -} - -::t_service* resolve_service(int64_t name) { - return g_service_cache[name]; -} - -THRIFT_CONVERT_FORWARD(t_base_type) { -#define T_BASETYPE_CASE(type) \ - case t_base::TYPE_##type: \ - t = ::t_base_type::TYPE_##type; \ - break - - ::t_base_type::t_base t = ::t_base_type::TYPE_VOID; - bool is_binary = false; - switch (from.value) { - T_BASETYPE_CASE(VOID); - T_BASETYPE_CASE(STRING); - T_BASETYPE_CASE(BOOL); - T_BASETYPE_CASE(I8); - T_BASETYPE_CASE(I16); - T_BASETYPE_CASE(I32); - T_BASETYPE_CASE(I64); - T_BASETYPE_CASE(DOUBLE); - case t_base::TYPE_BINARY: - t = ::t_base_type::TYPE_STRING; - is_binary = true; - break; - } - ::t_base_type* to = new ::t_base_type(from.metadata.name, t); - to->set_binary(is_binary); - return to; -#undef T_BASETYPE_CASE -} -THRIFT_CONVERT_COMPLETE(t_base_type) { - THRIFT_ASSIGN_METADATA(); -} - -THRIFT_CONVERT_FORWARD(t_typedef) { - ::t_typedef* to; - if (from.forward) { - to = new ::t_typedef(g_program_cache[from.metadata.program_id], from.symbolic, true); - } else { - to = new ::t_typedef(g_program_cache[from.metadata.program_id], - resolve_type< ::t_type>(from.type), from.symbolic); - } - return to; -} -THRIFT_CONVERT_COMPLETE(t_typedef) { - THRIFT_ASSIGN_METADATA(); -} -THRIFT_CONVERSION(t_enum_value, from.name, from.value) { - assert(to); - THRIFT_ASSIGN_ANNOTATIONS(); -} -THRIFT_CONVERSION(t_enum, g_program_cache[from.metadata.program_id]) { - assert(to); - THRIFT_ASSIGN_METADATA(); - boost::for_each(from.constants | boost::adaptors::transformed(convert<t_enum_value>), - std::bind(&::t_enum::append, to, std::placeholders::_1)); -} -THRIFT_CONVERSION(t_list, resolve_type< ::t_type>(from.elem_type)) { - assert(to); - THRIFT_ASSIGN_METADATA(); - if (from.__isset.cpp_name) - to->set_cpp_name(from.cpp_name); -} -THRIFT_CONVERSION(t_set, resolve_type< ::t_type>(from.elem_type)) { - assert(to); - THRIFT_ASSIGN_METADATA(); - if (from.__isset.cpp_name) - to->set_cpp_name(from.cpp_name); -} -THRIFT_CONVERSION(t_map, - resolve_type< ::t_type>(from.key_type), - resolve_type< ::t_type>(from.val_type)) { - assert(to); - THRIFT_ASSIGN_METADATA(); - if (from.__isset.cpp_name) - to->set_cpp_name(from.cpp_name); -} -THRIFT_CONVERSION(t_const_value, ) { -#define T_CONST_VALUE_CASE(type) \ - if (from.__isset.type##_val) \ - to->set_##type(from.type##_val) - - assert(to); - if (from.__isset.map_val) { - to->set_map(); - for (std::map<t_const_value, t_const_value>::const_iterator it = from.map_val.begin(); - it != from.map_val.end(); it++) { - to->add_map(convert(it->first), convert(it->second)); - } - } else if (from.__isset.list_val) { - to->set_list(); - boost::for_each(from.list_val | boost::adaptors::transformed(&convert<t_const_value>), - std::bind(&::t_const_value::add_list, to, std::placeholders::_1)); - } else - T_CONST_VALUE_CASE(string); - else T_CONST_VALUE_CASE(integer); - else T_CONST_VALUE_CASE(double); - else if (from.__isset.const_identifier_val) { - to->set_identifier(from.const_identifier_val.identifier_val) ; - to->set_enum(resolve_type< ::t_enum>(from.const_identifier_val.enum_val)) ; - } - -#undef T_CONST_VALUE_CASE -} -THRIFT_CONVERSION(t_field, resolve_type< ::t_type>(from.type), from.name, from.key) { - assert(to); - THRIFT_ASSIGN_ANNOTATIONS(); - to->set_reference(from.reference); - to->set_req(static_cast< ::t_field::e_req>(from.req)); - if (from.__isset.value) { - to->set_value(convert(from.value)); - } -} -THRIFT_CONVERSION(t_struct, g_program_cache[from.metadata.program_id]) { - assert(to); - THRIFT_ASSIGN_METADATA(); - to->set_union(from.is_union); - to->set_xception(from.is_xception); - boost::for_each(from.members | boost::adaptors::transformed(convert<t_field>), - std::bind(&::t_struct::append, to, std::placeholders::_1)); -} -THRIFT_CONVERSION(t_const, - resolve_type< ::t_type>(from.type), - from.name, - convert<t_const_value>(from.value)) { - assert(to); - THRIFT_ASSIGN_DOC(); -} - -THRIFT_CONVERSION(t_function, - resolve_type< ::t_type>(from.returntype), - from.name, - resolve_type< ::t_struct>(from.arglist), - resolve_type< ::t_struct>(from.xceptions), - from.is_oneway) { - assert(to); - THRIFT_ASSIGN_DOC(); -} - -THRIFT_CONVERSION(t_service, g_program_cache[from.metadata.program_id]) { - assert(to); - assert(from.metadata.program_id); - assert(g_program_cache[from.metadata.program_id]); - THRIFT_ASSIGN_METADATA(); - - boost::for_each(from.functions | boost::adaptors::transformed(convert<t_function>), - std::bind(&::t_service::add_function, to, std::placeholders::_1)); - - if (from.__isset.extends_) - to->set_extends(resolve_service(from.extends_)); -} - -THRIFT_CONVERT_FORWARD(t_type) { -#define T_TYPE_CASE_FW_T(case, type) \ - if (from.__isset.case##_val) \ - return convert_forward<type>(from.case##_val) -#define T_TYPE_CASE_FW(case) T_TYPE_CASE_FW_T(case, t_##case) - - T_TYPE_CASE_FW(base_type); - T_TYPE_CASE_FW(typedef); - T_TYPE_CASE_FW(enum); - T_TYPE_CASE_FW(struct); - T_TYPE_CASE_FW_T(xception, t_struct); - T_TYPE_CASE_FW(list); - T_TYPE_CASE_FW(set); - T_TYPE_CASE_FW(map); - T_TYPE_CASE_FW(service); - throw ThriftPluginError("Invalid data: Type union has no value."); -#undef T_TYPE_CASE_FW_T -#undef T_TYPE_CASE_FW -} -THRIFT_CONVERT_COMPLETE(t_type) { -#define T_TYPE_CASE_T(case, type) \ - else if (from.__isset.case##_val) \ - convert<type, ::type>(from.case##_val, reinterpret_cast< ::type*>(to)) -#define T_TYPE_CASE(case) T_TYPE_CASE_T(case, t_##case) - - if (false) { - } - T_TYPE_CASE(base_type); - T_TYPE_CASE(typedef); - T_TYPE_CASE(enum); - T_TYPE_CASE(struct); - T_TYPE_CASE_T(xception, t_struct); - T_TYPE_CASE(list); - T_TYPE_CASE(set); - T_TYPE_CASE(map); - T_TYPE_CASE(service); - else { - throw ThriftPluginError("Invalid data: Type union has no value."); - } -#undef T_TYPE_CASE_T -#undef T_TYPE_CASE -} - -THRIFT_CONVERSION(t_scope, ) { - assert(to); -#define T_SCOPE_RESOLVE(type, name, a) \ - for (std::vector<int64_t>::const_iterator it = from.name##s.begin(); it != from.name##s.end(); \ - it++) { \ - ::t_##type* t = resolve_##type a(*it); \ - to->add_##name(t->get_name(), t); \ - } - T_SCOPE_RESOLVE(type, type, < ::t_type>); - T_SCOPE_RESOLVE(const, constant, ); - T_SCOPE_RESOLVE(service, service, ); -#undef T_SCOPE_RESOLVE -} - -THRIFT_CONVERT_FORWARD(t_program) { - ::t_program* to = new ::t_program(from.path, from.name); - for (std::vector<t_program>::const_iterator it = from.includes.begin(); it != from.includes.end(); - it++) { - to->add_include(convert_forward(*it)); - } - g_program_cache[from.program_id] = to; - return to; -} -THRIFT_CONVERT_COMPLETE(t_program) { - assert(to); - g_program = to; - convert<t_scope, ::t_scope>(from.scope, to->scope()); - THRIFT_ASSIGN_DOC(); - - to->set_out_path(from.out_path, from.out_path_is_absolute); - - boost::for_each(from.typedefs | boost::adaptors::transformed(&resolve_type< ::t_typedef>), - std::bind(&::t_program::add_typedef, to, std::placeholders::_1)); - boost::for_each(from.enums | boost::adaptors::transformed(&resolve_type< ::t_enum>), - std::bind(&::t_program::add_enum, to, std::placeholders::_1)); - for (std::vector<int64_t>::const_iterator it = from.objects.begin(); it != from.objects.end(); - it++) { - ::t_struct* t2 = resolve_type< ::t_struct>(*it); - if (t2->is_xception()) { - to->add_xception(t2); - } else { - to->add_struct(t2); - } - } - boost::for_each(from.consts | boost::adaptors::transformed(&resolve_const), - std::bind(&::t_program::add_const, to, std::placeholders::_1)); - boost::for_each(from.services | boost::adaptors::transformed(&resolve_service), - std::bind(&::t_program::add_service, to, std::placeholders::_1)); - - for (std::vector<t_program>::const_iterator it = from.includes.begin(); it != from.includes.end(); - it++) { - convert(*it, g_program_cache[it->program_id]); - } - std::for_each(from.c_includes.begin(), from.c_includes.end(), - std::bind(&::t_program::add_c_include, to, std::placeholders::_1)); - std::for_each(from.cpp_includes.begin(), from.cpp_includes.end(), - std::bind(&::t_program::add_cpp_include, to, std::placeholders::_1)); - for (std::map<std::string, std::string>::const_iterator it = from.namespaces.begin(); - it != from.namespaces.end(); it++) { - to->set_namespace(it->first, it->second); - } - - to->set_include_prefix(from.include_prefix); - to->set_namespace(from.namespace_); -} - -int GeneratorPlugin::exec(int, char* []) { -#ifdef _WIN32 - _setmode(fileno(stdin), _O_BINARY); -#endif - std::shared_ptr<TFramedTransport> transport( - new TFramedTransport(std::make_shared<TFDTransport>(fileno(stdin)))); - TBinaryProtocol proto(transport); - GeneratorInput input; - try { - input.read(&proto); - } catch (std::exception& err) { - std::cerr << "Error while receiving plugin data: " << err.what() << std::endl; - return -1; - } - initGlobals(); - ::t_program* p = g_program = convert_forward(input.program); - set_global_cache(input.type_registry); - convert(input.program, p); - - int ret = generate(p, input.parsed_options); - clearGlobals(); - - return ret; -} - -::t_const_value::t_const_value_type const_value_case(const t_const_value& v) { - if (v.__isset.map_val) - return ::t_const_value::CV_MAP; - if (v.__isset.list_val) - return ::t_const_value::CV_LIST; - if (v.__isset.string_val) - return ::t_const_value::CV_STRING; - if (v.__isset.integer_val) - return ::t_const_value::CV_INTEGER; - if (v.__isset.double_val) - return ::t_const_value::CV_DOUBLE; - if (v.__isset.const_identifier_val) - return ::t_const_value::CV_IDENTIFIER; - throw ThriftPluginError("Unknown const value type"); -} - -bool t_const_value::operator<(const t_const_value& that) const { - ::t_const_value::t_const_value_type t1 = const_value_case(*this); - ::t_const_value::t_const_value_type t2 = const_value_case(that); - if (t1 != t2) - return t1 < t2; - switch (t1) { - case ::t_const_value::CV_INTEGER: - return integer_val < that.integer_val; - case ::t_const_value::CV_DOUBLE: - return double_val < that.double_val; - case ::t_const_value::CV_STRING: - return string_val < that.string_val; - case ::t_const_value::CV_MAP: - if (that.map_val.empty()) - return false; - else if (map_val.empty()) - return true; - else - return map_val.begin()->first < that.map_val.begin()->first; - case ::t_const_value::CV_LIST: - if (that.list_val.empty()) - return false; - else if (list_val.empty()) - return true; - else - return list_val.front() < that.list_val.front(); - case ::t_const_value::CV_IDENTIFIER: - return integer_val < that.integer_val; - } - throw ThriftPluginError("Unknown const value type"); -} -} -} -} diff --git a/compiler/cpp/src/thrift/plugin/plugin.h b/compiler/cpp/src/thrift/plugin/plugin.h deleted file mode 100644 index 705cd41..0000000 --- a/compiler/cpp/src/thrift/plugin/plugin.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#ifndef T_PLUGIN_PLUGIN_H -#define T_PLUGIN_PLUGIN_H - -#include "thrift/Thrift.h" - -class t_program; - -namespace apache { -namespace thrift { -namespace plugin { - -struct ThriftPluginError : public apache::thrift::TException { - ThriftPluginError(const std::string& msg) : apache::thrift::TException(msg) {} -}; - -class GeneratorPlugin { -public: - int exec(int argc, char* argv[]); - virtual int generate(::t_program*, const std::map<std::string, std::string>&) = 0; -}; -} -} -} - -#endif diff --git a/compiler/cpp/src/thrift/plugin/plugin.thrift b/compiler/cpp/src/thrift/plugin/plugin.thrift deleted file mode 100644 index 6d98f99..0000000 --- a/compiler/cpp/src/thrift/plugin/plugin.thrift +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -namespace as3 org.apache.thrift.plugin -namespace cpp apache.thrift.plugin -namespace csharp Thrift.Plugin -namespace d thrift.plugin -namespace delphi Thrift.Plugin -namespace erl thrift.plugin -namespace go thrift -namespace haxe org.apache.thrift.plugin -namespace hs Thrift.Plugin -namespace java org.apache.thrift.plugin -namespace ocaml Thrift -namespace perl Thrift.Plugin -namespace php thrift.plugin -namespace py thrift.plugin -namespace rb Thrift - -typedef i64 t_program_id -typedef i64 t_type_id -typedef i64 t_const_id -typedef i64 t_service_id - -enum t_base { - TYPE_VOID - TYPE_STRING - TYPE_BOOL - TYPE_I8 - TYPE_I16 - TYPE_I32 - TYPE_I64 - TYPE_DOUBLE - TYPE_BINARY -} - -struct TypeMetadata { - 1: required string name - 2: required t_program_id program_id - 99: optional map<string, string> annotations - 100: optional string doc -} - -struct t_base_type { - 1: required TypeMetadata metadata - 2: required t_base value -} - -struct t_list { - 1: required TypeMetadata metadata - 2: optional string cpp_name - 3: required t_type_id elem_type -} - -struct t_set { - 1: required TypeMetadata metadata - 2: optional string cpp_name - 3: required t_type_id elem_type -} - -struct t_map { - 1: required TypeMetadata metadata - 2: optional string cpp_name - 3: required t_type_id key_type - 4: required t_type_id val_type -} - -struct t_typedef { - 1: required TypeMetadata metadata - 2: required t_type_id type - 3: required string symbolic - 4: required bool forward -} - -struct t_enum_value { - 1: required string name - 2: required i32 value - 99: optional map<string, string> annotations - 100: optional string doc -} -struct t_enum { - 1: required TypeMetadata metadata - 2: required list<t_enum_value> constants -} - -enum Requiredness { - T_REQUIRED = 0 - T_OPTIONAL = 1 - T_OPT_IN_REQ_OUT = 2 -} - -struct t_const_identifier_value { - 1: required string identifier_val - 2: required t_type_id enum_val -} - -union t_const_value { - 1: optional map<t_const_value, t_const_value> map_val - 2: optional list<t_const_value> list_val - 3: optional string string_val - 4: optional i64 integer_val - 5: optional double double_val - 8: optional t_const_identifier_value const_identifier_val -} - -struct t_const { - 1: required string name - 2: required t_type_id type - 3: required t_const_value value - 100: optional string doc -} -struct t_field { - 1: required string name - 2: required t_type_id type - 3: required i32 key - 4: required Requiredness req - 5: optional t_const_value value - 10: required bool reference - 99: optional map<string, string> annotations - 100: optional string doc -} -struct t_struct { - 1: required TypeMetadata metadata - 2: required list<t_field> members - 3: required bool is_union - 4: required bool is_xception -} -struct t_function { - 1: required string name - 2: required t_type_id returntype - 3: required t_type_id arglist - 4: required t_type_id xceptions - 5: required bool is_oneway - 100: optional string doc -} -struct t_service { - 1: required TypeMetadata metadata - 2: required list<t_function> functions - 3: optional t_service_id extends_ -} -union t_type { - 1: optional t_base_type base_type_val - 2: optional t_typedef typedef_val - 3: optional t_enum enum_val - 4: optional t_struct struct_val - 5: optional t_struct xception_val - 6: optional t_list list_val - 7: optional t_set set_val - 8: optional t_map map_val - 9: optional t_service service_val -} -struct t_scope { - 1: required list<t_type_id> types - 2: required list<t_const_id> constants - 3: required list<t_service_id> services -} - -struct TypeRegistry { - 1: required map<t_type_id, t_type> types - 2: required map<t_const_id, t_const> constants - 3: required map<t_service_id, t_service> services -} - -struct t_program { - 1: required string name - 2: required t_program_id program_id - 3: required string path - 4: required string namespace_ - 5: required string out_path - 6: required bool out_path_is_absolute - 8: required list<t_program> includes - 9: required string include_prefix - 10: required t_scope scope - - 11: required list<t_type_id> typedefs - 12: required list<t_type_id> enums - 13: required list<t_const_id> consts - 14: required list<t_type_id> objects - 15: required list<t_service_id> services - - 16: required map<string, string> namespaces - 17: required list<string> cpp_includes - 18: required list<string> c_includes - 100: optional string doc -} - -struct GeneratorInput { - 1: required t_program program - 2: required TypeRegistry type_registry - 3: required map<string, string> parsed_options -} diff --git a/compiler/cpp/src/thrift/plugin/plugin_output.cc b/compiler/cpp/src/thrift/plugin/plugin_output.cc deleted file mode 100644 index f8223de..0000000 --- a/compiler/cpp/src/thrift/plugin/plugin_output.cc +++ /dev/null @@ -1,455 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#ifdef _WIN32 -#include <cstdio> -#include <fcntl.h> -#include <io.h> -#include <iostream> -#define THRIFT_POPEN(cmd) _popen(cmd, "wb") -#define THRIFT_PCLOSE _pclose -#else -#define THRIFT_POPEN(cmd) popen(cmd, "w") -#define THRIFT_PCLOSE pclose -#endif - -#include "thrift/plugin/plugin_output.h" - -#include <boost/range/adaptor/map.hpp> -#include <boost/range/algorithm/copy.hpp> -#include <boost/range/algorithm/transform.hpp> - -#include "thrift/generate/t_generator.h" -#include "thrift/plugin/plugin.h" -#include "thrift/plugin/type_util.h" -#include "thrift/protocol/TBinaryProtocol.h" -#include "thrift/transport/TBufferTransports.h" -#include "thrift/transport/TFDTransport.h" - -#include "thrift/plugin/plugin_types.h" - -#include <memory> - -namespace plugin_output { - -template <typename From> -typename apache::thrift::plugin::ToType<From>::type convert(From* from) { - typename apache::thrift::plugin::ToType<From>::type to; - convert(from, to); - return to; -} - -using apache::thrift::protocol::TBinaryProtocol; -using std::make_shared; -using std::shared_ptr; -using apache::thrift::transport::TFDTransport; -using apache::thrift::transport::TFramedTransport; - -using namespace apache::thrift; - -#define THRIFT_CONVERSION_N(from_type, to_type) \ - template <> \ - void convert<from_type, to_type>(from_type * from, to_type & to) -#define THRIFT_CONVERSION(type) THRIFT_CONVERSION_N(::type, plugin::type) - -#define THRIFT_ASSIGN_N(from_name, to_name, prefix) \ - do { \ - if (from) \ - to.__set_##to_name(prefix(from->from_name)); \ - } while (0) - -#define THRIFT_ASSIGN(name) THRIFT_ASSIGN_N(get_##name(), name, ) -#define THRIFT_ASSIGN_CONVERT(type, from_name, to_name) \ - do { \ - if (from && from->from_name) { \ - to.__set_##to_name(convert(from->from_name)); \ - } \ - } while (0) - -#define THRIFT_ASSIGN_OPT(name) \ - do { \ - if (from->has_##name()) \ - THRIFT_ASSIGN(name); \ - } while (0) - -#define THRIFT_ASSIGN_LIST_N(type, from_name, to_name) \ - do { \ - if (from && !from->from_name.empty()) { \ - std::transform(from->from_name.begin(), \ - from->from_name.end(), \ - std::back_inserter(to.to_name), \ - convert< ::type>); \ - } \ - } while (0) - -#define THRIFT_ASSIGN_METADATA() convert(reinterpret_cast<t_type*>(from), to.metadata) - -// a generator of sequential unique identifiers for addresses -- so -// that the TypeCache below can use those IDs instead of -// addresses. This allows GeneratorInput's various -// t_{program,type,etc}_id types to be dense consecutively-numbered -// integers, instead of large random-seeming integers. -// -// Furthermore, this allows GeneratorInput to be deterministic (no -// addresses, so no pseudo-randomness) and that means reproducibility -// of output. -const int64_t ONE_MILLION = 1000 * 1000; -class id_generator { -public: - id_generator() : addr2id_(), next_id_(ONE_MILLION) {} - - void clear() { - addr2id_.clear() ; - next_id_ = ONE_MILLION ; - } - - int64_t gensym(const int64_t addr) { - if (!addr) return 0L ; - std::map<int64_t, int64_t>::iterator it = addr2id_.find(addr); - if (it != addr2id_.end()) return it->second ; - int64_t id = next_id_++ ; - addr2id_.insert(std::make_pair(addr, id)) ; - return id ; - } - - std::map<int64_t, int64_t> addr2id_ ; - int64_t next_id_ ; -} ; - -// To avoid multiple instances of same type, t_type, t_const and t_service are stored in one place -// and referenced by ID. -template <typename T> -struct TypeCache { - typedef typename plugin::ToType<T>::type to_type; - id_generator idgen ; - std::map<int64_t, to_type> cache; - - template <typename T2> - int64_t store(T2* t) { - intptr_t addr = reinterpret_cast<intptr_t>(t); - if (!addr) return 0L ; - - int64_t id = idgen.gensym(addr) ; - if (cache.end() != cache.find(id)) return id ; - - // HACK: fake resolve for recursive type - cache.insert(std::make_pair(id, to_type())); - // overwrite with true value - cache[id] = convert(t); - return id ; - } - - void clear() { cache.clear() ; idgen.clear(); } -}; - -template <typename T> -int64_t store_type(T* t); - -#define T_STORE(type) \ - TypeCache<t_##type> type##_cache; \ - template <> \ - plugin::t_##type##_id store_type<t_##type>(t_##type * t) { \ - return type##_cache.store<t_##type>(t); \ - } -T_STORE(type) -T_STORE(const) -T_STORE(service) -#undef T_STORE -// this id_generator is for gensymm-ing t_program_id -id_generator program_cache ; - -#define THRIFT_ASSIGN_ID_N(t, from_name, to_name) \ - do { \ - if (from && from->from_name) \ - to.__set_##to_name(store_type<t>(from->from_name)); \ - } while (0) - -#define THRIFT_ASSIGN_ID(name) THRIFT_ASSIGN_ID_N(t_type, get_##name(), name) - -#define THRIFT_ASSIGN_LIST_ID(t, name) \ - do { \ - if (from && !from->get_##name##s().empty()) { \ - std::transform(from->get_##name##s().begin(), \ - from->get_##name##s().end(), \ - std::back_inserter(to.name##s), \ - &store_type<t>); \ - } \ - } while (0) - -THRIFT_CONVERSION_N(::t_type, plugin::TypeMetadata) { - to.program_id = program_cache.gensym(reinterpret_cast<int64_t>(from->get_program())); - THRIFT_ASSIGN_N(annotations_, annotations, ); - if (from->has_doc()) { - to.__set_doc(from->get_doc()); - } - THRIFT_ASSIGN(name); -} - -THRIFT_CONVERSION(t_typedef) { - THRIFT_ASSIGN_METADATA(); - THRIFT_ASSIGN_ID(type); - THRIFT_ASSIGN(symbolic); - THRIFT_ASSIGN_N(is_forward_typedef(), forward, ); -} - -THRIFT_CONVERSION(t_enum_value) { - THRIFT_ASSIGN_OPT(doc); - THRIFT_ASSIGN(name); - THRIFT_ASSIGN(value); -} - -THRIFT_CONVERSION(t_enum) { - THRIFT_ASSIGN_METADATA(); - THRIFT_ASSIGN_LIST_N(t_enum_value, get_constants(), constants); -} - -THRIFT_CONVERSION(t_const_value) { - switch (from->get_type()) { - case t_const_value::CV_INTEGER: - THRIFT_ASSIGN_N(get_integer(), integer_val, ); - break; - case t_const_value::CV_DOUBLE: - THRIFT_ASSIGN_N(get_double(), double_val, ); - break; - case t_const_value::CV_STRING: - THRIFT_ASSIGN_N(get_string(), string_val, ); - break; - case t_const_value::CV_IDENTIFIER: - if (from) { - apache::thrift::plugin::t_const_identifier_value cidval ; - if (from->enum_) - cidval.__set_enum_val(store_type<t_type>(from->enum_)); - cidval.__set_identifier_val(from->get_identifier()); - to.__set_const_identifier_val(cidval) ; - } - break; - case t_const_value::CV_MAP: - to.__isset.map_val = true; - if (from && !from->get_map().empty()) { - for (std::map< ::t_const_value*, ::t_const_value*>::const_iterator it - = from->get_map().begin(); - it != from->get_map().end(); - it++) { - to.map_val.insert(std::make_pair(convert(it->first), convert(it->second))); - } - } - break; - case t_const_value::CV_LIST: - to.__isset.list_val = true; - THRIFT_ASSIGN_LIST_N(t_const_value, get_list(), list_val); - break; - default: - throw plugin::ThriftPluginError("const value has no value"); - } -} -THRIFT_CONVERSION(t_const) { - THRIFT_ASSIGN_OPT(doc); - THRIFT_ASSIGN(name); - THRIFT_ASSIGN_ID(type); - THRIFT_ASSIGN_CONVERT(t_const_value, get_value(), value); -} -THRIFT_CONVERSION(t_field) { - THRIFT_ASSIGN_OPT(doc); - THRIFT_ASSIGN(name); - THRIFT_ASSIGN(key); - THRIFT_ASSIGN_N(get_req(), req, (plugin::Requiredness::type)); - THRIFT_ASSIGN(reference); - THRIFT_ASSIGN_ID(type); - THRIFT_ASSIGN_CONVERT(t_const_value, get_value(), value); -} -THRIFT_CONVERSION(t_struct) { - THRIFT_ASSIGN_METADATA(); - THRIFT_ASSIGN_LIST_N(t_field, get_members(), members); - THRIFT_ASSIGN_N(is_union(), is_union, ); - THRIFT_ASSIGN_N(is_xception(), is_xception, ); -} -THRIFT_CONVERSION(t_function) { - THRIFT_ASSIGN_OPT(doc); - THRIFT_ASSIGN(name); - THRIFT_ASSIGN_ID(returntype); - THRIFT_ASSIGN_N(is_oneway(), is_oneway, ); - THRIFT_ASSIGN_ID(arglist); - THRIFT_ASSIGN_ID(xceptions); -} - -THRIFT_CONVERSION(t_list) { - THRIFT_ASSIGN_METADATA(); - THRIFT_ASSIGN_OPT(cpp_name); - THRIFT_ASSIGN_ID(elem_type); -} -THRIFT_CONVERSION(t_set) { - THRIFT_ASSIGN_METADATA(); - THRIFT_ASSIGN_OPT(cpp_name); - THRIFT_ASSIGN_ID(elem_type); -} -THRIFT_CONVERSION(t_map) { - THRIFT_ASSIGN_METADATA(); - THRIFT_ASSIGN_OPT(cpp_name); - THRIFT_ASSIGN_ID(key_type); - THRIFT_ASSIGN_ID(val_type); -} - -THRIFT_CONVERSION(t_service) { - THRIFT_ASSIGN_METADATA(); - THRIFT_ASSIGN_LIST_N(t_function, get_functions(), functions); - THRIFT_ASSIGN_ID_N(t_service, get_extends(), extends_); -} - -THRIFT_CONVERSION(t_base_type) { - THRIFT_ASSIGN_METADATA(); - if (from->is_binary()) { - to.value = plugin::t_base::TYPE_BINARY; - } else { - switch (from->get_base()) { -#define T_BASETYPE_CASE(name) \ - case t_base_type::TYPE_##name: \ - to.value = plugin::t_base::TYPE_##name; \ - break - T_BASETYPE_CASE(VOID); - T_BASETYPE_CASE(STRING); - T_BASETYPE_CASE(BOOL); - T_BASETYPE_CASE(I8); - T_BASETYPE_CASE(I16); - T_BASETYPE_CASE(I32); - T_BASETYPE_CASE(I64); - T_BASETYPE_CASE(DOUBLE); - default: - throw plugin::ThriftPluginError("Base type union has no value"); - break; -#undef T_BASETYPE_CASE - } - } -} -THRIFT_CONVERSION(t_type) { -#define T_CONVERT_UNION_N(name, type) \ - else if (from->is_##name()) { \ - to.__isset.name##_val = true; \ - convert(reinterpret_cast< ::type*>(from), to.name##_val); \ - } -#define T_CONVERT_UNION(name) T_CONVERT_UNION_N(name, t_##name) - if (false) { - } - T_CONVERT_UNION(base_type) - T_CONVERT_UNION(typedef) - T_CONVERT_UNION(enum) - T_CONVERT_UNION(struct) - T_CONVERT_UNION_N(xception, t_struct) - T_CONVERT_UNION(list) - T_CONVERT_UNION(set) - T_CONVERT_UNION(map) - T_CONVERT_UNION(service) - else { - throw plugin::ThriftPluginError("Type union has no value"); - } -#undef T_CONVERT_UNION_N -#undef T_CONVERT_UNION -} - -THRIFT_CONVERSION(t_scope) { -#define T_SCOPE_ASSIGN(name, type) \ - boost::copy(from->name##s_ | boost::adaptors::map_values \ - | boost::adaptors::transformed(&store_type<type>), \ - std::back_inserter(to.name##s)) - T_SCOPE_ASSIGN(type, t_type); - T_SCOPE_ASSIGN(constant, t_const); - T_SCOPE_ASSIGN(service, t_service); -#undef T_SCOPE_ASSIGN -} - -void get_global_cache(plugin::TypeRegistry& reg) { - reg.types = type_cache.cache; - reg.constants = const_cache.cache; - reg.services = service_cache.cache; -} - -void clear_global_cache() { - type_cache.clear(); - const_cache.clear(); - service_cache.clear(); - program_cache.clear() ; -} - -THRIFT_CONVERSION(t_program) { - THRIFT_ASSIGN_CONVERT(t_scope, scope(), scope); - THRIFT_ASSIGN(path); - THRIFT_ASSIGN(out_path); - THRIFT_ASSIGN(name); - THRIFT_ASSIGN(include_prefix); - THRIFT_ASSIGN(cpp_includes); - THRIFT_ASSIGN(c_includes); - THRIFT_ASSIGN(namespaces); - THRIFT_ASSIGN_N(is_out_path_absolute(), out_path_is_absolute, ); - THRIFT_ASSIGN_N(get_namespace(), namespace_, ); - THRIFT_ASSIGN_LIST_ID(t_type, typedef); - THRIFT_ASSIGN_LIST_ID(t_type, enum); - THRIFT_ASSIGN_LIST_ID(t_type, object); - THRIFT_ASSIGN_LIST_ID(t_const, const); - THRIFT_ASSIGN_LIST_ID(t_service, service); - THRIFT_ASSIGN_LIST_N(t_program, get_includes(), includes); - to.program_id = program_cache.gensym(reinterpret_cast<plugin::t_program_id>(from)); -} - -PluginDelegateResult delegateToPlugin(t_program* program, const std::string& options) { - std::string language; - std::map<std::string, std::string> parsed_options; - t_generator::parse_options(options, language, parsed_options); - std::string cmd = "thrift-gen-"; - if (language.find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-0123456789") - != std::string::npos) { - std::cerr << "Invalid language name" << std::endl; - return PLUGIN_FAILURE; - } - cmd.append(language); - FILE* fd = THRIFT_POPEN(cmd.c_str()); - if (fd) { -#ifdef _WIN32 - _setmode(fileno(fd), _O_BINARY); -#endif - shared_ptr<TFramedTransport> transport( - new TFramedTransport(make_shared<TFDTransport>(fileno(fd)))); - TBinaryProtocol proto(transport); - - plugin::GeneratorInput input; - input.__set_parsed_options(parsed_options); - clear_global_cache(); - convert(program, input.program); - get_global_cache(input.type_registry); - try { - input.write(&proto); - transport->flush(); - } catch (std::exception& err) { - std::cerr << "Error while sending data to plugin: " << err.what() << std::endl; - THRIFT_PCLOSE(fd); - return PLUGIN_FAILURE; - } - - // TODO: be prepared for hang or crash of child process - int ret = THRIFT_PCLOSE(fd); - if (!ret) { - return PLUGIN_SUCCEESS; - } else { - std::cerr << "plugin process returned non zero exit code: " << ret << std::endl; - return PLUGIN_FAILURE; - } - } - clear_global_cache(); - return PLUGIN_NOT_FOUND; -} -} - diff --git a/compiler/cpp/src/thrift/plugin/plugin_output.h b/compiler/cpp/src/thrift/plugin/plugin_output.h deleted file mode 100644 index eab2d1b..0000000 --- a/compiler/cpp/src/thrift/plugin/plugin_output.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#ifndef T_PLUGIN_PLUGIN_OUTPUT_H -#define T_PLUGIN_PLUGIN_OUTPUT_H - -#include <string> - -class t_program; - -namespace plugin_output { - -enum PluginDelegateResult { - PLUGIN_NOT_FOUND, - PLUGIN_FAILURE, - PLUGIN_SUCCEESS, -}; - -PluginDelegateResult delegateToPlugin(t_program* program, const std::string& options); -} - -#endif diff --git a/compiler/cpp/src/thrift/plugin/type_util.h b/compiler/cpp/src/thrift/plugin/type_util.h deleted file mode 100644 index 996b5c6..0000000 --- a/compiler/cpp/src/thrift/plugin/type_util.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#ifndef T_PLUGIN_TYPE_UTIL_H -#define T_PLUGIN_TYPE_UTIL_H - -namespace apache { -namespace thrift { -namespace plugin { - -template <typename From> -struct ToType {}; - -template <typename From> -typename ToType<From>::type* convert_forward(const From&); - -template <typename From, typename To> -void convert(const From&, To*); - -template <typename From> -typename ToType<From>::type* convert(const From& from); - -class TypeRegistry; -void set_global_cache(const TypeRegistry&); -void clear_global_cache(); -} -} -} - -// conversion from raw compiler types to plugin wire type -namespace plugin_output { - -template <typename From, typename To> -void convert(From* from, To& to); - -template <typename From> -typename apache::thrift::plugin::ToType<From>::type convert(From* from); - -void get_global_cache(apache::thrift::plugin::TypeRegistry&); -void clear_global_cache(); -} - -#define THRIFT_TYPE_MAPPING(TYPE) \ - class TYPE; \ - namespace apache { \ - namespace thrift { \ - namespace plugin { \ - class TYPE; \ - template <> \ - struct ToType< ::TYPE> { \ - typedef TYPE type; \ - }; \ - template <> \ - struct ToType<TYPE> { \ - typedef ::TYPE type; \ - }; \ - } \ - } \ - } -THRIFT_TYPE_MAPPING(t_base_type) -THRIFT_TYPE_MAPPING(t_const) -THRIFT_TYPE_MAPPING(t_const_value) -THRIFT_TYPE_MAPPING(t_container) -THRIFT_TYPE_MAPPING(t_doc) -THRIFT_TYPE_MAPPING(t_enum) -THRIFT_TYPE_MAPPING(t_enum_value) -THRIFT_TYPE_MAPPING(t_field) -THRIFT_TYPE_MAPPING(t_function) -THRIFT_TYPE_MAPPING(t_list) -THRIFT_TYPE_MAPPING(t_map) -THRIFT_TYPE_MAPPING(t_program) -THRIFT_TYPE_MAPPING(t_scope) -THRIFT_TYPE_MAPPING(t_service) -THRIFT_TYPE_MAPPING(t_set) -THRIFT_TYPE_MAPPING(t_struct) -THRIFT_TYPE_MAPPING(t_type) -THRIFT_TYPE_MAPPING(t_typedef) -#undef THRIFT_TYPE_MAPPING -#endif diff --git a/compiler/cpp/test/CMakeLists.txt b/compiler/cpp/test/CMakeLists.txt index 373cb78..2bc7e9e 100644 --- a/compiler/cpp/test/CMakeLists.txt +++ b/compiler/cpp/test/CMakeLists.txt @@ -23,50 +23,6 @@ REQUIRE_BOOST_HEADERS() set(BOOST_COMPONENTS unit_test_framework) REQUIRE_BOOST_LIBRARIES(BOOST_COMPONENTS) -if(${WITH_PLUGIN}) - # Make sure gen-cpp files can be included - include_directories("${CMAKE_CURRENT_BINARY_DIR}") - - set(plugintest_SOURCES - plugin/conversion_test.cc - ) - add_executable(plugintest ${plugintest_SOURCES}) - target_link_libraries(plugintest - thriftc - ${Boost_LIBRARIES} - ) - add_test(NAME PluginUnitTest COMMAND plugintest) - - set(thrift-gen-mycpp_SOURCES - ../src/thrift/generate/t_cpp_generator.cc - plugin/cpp_plugin.cc - ) - add_executable(thrift-gen-mycpp ${thrift-gen-mycpp_SOURCES}) - target_link_libraries(thrift-gen-mycpp thriftc) - - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(BUILDTYPE "Debug") - else() - # RelWithDebInfo generates binaries in "Release" directory too - set(BUILDTYPE "Release") - endif() - - set_directory_properties(PROPERTIES - ADDITIONAL_MAKE_CLEAN_FILES gen-cpp - ADDITIONAL_MAKE_CLEAN_FILES gen-mycpp) - - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/gen-cpp) - file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/gen-mycpp) - add_test(NAME PluginIntegrationTest - COMMAND ${CMAKE_COMMAND} - -DTHRIFT_COMPILER=${THRIFT_COMPILER} - -DBINDIR=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} - -DBUILDTYPE=${BUILDTYPE} - -DCURDIR=${CMAKE_CURRENT_BINARY_DIR} - -DSRCDIR=${CMAKE_CURRENT_SOURCE_DIR} - -P ${CMAKE_CURRENT_SOURCE_DIR}/cpp_plugin_test.cmake) -endif() - file(GLOB KEYWORD_SAMPLES "${CMAKE_CURRENT_SOURCE_DIR}/keyword-samples/*.thrift") foreach(LANG ${thrift_compiler_LANGS}) foreach(SAMPLE ${KEYWORD_SAMPLES}) @@ -84,4 +40,4 @@ if(PYTHONINTERP_FOUND) add_test(NAME StalenessCheckTest COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/compiler/staleness_check.py ${THRIFT_COMPILER}) else() message(WARNING "Skipping StalenessCheckTest as there is no python interpreter available.") -endif() \ No newline at end of file +endif() diff --git a/compiler/cpp/test/Makefile.am b/compiler/cpp/test/Makefile.am index b7fc91d..9625834 100644 --- a/compiler/cpp/test/Makefile.am +++ b/compiler/cpp/test/Makefile.am @@ -26,35 +26,3 @@ AUTOMAKE_OPTIONS = subdir-objects serial-tests AM_CPPFLAGS = $(BOOST_CPPFLAGS) -I$(top_srcdir)/compiler/cpp/src AM_LDFLAGS = $(BOOST_LDFLAGS) AM_CXXFLAGS = -Wall -Wextra -pedantic - -if WITH_PLUGIN -check_PROGRAMS = plugintest - -noinst_PROGRAMS = thrift-gen-mycpp - -all-local: thrift-gen-bincat - -AM_CPPFLAGS += -I$(top_srcdir)/lib/cpp/src -I$(top_builddir)/lib/cpp/src - -plugintest_SOURCES = plugin/conversion_test.cc -plugintest_LDADD = $(top_builddir)/compiler/cpp/libthriftc.la - -thrift_gen_mycpp_SOURCES = plugin/cpp_plugin.cc \ - plugin/t_cpp_generator.cc -thrift_gen_mycpp_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/compiler/cpp -I$(top_srcdir)/compiler/cpp/src/generate -thrift_gen_mycpp_LDADD = $(top_builddir)/compiler/cpp/libthriftc.la - -cpp_plugin_test.sh: thrift-gen-mycpp - -thrift-gen-bincat: - cp bincat.sh $@ - chmod 755 $@ - -plugin_stability_test.sh: thrift-gen-bincat - -TESTS = $(check_PROGRAMS) cpp_plugin_test.sh plugin_stability_test.sh - -clean-local: - $(RM) -rf gen-cpp gen-mycpp gen-bincat thrift-gen-bincat - -endif diff --git a/compiler/cpp/test/cpp_plugin_test.cmake b/compiler/cpp/test/cpp_plugin_test.cmake deleted file mode 100644 index fd18281..0000000 --- a/compiler/cpp/test/cpp_plugin_test.cmake +++ /dev/null @@ -1,45 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -file(MAKE_DIRECTORY ${CURDIR}/gen-cpp) -execute_process(COMMAND ${THRIFT_COMPILER} -r -out ${CURDIR}/gen-cpp -gen cpp ${SRCDIR}/../../../test/Include.thrift) -if(EXITCODE) - message(FATAL_ERROR "FAILED: \"${ARGV}\": \"${EXITCODE}\"") -endif() -if(WIN32) - set(ENV{PATH} "${BINDIR}/${BUILDTYPE};${BINDIR};$ENV{PATH}") -else() - set(ENV{PATH} "${BINDIR}:$ENV{PATH}") -endif() - -file(MAKE_DIRECTORY ${CURDIR}/gen-mycpp) -execute_process(COMMAND ${THRIFT_COMPILER} -r -out ${CURDIR}/gen-mycpp -gen mycpp ${SRCDIR}/../../../test/Include.thrift RESULT_VARIABLE EXITCODE) -if(EXITCODE) - message(FATAL_ERROR "FAILED: \"${EXITCODE}\"") -endif() - -find_program(DIFF diff) -if(DIFF) - execute_process(COMMAND ${DIFF} -urN gen-cpp gen-mycpp RESULT_VARIABLE EXITCODE) - if(EXITCODE) - message(FATAL_ERROR "FAILED: \"${EXITCODE}\"") - endif() -else() - message(WARNING "diff executable is not available. Not validating plugin-generated code.") -endif() diff --git a/compiler/cpp/test/cpp_plugin_test.sh b/compiler/cpp/test/cpp_plugin_test.sh deleted file mode 100755 index ddb2e0a..0000000 --- a/compiler/cpp/test/cpp_plugin_test.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -# this file is intended to be invoked by make. -set -e -mkdir -p gen-cpp gen-mycpp -PATH=.:"$PATH" ../thrift -r -out gen-cpp -gen cpp ../../../test/Include.thrift -PATH=.:"$PATH" ../thrift -r -out gen-mycpp -gen mycpp ../../../test/Include.thrift -diff -urN gen-cpp gen-mycpp diff --git a/compiler/cpp/test/plugin/conversion_test.cc b/compiler/cpp/test/plugin/conversion_test.cc deleted file mode 100644 index 3c8d812..0000000 --- a/compiler/cpp/test/plugin/conversion_test.cc +++ /dev/null @@ -1,498 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#include "thrift/parse/t_program.h" -#include "thrift/plugin/type_util.h" -#include "thrift/plugin/plugin_types.h" - -#include <map> -#include <vector> - -#include <boost/preprocessor.hpp> -#include <boost/test/included/unit_test.hpp> -#include <boost/test/parameterized_test.hpp> - -using namespace apache::thrift; -using namespace boost::unit_test; - -namespace test_data { -#define T_TEST_TYPES \ - BOOST_PP_TUPLE_TO_LIST(14, \ - (program, \ - base_type, \ - enum_value, \ - enum, \ - const_value, \ - const, \ - list, \ - set, \ - map, \ - field, \ - struct, \ - typedef, \ - function, \ - service)) -#define T_DELETE_TESTDATA(r, d, elem) \ - for (std::vector<t_##elem*>::reverse_iterator it = elem##s.rbegin(); it != elem##s.rend(); it++) \ - delete *it; -#define T_DECL_TESTDATA(r, d, elem) static std::vector< ::t_##elem*> elem##s; -BOOST_PP_LIST_FOR_EACH(T_DECL_TESTDATA, _, T_TEST_TYPES) -#undef T_DECL_TESTDATA - -bool has_data = false; -void cleanup() { - if (has_data) { - has_data = false; - BOOST_PP_LIST_FOR_EACH(T_DELETE_TESTDATA, _, T_TEST_TYPES) - } -} - -void init_programs() { - programs.push_back(new t_program("prog path", "prog_name")); -} - -void init_base_types() { - base_types.push_back(new ::t_base_type("name0", ::t_base_type::TYPE_VOID)); - base_types.push_back(new ::t_base_type("name1", ::t_base_type::TYPE_STRING)); - base_types.push_back(new ::t_base_type("name2", ::t_base_type::TYPE_BOOL)); - base_types.push_back(new ::t_base_type("name3", ::t_base_type::TYPE_I8)); - base_types.push_back(new ::t_base_type("name4", ::t_base_type::TYPE_I16)); - base_types.push_back(new ::t_base_type("name5", ::t_base_type::TYPE_I32)); - base_types.push_back(new ::t_base_type("name6", ::t_base_type::TYPE_I64)); - base_types.push_back(new ::t_base_type("name7", ::t_base_type::TYPE_DOUBLE)); -} - -void init_const_values() { - const_values.push_back(new t_const_value(42)); - const_values.push_back(new t_const_value("foo")); - { - t_const_value* x = new t_const_value; - x->set_double(3.1415); - const_values.push_back(x); - } - { - t_const_value* x = new t_const_value; - x->set_identifier("bar"); - x->set_enum(enums[0]); - const_values.push_back(x); - } - { - t_const_value* x = new t_const_value; - x->set_map(); - x->add_map(const_values[0], const_values[1]); - x->add_map(const_values[1], const_values[0]); - const_values.push_back(x); - } - { - t_const_value* x = new t_const_value; - x->set_list(); - x->add_list(const_values[0]); - x->add_list(const_values[1]); - const_values.push_back(x); - } -} - -void init_consts() { - // base_type/enum indexes for this and other tests are arbitrary - consts.push_back(new t_const(base_types[2], "aaa", const_values[0])); - consts.back()->set_doc("soem doc"); - consts.push_back(new t_const(base_types[3], "bbb", const_values[1])); -} - -void init_enum_values() { - enum_values.push_back(new t_enum_value("VAL1", 11)); - enum_values.back()->set_doc("enum doc 1"); - enum_values.back()->annotations_.insert(std::make_pair("anno1", "val1")); - - enum_values.push_back(new t_enum_value("VAL2", 22)); -} - -void init_enums() { - enums.push_back(new t_enum(programs[0])); - enums.back()->set_doc("enum doc 1"); - enums.back()->annotations_.insert(std::make_pair("anno1", "val1")); - enums.back()->set_name("fooo"); - enums.back()->append(enum_values[0]); - enums.back()->append(enum_values[1]); -} - -void init_lists() { - lists.push_back(new t_list(enums[0])); - lists.push_back(new t_list(base_types[5])); - lists.back()->set_cpp_name("list_cpp_name_1"); -} -void init_sets() { - sets.push_back(new t_set(base_types[4])); - sets.push_back(new t_set(enums[0])); - sets.back()->set_cpp_name("set_cpp_name_1"); -} -void init_maps() { - maps.push_back(new t_map(base_types[4], base_types[1])); - maps.push_back(new t_map(base_types[5], enums[0])); - maps.back()->set_cpp_name("map_cpp_name_1"); -} - -void init_typedefs() { - typedefs.push_back(new t_typedef(programs[0], base_types[3], "VAL1")); -} -void init_fields() { - fields.push_back(new t_field(base_types[1], "f1")); - fields.back()->set_reference(false); - fields.back()->set_req(t_field::T_OPTIONAL); - fields.push_back(new t_field(base_types[2], "f2", 9)); - fields.back()->set_reference(true); - fields.push_back(new t_field(base_types[3], "f3", 11)); - fields.back()->set_req(t_field::T_REQUIRED); - fields.back()->set_value(const_values[0]); -} -void init_structs() { - structs.push_back(new t_struct(programs[0], "struct1")); - structs.back()->append(fields[0]); - structs.back()->append(fields[1]); - structs.push_back(new t_struct(programs[0], "union1")); - structs.back()->append(fields[0]); - structs.back()->append(fields[1]); - structs.back()->set_union(true); - structs.push_back(new t_struct(programs[0], "xcept1")); - structs.back()->set_xception(true); -} -void init_functions() { - structs.push_back(new t_struct(programs[0], "errs1")); - t_struct* errors = structs.back(); - structs.push_back(new t_struct(programs[0], "args1")); - t_struct* arglist = structs.back(); - functions.push_back(new t_function(base_types[0], "func1", errors, arglist, false)); - functions.push_back(new t_function(base_types[0], "func2", errors, arglist, true)); -} -void init_services() { - services.push_back(new t_service(programs[0])); - services.back()->set_doc("srv1 doc"); - services.back()->set_name("srv1"); - services.back()->add_function(functions[0]); - services.back()->add_function(functions[1]); - - services.push_back(new t_service(programs[0])); - services.back()->set_name("srv2"); - services.back()->set_extends(services[0]); -} - -std::vector<t_type*> types; -void init_types() { -#define T_COPY_TYPES(type) std::copy(type##s.begin(), type##s.end(), std::back_inserter(types)) - T_COPY_TYPES(base_type); - T_COPY_TYPES(enum); - T_COPY_TYPES(typedef); - T_COPY_TYPES(struct); - T_COPY_TYPES(list); - T_COPY_TYPES(set); - T_COPY_TYPES(map); -// T_COPY_TYPES(service); -#undef T_COPY_TYPES -} - -void init() { - if (!has_data) { - has_data = true; -#define T_INIT_TESTDATA(r, d, elem) init_##elem##s(); - BOOST_PP_LIST_FOR_EACH(T_INIT_TESTDATA, _, T_TEST_TYPES) - init_types(); -#undef T_INIT_TESTDATA - } -} -} -struct GlobalFixture { - ~GlobalFixture() { test_data::cleanup(); } -}; -#if (BOOST_VERSION >= 105900) -BOOST_GLOBAL_FIXTURE(GlobalFixture); -#else -BOOST_GLOBAL_FIXTURE(GlobalFixture) -#endif - -void migrate_global_cache() { - plugin::TypeRegistry reg; - plugin_output::get_global_cache(reg); - plugin::set_global_cache(reg); - plugin_output::clear_global_cache(); -} -template <typename T> -T* round_trip(T* t) { - typename plugin::ToType<T>::type p; - plugin::clear_global_cache(); - plugin_output::clear_global_cache(); - plugin_output::convert(t, p); - migrate_global_cache(); - return plugin::convert(p); -} - -void test_base_type(::t_base_type* sut) { - plugin::t_base_type p; - plugin_output::convert(sut, p); - boost::scoped_ptr< ::t_base_type> sut2(plugin::convert(p)); - -#define THRIFT_CHECK(r, data, elem) BOOST_PP_EXPAND(BOOST_CHECK_EQUAL(data elem, sut2->elem)); - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(7, - (is_void(), - is_string(), - is_bool(), - is_string_list(), - is_binary(), - is_string_enum(), - is_base_type()))) -} - -void test_const_value(t_const_value* sut) { - boost::scoped_ptr<t_const_value> sut2(round_trip(sut)); - - BOOST_CHECK_EQUAL(sut->get_type(), sut2->get_type()); - switch (sut->get_type()) { -#define T_CONST_VALUE_CASE(type, name) \ - case t_const_value::type: \ - BOOST_CHECK_EQUAL(sut->get_##name(), sut2->get_##name()); \ - break - T_CONST_VALUE_CASE(CV_INTEGER, integer); - T_CONST_VALUE_CASE(CV_DOUBLE, double); - T_CONST_VALUE_CASE(CV_STRING, string); - T_CONST_VALUE_CASE(CV_IDENTIFIER, identifier); -#undef T_CONST_VALUE_CASE - case t_const_value::CV_MAP: - BOOST_CHECK_EQUAL(sut->get_map().size(), sut2->get_map().size()); - { - std::map<t_const_value::t_const_value_type, t_const_value::t_const_value_type> sut_values; - for (std::map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator it = sut->get_map().begin(); - it != sut->get_map().end(); it++) { - sut_values[it->first->get_type()] = it->second->get_type(); - } - std::map<t_const_value::t_const_value_type, t_const_value::t_const_value_type> sut2_values; - for (std::map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator it = sut2->get_map().begin(); - it != sut2->get_map().end(); it++) { - sut2_values[it->first->get_type()] = it->second->get_type(); - } - BOOST_CHECK_EQUAL(sut_values.begin()->first, sut2_values.begin()->first); - BOOST_CHECK_EQUAL(sut_values.begin()->second, sut2_values.begin()->second); - } - break; - case t_const_value::CV_LIST: - BOOST_CHECK_EQUAL(sut->get_list().size(), sut2->get_list().size()); - BOOST_CHECK_EQUAL(sut->get_list().front()->get_type(), sut2->get_list().front()->get_type()); - break; - default: - BOOST_ASSERT(false); - break; - } -} - -void test_const(t_const* sut) { - boost::scoped_ptr< ::t_const> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(4, - (get_type()->get_name(), - get_name(), - get_value()->get_type(), - get_doc()))) -} - -void test_enum_value(t_enum_value* sut) { - boost::scoped_ptr<t_enum_value> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(3, (get_name(), get_value(), get_doc()))) -} - -void test_enum(t_enum* sut) { - boost::scoped_ptr< ::t_enum> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(6, - (get_name(), - get_min_value()->get_value(), - get_max_value()->get_value(), - get_constant_by_value(11)->get_value(), - get_constant_by_name("VAL1")->get_value(), - get_doc()))) -} - -void test_list(t_list* sut) { - boost::scoped_ptr<t_list> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(4, - (get_elem_type()->get_name(), - has_cpp_name(), - get_doc(), - get_name()))) - if (sut->has_cpp_name()) - BOOST_CHECK_EQUAL(sut->get_cpp_name(), sut2->get_cpp_name()); -} -void test_set(t_set* sut) { - boost::scoped_ptr<t_set> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(4, - (get_elem_type()->get_name(), - has_cpp_name(), - get_doc(), - get_name()))) - if (sut->has_cpp_name()) - BOOST_CHECK_EQUAL(sut->get_cpp_name(), sut2->get_cpp_name()); -} -void test_map(t_map* sut) { - boost::scoped_ptr<t_map> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(5, - (get_key_type()->get_name(), - get_val_type()->get_name(), - has_cpp_name(), - get_doc(), - get_name()))) - if (sut->has_cpp_name()) - BOOST_CHECK_EQUAL(sut->get_cpp_name(), sut2->get_cpp_name()); -} - -void test_typedef(t_typedef* sut) { - boost::scoped_ptr<t_typedef> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(4, - (get_doc(), - get_name(), - get_symbolic(), - is_forward_typedef()))) -} - -void test_type(t_type* sut) { - boost::scoped_ptr<t_type> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(15, - (is_void(), - is_base_type(), - is_string(), - is_bool(), - is_typedef(), - is_enum(), - is_struct(), - is_xception(), - is_container(), - is_list(), - is_set(), - is_map(), - is_service(), - get_doc(), - get_name()))) -} - -void test_field(t_field* sut) { - boost::scoped_ptr<t_field> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(5, - (get_req(), - get_reference(), - get_key(), - get_doc(), - get_name()))) - if (sut->get_value()) { - THRIFT_CHECK(, sut->, get_value()->get_type()); - } else { - BOOST_CHECK(!sut2->get_value()); - } - if (sut->get_type()) { - THRIFT_CHECK(, sut->, get_type()->get_name()); - } else { - BOOST_CHECK(!sut2->get_type()); - } -} -void test_struct(t_struct* sut) { - boost::scoped_ptr<t_struct> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(5, - (is_union(), - is_xception(), - is_struct(), - get_doc(), - get_name()))) -} - -void test_function(t_function* sut) { - boost::scoped_ptr<t_function> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH( - THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(4, (get_doc(), get_name(), get_returntype()->get_name(), is_oneway()))) -} -void test_service(t_service* sut) { - boost::scoped_ptr<t_service> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, - sut->, - BOOST_PP_TUPLE_TO_LIST(3, (get_doc(), get_name(), get_functions().size()))) - if (sut->get_extends()) { - THRIFT_CHECK(, sut->, get_extends()->get_name()); - } else { - BOOST_CHECK(!sut2->get_extends()); - } -} - -void test_program(t_program* sut) { - boost::scoped_ptr<t_program> sut2(round_trip(sut)); - - BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, sut->, BOOST_PP_TUPLE_TO_LIST(2, (get_doc(), get_name()))) -} -boost::unit_test::test_suite* do_init_unit_test_suite() { - test_data::init(); - test_suite* ts = BOOST_TEST_SUITE("PluginConversionTest"); - -#define T_TEST_CASE(r, d, type) \ - ts->add(BOOST_PARAM_TEST_CASE(test_##type, test_data::type##s.begin(), test_data::type##s.end())); - BOOST_PP_LIST_FOR_EACH(T_TEST_CASE, _, T_TEST_TYPES) - T_TEST_CASE(_, _, type) -#undef T_TEST_CASE - return ts; -} - -#ifdef BOOST_TEST_DYN_LINK -bool init_unit_test_suite() { - framework::master_test_suite().add(do_init_unit_test_suite()); - return true; -} -int main(int argc, char* argv[]) { - return ::boost::unit_test::unit_test_main(&init_unit_test_suite, argc, argv); -} -#else -boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[]) { - return do_init_unit_test_suite(); -} -#endif diff --git a/compiler/cpp/test/plugin/cpp_plugin.cc b/compiler/cpp/test/plugin/cpp_plugin.cc deleted file mode 100644 index 6cc19f2..0000000 --- a/compiler/cpp/test/plugin/cpp_plugin.cc +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#include "thrift/plugin/plugin.h" -#include "thrift/generate/t_generator.h" - -namespace apache { -namespace thrift { -namespace plugin { - -class MyCppGenerator : public GeneratorPlugin { - virtual int generate(::t_program* program, - const std::map<std::string, std::string>& parsed_options) { - t_generator* gen = t_generator_registry::get_generator(program, "cpp", parsed_options, ""); - gen->generate_program(); - delete gen; - return 0; - } -}; -} -} -} - -int main(int argc, char* argv[]) { - apache::thrift::plugin::MyCppGenerator p; - return p.exec(argc, argv); -} diff --git a/compiler/cpp/test/plugin_stability_test.sh b/compiler/cpp/test/plugin_stability_test.sh deleted file mode 100755 index eb7c93d..0000000 --- a/compiler/cpp/test/plugin_stability_test.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -# this file is intended to be invoked by make. -# -# This file runs the compiler twice, using a plugin that just invokes -# /bin/cat, and compares the output. If GeneratorInput is -# nondeterminsitic, you'd expect the output to differ from run-to-run. -# So this tests that in fact, the output is stable from run-to-run. -set -e -mkdir -p gen-bincat -PATH=.:"$PATH" ../thrift -r -gen bincat ../../../test/Include.thrift > gen-bincat/1.ser -PATH=.:"$PATH" ../thrift -r -gen bincat ../../../test/Include.thrift > gen-bincat/2.ser -diff --binary gen-bincat/1.ser gen-bincat/2.ser diff --git a/configure.ac b/configure.ac index 0f6c6da..7da52a0 100755 --- a/configure.ac +++ b/configure.ac @@ -607,20 +607,6 @@ if test "$enable_tests" = "no"; then fi AM_CONDITIONAL(WITH_TESTS, [test "$have_tests" = "yes"]) -AC_ARG_ENABLE([plugin], - AS_HELP_STRING([--enable-plugin], [build compiler plugin support [default=no]]), - [], enable_plugin=no -) -have_plugin=yes -if test "$have_cpp" = "no" ; then - have_plugin="no" -fi -if test "$enable_plugin" = "no"; then - have_plugin="no" -fi -AC_CONFIG_LINKS([compiler/cpp/test/plugin/t_cpp_generator.cc:compiler/cpp/src/thrift/generate/t_cpp_generator.cc]) -AM_CONDITIONAL(WITH_PLUGIN, [test "$have_plugin" = "yes"]) - AC_ARG_ENABLE([tutorial], AS_HELP_STRING([--enable-tutorial], [build tutorial [default=yes]]), [], enable_tutorial=yes @@ -803,7 +789,6 @@ AC_CONFIG_FILES([ Makefile compiler/cpp/Makefile compiler/cpp/src/Makefile - compiler/cpp/src/thrift/plugin/Makefile compiler/cpp/test/Makefile compiler/cpp/src/thrift/version.h lib/Makefile @@ -957,7 +942,6 @@ echo "Building Lua Library ......... : $have_lua" echo "Building NodeJS Library ...... : $have_nodejs" echo "Building Perl Library ........ : $have_perl" echo "Building PHP Library ......... : $have_php" -echo "Building Plugin Support ...... : $have_plugin" echo "Building Python Library ...... : $have_python" echo "Building Py3 Library ......... : $have_py3" echo "Building Ruby Library ........ : $have_ruby" diff --git a/lib/Makefile.am b/lib/Makefile.am index 901c3ef..f6060c4 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -25,11 +25,8 @@ SUBDIRS += as3 endif if WITH_CPP -# cpp dir is picked directly by plugin build -if !WITH_PLUGIN SUBDIRS += cpp endif -endif if WITH_C_GLIB SUBDIRS += c_glib diff --git a/lib/cpp/Makefile.am b/lib/cpp/Makefile.am index db9d751..616effd 100755 --- a/lib/cpp/Makefile.am +++ b/lib/cpp/Makefile.am @@ -25,12 +25,8 @@ moc__%.cpp: %.h SUBDIRS = . if WITH_TESTS -# This file is needed by compiler with plugin, while test/Makefile.am needs compiler -# So test directory is directly picked by top level Makefile.am for plugin build -if !WITH_PLUGIN SUBDIRS += test endif -endif pkgconfigdir = $(libdir)/pkgconfig